Closed6
OpenSSHの脆弱性の信じたくなる原因
- UNIXライクな環境では割り込みをシグナルで表現する
- 割り込みを受けたいプログラムはシグナルハンドラを実装することでシグナルを受信できる
- シグナルハンドラ内では実行できる処理に制限が加わる (参考資料:SIG30-C. シグナルハンドラ内では非同期安全な関数のみを呼び出す)
- killコマンドなどにより外部から送信されたシグナルは、プログラム本体のスレッドとは別のスレッドでシグナルハンドルを実行する
- C標準の関数のなかにはシグナルハンドラから呼べるものと呼べないものがある
- マルチスレッド対応に一手間必要なCランタイムはそれなりにある
- printfなどはメモリアロケーションが必要なためシグナルハンドラから呼べないことになっている(POSIXの規定があるらしい)
- OpenBSDは安全性を重視する立場から、POSIXに反してシグナルハンドラからprintfを呼べるようにしている
- OpenBSDで開発されるOpenSSHはシグナルハンドラからprintfを呼んでも脆弱にならないので、問題に気付かない
- この脆弱性はOpenBSD以外でのOpenSSHで発見された
OpenSSHの親せきであるFreeBSDが発表した本問題のパッチは
sprintfを使っているはずの関数を呼び出さないようにすることだった。
--- crypto/openssh/log.c.orig
+++ crypto/openssh/log.c
@@ -451,12 +451,14 @@
sshsigdie(const char *file, const char *func, int line, int showfunc,
LogLevel level, const char *suffix, const char *fmt, ...)
{
+#if 0
va_list args;
va_start(args, fmt);
sshlogv(file, func, line, showfunc, SYSLOG_LEVEL_FATAL,
suffix, fmt, args);
va_end(args);
+#endif
_exit(1);
}
引用元: https://www.freebsd.org/security/patches/SA-24:04/openssh-14.1.patch
この説は信じたくなる。
このスクラップは2ヶ月前にクローズされました