GoogleがCodeMenderの参照構成を紹介

GoogleがCodeMenderの参照構成を紹介、プルリクエストで脆弱性の検証と修正が可能

公開:
CodeCampが提供するDX人材育成が可能なプログラミングやITが学べる公開講座

Googleは、CodeMenderによる自動修正をGoogle Cloud Run経由でGitのプルリクエストへ組み込む参照アーキテクチャを公開しました。CodeMenderは、ソフトウェアの欠陥を機械の速さで見つけて修正できる、Googleの自律型コードセキュリティエージェントです。[1]

この記事では、参照アーキテクチャでCodeMenderをプルリクエストへ組み込むとできることと、導入前の確認事項を解説します。検証用の攻撃コードをCloud Run jobで実行する点も、確認事項として整理します。

目次
  1. 参照アーキテクチャでのプルリクエスト操作
  2. CodeMender参照実装を動かす前提
  3. CodeMender参照アーキテクチャの確認点

参照アーキテクチャでのプルリクエスト操作

参照アーキテクチャでは、プルリクエストをきっかけにCloud Run上でスキャンが動きます。スキャンは1件のコメントを投稿し、IDの付いた検出結果の表と、次に入力できる2つのコマンドを示します。[1]

プルリクエスト上の結果とコマンド

図1 プルリクエスト上の結果とコマンド

検出結果や攻撃の試行記録、修正案の返る先は、同じタイムラインです。開発者は、プルリクエストを離れることも、コンソールの使い方を覚えることも求められません。

サンドボックスでの攻撃検証

CodeMenderのcm findは、コード解析の際に脆弱性の検出結果へ確信度のスコアを返します。スコアが100%未満の場合に、サンドボックスで攻撃を組み立てて模擬し、実際に悪用できるかを確かめる手段がcm verifyです。

cm verifyと/verifyの各操作

図2 cm verifyと/verifyの各操作

プルリクエストでは、/verify 612424daのようにIDを付けて返信すると、サンドボックスでの攻撃試行の記録がスレッドに届きます。記録はView Exploit Steps & Response Traceという折りたためる枠に入り、会話を埋もれさせません。

模擬攻撃の結果によって、深刻度が変わることがあります。検証用のサンドボックスは一時的なため、パイプラインは記録を監査証跡としてGoogle Cloud Storageへ自動で送ります。

修正パッチによる対応

攻撃によって検出結果が本物だと示された場合、次の手順はチケットではなくパッチの作成です。cm fix a1b2c3d4のようにIDを指定すると、CodeMenderがパッチを作成する仕組みです。

cm fixと/fixの各操作

図3 cm fixと/fixの各操作

プルリクエストでは、/fix 612424daと返信すると、統合形式の差分がPreview Proposed Code Diffという枠に入って届きます。/approveする下書きのプルリクエストもすでに開いており、/verifyと/fixはIDの代わりにallも指定できます。

差分に問題がなければ、適用は開発者が/approveと返信する1回の操作です。エージェントはパッチをブランチにコミットしてプッシュし、コミット状態security/codemender-gateを緑に設定します。

差分に問題がない場合の適用とマージ

図4 差分に問題がない場合の適用とマージ

コミット状態をマージの阻止に変えるのは、ブランチ保護の役割です。ブランチ保護を設定していない場合、ゲートは参考扱いにとどまります。

CodeMender参照実装を動かす前提

CodeMenderを使った自律型のGitOpsセキュリティエージェントは、参照実装codemender-gitopsから構築を始められます。動かす前提として、GitHubとGoogle Cloudが互いを信頼する設定が必要です。[1]

参照アーキテクチャで示された構成要素

図5 参照アーキテクチャで示された構成要素


Python研修一覧はこちら

目的に合うPython研修を一覧形式から探したい方は、ぜひご利用ください。

Python研修を比較する

Java研修一覧はこちら

目的に合うJava研修を一覧形式から探したい方は、ぜひご利用ください。

Java研修を比較する

PHP研修一覧はこちら

目的に合うPHP研修を一覧形式から探したい方は、ぜひご利用ください。

PHP研修を比較する

新入社員研修

目的に合う新入社員研修を一覧形式から探したい方は、ぜひご利用ください。

新入社員研修を比較する

全ての研修からも探したい方はこちら

OIDCトークンでの認証

このエージェントにはソースコードへの書き込み権限が必要で、その認証情報をシークレットの保管場所に置くと漏えいのおそれがあります。GitHub Actionsが発行する短期のOIDCトークンを受け入れるようGoogle側を設定すれば、盗まれる長期の認証情報が残りません。

書き込み権限の認証情報の扱い方

図6 書き込み権限の認証情報の扱い方

受け入れるリポジトリの限定

この構成の安全性は、ほぼ1行の条件設定にかかっています。以下は、GitHub Actionsを発行元とし、特定のrepository_idに限定する定義です。

resource "google_iam_workload_identity_pool_provider" "github" {
  workload_identity_pool_provider_id = "github-provider"

  oidc {
    issuer_uri = "https://token.actions.githubusercontent.com"
  }

  attribute_mapping = {
    "google.subject"          = "assertion.sub"
    "attribute.repository_id" = "assertion.repository_id"
  }

  # Without this, any repository on GitHub can exchange a token against your pool
  attribute_condition = "assertion.repository_id == '123456789'"
}

公式資料からの抜粋:Don't just flag it, fix it: How to run CodeMender in your pull requests(No stored keys between GitHub and Cloud Run)。対象版・範囲:原記事の参照アーキテクチャのコード例(版の記載なし)。

上記のコードでは、issuer_uriで発行元を指定し、attribute_conditionで受け入れるrepository_idを1つに限定しています。attribute_conditionが無い場合、GitHub上の任意のリポジトリがこのプールに対してトークンを交換できます。

発行元URLはGitHub Actionsのワークフロー間で共通のため、発行元の確認だけでは守りになりません。リポジトリを絞る働きを担うのは、attribute_conditionの条件です。

参照構成でrepository_idに限定する条件

図7 参照構成でrepository_idに限定する条件

照合にはassertion.repositoryも使えますが、リポジトリ名は変更されたり、手放した後に他者に取得されたりします。Googleは、変更されないrepository_idとrepository_owner_idの対応付けを推奨しています。

CodeMender参照アーキテクチャの確認点

CodeMenderはAI Threat Defenseプラットフォームの一部で、今回の発表はプルリクエストへ組み込む参照アーキテクチャと参照実装です。CodeMenderの料金や提供地域、提供状態は、今回の発表に含まれていません。[1]

編集部が整理したマージ阻止とOIDCの確認点

図8 編集部が整理したマージ阻止とOIDCの確認点

コミット状態security/codemender-gateでマージを止めたい場合は、対象ブランチのブランチ保護を確かめます。GitHubのOIDCトークンをGoogle側で受け入れる場合は、attribute_conditionの対象を自分のrepository_idに絞ったかも確認対象です。


Python基礎・実践(Django)

企業・法人向けのPython研修では、基礎から応用まで体系的に学べます。

Python研修の詳細

DX社員研修

企業・法人向けのDX研修では、実務に繋がるリスキリングでITレベルを向上させます。

DX研修の詳細

Javaエンジニア育成研修

企業・法人向けのJavaエンジニア育成研修では、Javaの基礎から応用まで確実に習得できます。

Java研修の詳細

新卒・新入社員向け研修

企業・法人に新入社員・新卒社員に向けたプログラミング研修を提供しています。

新入社員研修の詳細

コードキャンプのIT研修を全て見る

検証パイプラインの判定設計

自前の検証パイプラインでは、テストが失敗したときの扱いの設計が欠かせません。ハーネスが攻撃成功の文字列だけを探す作りでは、モックサーバーのクラッシュやタイムアウトで、本物の脆弱性が安全と誤判定されるおそれがあります。

Googleは、パーサーで真の陰性の結果とテストのクラッシュを区別することを勧めています。攻撃が正常に完了しなかった場合は、問題なしとせず、状態をinconclusiveとして示す設計です。

検証パイプラインの失敗時の扱い

図9 検証パイプラインの失敗時の扱い

検証の判定をレビューの根拠に使う場合は、自前のパーサーがテストのクラッシュと真の陰性を分けているかを確かめます。攻撃成功の文字列だけを探す作りでは、テストの失敗が安全という判定につながるおそれがあるためです。

Cloud Run jobの実行設計

検証では、誰もレビューしていない攻撃コードをその場で書き、脆弱性の種類が示す動作をモックの標的に向けて行う仕組みです。自律型エージェントがコンテナを抜け出し、内部ネットワークをポートスキャンする事態は避ける必要があります。

Googleの構成では、攻撃コードは何も保持しないインスタンスで動き、インスタンスは検出結果1件の間だけ存在して、外へ出るのは判定結果だけです。記録をGoogle Cloud Storageへ送るパイプラインと、このインスタンスとの関係(記録の送信元)は今回の発表に含まれていません。

Cloud Run jobの実行設計

図10 Cloud Run jobの実行設計

判定を信頼する前に、攻撃コードをどこで実行し、実行中に何へ届くかを確かめる必要があります。Googleが示す実行場所はCloud Run jobで、検出結果1件ごとにjobを1つ実行し、終了後に残るのは判定結果だけです。

Cloud Runのインスタンスはサンドボックス化され、jobは常にLinux完全互換のmicroVMである第2世代実行環境で動きます。jobの実行は開始して1つの処理を行い、そこで終了する流れです。

どちらかのsandboxesによる分離

Cloud Run sandboxesまたはagent sandboxesを使うと、インスタンス内のプロセスの実行が親のワークロードから分離されます。プロセスは環境変数やシークレット、Google Cloudのメタデータサーバーからも分離され、プラットフォームが既定で渡す認証情報にも届きません。

インスタンス内のプロセスの分離

図11 インスタンス内のプロセスの分離

攻撃コードの到達範囲の設計

jobには専用のサービスアカウントを持たせ、エクスプロイトを書き込むAPI以外の権限は与えない構成です。Googleの構成では、組織のポリシーによってはroles/editorを持つことがあるCompute Engineのデフォルトアカウントを使いません。

攻撃コードが届く範囲を絞る設定

図12 攻撃コードが届く範囲を絞る設定

Cloud Runはデプロイ時にコンテナイメージを取り込むため、jobにはレジストリへのアクセス権も不要です。ネットワークはDirect VPC egressで外へ出る経路のないサブネットにつなぎ、見つけた情報の持ち出しや第2段階の攻撃コードの取得を防ぎます。

攻撃コードをCloud Run jobで実行する検証環境では、jobにCompute Engineのデフォルトアカウントを使っていないかを確かめます。サブネットに外へ出る経路が残っていないかも、あわせて確かめる対象です。

出典

  1. ^ Google Cloud. 「Don't just flag it, fix it: How to run CodeMender in your pull requests」. https://cloud.google.com/blog/products/identity-security/how-to-run-codemender-in-your-pull-requests, (参照 26-11-10).

※本記事は公式の一次情報を基に編集しています。内容はAIで確認していますが、誤りや最新情報との差異がある場合は、以下フォームよりご報告ください。

修正・削除・掲載などの依頼はこちら
ブログに戻る

コメントを残す

コメントは公開前に承認される必要があることにご注意ください。

企業・法人向けのIT・プログラミング・生成AI研修を探す、比較する - IT・プログラミングを知って学べるコネクトメディア CodeCampが提供するDX人材育成が可能なプログラミングやITが学べる公開講座 - IT・プログラミングを知って学べるコネクトメディア コードキャンプが提供する無料で学べるプログラミングスクール講座 - IT・プログラミングを知って学べるコネクトメディア コードキャンプDX人材育成研修 - IT・プログラミングを知って学べるコネクトメディア 3.5日の研修で、年間1,600時間の削減効果が見込まれる。東京きらぼしフィナンシャルグループのDX人材育成事例 - IT・プログラミングを知って学べるコネクトメディア 配属3ヶ月で30%の生産性向上を実現するいよぎんコンピュータサービスの新人研修に迫る - IT・プログラミングを知って学べるコネクトメディア 金融業界の業務効率化を加速するニッセイアセットマネジメントの生成AI×GAS活用研修事例 - IT・プログラミングを知って学べるコネクトメディア 【製造業のDX人材育成事例】デジタル人材の即戦力化を実現する、日本ガイシ株式会社の異動者向オンボーディング研修 - ITやプログラミングを知って学べるコネクトメディア フューチャーアーキテクト株式会社が実現した新入社員向けIT研修プログラムでタスクフォース制度が主体的な学びと成長を生み出す - IT・プログラミングを知って学べるコネクトメディア コードキャンプDX人材育成研修 - IT・プログラミングを知って学べるコネクトメディア コードキャンプIT・プログラミング研修事例/【IT新入社員研修】オンラインとオフラインの最適バランスを実現したFutureOneの導入事例 - IT・プログラミングを知って学べるコネクトメディア コードキャンプIT・プログラミング研修事例/【新入社員研修】柔軟なハイブリッド型Java研修で実現した新卒20名の成長と成果|サークレイス株式会社 - ITやプログラミングを知って学べるコネクトメディア コードキャンプIT・プログラミング研修事例/現場により近いところにデジタルを根付かせるDX基礎講座研修|株式会社ブリヂストン - ITやプログラミングを知って学べるコネクトメディア コードキャンプIT・プログラミング研修事例/業務の効率化・DX推進に向けたIT人材育成への第一歩|株式会社カナエ - ITやプログラミングを知って学べるコネクトメディア 企業・法人向けのIT・プログラミング研修 - ITやプログラミングを知って学べるコネクトメディア

What's New

新着記事

対象者別で探す

子供(小学生・中学生・高校生)向け
プログラミング教室検索する

子供(小学生・中学生・高校生)がロボットやプログラミング言語を学ぶことができるオフラインからオンラインスクールを検索、比較することが可能です。

子供(小学生・中学生・高校生)
プログラミング教室検索する

ITやプログラムなどの
最新情報を検索する

日々、新しいITやプログラミング言語の情報が流れていきますが、特定の情報を時系列でニュースやコラムを確認することができます。

ITやプログラムなどの
最新情報を検索する