AIセキュリティハーネス入門——Vercel deepsecで自分のコードベースの脆弱性を自動検出する
OSS化されたdeepsecを使い、自社コードベースの脆弱性検出フローを構築します。Scan→Investigate→Revalidateというワークフローを、架空のSaaSを題材に解説。AI生成コード時代のセキュリティ担保を扱います。

はじめに
AIにコードを書かせる量が増えて、こんな不安はありませんか?
- 大量に生成されたコードを、人間が全部レビューしきれない
- AIが書いたコードに脆弱性が混ざっていないか、確信が持てない
- 既存の静的解析ツールは誤検知が多く、ノイズに埋もれて重要な指摘を見逃す
この課題に対してVercelがOSSとして公開したのが deepsec という「セキュリティハーネス」です。AIを使ってコードベースの脆弱性を見つけ、調査し、検証するワークフローを提供します。
本記事を読み終えると、次のことができるようになります。
- AIセキュリティハーネスという考え方を理解する
- deepsecの初期化とワークフローの全体像を把握する
- 架空のSaaSを題材に、脆弱性検出フローの組み方を考える
AIセキュリティハーネスとは
従来の静的解析ツールは「パターンマッチで怪しい箇所を機械的に列挙する」アプローチでした。これに対しdeepsecのような AIセキュリティハーネス は、AIにコードの文脈を読ませて脆弱性を 調査・検証 させる点が異なります。
「とりあえず大量に警告を出す」のではなく、「本当に問題か」をAIが掘り下げてくれるのが、AI生成コード時代に適した発想です。
deepsecのワークフロー
deepsecは、脆弱性検出を複数のステップに分けて処理します。公開されている処理ステップは次の通りです。
| ステップ | 役割 |
|---|---|
| Scan | コードベースをスキャンして候補を洗い出す |
| Investigate | 候補を調査し、実際に問題かを掘り下げる |
| Revalidate | 再検証して誤検知を削減する |
| Enrich | 情報を付加して指摘を充実させる |
| Export | 結果をエクスポートする |
この「Scan → Investigate → Revalidate」という流れが、誤検知を減らす肝です。
ハンズオン1: deepsecを初期化する
deepsecはリポジトリのルートで初期化コマンドを実行することで導入します。
# リポジトリのルートで実行
npx deepsec init
このコマンドを実行すると、./.deepsec ディレクトリが作成されます。ここに設定やスキャナーの定義が置かれる構成です。
GitHubリポジトリは github.com/vercel-labs/deepsec で公開されています。カスタムスキャナーの作成ガイドも提供されているため、自社のコードベース特有のチェックを追加することも可能です。
注意: 本記事で扱うコマンドは公式発表に基づくものです。具体的なオプションや最新の使い方は、必ず公式リポジトリのドキュメントで確認してください。
ハンズオン2: 架空SaaSでの活用シナリオ
架空の在庫管理SaaS「ZaikoFlow」を題材に、どんな脆弱性検出フローを組むかを考えます。スタックは Next.js + Firestore + TypeScript です。
ZaikoFlowで特に検査したい観点は次のようなものです。
| 観点 | 具体例 |
|---|---|
| 認可漏れ | Server Actionで本人確認をせずにデータを更新していないか |
| 入力検証 | Webhookハンドラで外部入力をそのまま信用していないか |
| シークレット混入 | Firebaseの認証情報をコードにハードコードしていないか |
たとえば、次のようなServer Actionは認可チェックが抜けている危険な例です。
// 危険な例: 呼び出し元の権限を確認していない
export async function deleteProduct(productId: string) {
// 認可チェックなしで削除している(誰でも実行できてしまう)
await db.product.delete({ where: { id: productId } });
}
AIセキュリティハーネスは、こうした「文脈的に危険」なコードを、単なるパターンではなく 意味を読んで 指摘することが期待できます。
修正後はこうあるべきです。
// 安全な例: セッションから権限を確認してから削除
export async function deleteProduct(productId: string) {
const session = await getServerSession();
if (!session || session.role !== "admin") {
throw new Error("権限がありません");
}
await db.product.delete({ where: { id: productId } });
}
ハンズオン3: CI/CDに組み込む発想
検出を一度きりで終わらせず、継続的に回す ことが重要です。モリソンの標準であるGitHub Actionsに組み込む発想を図で示します。
PRごとにスキャンを走らせることで、「マージ前に脆弱性に気づく」体制を作れます。具体的なActionsの組み込み手順は公式ドキュメントに従ってください。
AI生成コード時代のセキュリティ姿勢
ツールを入れるだけでなく、姿勢としても押さえておきたい点があります。
- AIが書いたコードも必ず検査対象にする: 「AIが書いたから大丈夫」は最も危険な思い込みです
- 誤検知に慣れすぎない: ノイズが多いと重要な指摘を見逃します。再検証で精度を上げる仕組みを重視しましょう
- シークレットは環境変数へ: コードにキーを書かない、という基本を徹底する
- 多層で守る: ハーネスは万能ではありません。レビュー・テスト・最小権限と組み合わせて多層防御にする
Tips・注意点
- OSSである利点を活かす: deepsecはオープンソースなので、カスタムスキャナーで自社固有のルールを足せます。汎用ツールでは拾えない「ZaikoFlow特有の危険パターン」を定義できるのが強みです。
- AI生成の指摘も鵜呑みにしない: ハーネスの指摘自体もAIによるものです。最終判断は人間が行い、過検知・過信の両方を避けましょう。
- 正確な情報は公式で: コマンドやオプションは更新される可能性があります。導入時は公式リポジトリを一次情報として確認してください。
まとめ
AIセキュリティハーネスの要点を整理します。
- deepsec はAIでコードベースの脆弱性を検出するOSSのセキュリティハーネス
- Scan → Investigate → Revalidate → Enrich → Export のワークフローで、調査と再検証により誤検知を削減する
- 導入は
npx deepsec initで、./.deepsecディレクトリが作られる - 認可漏れ・入力検証・シークレット混入など、文脈依存の脆弱性検出に向く
- ツール任せにせず、レビュー・テスト・最小権限と組み合わせた多層防御 が前提
次のアクションとして、まずは検証用のリポジトリで npx deepsec init を試し、自社のコードベースにどんな指摘が出るかを眺めてみてください。AIが書いたコードを安心して使うための、最初の一歩になります。