2013-09-13

Intelのドキュメント化されていないマイクロコードアップデート用のバイナリの考察

Notes on Intel Microcode Updates

最近のIntelの(AMDにもあるが)CPUには、マイクロコードをアップデートする機能が付いている。これにより一部のCPUの不具合を修正することができる。

このアップデートは、通常、マザーボードのファームウェアがOSに制御を渡す前に行うが、OSが行うこともできる。

マイクロコードアップデート用のバイナリは、Intelが公開している。このバイナリのフォーマットはドキュメント化されていない。アップデート用のバイナリが更新される際も、どのCPUのどのような不具合を直したなどという情報は公開されていない。

一体どんなフォーマットなのかということを外部から観測できる挙動によって考察した内容が公開されている。なかなか暗号解読のような趣があり面白い。

一見したところ、バイナリはほとんどランダムで、構造らしきものが見当たらない。

まず行なっているのは、歴代のバイナリの差分を比較することだ。過去のすべてのバイナリに対して最小一致するビット列を探したところ、一度も変わっていない連続した2048bitが見つかった。

2048bitといえば、RSAの鍵でよく使われている長さだ。ひょっとしたら、RSAの公開鍵かもしれない。それを強く示唆する証拠もいくつか見られる。

さらに、1ビットづつ反転させたバイナリを読み込ませて、更新に成功するかどうかを調べたり、更新にかかる平均時間を計測して、どのビットを変更した時に、更新時間にどのように影響が見られるかということを観測したりしている。

また、RSAシグネチャらしき部分を見つけ出して、冒頭の2048bitをRSA鍵だと仮定して実際にデコードを試みたが、非標準の初期化ベクタかハッシュ関数が使われているのか、正しいシグネチャにはデコードはできなかったようだ。

また、RSA公開鍵だと思われる部分も変更して、シグネチャもそれに合わせて変えてみたが、更新失敗するだけだった。

興味深いことに、RSA公開鍵だと思われる部分の最初の1 wordを0にしてみると、ハードウェアリセットがかかった。これはひょっとすると、マイクロコードの妥当性検証機能に「ゼロ除算」エラーが存在するのかもしれない。

原文では、この観測により、マイクロコード更新用のバイナリフォーマットの一部に光を当てたと結論している。

No comments: