ARM64 Linuxでcurlがクラッシュする問題と解決策
2022年 05月 17日 火曜日
これは2022/05/17のMK社内LTで発表した内容です。
現象
- Parallels Desktopを介したARM64のUbuntu 20.04.04で問題を発見しました
- curl
cliff@PD-Focal:~$ curl https://dl.yarnpkg.com/debian/pubkey.gpg
Segmentation fault (core dumped)
- wget
cliff@PD-Focal:~$ wget https://dl.yarnpkg.com/debian/pubkey.gpg
--2022-02-22 15:22:36-- https://dl.yarnpkg.com/debian/pubkey.gpg
Resolving dl.yarnpkg.com (dl.yarnpkg.com)... 104.16.171.99, 104.18.126.100
Connecting to dl.yarnpkg.com (dl.yarnpkg.com)|104.16.171.99|:443... connected.
Segmentation fault (core dumped)
- curl/wget 両方で問題が発生するため curlの問題ではなさそうです。。。
解決策を探し
- GitHubでissueを発見
Segfault with specific URL but only over HTTPS
- 上記のissueによると、OpenSSLの問題であることが確認されています
- Fixed on 30 Oct 2020
問題再現
- OpenSSLで問題再現
cliff@PD-Focal:~$ openssl s_client -showcerts -connect graph.facebook.com:443 </dev/null
CONNECTED(00000003)
Segmentation fault (core dumped)
バージョン確認
cliff@PD-Focal:~$ openssl version -a
OpenSSL 1.1.1f 31 Mar 2020
built on: Wed Nov 24 13:20:48 2021 UTC
platform: debian-arm64
options: bn(64,64) rc4(char) des(int) blowfish(ptr)
compiler: gcc -fPIC -pthread -Wa,--noexecstack -Wall -Wa,--noexecstack -g -O2 -fdebug-prefix-map=/build/openssl-ibbik6/openssl-1.1.1f=. -fstack-protector-strong -Wformat -Werror=format-security -DOPENSSL_TLS_SECURITY_LEVEL=2 -DOPENSSL_USE_NODELETE -DOPENSSL_PIC -DOPENSSL_CPUID_OBJ -DOPENSSL_BN_ASM_MONT -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DKECCAK1600_ASM -DVPAES_ASM -DECP_NISTZ256_ASM -DPOLY1305_ASM -DNDEBUG -Wdate-time -D_FORTIFY_SOURCE=2
OPENSSLDIR: "/usr/lib/ssl"
ENGINESDIR: "/usr/lib/aarch64-linux-gnu/engines-1.1"
Seeding source: os-specific
解決策
- OpenSSLのバージョンをアップする
- https://launchpad.net/ubuntu/focal/+source/openssl
apt list -a openssl
Listing... Done
openssl/focal-updates,focal-security,now 1.1.1f-1ubuntu2.13 arm64 [installed,automatic]
openssl/focal 1.1.1f-1ubuntu2 arm64
- 上記によると、Ubuntu 20.04では OpenSSL1.1.1f以外のバージョンを提供されていません
- 最新バージョンをコンパイルする必要があります (2022/02/22現在:1.1.1m)
OpenSSLのコンパイル手順
wget https://www.openssl.org/source/openssl-1.1.1m.tar.gz
tar -xvf openssl-1.1.1m.tar.gz
cd openssl-1.1.1m
./config --prefix=/usr --openssldir=/usr/lib/ssl --libdir=/usr/lib/aarch64-linux-gnu
make -j
make test
sudo make install
結果確認
cliff@PD-Focal:~$ openssl version -a
OpenSSL 1.1.1m 14 Dec 2021
built on: Tue Feb 22 15:00:41 2022 UTC
platform: linux-aarch64
options: bn(64,64) rc4(char) des(int) idea(int) blowfish(ptr)
compiler: gcc -fPIC -pthread -Wa,--noexecstack -Wall -O3 -DOPENSSL_USE_NODELETE -DOPENSSL_PIC -DOPENSSL_CPUID_OBJ -DOPENSSL_BN_ASM_MONT -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DKECCAK1600_ASM -DVPAES_ASM -DECP_NISTZ256_ASM -DPOLY1305_ASM -DNDEBUG
OPENSSLDIR: "/usr/lib/ssl"
ENGINESDIR: "/usr/lib/aarch64-linux-gnu/engines-1.1"
Seeding source: os-specific
分析
他のプラットフォームの状況
プラットフォーム | アーキテクチャ | 問題発生 |
---|---|---|
Ubuntu in M1 PD | ARM64 | ✓ |
Ubuntu in M1 UTM | ARM64 | ✓ |
Docker in M1 | ARM64 | 必ずしもそうではない |
PC | x86-64 | |
Raspberry Pi 4 B | ARM | |
Raspberry Pi 4 B | ARM64 | |
Jetson Nano | ARM64 |
M1: Apple M1 Soc
PD: Parallels Desktop、仮想マシン環境ソフトウェア
UTM: virtual machine host for iOS and macOS
- ARM64プラットフォームの問題だと思っていましたが、問題ないプラットフォームもあります。
OpenSSLの修正について見てみましょう
- アセンブリの修正
Pointer Authentication
という機能を使用しています。Pointer Authentication
introduced in ARMv8.3-A1
結論
- ARMv8.3-A以降のCPUとOpenSSL 1.1.1i以前のバージョンと組み合わせると今回の問題が発生する可能性があります
プラットフォーム | 命令セット2 | 問題発生 |
---|---|---|
Apple M1 Mac | ARMv8.5-A | ✓ |
Raspberry Pi 4 B (Cortex-A72) | ARMv8-A | |
Jetson Nano (Cortex-A57) | ARMv8-A |
Reference
この記事をシェア