Top/EBUG勉強会/20241130_河豚板のIBT対応

河豚板のIBT対応

EBUG 第91回会合 2024年11月30日
川俣吉広、kaw@on.rim.or.jp

概要

河豚板にて同様の不具合が複数報告されたことにより調査・対応を行った。

経過要約

9月22日 (日)karl初の報告 (on Hyper-V)
kaw現象を分析、initがsignal 4 (SIGILL)を受けるのはHyper-V特有の問題か
10月20日 (日)FuguIta/Report/19 にて同様の報告が上げられる。
masakazu,kawコンパイラのCPUインストラクションセットの指定の問題である可能性を議論
(河豚板7.6リリース)
10月21日 (月)kawPIEが関連しているか検討
kaw,karlpie:PIEな版→現象かわらず
10月23日 (水)kaw,karlrvmk:ビルドツールの改修版→現象かわらず
10月24日 (木)kaw,karlinit: /boottmp/initを独立した実行バイナリにした版→/bin/shが起動しない
新たに報告あり。FuguIta/Report/23 - 12th Gen Intel(R) Core(TM) i3-1220P
karlクランチバイナリの問題?12世代以降のP/Eコア構成が絡んでいるか
10月25日 (金)paina12900K 実機によるテスト→現象再現(Process (pid 1) got signal 4)、E-Core を無効にしても発生
kaw,karltst4:クランチバイナリ生成部を現行のOpenBSD本家を基に作り直し→現象変らず。single user shでのコマンド実行が明らかにおかしい。
10月27日 (日)kaw,karltst5: crunchgen廻りをよりOpenBSDに近づけた版
kaw,karltst6: *.[do]の消し忘れがあったので改良版を生成、NKPTPも増やす
10月28日 (月)kaw,karlnocb: クランチバイナリを使用しない版→/bin/shは起動できた。sedなどがcore dumpする。
kaw本件についてfuguita.orgの掲示版で広報
karlarm64で関連する可能性のある事例を検索
norkコンパイル時のリンカーオプションに -Wl,-z,nobtcfi の指定を示唆
10月29日 (火)karlLDFLAGS+=$(NOPIE_LDFLAGS) -z nobtcfiを追加してbootbinをビルド、起動できたが、core dumpしてるものがある。
kawIBT対応はOpenBSD JournalOpenBSD公式で紹介されていた。
kawcts2: LDFLAGS+=-Wl,-z,nobitcfiでビルドしたバージョン → /boottmp/rc内でSIGILL発生
10月30日 (水)karl再度処理が走るのでshell自身がcore dumpしているのではないようだ。
kawシェル変数が未代入、sysctlとかswapctlがcore dumpしているかも。
10月31日 (木)kaw,karlcts4: クランチバイナリを /usr/src/distrib に倣って作ってみた版→signal4 で落ちる
karl/boottmp/init?がIBTで保護されて、バイナリが起動できないのでは
11月1日 (金)karl現象の整理
kaw/usr/ports に、Makefileで USE_NOBTCFI = Yes という定義をしているものがある
11月2日 (土)kaw,karlcts7:OpenBSDでの instbin ビルドを河豚板の bootbin に適用→メモリ取得でcore dumpする(cts6と同様)
kaw,karlcts8: build-repl.sh で作成。中身的には cts7 と同じ→ルートディレクトリに、sh.core ができている
kaw,karlJitsiにてミーティング
kawcts9: /boottmp/rc の冒頭に set -x を付けた版
karlHYPER-V上では、cpuid 7.0の所にedx=bc104410 <MD_CLEAR,IBT,IBRS,IBPB,STIBP,L1DF,SSBD>と、IBTが立っている。
kawコアダンプしているのはクランチバイナリのswapctlか、それを起動しているコマンド実行置換のサブシェルの可能性が高い
karl$swpmem=NULLとなり、NULLを参照して落ちるのでは。
kawparsesize はシェル関数なので、NULLを参照して落ちる、ということはないと思う。
11月3日 (日)kaw検索: 脆弱性緩和技術の最前線 - CPU レベルの技術
kawctsa: makeconf.awkのlibs行の生成部分をlibs -Wl,-nopie -Wl,-z,nobtcfi -lutilに変更した版、 printfデバッグを追加
karlwd0bが存在する状態でもスワップ容量は取れていない
kawctsb: ctsa から 2>/dev/null をはずした版→swapctlは正常に実行されて、値も取得されいるようだ
kaw,karlctsc: set -v を追加, swpmemを設定する部分をスキップ→ctsc: parsesize 75% 2031 0を渡してもサブシェルがIllegal instruction(core dumped)する。
karlシェルコマンド置換の部分で、評価順序に依っては問題が起きるのではないか。
kawパラメータのコマンド実行置換(=サブシェル)がネストするとコケる、っていうことでは。
karlカーネル内で、option SMALL_KERNELによるIBT無効部分を特定
kaw,karlネストしたシェル呼出しのサンプルコードを提示→HYPERV on OpenBSD 7.6では正常
kawctsd: bootbinにノーマルなkshを入れた版→file system fullに
kaw,karlctse: ramdisk root容量増、NKPTP変更、起動初期にksh起動版→シェルスクリプト実行中に落ちる
11月5日 (火)kaw実機を手配
11月6日 (水)karl自前buildで検証→IBT環境でcrunch バイナリを実行する時は、nobtcfiが必須と推測
11月7日 (木)kawcrunchgenが不正な分岐命令を生成していると推測→nobtcfiが必要
kaw実機到着・テスト実施
11月8日 (金)kawテストシェルスクリプト(クランチバイナリ)→シェルのネストで死ぬ
kawctsf: /boottmp/bootbinに-z nobtcfiを付けてビルド&init, sh (=ksh) は個別のバイナリ→正常に起動
karl同様に、正常起動を確認
kawFuguIta/Report/19FuguIta/Report/23 の報告者にも追試を依頼
kawFuguIta-7.6-amd64-202411081を対応版としてリリース
11月9日 (土)kawi386カーネルが動作せず→NKPTP変更でOK。全プラットフォームでOK

まとめ


Top/EBUG勉強会/20241130_河豚板のIBT対応

Front page   New Page list Search Recent changes   Help   RSS of recent changes