3年前のトークン1つで本番GitHubの管理者に — 25分で落ちた理由
公開Dockerイメージのビルド履歴に残っていた2023年のGitHub PATが生きていて、AIエージェントが25分で本番リポジトリの管理者権限を取った事例。
#なぜ今日これを選んだか
「古い秘密は消えない」を一番分かりやすく見せてくれる事例だったから。攻撃者は難しい脆弱性を突いたのではなく、公開イメージの履歴を読んだだけ。しかも実行したのは人間ではなくAIエージェントで、所要時間は25分。自分のリポジトリでも起こり得る話として読んだ。
#要点
- Basetenが公開していたDockerイメージ(Harbor)のビルド履歴に、2023年3月発行のGitHub Personal Access Tokenが残っていた
- そのPATは3年以上経っても失効しておらず、メインリポジトリ・GitOpsリポジトリ・顧客ごとのプライベートリポジトリに読み書きできる管理者権限を持ったままだった
- 発見から権限確認までを自動ハッキングAIエージェントが約25分で完了。Baseten側は報告から数日でトークンを回転し、イメージを非公開にした
- HNでは「AIエージェントは信頼できない従業員ではなく、未承認のCI/CDジョブとして扱え(リポジトリスコープ限定・デフォルト読み取り専用・出口監視)」という指摘が支持を集めた
#自分にとっての示唆
Dockerイメージのレイヤーは「消したつもり」が一番危ない場所で、RUN で使った環境変数やコピーした設定ファイルは後の rm では消えない。自分の手元でも、ビルド時に秘密が必要ならBuildKitの --secret かマルチステージで最終イメージに残さない形にする。そしてPATは有効期限を必ず付ける。GitHubは今、fine-grained PATで期限とスコープを絞れるので、無期限のclassic PATが残っていないかを今日確認する。もう一つ、AIエージェントに作業を任せる時代では「渡すトークンの権限は最小」が自分を守る唯一の壁になる。Rustやハードウェアに進む前に、この基礎を自分のリポジトリで一度点検しておきたい。