
PHP 8.1.0-dev User-Agentt バックドア リモートコード実行 (RCE)
User-Agentt バックドア リモートコード実行 (RCE)重大度: Critical (CVSS 相当: 10.0)
脆弱性タイプ: サプライチェーンバックドア / リモートコード実行 (RCE)
影響を受けるソフトウェア: PHP 8.1.0-dev (開発ビルドのみ)
攻撃ベクトル: リモート (認証不要)
必要な認証: なし
ユーザー操作: 不要
影響: システム全体の完全な侵害
PHP 8.1.0-dev User-Agentt バックドアは、オープンソースソフトウェアの歴史の中でも最も悪名高いサプライチェーン侵害の一つです。プログラミングミスから生じる従来の脆弱性とは異なり、この問題は悪意のあるコードが公式のPHPソースコードリポジトリに意図的に挿入されたことに起因します。
このバックドアは、攻撃者がPHPのGitインフラストラクチャの侵害に成功した後、2021年3月にPHP 8.1.0-devの開発スナップショットに出現しました。悪意のあるコミットは、信頼されたPHPメンテナを装い、特別に細工されたHTTPヘッダーを受信した際に任意のPHPコードを実行できる隠しメカニズムを導入しました。
このバックドアは発見・除去されるまで短期間しか存在しませんでしたが、侵害された開発ビルドのいずれかをデプロイしたサーバーは、即座に認証不要のリモートコード実行 (RCE) に対して脆弱になりました。
このインシデントはPHPの開発ワークフローを根本的に変え、最終的にはPHPソースリポジトリが自己ホスト型のGitインフラストラクチャから移行するきっかけとなりました。 :contentReference[oaicite:0]{index=0}
ほとんどのリモートコード実行の脆弱性は、以下の原因から発生します:
しかし、この脆弱性は異なります。
これはコーディングバグではありません。
これは、正当なPHPソースコードの中に隠された意図的に仕掛けられたバックドアでした。
既存の弱点を悪用する代わりに、攻撃者はPHP自体を改変し、HTTPリクエストを行う誰もが提供する任意のPHPコードを実行できるようにしました。
そのため、このインシデントはソフトウェアサプライチェーン攻撃の最もよく知られた例の一つとなっています。
2021年3月28日、PHPのGitリポジトリに2つの不審なコミットが出現しました。
両方のコミットは、著名なPHPメンテナからのものに見えました。
最初は無害に見えました。
コミットメッセージは、ありふれたタイプミスの修正に似ていました。
しかし、研究者たちはすぐにPHPインタプリタに追加された不審なコードに気づきました。
挿入されたコードは、受信したHTTPリクエストから独自のヘッダーを検索していました:
User-Agentt
余分な**「t」**に注目してください。
この微妙なスペルの違いにより、カジュアルなレビューではバックドアが隠れたままでした。
ヘッダーがトリガー文字列で始まる場合:
zerodium
PHPはその後に続くすべてを、次を使って即座に実行しました:
zend_eval_string()
これにより、事実上誰でもリモートで任意のPHPコードを実行できました。
悪意のあるコミットは発見から数時間以内に削除されました。その後の調査では、攻撃者はメンテナの署名鍵を正規に入手したのではなく、PHPのGitインフラストラクチャを侵害したことが示されました。 :contentReference[oaicite:1]{index=1}
挿入されたコードは、おおよそ次のようなロジックを実行していました:
Incoming HTTP Request
│
▼
Read User-Agentt Header
│
▼
Does header start with "zerodium"?
│
Yes ▼
Execute remaining text as PHP
│
▼
Attacker gains Remote Code Execution
ヘッダーを無害なメタデータとして扱う代わりに、PHPはそれを実行可能なPHPコードとして直接評価しました。
通常、HTTPリクエストには次のようなヘッダーが含まれます:
GET / HTTP/1.1
Host: example.com
User-Agent: Mozilla Firefox
侵害されたPHPバージョンは、さらに以下も処理していました:
User-Agentt:
その値が次の文字列で始まる場合:
zerodium
PHPは以下を呼び出しました:
zend_eval_string()
残りの内容が実行可能なPHPになりました。
概念的に:
User-Agentt:
zerodium
│
▼
zend_eval_string(payload)
│
▼
Remote Code Execution
Attacker
│
│ HTTP Request
▼
GET /
User-Agentt: zerodiumsystem("id");
│
▼
PHP 8.1.0-dev
│
▼
Backdoor Triggered
│
▼
system("id")
│
▼
Command Executed
│
▼
Output Returned
認証は不要です。
セッションも不要です。
認証情報も不要です。
たった1つのHTTPリクエストで十分でした。
攻撃者は意図的に
User-Agentt
を選びました。
User-Agent
の代わりにです。
その理由は:
この小さなタイプミスが、完全なリモートコード実行バックドアを隠蔽していました。
該当するのは:
PHP 8.1.0-dev
具体的には、2021年3月のインシデント中に公開された侵害された開発スナップショットです。
以下のような安定版リリースは:
影響を受けませんでした。
攻撃者に必要なのは、以下のみでした:
認証は不要。
ブルートフォースも不要。
ログインも不要。
事前のアクセスも不要。
悪用に成功すると、攻撃者は以下が可能になります:
実際には、この脆弱性によりサーバー全体が完全に侵害されます。
管理者は、以下の値を公開しているシステムを直ちに調査する必要があります:
PHP/8.1.0-dev
以下のようなレスポンスヘッダー内で:
X-Powered-By:
PHP/8.1.0-dev
また、HTTPログに以下の文字列を含む不審なリクエストがないかも確認する必要があります:
User-Agentt
または
zerodium
現在では、多くの侵入検知システムやIPS製品に、この攻撃パターン専用のシグネチャが含まれています。 :contentReference[oaicite:2]{index=2}
考えられる痕跡には以下が含まれます:
User-Agentt を含むリクエストzerodium で始まるヘッダー値| プロパティ | 値 |
|---|---|
| 認証 | 不要 |
| ユーザー操作 | 不要 |
| 複雑さ | 非常に低い |
| 必要な権限 | なし |
| リモート | はい |
これは、攻撃者が細工されたHTTPリクエストを送信するだけでよいため、悪用が最も容易なリモートコード実行の脆弱性の一つと考えられています。
本番システムにPHPの開発スナップショットをデプロイしてはいけません。
サーバーが侵害されたビルドを実行していることが判明した場合:
このインシデントは、いくつかの重要な教訓を示しました:
この侵害はPHPの開発インフラストラクチャの変更を加速させ、業界全体におけるソフトウェアサプライチェーンセキュリティの重要性の高まりを浮き彫りにしました。 :contentReference[oaicite:3]{index=3}
PHP 8.1.0-dev User-Agentt バックドアは、主要なオープンソースプロジェクトを標的としたソフトウェアサプライチェーン攻撃の最も重要な例の一つであり続けています。攻撃者はプログラミング上の欠陥を悪用するのではなく、言語のソースコードに直接隠しバックドアを挿入し、特別に細工された User-Agentt HTTPヘッダーを通じて、認証なしで任意のPHPコードをリモート実行できるようにしました。侵害された開発スナップショットはすぐに削除され、安定版のPHPリリースは影響を受けませんでしたが、このインシデントは、ソフトウェア開発インフラストラクチャの保護、コードの来歴の検証、本番環境への開発ビルドのデプロイ回避の決定的な重要性を浮き彫りにしました。現在、この脆弱性はサプライチェーンセキュリティにおける画期的な事例として広く研究されており、ソフトウェアのビルドプロセスの完全性がコード自体のセキュリティと同様に重要であることを思い起こさせるものとなっています。
| 手法 | 説明 |
|---|
| T1195 | サプライチェーン侵害 |
| T1059 | コマンドおよびスクリプトインタプリタ |
| T1505 | サーバーソフトウェアコンポーネント |
| T1105 | イングレスツール転送 |
| T1071 | アプリケーション層プロトコル |
| T1106 | ネイティブAPI |
| T1055 | プロセスインジェクション (悪用後の可能性あり) |
| T1027 | 難読化されたファイルまたは情報 |