河豚板にて同様の不具合が複数報告されたことにより調査・対応を行った。
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日 (月) | kaw | PIEが関連しているか検討 |
kaw,karl | pie:PIEな版→現象かわらず | |
10月23日 (水) | kaw,karl | rvmk:ビルドツールの改修版→現象かわらず |
10月24日 (木) | kaw,karl | init: /boottmp/initを独立した実行バイナリにした版→/bin/shが起動しない |
新たに報告あり。FuguIta/Report/23 - 12th Gen Intel(R) Core(TM) i3-1220P | ||
karl | クランチバイナリの問題?12世代以降のP/Eコア構成が絡んでいるか | |
10月25日 (金) | paina | 12900K 実機によるテスト→現象再現(Process (pid 1) got signal 4)、E-Core を無効にしても発生 |
kaw,karl | tst4:クランチバイナリ生成部を現行のOpenBSD本家を基に作り直し→現象変らず。single user shでのコマンド実行が明らかにおかしい。 | |
10月27日 (日) | kaw,karl | tst5: crunchgen廻りをよりOpenBSDに近づけた版 |
kaw,karl | tst6: *.[do]の消し忘れがあったので改良版を生成、NKPTPも増やす | |
10月28日 (月) | kaw,karl | nocb: クランチバイナリを使用しない版→/bin/shは起動できた。sedなどがcore dumpする。 |
kaw | 本件についてfuguita.orgの掲示版で広報 | |
karl | arm64で関連する可能性のある事例を検索 | |
nork | コンパイル時のリンカーオプションに -Wl,-z,nobtcfi の指定を示唆 | |
10月29日 (火) | karl | LDFLAGS+=$(NOPIE_LDFLAGS) -z nobtcfiを追加してbootbinをビルド、起動できたが、core dumpしてるものがある。 |
kaw | IBT対応はOpenBSD Journal とOpenBSD公式で紹介されていた。 | |
kaw | cts2: LDFLAGS+=-Wl,-z,nobitcfiでビルドしたバージョン → /boottmp/rc内でSIGILL発生 | |
10月30日 (水) | karl | 再度処理が走るのでshell自身がcore dumpしているのではないようだ。 |
kaw | シェル変数が未代入、sysctlとかswapctlがcore dumpしているかも。 | |
10月31日 (木) | kaw,karl | cts4: クランチバイナリを /usr/src/distrib に倣って作ってみた版→signal4 で落ちる |
karl | /boottmp/init?がIBTで保護されて、バイナリが起動できないのでは | |
11月1日 (金) | karl | 現象の整理 |
kaw | /usr/ports に、Makefileで USE_NOBTCFI = Yes という定義をしているものがある | |
11月2日 (土) | kaw,karl | cts7:OpenBSDでの instbin ビルドを河豚板の bootbin に適用→メモリ取得でcore dumpする(cts6と同様) |
kaw,karl | cts8: build-repl.sh で作成。中身的には cts7 と同じ→ルートディレクトリに、sh.core ができている | |
kaw,karl | Jitsiにてミーティング | |
kaw | cts9: /boottmp/rc の冒頭に set -x を付けた版 | |
karl | HYPER-V上では、cpuid 7.0の所にedx=bc104410 <MD_CLEAR,IBT,IBRS,IBPB,STIBP,L1DF,SSBD>と、IBTが立っている。 | |
kaw | コアダンプしているのはクランチバイナリのswapctlか、それを起動しているコマンド実行置換のサブシェルの可能性が高い。 | |
karl | $swpmem=NULLとなり、NULLを参照して落ちるのでは。 | |
kaw | parsesize はシェル関数なので、NULLを参照して落ちる、ということはないと思う。 | |
11月3日 (日) | kaw | 検索: 脆弱性緩和技術の最前線 - CPU レベルの技術 |
kaw | ctsa: makeconf.awkのlibs行の生成部分をlibs -Wl,-nopie -Wl,-z,nobtcfi -lutilに変更した版、 printfデバッグを追加 | |
karl | wd0bが存在する状態でもスワップ容量は取れていない | |
kaw | ctsb: ctsa から 2>/dev/null をはずした版→swapctlは正常に実行されて、値も取得されいるようだ | |
kaw,karl | ctsc: 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では正常 | |
kaw | ctsd: bootbinにノーマルなkshを入れた版→file system fullに | |
kaw,karl | ctse: ramdisk root容量増、NKPTP変更、起動初期にksh起動版→シェルスクリプト実行中に落ちる | |
11月5日 (火) | kaw | 実機を手配 |
11月6日 (水) | karl | 自前buildで検証→IBT環境でcrunch バイナリを実行する時は、nobtcfiが必須と推測 |
11月7日 (木) | kaw | crunchgenが不正な分岐命令を生成していると推測→nobtcfiが必要 |
kaw | 実機到着・テスト実施 | |
11月8日 (金) | kaw | テストシェルスクリプト(クランチバイナリ)→シェルのネストで死ぬ |
kaw | ctsf: /boottmp/bootbinに-z nobtcfiを付けてビルド&init, sh (=ksh) は個別のバイナリ→正常に起動 | |
karl | 同様に、正常起動を確認 | |
kaw | FuguIta/Report/19、FuguIta/Report/23 の報告者にも追試を依頼 | |
kaw | FuguIta-7.6-amd64-202411081を対応版としてリリース | |
11月9日 (土) | kaw | i386カーネルが動作せず→NKPTP変更でOK。全プラットフォームでOK |