ARM64 Linuxでcurlがクラッシュする問題と解決策

これは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

解決策

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の修正について見てみましょう

fix armv8 pointer authentication

  • アセンブリの修正
  • 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

この記事をシェア

弊社では、一緒に会社を面白くしてくれる仲間を募集しています。
お気軽にお問い合わせください!