Closed6

OpenSSHの脆弱性の信じたくなる原因

MURAOKA TaroMURAOKA Taro
  • OpenBSDは安全性や正当性を重視したBSDベースのOS
    • 4.3BSD → 386BSD → NetBSD → OpenBSD という系譜
    • NetBSDの兄弟がFreeBSD
    • Darwin(macos)はFreeBSDの環境部分(runtime?)とMachカーネルベースのXNUを合わせたもの
  • OpenSSHはOpenBSDにおいて開発され、切り出されて他のOSでも利用できるように移植された
MURAOKA TaroMURAOKA Taro
  • UNIXライクな環境では割り込みをシグナルで表現する
  • 割り込みを受けたいプログラムはシグナルハンドラを実装することでシグナルを受信できる
  • シグナルハンドラ内では実行できる処理に制限が加わる (参考資料:SIG30-C. シグナルハンドラ内では非同期安全な関数のみを呼び出す)
    • killコマンドなどにより外部から送信されたシグナルは、プログラム本体のスレッドとは別のスレッドでシグナルハンドルを実行する
    • C標準の関数のなかにはシグナルハンドラから呼べるものと呼べないものがある
    • マルチスレッド対応に一手間必要なCランタイムはそれなりにある
    • printfなどはメモリアロケーションが必要なためシグナルハンドラから呼べないことになっている(POSIXの規定があるらしい)
MURAOKA TaroMURAOKA Taro
  • OpenBSDは安全性を重視する立場から、POSIXに反してシグナルハンドラからprintfを呼べるようにしている
  • OpenBSDで開発されるOpenSSHはシグナルハンドラからprintfを呼んでも脆弱にならないので、問題に気付かない
  • この脆弱性はOpenBSD以外でのOpenSSHで発見された
MURAOKA TaroMURAOKA Taro

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

このスクラップは5ヶ月前にクローズされました