
X-Stat Push Option Injection による GitHub RCE
教育目的および許可を得たセキュリティ研究目的のみに使用してください。
明示的な書面による許可なしに、いかなるシステムに対しても使用しないでください。
CVE-2026-3854 は、GitHub Enterprise Server(および GitHub.com)の git push パイプラインにおけるリモートコード実行(RCE)の脆弱性です。
クライアントが push オプション(git push -o)を指定すると、GitHub の内部 Ruby コードは、各オプション値をセミコロンで区切ったフィールドとして連結し、X-Stat ヘッダーを構築します。値はそのまま(サニタイズなしで)挿入されるため、攻撃者は push オプションにセミコロンを埋め込むことで、ヘッダーに任意のキーと値のフィールドを注入し、セキュリティ上重要な設定を上書きできます。最終的には、git ユーザーとしてサンドボックスなしの RCE を達成します。
X-Stat: repo_id=12345;user_id=alice;rails_env=production;...;push_option_0=<USER INPUT>
push オプションの値として normal_value;rails_env=staging を注入すると、次のようになります:
...;push_option_0=normal_value;rails_env=staging
パーサーは各キーの最後の出現を使用するため、rails_env は(サンドボックスなしの)staging になり、先に設定されていた正規の production 値を上書きします。
list[str] / dict[str, str] 型ヒントを使用)python3 exploi-git.py
このスクリプトは、3 つのデモをすべてメモリ内で連続して実行します。ネットワーク接続、シェルコマンド、ファイル書き込みは一切行いません:
| Demo | 内容 |
|---|---|
| 1 | rails_env を上書きする基本的なセミコロンインジェクション |
| 2 | 3 段階からなる概念的な RCE チェーンの全体 |
| 3 | パッチ適用後の動作 — セミコロンがパーセントエンコードされ、インジェクションが無効化される |
GitHub は、push オプション値を X-Stat ヘッダーに挿入する前にセミコロンをパーセントエンコードすることで、この脆弱性を修正しました:
normal_value;rails_env=staging → normal_value%3Brails_env=staging
これにより、セミコロンは値のリテラルな一部となり、インジェクションは成立しなくなります。
このリポジトリは、教育目的および許可を得たセキュリティ研究の支援のみを目的として提供されています。著者は悪用に対する一切の責任を負いません。自分が所有していないシステムに対してテストを行う前に、必ず明示的な書面による許可を取得してください。