GhostWrite アタックについて説明されているファジングの論文、RISCVuzzの論文を読んでいこうと思う。
もう一つの脆弱性、CPUを完全に停止させてしまうベンダ拡張命令について見ていく。
以下が問題を再現させるアセンブリコードである:
- C906 :
th.lbib
命令の定義について確認しよう。
th.lbib t0, (t0), 0, 0 frcsr t0 li t0, 0
th.lbib
は以下に命令仕様が置かれている: https://github.com/XUANTIE-RV/openc906/blob/main/doc/%E7%8E%84%E9%93%81C906%E7%94%A8%E6%88%B7%E6%89%8B%E5%86%8C(openc906)_20240627.pdf
lbib rd, (rs1), imm5,imm2 rs1←rs1 + sign_extend(imm5 << imm2) rd ←sign_extend(mem[rs1+7:rs1]) 例外:ロード命令アンアラインドアクセス例外、ロード命令アクセスエラー例外、ロード命令ページエラー例外、不正命令例外。 注:rdとrs1は等しくない。
なるほど、アドレスも一緒にインクリメントしてしまうタイプの命令ということか。
これは通常rs1
とrd
を一致させてはならないが、一致させた場合、そして上記のシーケンスだとハングが発生する、というものだ。
もう一つ、C908における vsm.v
と vlm.v
において特定のビット・エンコーディングで発生するハングケースだ。
ビット29から31を設定することによりハングが発生する。
つまり、nf != 0
を設定することにより命令がハングする、という訳だ。
これらのCPUの実装はRTLも公開されているため、RTLシミュレーションでも再現可能である。
これらのバグの要因は、すべて通常実行可能な命令とは異なる、命令例外が生成されるべきものが、生成されていない、ということになる。