BatBadBut コマンド・インジェクション:Windows 上の Rust/Node.js/PHP などに影響

‘BatBadBut’ Command Injection Vulnerability Affects Multiple Programming Languages

2024/04/12 SecurityWeek — 複数のプログラミング言語から、Windows アプリケーションのコマンド・インジェクションにつながるという深刻な脆弱性について、Flatt Security のバグハンターたちが警告している。この BatBadBut と名付けられた問題は、Windows オペレーティング・システムにおいて、”CreateProcess” 関数でバッチ (bat) ファイルが実行され、”cmd exe” プロセスが生成される際に、プログラミング言語がコマンド引数を適切に回避しないことに起因する。


大半のプログラミング言語は “CreateProcess” 関数をラップすることで、ユーザーフレンドリーなインターフェイスを提供しているが、関数に渡されるコマンド引数が適切にエスケープされていない。

Flatt Security の 研究者である RyotaK は、「コマンド引数の解析ルールが複雑であり、プログラミング言語のランタイムは、コマンド引数を適切にエスケープできない」と説明している。

この問題が原因となり、バッチファイルのコマンド引数セクションを制御できる攻撃者が、Windows アプリケーションにコマンドを注入する可能性が生じる。

しかし、そのための前提としては、対象となるアプリケーションが Windows 上でコマンドを実行する必要がある。さらに、コマンド・ファイルの拡張子を指定してはならず、攻撃者がコマンド引数を制御する必要があり、プログラミング言語のランタイムが “cmd exe” のコマンド引数のエスケープに失敗する必要がある。

RyotaK は、「Windows はデフォルトで、PATHEXT 環境変数に “.bat” と “.cmd” を取り込んでいる。そのため、開発者が実行するコマンドと同じ名前のバッチ・ファイルが存在する場合には、開発者の意図に反してバッチ・ファイルが実行される可能性が生じる」と述べている。

RyotaK は、「大半のアプリケーションにおいて、この脆弱性が影響を及ぼすことはなく、また、いくつかの緩和策が利用可能である。さらに、このバグが存在するとされるプログラミング言語の中には、バッチ・ファイルに別のエスケープ・メカニズムを追加して対処するという、措置を講じているものもある」と指摘している。

カーネギー・メロン大学 CERT/CC の アドバイザリによると、このセキュリティ欠陥には、CVE-2024-1874/CVE-2024-22423/CVE-2024-24576/CVE-2024-3566 という4つの CVE 識別子が発行されているが、影響を受けるプログラミング言語は多くても1つか2つだという。

CERT/CC は、「アプリケーションのランタイムが、この脆弱性に対するパッチを提供しておらず、ユーザー制御の引数を持つバッチ・ファイルを実行する場合には、問題となるコマンドの実行を防ぐために、データのエスケープと無効化を実行する必要がある」と指摘している。

現在までに判明しているのは、Haskell プロセス・ライブラリ/Rust/Node.js/PHP/yt-dlp などが影響を受けることである。なお、HaskellRustyt-dlp はパッチを発表している。