メインコンテンツへスキップ
見出し画像

Uber ADRの使い方——AIエージェントが「やったこと」をログから集め、危ない振る舞いを2段で検知する

    朝、AIエージェントの夜間ログを開いたら、見覚えのないファイルを読んだ記録が1行ありました。

    誰も頼んでいない。でも、止める仕組みも無かった。

    これ、ありませんか?

    Uber ADRは、その「見覚えのない1行」を機械で拾うためのオープンソースです。今月1,509スター増(GitHub Trending月間・2026年9月2日取得)。作者はUber、ライセンスはApache 2.0。

    READMEの一言に性格が出ています。Agentic AI Detection and Response。AIエージェント向けの「検知と対応」。Uberの本番で動いていて、論文はMLSys 2026に採択されたと書いてあります。

    この記事では、Uber ADRの使い方を「何者か・4つの部品・集める・棚卸しする・判定する」の順で書きます。うちではまだ本番に入れていないので、READMEから読めることと、うちならこう試すという提案を分けて書きます。

    出典はGitHub uber/ADRのREADMEと、同リポジトリのSensor、Discovery、Detectionの各README。2026年9月10日に本文を確認しました。

    Uber ADRは何者か——AIエージェント向けの「検知と対応」

    セキュリティの世界には、EDRという言葉があります。端末の振る舞いを記録して、怪しい動きを検知し、対応する。

    ADRは、その対象をAIエージェントに置き換えたものです。

    READMEが挙げる守る相手は2つ。CursorやClaude Codeのような社員が使う道具と、顧客に向いたAIサポート。どちらも、人が全部の操作を見ていられない。

    で、何を「振る舞い」として見るのか。エージェントの意図、ツールの呼び出し、実行の跡。READMEは、macOS・Linux・Windowsで7つ以上のAIコーディングツールから、これを集めると書いています。

    つまりUber ADRは、AIエージェントの「やったこと」をあとから機械が読める形にして、その中から危ないものを拾う道具です。

    4つの部品と、まだ無い1つ

    READMEの構成は、5つの能力に分かれています。公開されているのは4つ。

    Discoveryは、端末に入っているAIアプリ・CLIエージェント・IDE拡張・モデル実行環境・MCPサーバーを棚卸しする。

    Observabilityは、エージェントのログを集めて揃える。リポジトリでは Sensor/ フォルダ。

    Benchmarkは、検知の腕を測る試験。300以上のタスク、133のMCPサーバー、17種類の攻撃手法をカバーすると書いてあります。

    Detectionは、2段構えの検知器。

    そして5つ目のPrevention。READMEにはこうあります。「この部品は現在のオープンソース公開には含まれていない。Stay tuned.」

    ここ、大事です。Uber ADRは今のところ「止める」道具ではなく、「見つける」道具。止めるのは、まだ自分で組む必要があります。

    画像


    STEP1: Sensorで「やったこと」を集める

    最初に入れるのは、Sensorです。

    入れ方は1行。

    pip install adr-sensor

    集め方が、少し意外でした。Sensorは実行時にフックを差し込むのではなく、各ツールが手元に残しているログを読む。READMEの言い方は「複数のAIエージェント基盤のログを解析し、統一スキーマへ揃える」。

    対応しているのは7つ。Claude Codeは ~/.claude/projects/ のJSONL。CursorはSQLite。Codex CLIは ~/.codex/sessions/。ほかにCline、Claude Desktop、Warp、opencode。

    いや、ログを読むだけなら自分で書けるでしょ?

    僕もそう思ってたんですが、揃えるのが大変なんです。7つのツールは、ログの形も置き場も全部違う。Sensorはそれを AgentEvent という1つの形にする。誰が・いつ・どのモデルで・どのツールを・どんな引数で呼び、結果はどうだったか。

    実行はこう。

    adr-sensor                       # 全部のエージェント
    adr-sensor --source claude       # Claude Code だけ
    adr-sensor --output-format jsonl # JSONL で出す

    Python 3.9から3.13、macOS・Linux・Windowsで動く。OSに無いツールは自動で飛ばされます。

    STEP2: Discoveryで「何が入っているか」を棚卸しする

    集める前に、そもそも何が入っているかを知りたい。それがDiscoveryです。

    uv run adr-discovery --dry-run --json

    棚卸しするのは、AIのバイナリ、デスクトップアプリ、エージェント、MCPサーバー、スキル、プラグイン。READMEは「知らない面を、確認用に印を付ける」と書いています。

    終了コードに意味があります。0なら全部見えた。2なら、見えない場所があったが棚卸し自体は出た。 無人で回すなら、この2を拾って人に知らせる、という設計にできる。

    前回との差分も取れます。

    uv run adr-discovery --diff /path/to/snapshot.json --dry-run --json

    先週は無かったMCPサーバーが今週ある。これが分かるだけで、「誰が何を足したか」の会話ができます。Python 3.11以上、外部ライブラリなし。

    画像


    STEP3: Detectionで判定する——2段構え

    集めたログを、危ないかどうか判定するのがDetectionです。

    git clone https://github.com/uber/ADR
    cd ADR/Detection
    uv sync
    export ANTHROPIC_API_KEY="..." OPENAI_API_KEY="..."

    鍵が2社ぶん要る理由が、2段構えです。

    1段目はtriage。READMEでは gpt-4o が受け持ち、まず広く拾う。2段目はreasoning。claude-sonnet-4-6 をClaude CLI経由で呼び、拾ったものを深く読む。READMEの表現は「高い再現率の選別と、より深いエージェント的な推論を組み合わせる」。

    1段目で取りこぼさず、2段目で誤報を落とす。人間の当直と同じ形です。

    鍵を用意する前に腕試しをしたいなら、--detector llamafirewall。鍵なしで動く比較用の検知器で、既定の adr と並べて結果を見られます。

    uv run python main_detector.py --results-dir "$BENCH"
    uv run python main_detector.py --detector llamafirewall --results-dir "$BENCH"

    出力は {detector}_baseline_analysis.json。1件ごとの判定と、精度・再現率・F1・混同行列が入ります。

    数字の読み方——精度1.000・再現率0.667

    READMEが載せている数字を、そのまま書きます。

    ベンチマークは303タスク。良性261、悪性42。133のMCPサーバーを使い、脅威のカテゴリは7つ。認証情報の露出、データの持ち出し、範囲の逸脱、監視のやりすぎ、金銭の操作、制御フローの乗っ取り、情報の忠実性への攻撃。

    ADRの2段検知器の結果は、精度1.000、再現率0.667(42件中28件)、F1が0.800、誤報0。

    ここで、数字の読み方を1つ。

    精度1.000は「危ないと言ったものは全部本当に危なかった」。再現率0.667は「本当に危ないもののうち、3分の2を拾えた」。つまり残りの3分の1は見逃している。READMEも隠していません。

    で、これをどう評価するか。私は「誤報ゼロで3分の2」は、当直の1段目としては十分だと思います。誤報が多い検知器は、人が読まなくなる。読まれない検知は、無いのと同じです。

    ただし、Uber側のベンチマークでの数字であって、自分の環境で同じになる保証はどこにもない。ここは、自分のログで測り直すところです。

    画像


    うちならこう試す(未実施の提案)

    うちは、Claude CodeとCodexを毎日走らせています。まだADRは入れていません。入れるなら、こう試します。

    まずSensorだけ。adr-sensor --source claude --output-format jsonl を毎朝1回。何が集まるかを1週間見る。

    次にDiscoveryの差分。週1回スナップショットを取って --diff で比べ、知らないMCPサーバーが増えていたら人に知らせる。

    Detectionは最後。鍵が2社ぶん要るので、まず llamafirewall で腕試しをして、それから adr に切り替える。誤報がどれだけ出るかを、自分のログで測る。

    止める仕組みは、Preventionが来るまで自前です。うちなら、検知結果を朝の報告に1行足すところから。

    これは提案であって、実測ではありません。やってみたら、また書きます。

    Uber ADRの使い方を一言で

    AIエージェントのログを、Sensorが7ツールぶん1つの形に揃える。Discoveryが端末の中身を棚卸しし、差分を出す。Detectionが2段(gpt-4o で選別・claude-sonnet-4-6 で推論)で判定する。数字は精度1.000・再現率0.667。止める部品はまだ無い。

    今日、5分でできること。

    pip install adr-sensor を打って、adr-sensor --source claude を1回だけ走らせてください。出てきたJSONの tool_name の列を眺める。昨日AIが何を呼んだかが、そこに全部並びます。見覚えのない1行があれば、それがこの道具を入れる理由です。

    ▶ 関連記事: oMLXの使い方——Macの中でモデルを常駐させて、続きの会話を計算し直さない

    ▶ 関連記事: RustDeskの使い方を、自分のサーバーで完結させるまで——hbbsとhbbrが何をしているか


    OSSを実務で活用するための6大特典

    OSSの選び方や、AIエージェントを動かすときの見張り方を整理したい方へ。活用を進めるための6大特典をご案内しています。

    👉 OSS活用の6大特典を見る

     
     
    今バズってるAI系オープンソースを毎日発信|海外で話題のGitHubレポジトリを最速で紹介|“使えるかどうか”まで解説|AI・開発トレンドを追う人向け|AIメディア|最新情報を毎日執筆中|フォロー推奨👇

    あなたへのおすすめ