CERT Coordination Center (CERT/CC, Carnegie Mellon University)は4月10日(米国時間)、「VU#123335 - Multiple programming languages fail to escape arguments properly in Microsoft Windows」において、Windows上で動作する複数のプログラミング言語から引数を適切にエスケープしない脆弱性を発見したと報じた。この脆弱性はアプリケーションのコマンドインジェクションにつながるとして注意を呼びかけている。

  • VU#123335 - Multiple programming languages fail to escape arguments properly in Microsoft Windows

    VU#123335 - Multiple programming languages fail to escape arguments properly in Microsoft Windows

脆弱性の詳細

多くのプログラミング言語にはオペレーティングシステム上で任意のコマンドを実行する機能(Go言語のexec.CommandやPythonのsubprocess.runなど)が用意されている。これら機能はコマンド名とコマンドに渡す引数(以下、コマンドライン引数と呼称)を受け取る仕組みがあり、プログラミング言語は環境に合わせた方法にて指定されたコマンドを起動する。

Windowsの場合は「CreateProcess」と呼ばれるシステム標準のアプリケーション・プログラミング・インタフェース(API: Application Programming Interface)を使用してコマンドを実行する(参考:「プロセスを作成する - Win32 apps | Microsoft Learn」)。

このAPIに渡すコマンドライン引数は適切にエスケープすることが期待されており、Microsoftは2011年に誤った使用方法と解決策について文書化している(参考:「Everyone quotes command line arguments the wrong way | Microsoft Learn」)。

今回発見された不具合は、複数のプログラミング言語においてこのコマンドライン引数のエスケープが不適切とされるもので、攻撃者は慎重にコマンドライン引数を組み立てることで任意のコマンドを実行する可能性がある。

この脆弱性は脆弱性情報データベース(CVE: Common Vulnerabilities and Exposures)に複数登録されており、「CVE-2024-1874」、「CVE-2024-22423」、「CVE-2024-24576」、「CVE-2024-3566」として追跡されている。

脆弱性の影響を受けるプログラミング言語

脆弱性の影響を受けるとされるプログラミング言語およびバージョンは次のとおり。

  • Haskell Programming Language processパッケージ バージョン1.0.0.0から1.6.19.0より前のバージョン
  • Node.js
  • Rust 1.77.2より前のバージョン
  • PHP
  • yt-dlp バージョン2024.04.09より前のバージョン

脆弱性を修正したプログラミング言語

脆弱性を修正したプログラミング言語およびバージョンは次のとおり。

  • Haskell Programming Language processパッケージ バージョン1.6.19.0
  • Rust 1.77.2
  • yt-dlp バージョン2024.04.09

脆弱性の影響を受けないプログラミング言語

脆弱性の影響を受けないとされるプログラミング言語は次のとおり。

  • Go Programming Language

上記以外のプログラミング言語は調査中とされ、影響の有無は各言語の開発者に問い合わせる必要がある。CERT Coordination Center (CERT/CC, Carnegie Mellon University)は影響を受ける言語を使用していてパッチが提供されていない場合、アプリケーションの開発者はアプリケーション側で必要なエスケープ処理を実装するか、または悪意のある処理を無効化する必要があるとしている。