まとめ
まとめ
regreSSHion を切り口にLinuxの世界に足を踏み入れました。
- シグナルハンドラーのレースコンディション
- sshd(SSHサーバー)
- root権限
- glibc
これらキーワードへの理解は深まったでしょうか?
Qualys による regreSSHion ブログの脆弱性の概要を再掲します。
The vulnerability, which is a signal handler race condition in OpenSSH’s server (sshd), allows unauthenticated remote code execution (RCE) as root on glibc-based Linux systems; that presents a significant security risk. This race condition affects sshd in its default configuration.
SIGTERM
などのシグナルをハンドリングするシグナル・ハンドラーの実装では、printf()
関数などは使えず、非同期シグナル安全な関数のみ呼び出せるなど、制約が多いです。
SSHプロトコルのサーバーサイドプログラムである sshd(OpenSSH server) では、クライアントの認証時に SIGALRM
タイマーで試行時間を制御し、特に glibc を使うLinux環境のシグナルハンドラー内では、内部的に malloc()
/free()
を呼び出す syslog()
が使われていました。
複数の SSH 接続を試み、認証のタイムアウトを発生させ、シグナルハンドラー内の malloc()
呼び出しに別の非同期シグナルをうまく割り込ませるなどして、ヒープを不正な状態にすることで(レースコンディション)、任意のリモートコード実行(RCE) につながらう脆弱性があります。
認証できていないため、unauthenticated なRCEです。
この脆弱性を修正したエンジニアは、脆弱性を回避するミニマルなパッチを提供しています
1) Critical race condition in sshd
diff --git a/log.c b/log.c
index 9fc1a2e2e..191ff4a5a 100644
--- a/log.c
+++ b/log.c
@@ -451,12 +451,14 @@ void
sshsigdie(const char *file, const char *func, int line, int showfunc,
LogLevel level, const char *suffix, const char *fmt, ...)
{
+#ifdef SYSLOG_R_SAFE_IN_SIGHAND
va_list args;
va_start(args, fmt);
sshlogv(file, func, line, showfunc, SYSLOG_LEVEL_FATAL,
suffix, fmt, args);
va_end(args);
+#endif
_exit(1);
}
このパッチを適用すると、OpenBSD(Linuxとは別のUNIX系OS)のように、シグナルハンドラー内で再入可能なsyslog
関数(syslog_r
など)が使われている場合のみ、ログ出力します。このミニマルパッチを適用後も、脆弱性を受けていないOpenBSDでの挙動は変わらず、Linux + glibc のように non-reentrant な syslog()
を読んでいる場合、ログ出力されなくなります。
2006年にも類似の脆弱性があり(CVE-2006-5051)、その際は、安全な syslog()
関数がある場合のみログ出力する判定(#ifdef DO_LOG_SAFE_IN_SIGHAND
) が追加されました。
その後、2020年のリファクタリングの際に、誤ってこの判定が除外されてしまい、CVE-2006-5051 のバグが再発(回帰=regression)するようになっていました。
以上が CVE-2024-6387(regreSSHion) のあらましです。
次のステップ
今回のワークショップのような、OSを強く意識した世界に興味をもったら、以下の書籍がオススメです。
- 武内 覚 著『[試して理解]Linuxのしくみ』(技術評論社, 2022, ISBN 978-4-297-13148-7)
- サンプルコードはPython。コマンドからOSを学ぶ側面が強い。
- 青木 峰郎著『ふつうのLinuxプログラミング 第2版』(SBクリエイティブ, 2017, ISBN 978-4-7973-8647-9)
- サンプルコードはC。アプリケーション開発からOSを学ぶ側面が強い。
- 河田 旺、小池 悠生、渡邉 慶一、佐伯 学哉、荒田 実樹 著『河田 旺、小池 悠生、渡邉 慶一、佐伯 学哉、荒田 実樹 著』(オライリー・ジャパン、2024, ISBN 978-4-8144-0085-0)
- 低レイヤーと友達になりたい
ぜひ、本屋で手にとって見てください。