FPGA開発日記

カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages , English Version https://fpgadevdiary.hatenadiary.com/

GhostWriteの論文を読む (5. CPUがHALTする命令シーケンス)

GhostWrite アタックについて説明されているファジングの論文、RISCVuzzの論文を読んでいこうと思う。

ghostwriteattack.com

msyksphinz.hatenablog.com

msyksphinz.hatenablog.com

msyksphinz.hatenablog.com


もう一つの脆弱性、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

rs1rs1 + sign_extend(imm5 << imm2)
rdsign_extend(mem[rs1+7:rs1])

例外:ロード命令アンアラインドアクセス例外、ロード命令アクセスエラー例外、ロード命令ページエラー例外、不正命令例外。
注:rdrs1は等しくない。

なるほど、アドレスも一緒にインクリメントしてしまうタイプの命令ということか。 これは通常rs1rdを一致させてはならないが、一致させた場合、そして上記のシーケンスだとハングが発生する、というものだ。

もう一つ、C908における vsm.vvlm.v において特定のビット・エンコーディングで発生するハングケースだ。 ビット29から31を設定することによりハングが発生する。

つまり、nf != 0 を設定することにより命令がハングする、という訳だ。 これらのCPUの実装はRTLも公開されているため、RTLシミュレーションでも再現可能である。

これらのバグの要因は、すべて通常実行可能な命令とは異なる、命令例外が生成されるべきものが、生成されていない、ということになる。