StealMyBitcoin Challenge で実証された PHP2Shell 侵害:PHP RCE の PoC を提供

Hacker Demonstrates PHP Remote Code Execution in StealMyBitcoin Challenge, Shares Exploit

2026/10/26 gbhackers — Steal My Bitcoin チャレンジにおいて、セキュリティ研究者が実証したのは、PHP のリモート・コード実行 (RCE) エクスプロイトの実証である。この概念実証 (PoC) エクスプロイトが示すのは、特別に細工された HTTP リクエストによりメモリ破損を引き起こし、PHP 内部のメモリアドレスを漏えいさせ、脆弱なサーバ上でコマンドを実行できることだ。GitHub で KillaBoi というユーザー名を使用する研究者は、公開リポジトリでエクスプロイトを公開し、PHP 8.4.26 を対象とする攻撃の詳細を説明している。

今回の実証は、CVE-2026-109618/CVE-2026-109619 という 2件の深刻な PHP 脆弱性が公開されたことを受けて行われた。これらは総称して PHP2Shell と呼ばれ、いずれも CVSS v4.0 スコア 9.2 と評価されている。脆弱な条件下では、未認証のリモート攻撃者によるコード実行に至る恐れがある。

PHP のリモートコード実行エクスプロイト

今回のエクスプロイトは、PHP のセッション・アップロード進捗管理機能とメモリ管理処理を標的としている。研究者の技術資料によると、特別に細工された multipart/form-data 形式の HTTP リクエストにより、PHP は実際のリクエスト・サイズを大幅に上回るメモリを確保するよう誘導される。

この攻撃では、深くネストされたフォーム・フィールド名を使用し、PHP に設定された128 MiB のメモリ制限を使い切らせる。その結果、再利用されるワーカー・プロセス内に、古いセッション関連データが残る可能性がある。その後に続くリクエストにおいて、この状態を悪用することで、PHPSESSID Cookie を通じてメモリアドレスを漏えいさせる。

攻撃の4段階
段階技術的な動作
ヘルスチェックPHP 8.4.26 が稼働していることを確認
ヒープアドレスの漏えい256バイトの Cookie を通じて Zend ヒープのベースアドレスを取得
コードアドレスの漏えい16バイトの Cookie を通じて zval_ptr_dtor のポインターを漏えいさせる
RCE の実行偽造した HashTable のクリーンアップコールバックを誘発し、zif_system を呼び出す

2種類のメモリアドレスを取得することで、攻撃者はアドレス空間配置のランダム化 (ASLR) を回避しやすくなる。この ASLR というセキュリティ機構により、PHP の実行可能コードとヒープメモリの配置をランダム化し、攻撃を困難にする。

研究者は、細工されたデストラクター・コールバックを含む、偽造された PHP の HashTable を構築した。クリーンアップ処理の際、この破損したデータ構造を PHP が解釈すると、その system() 関数に対応する内部ハンドラー zif_system が呼び出される。これにより、攻撃者が意図したコマンドの実行につながる。

ローカルテストの出力例

研究者が公開したローカルテストの出力には、以下の内容が含まれている。

[health] PHP 8.4.26 confirmed
[heap] strict Zend base 0x78113e800000
strict zval_ptr_dtor 0x615b1f512930
{"stage":"final","execution_proof_verified":true}

この出力が示すのは、PHP のバージョン確認/Zend ヒープのベースアドレスの取得/コード領域のアドレス取得/最終段階での実行証明である。

公開された PoC は Python 3.11 以降で動作し、外部のサードパーティ・ライブラリを必要としない。この PoC は HTTP リクエストを生成し、メモリ情報の漏えいを検証するとともに、各攻撃段階の証拠を記録する。

公開チャレンジ環境での攻撃成功を報告

研究者の報告によると、2026年10月25日15時47分38秒 (UTC) に、公開されているチャレンジ環境に対するエクスプロイト実行の成功に至った。最終的な HTTP POST リクエストに対して、PHP のメモリ枯渇エラーを引き起こし、その結果として Wallet Import Format (WIF) 形式の秘密鍵が返された。

ただし、取得した秘密鍵がチャレンジ・サイトに掲載されている Bitcoin アドレスと一致しなかったことを、研究者は指摘している。チャレンジの作成者も、この不一致を認めた。したがって、秘密鍵形式のデータが取得されたことと、チャレンジで指定された Bitcoin アドレスに対応する正しい秘密鍵を取得できたことを、区別して捉える必要がある。

Docker 環境での再現結果

研究者は、制御された Docker 環境でもコマンド実行を再現し、テスト用バイナリから正常に出力を取得した。

PoC の実行成功率(報告値)

  • 10回の試行:成功率 70%
  • 7回成功:3回失敗

この結果は、特定のテスト環境におけるものであり、他の PHP 環境での成功率を示すものではない。失敗の主な原因は、ワーカー・プロセスの選択に関する競合状態と、メモリ・レイアウトの違いだった。

今回の PoC は、4つの CLI サーバ・ワーカーを使用する、Alpine Linux 上の PHP 8.4.26 に合わせて調整されている。したがって、エクスプロイト内にハードコードされたメモリ・オフセットが、別の PHP ビルドにも適用できるとは限らない。

今回の実証は、PHP のメモリ管理の脆弱性が、単なるリソース枯渇から情報漏えいへ、さらにはリモート・コマンド実行へと発展する可能性を示している。

修正済みバージョンと推奨対策

ユーザー組織にとって必要なことは、使用している PHP のブランチに応じて、脆弱なインストールを以下の修正済みバージョンへ更新することである。

PHP ブランチ修正済みバージョン
PHP 8.28.2.35
PHP 8.38.3.36
PHP 8.48.4.27
PHP 8.58.5.12

また、管理者は、以下のような不審な動作を監視する必要がある。

  • 通常とは異なる multipart/form-data リクエスト
  • 繰り返し発生する PHP のメモリ枯渇エラー
  • 異常なセッション Cookie
  • PHP ワーカープロセスによる予期しないコマンド実行

今回公開されたエクスプロイトは、特定のチャレンジ環境向けに調整されたものである。しかし、PHP2Shell と呼ばれる 2件の脆弱性が、実際に及ぼす影響を示す、重要な実証となっている。

悪用状況の整理: 今回確認されたのは、研究者による公開チャレンジ環境および制御された Docker 環境でのコード実行の実証である。これは、実運用システムに対する攻撃者による悪用 (in-the-wild) が確認されたことを意味するものではない。