Not only is the Internet dead, it's starting to smell really bad.:2019年04月25日分

2019/04/25(Thu)

[Windows] Windows 64bit OSのドライバに必要なコード署名についていろいろ

@「ドライバー署名の強制を無効にする」は本当に必要?

先日の古いSCSIカードを使う件なんかでWindows 64bit OSのドライバ署名まわりの挙動を調べてたんだけど

  • ドライバインストール時の署名検証はセキュリティカタログ(.cat)で行なわれる
  • セキュリティカタログとカーネルモードドライバ以外のファイルは署名されず、セキュリティカタログにハッシュ値だけが記録されている
  • インストール時は
    • セキュリティカタログの署名の真正性と信頼性
    • それぞれのファイルのハッシュ値が一致するか
    だけが検証され、この時点ではカーネルモードドライバの署名は検証のしようがない(infにカーネルモードドライバか否かの情報無いしね)
  • セキュリティカタログの署名チェックは基本ザルで、オレオレ署名でも「信頼されたルート証明書」に追加されてれば回避できるのでインストール可能
  • なんなら回復コンソール(Windows RE)で起動し、DISM /Add-Driverコマンドを使ってDriverStoreにインストールしてしまえばセキュリティカタログ要らない
  • ただしオレオレ署名だと(?)デバイスマネージャ上は「デジタル署名されていません」表示のままになる(原因不明)
  • カーネルモードドライバにされてる署名の真正性はカーネルにロードされる時にようやっと検証される
  • カーネルモードドライバの署名だけはMicrosoftによる署名でないとダメ*1
  • セキュアブートを無効にすれば(あるいは元々その機能が無ければ)上の条件は緩和され、認証局から購入したMicrosoftとのクロスルート証明書で署名されてればおk
  • テストモード(bcdedit /set testsigning on)で起動すればオレオレ署名なカーネルモードドライバでもロードされる
  • それでもドライバに絶対に署名したくないでござるであれば、起動オプションで「ドライバー署名の強制を無効にする」を選択

ってとこかな。

これ公式文書にも当たらず自分で検証もせず他人の書いた文章を鵜呑みにして最終手段のはずの「ドライバー署名の強制を無効にする」を設定してくださいなどと製品サポートに書いてしまう法人が多数あるのはヤバさ可視化されていいっすね、やっぱりこの施策って失敗だったんじゃないですかね…

(追記) Windows10 20H2(2009)だと「信頼されたルート証明書」としてオレオレ証明書を追加してあれば、デバイスマネージャ上でも「デジタル署名されていません」ではなく正しくオレオレ署名者の名前が表示されるようになっとるね、バグだったんですかねこれ…

@コード署名って本当に有用?

それにコード署名って結局のところ配布物が改変されてないことを証明することが精一杯で

  • コードに悪意が無いかの証明 → たかが認証局にコードの安全性の審査なんてできるわけがない、そもそも悪意ないヤツが書いたコードでも大災害は起きるのだ
  • EV証明書なら責任の所在が明確 → 責任取れといわれて取るのは実は世間の少数派、会社畳んで夜逃げドロンのケースがどんだけ多いことか

であってスーパーの野菜に生産者表示にある顔写真のものではないのよな。

なのになぜコード署名にMicrosoftが信頼する認証局のEV証明書が必要になるのか、これは事務的な問題でしかなくPGPのキーサインパーティーでは鍵指紋と身分証明書を持ちあって本人確認を行うけど、そのプロセスを認証局が代行するだけなんよな(どーせ帝国データバンクとか東京商工リサーチなんかの足元にも及ばないザル調査だと思うんだけどね)。

その結果として失われたものは多くて

  • 本人確認プロセスは認証局の特権となり、非常に高価なものとなっってしまった上に、信頼の連鎖モデルは失われてしまった
  • EV証明書とその署名自体に価値があると勘違いする連中が増え、セキュリティ的にはむしろモラルが下がった

ってのは大問題よね、署名されてればオッケーならWindowsのエラー番号やKB番号そしてハードの名前で検索すると雲霞の如くヒットするWindows修復ツールを騙るマルウェアのインストーラーだって署名されとるわけでさ。

とはいえだ、Microsoftがそんなにコード署名ごときを重視するのであれば、こっちもオレオレ証明書いっこ作っておいた方が運用面で楽になるよね、そもそもOffice製品のVBAマクロやPowerShellなんかもコード署名しといた方がいいケースも多いしな。

ということで次回はopenssl(1)?知らないですねそんな子のためのオレオレ認証局の建て方とコード署名証明書の作り方でも書くか…

*1:例外もあって、アップグレードインストールあるいは署名の日付がWindows 10のリリースより前という条件ならセキュアブート無効と同じ条件に緩和されるようだ