# 運用保守・バグ修正 --- ## このフェーズでやること - 入口が障害なだけで、頼む → PR → merge 判断はいつも通り - **A**: AWS のログを **read-only** で調査して、原因を直して PR - **B**: 500 エラーなどの alert を起点に、agent が**自動で修正 PR** を作る - **stage 起点が必須**のフェーズ(仕込みバグは地続きで再現しない) --- ## シナリオ A の構成(read と write を分ける) box を分けるのは、**ログ(信用できない入力)を読む agent に書き込み権限を持たせない**ため — ログ経由の乗っ取りは guardrail をすり抜けることが実証されている
flowchart LR O["observe box(read-only)"] -. "ログ調査" .-> AWS["AWS(本番相当)"] O -- "調査結果だけ渡す" --> D["dev box(write)"] D -- "修正 PR" --> GH["GitHub"]
--- ## シナリオ A: 進め方(3 つの claude に順番に頼む) - `git switch stage/06-readings-drift-broken` から始める - ① host の claude に: `/observe-session で stage/06 のデプロイ先を調べる observe box を立てて` - ② observe box の claude に: `本番相当のログを読んで、readings 診断がどの層で壊れているか切り分けて` - ③ dev box の claude に: `調査で分かった原因を stage/06-readings-drift-broken で直して PR にして` --- ## シナリオ B の構成(alert から自動で修正 PR)
flowchart LR AWS["AWS(本番相当)"] -- "500 エラーなどの alert" --> FX["常駐 agent(SRE fixer)"] FX -- "修正 PR(自動)" --> GH["GitHub"] H["人間"] -- "merge 判断" --> GH
--- ## シナリオ B: デモの流れ - `git switch stage/08-server-500-broken` → deploy して 500 を起こす(講師デモ) - alert が上がった後は**無人**: 常駐 agent が調査して修正 PR を作る(※ alert からの自動起動は準備中のため、デモでは起動だけ講師が手で蹴る) - PR は自動・**merge は人間** - 自分の AWS で回すなら `examples/sre-bedrock/README.md` --- ## シナリオ C: ログ経由のプロンプトインジェクション - シナリオ A の「ログ経由の乗っ取り」を**実演で確かめる** - 汚染上流が **エラー本文に注入命令**を返す(502) - app がその**本文をそのままログに出す**のが穴(`external.ts`) - **lethal trifecta**: 本番データ + 信用できない入力 + 外部送信の同居 - stage: `stage/09-log-injection-broken` / `stage/10-log-injection-fixed` --- ## 攻撃: naive な単一 agent が乗っ取られる - **read+write 持ち・runbook なし**の agent が汚染ログを命令として実行 - 検出: canary `INJECTED-CANARY-7F3A` を echo したら成立 - LogJack(arXiv): guardrail 検知 **0〜1/32**、命令実行 **最大 86%** - **guardrail 頼みは破れる**(モデルの行儀を防御にしない) - AWS 不要でローカル再現できる --- ## 防御: 2 層で無害化する - **層1(prompt)**: runbook 規律 — ログは untrusted、固定テンプレのみ - **層2(permission)**: read-only IAM で **本番を壊せない**(AWS mutate 不能) - 送信遮断は network 未達で **運用規律が担う**(CDN に出ない) - 攻撃が成立するのは**両層が欠けた時だけ** - 既存の observe box・runbook・IAM を流用(新規実装ゼロ) --- ## シナリオ C: 攻撃 vs 防御
flowchart LR L["汚染ログ(注入命令入り)"] L -- "read+write・runbook なし" --> N["naive agent"] N --> P["乗っ取り成立(canary echo)"] L -- "read-only + runbook" --> O["observe box"] O --> S["無効化(規律 / IAM)"]
--- ## おわり **全 5 フェーズ完了** [← 一覧へ戻る](index.html)