メインコンテンツへスキップ
友田 陽大

Open Source · MIT · @aegiskit

Aegis — Next.js / Supabase のセキュリティを、ミドルウェア1枚で多層防御に

AIコーディングエージェントを含め、速く出荷する開発者が見落としがちな統制を自動化するOSS。ヘッダー/CSP・レート制限・入力検証・CSRF・秘密情報衛生を肩代わりし、ライブラリには直せない縦のリスク(認可/IDOR・RLSの設計ミス)を検出して警告します。

npx @aegiskit/cli scan

インストール・設定不要。いまのプロジェクトを静的解析する。インストールも設定も不要です。

「完全に守る」とは言いません。どんなツールもそうは言えず、そう謳う製品はむしろ危険です。Aegisはセキュアな設計を補完するものであって、置き換えるものではありません。

なぜ必要か

「デモは動く」と「本番で漏れない」は別物だ

生成AIはハッピーパスのコードを驚くほど速く書きます。しかし本番で問われるのは、不正な入力・同時アクセス・他人のIDを指す正規リクエストにどう振る舞うか。ここが抜けたまま出荷すると漏れます。これは感想ではなく、公開された事実です。

この「RLSの外側に空くIDOR」を、脆弱→修正の実コードで深掘りした記事があります。

記事を読む

Aegis の守備範囲(正直に)

自動化できる「水平」と、できない「縦」

セキュリティ対策には、アプリ横断で一律に効く水平の統制と、アプリ固有の「誰が何を所有するか」に依存する縦のリスクがあります。前者はライブラリが肩代わりでき、後者はできません。Aegisはこの境界を誤魔化しません。

水平の統制

Aegis が自動化する

  • セキュリティヘッダー / Content-Security-Policy(nonce対応)
  • サーバーレスでも正しく効くレート制限(Upstash Redis 対応のアトミックなストア)
  • CSRF / Origin 検証
  • 型付き env 境界(`process.env` の直接参照を排除)
  • 境界での入力バリデーション(Zod)と安全なデフォルト
  • 秘密情報の混入検知(ハードコードされた鍵・トークン)

縦のリスク

Aegis は検出・警告のみ(修正はあなたの設計)

  • 認可の欠陥 / IDOR・BOLA(他人のIDを指して他人のデータに触れる)
  • Supabase RLS の設計ミス(未設定テーブル・service_role バイパス・WITH CHECK 欠落)
  • 業務ロジックの欠陥(数量・価格・状態遷移の悪用)
  • 権限昇格・テナント越境

これらは「製品を入れれば守られる」類のリスクではありません。WAFやヘッダーでも防げない——攻撃が認証も書式も正しい正規リクエストだからです。閉じるには設計とレビューが要ります。

Aegis の検出パイプラインコードとSQLを静的解析(SAST)で「疑い」として検出し、動的確認(DAST)で「確証」へ格上げ、CIでは高確度の検出のみがビルドを止めます。ライブラリでは直せない認可/IDORやRLS設計などの縦のリスクは検出・警告にとどまり、設計と実装で塞ぐセキュリティ監査へ分岐します。入力コード・SQLmigrations静的解析 (SAST)疑いを検出taint・RLS検証動的確認 (DAST)確証へ格上げ非破壊プローブCI / SARIF高確度のみビルドをブロック相関認可 / IDOR・RLS設計・テナント分離= ライブラリでは直せない(検出・警告のみ)監査で塞ぐ設計+実装
静的=疑い、動的=確証。CIは高確度のみブロックし、縦のリスクは監査で塞ぐ。

できること

検出して、直して、CIで守り続ける

構文マッチングを超えたデータフロー解析と、SQLで書かれた認可境界の検証。静的で疑い、動的で確証し、安全なものだけ自動修正します。

  • 静的解析(taint / データフロー)

    構文マッチングでは見えない注入クラスを、関数内のデータフローで追跡。汚染された入力が、適切なサニタイザを通らずに危険なシンクへ到達する経路を、source→sink のトレース付きで指摘します。

    • SQLインジェクション・SSRF・パストラバーサル・オープンリダイレクト・DOM XSS
    • サニタイザの妥当性はシンク別に判定(URL安全 ≠ SQL安全)
    • 所有権スコープのない汚染入力=IDOR の検出(authz/idor-tainted-scope)
  • Supabase RLS / SQL 検証

    TypeScriptスキャナが構造的に盲目な、SQLで書かれた認可境界を検証。`supabase/migrations/**.sql` を読み、RLS未設定・WITH CHECK欠落・無条件true・anonへの過剰付与・search_pathを固定しないSECURITY DEFINERを指摘します。

    • 弱いRLSのテーブルを非管理クライアントが叩く箇所を「確定した露出」として相関
    • 正しい本番RLS設計では0件になるよう設計(=ノイズではなく実害)
    • RLSは検証する——設計やレビューを置き換えはしない
  • 安全な自動修正 + エージェント連携

    証明可能に安全な変換だけを自動適用し(例:ルートハンドラを secureRoute で包む)、人間の判断が要るものはコピペ可能な手順として提示。直せないものを直したとは決して主張しません。

    • `aegis fix` で安全な差分をプレビュー、`--write` で適用(git diff で確認)
    • `--format json` で計画を機械可読化し、コーディングエージェントに渡せる
  • ランタイム強化(ミドルウェア)

    ライブラリが正しく所有できる統制を、エッジ安全なプリミティブで一括導入。ヘッダー/CSP・レート制限・CSRF・型付きenv境界を、ミドルウェア1枚とenvモジュール1つで足します。

    • @aegiskit/core はランタイム非依存(Node / Edge / Browser)
    • fail-secure:曖昧さやエラー時は安全側に倒す(危険なヘッダーは出さない)
  • 動的解析(DAST)と SAST↔DAST 相関

    静的解析は「疑い」、動的解析は「確証」。自分が所有するアプリへ安全・境界つき・非破壊のHTTPを送り、実行時に再現したものを build-blocking に格上げします。

    • 反射XSS・オープンリダイレクト・SQLi(真偽/エラー推論)・SSRF(OOBカナリア)
    • テストID供給時は missing-auth / IDOR も確認(@aegiskit/dast)
    • localhost既定・スコープ固定・リクエスト予算つきで安全
  • CI 連携(SARIF / 高信頼のみブロック)

    高信頼の検出だけがCIを失敗させ、SARIFをGitHubコードスキャニングへアップロード。source→sink のデータフローがクリック可能なトレースとして残ります。

    • GitHub Action(`aegis ci` ラッパー)で1ステップ導入
    • ノイズを足さずに「歯」を足す——誤検知でビルドを壊さない

クイックスタート

3つのコマンドで始める

インストールも設定も不要。まずscanで現状を可視化し、initでランタイムを固め、probeで実行時に裏取りします。

  1. スキャンインストール・設定不要。いまのプロジェクトを静的解析する
    npx @aegiskit/cli scan
  2. ランタイム強化ヘッダー/CSP・レート制限・CSRF・型付きenv境界をミドルウェアで導入する
    npx @aegiskit/cli init
  3. ランタイム確認自分のアプリへ安全・非破壊なプローブを送り、静的検出を実行時に裏取りする
    npx @aegiskit/cli probe http://localhost:3000 --correlate

CI に組み込む(SARIF を GitHub に連携)

高信頼の検出だけがビルドを失敗させ、データフローのトレースが GitHub コードスキャニングにクリック可能な形で残ります。

# .github/workflows/security.yml
name: Security
on: [push, pull_request]
jobs:
  aegis:
    runs-on: ubuntu-latest
    permissions:
      contents: read
      security-events: write # upload SARIF to the Security tab
    steps:
      - uses: actions/checkout@v4
      - uses: tomodahinata/aegis@main
        with:
          severity: HIGH
      - uses: github/codeql-action/upload-sarif@v3
        if: always()
        with:
          sarif_file: aegis.sarif

正直なスコープ — Aegis が「しないこと」

「入れたから大丈夫」という油断こそ、最悪のセキュリティ結果を生みます。だから何ができないかを最初に明記します。

  • 認可が「正しい」ことは証明しません。見ているのはポリシーや実装の“形”であって、あなたの事業ルールやデータモデルの“意味”ではありません。
  • データフロー解析は intraprocedural(関数内)です。モジュールやフレームワークを跨ぐ流れは見逃します。
  • RLS の設計・コードレビュー・脅威モデリング・手動ペネトレーションテストを置き換えません。補完します。
  • クリーンな結果は「よくある罠は踏んでいない」であって、「このコードは安全だ」ではありません。

それでも、最頻出の穴を機械的に潰せる価値は計り知れません。検出が“歯”を持ち、ノイズを増やさず、人間が本当に難しい判断(=設計と認可)に集中できるようになります。

FAQ

よくある質問

  • Aegis は無料ですか?

    はい。MITライセンスのオープンソースで、`npx @aegiskit/cli` から今すぐ使えます。スキャン・ランタイム強化・CI連携まで含めて無料です。

  • Aegis を入れれば、アプリは「完全に安全」になりますか?

    いいえ。そう謳うツールはむしろ危険です(「入れたから大丈夫」という油断が最悪の結果を生みます)。Aegisは水平の統制を自動化し、ライブラリに直せない縦のリスク(認可/IDOR・業務ロジック)は検出・警告するだけです。セキュアな設計・コードレビュー・手動ペネトレーションテストを補完するものであって、置き換えません。

  • Next.js / Supabase 以外でも使えますか?

    中核(@aegiskit/core)はランタイム非依存のプリミティブ群で、ヘッダー/CSP・レート制限・型付きenvなどは汎用に使えます。Next.js(App Router)アダプタとSupabase RLS検証は、その2つに最適化された部分です。

  • 誤検知でCIが壊れませんか?

    既定では高信頼の検出だけがCIを失敗させます。さらに静的解析の「疑い」を動的プローブで再現できたものだけを build-blocking に格上げするため、ノイズを足さずに実害だけを止められます。

  • AIが生成したコードのレビューにも役立ちますか?

    まさにその用途を想定しています。AI生成のNext.js × Supabaseコードが頻繁に作り込む注入・RLS・認可の罠を機械的に洗い出し、`aegis fix --format json` で修正計画をコーディングエージェントへ渡せます。

  • 検出された認可/IDORの問題は、どう直せばいいですか?

    そこはライブラリの範囲外(=あなたの設計判断)です。RLSの張り方・service_role経路の所有権チェック・テナント分離は、設計とレビューで閉じる必要があります。手が足りなければ、その設計レビューと実装の支援を承っています。

次の一歩

無料のOSSで今すぐ試せます。そして、検出された「縦のリスク」を実際に塞ぐ設計レビューが必要なら、私が承ります。

設計レビューを依頼する

検出された「縦のリスク」、私が塞ぎます

認可/IDOR・Supabase RLS の設計・テナント分離は、ライブラリの範囲外=設計判断です。既存の Next.js × Supabase アプリの認可レビューや、検出された問題の修正設計・実装を承っています。

セキュリティ監査を見る(料金・内容)

スポット診断¥98,000〜/標準監査¥280,000〜。まずは30分の無料相談から。

まず自分で試す

無料・オープンソースで今すぐ

インストール不要。いまのプロジェクトを1コマンドでスキャンできます。MIT ライセンスで、改変も商用利用も自由です。

npx @aegiskit/cli scan
GitHub でスターする

有料の上位プラン「Aegis Team」は提供準備中です。先行登録(ウェイトリスト)はこちら