MRが楽しい

MRやVRについて学習したことを書き残す

AWESOME-COPILOTのドキュメントを読む その118(Security Standards)

本日はAWESOME-COPILOTの技術調査枠です。
AWESOME-COPILOTのドキュメントを読みながら実際に操作を試して記事に残します。
今回はカスタムインストラクションの一つSecurity Standardsについてです。

Security Standards

Security StandardsはCopilot をセキュアコーディングレビュー担当にするルールです。
全てのファイル・全ての技術スタックが対象です。
TypeScript / JavaScript / React / Next.js / Express / Angular / Go / API / CI/CD / LLM連携など、プロジェクト全体に対してセキュリティ観点が入ります。

以下のページからGenaiscriptのインストールボタンをクリックして取得します。
github.com

github.com
インストールボタンを押してSecurity Standardsをダウンロードします。
すると.github/instructions配下にインストラクションがインストールされます。

インストールしたインストラクションはCopilotの動作に自動的に適用されます。
このインストラクションを読み込むと、CopilotはOWASP Top 10 を前提に脆弱性を潰すセキュリティエンジニアとして振る舞います。

具体的にはCopilotは以下のような行動をとります。

Injection系の危険コードを強く避ける

Copilotは入力値を信用しません。
SQL、NoSQL、Shell、HTML、Template、XML、URL fetchなどに対して、ユーザー入力をそのまま渡す実装を避けるようになります。

「入力値はすべて攻撃者が操作できる」 という前提で以下のようにコードを書くようになります。

await db.query('SELECT * FROM users WHERE id = $1', [userId]);

認証・認可を必ずサーバー側で見る

認証・認可まわりにかなり厳しくなります。
CopilotはAPIやServer Actionを作るときに、以下を付けようとします。

  • auth middleware
  • role check
  • ownership check
  • re-authentication
  • rate limit
router.delete(
  '/api/users/:id',
  authenticate,
  authorize('admin'),
  deleteUser
);

JWT・Cookie・Session を安全側に倒す

Copilotは認証トークンの扱いで便利さより安全性を優先するようになります。

res.cookie('token', token, {
  httpOnly: true,
  secure: true,
  sameSite: 'strict',
});

JWTでは以下を意識するようになります。

  • algorithms を明示
  • expiresIn を設定
  • aud / iss を検証
  • 短命 access token
  • refresh token rotation

Secrets・環境変数・ログ漏洩を防ぐ

Copilotは秘密情報をコード・ログ・クライアントに出さないようになります。

const logger = pino({
  redact: ['req.headers.authorization', 'req.body.password'],
});

特にNext.jsではNEXT_PUBLIC_に秘密情報を入れる危険性を強く避けるようになります。

HTTPヘッダー・CORS・CSRFを標準装備にする

CopilotはExpressやWeb APIを作るときに、セキュリティヘッダーを最初から設定します。
例えば以下を意識します。

  • Content-Security-Policy
  • Strict-Transport-Security
  • X-Content-Type-Options
  • X-Frame-Options
  • Referrer-Policy
  • Permissions-Policy
  • CORS origin allowlist
app.use(cors({
  origin: ['https://app.example.com'],
  credentials: true,
}));

つまりCopilotは「公開しても危険が少ないAPI」を書くようになります。

フレームワーク別の危険パターンを検知する

Copilotは汎用セキュリティだけでなくフレームワーク別の注意点も考慮します。

React / Next.js
  • Server Action に auth を付ける
  • Client Component に不要な秘密情報を渡さない
  • middleware の matcher に /api/ を含める
  • RSC serialization でDBオブジェクトを丸ごと渡さない
Angular
  • bypassSecurityTrustHtml を安易に使わない
  • user-controlled template を避ける
  • HttpInterceptor で認証を集中管理する
Express
  • helmet() を使う
  • express.json({ limit }) を指定する
  • cookie に secure flags を付ける
  • stack trace を本番に返さない
Go
  • math/rand をセキュリティ用途に使わない
  • InsecureSkipVerify: true を避ける
  • SQLは parameterized query にする

AI/LLM連携も安全に扱う

LLMをセキュリティ上の攻撃面として扱います。
具体的に以下を考慮します。

  • system/user messageを分離する
  • LLM出力を信用しない
  • SQL/shell/HTMLに直接使わない
  • Zod/JSON Schemaで検証する
const response = await llm.complete({
  system: 'Only summarize the provided text.',
  user: userInput,
});

AI機能を入れても攻撃経路を増やさない設計に寄ります。

依存関係・CI/CDまで警戒する

Copilotはコード本体だけでなくnpm packageやlockfile、CI/CDも攻撃対象として扱います。

そのため、以下を提案するようになります。

  • npm audit
  • lockfile integrity
  • typosquatting review
  • postinstall script 確認
  • wildcard / latest version 回避
  • secrets in CI logs 回避

Supply Chain Security を考慮した開発補助になります。