qe-security-testing について
セキュリティテストや監査に取り組む人向けのスキルです。OWASP Top 10、認証と認可、入力検証、依存関係、シークレットの露出を確認する方法をテスト例とともにまとめています。
主な機能
- 01OWASP Top 10 のリスク確認
- 02認証とアクセス制御の検証
- 03インジェクションと入力検証のテスト
- 04依存関係とシークレットのスキャン
- 05CI/CD へのセキュリティチェック追加
活用シーン
- 01アプリケーションのセキュリティ監査
- 02API エンドポイントの認証と認可の検証
- 03コードやログにおけるシークレット露出の確認
- 04CI/CD での継続的なセキュリティチェック
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ proffesor-for-testing/ agentic-qe --skill qe-security-testingインストール後、Claude Code で/qe-security-testingを入力して読み込まれたか確認します。
詳細
セキュリティテスト
<default_to_action> セキュリティテストや監査を実施するとき:
- OWASP Top 10 の脆弱性を体系的にテストします
- すべてのエンドポイントで認証と認可を検証します
- 既知の脆弱性がないか依存関係をスキャンします(npm audit)
- インジェクション攻撃を確認します(SQL、XSS、コマンド)
- コードやログにシークレットが露出していないことを確認します
セキュリティのクイックチェック:
- アクセス制御 → 水平/垂直方向の権限昇格をテストします
- 暗号化 → パスワードのハッシュ化、HTTPS、機密データが露出していないことを確認します
- インジェクション → SQL インジェクション、XSS、コマンドインジェクションをテストします
- 認証 → 脆弱なパスワード、セッション固定、MFA の適用をテストします
- 設定 → エラーメッセージから情報が漏えいしないことを確認します
重要な成功要因:
- 攻撃者の視点で考え、防御者の視点で構築します
- セキュリティは最後に追加するのではなく、最初から組み込みます
- リリース直前だけでなく、CI/CD で継続的にテストします </default_to_action>
クイックリファレンスカード
使用する場面
- セキュリティ監査とペネトレーションテスト
- 認証/認可のテスト
- 入力サニタイズの検証
- セキュリティ設定のレビュー
OWASP Top 10(2021)
| # | 脆弱性 | 主なテスト |
|---|---|---|
| 1 | アクセス制御の不備 | ユーザー A によるユーザー B のデータへのアクセス |
| 2 | 暗号化の失敗 | 平文のパスワード、HTTP |
| 3 | インジェクション | SQL/XSS/コマンドインジェクション |
| 4 | 安全でない設計 | レート制限、セッションタイムアウト |
| 5 | セキュリティ設定の不備 | 詳細すぎるエラー、露出した /admin |
| 6 | 脆弱なコンポーネント | npm audit、古いパッケージ |
| 7 | 認証の失敗 | 脆弱なパスワード、MFA なし |
| 8 | 完全性の不備 | 署名されていない更新、マルウェア |
| 9 | ログ記録と監視の失敗 | 侵害に関する監査証跡がない |
| 10 | SSRF | サーバーによる内部 URL の取得 |
ツール
| 種類 | ツール | 目的 |
|---|---|---|
| SAST | SonarQube, Semgrep | 静的コード解析 |
| DAST | OWASP ZAP, Burp | 動的スキャン |
| 依存関係 | npm audit, Snyk | 依存関係の脆弱性 |
| シークレット | git-secrets, TruffleHog | シークレットのスキャン |
エージェントの連携
qe-security-scanner:多層的な SAST/DAST スキャンqe-api-contract-validator:API セキュリティテストqe-quality-analyzer:セキュリティコードレビュー
主な脆弱性テスト
1. アクセス制御の不備
// Horizontal escalation - User A accessing User B's data
test('user cannot access another user\'s order', async () => {
const userAToken = await login('userA');
const userBOrder = await createOrder('userB');
const response = await api.get(`/orders/${userBOrder.id}`, {
headers: { Authorization: `Bearer ${userAToken}` }
});
expect(response.status).toBe(403);
});
// Vertical escalation - Regular user accessing admin
test('regular user cannot access admin', async () => {
const userToken = await login('regularUser');
expect((await api.get('/admin/users', {
headers: { Authorization: `Bearer ${userToken}` }
})).status).toBe(403);
});
2. インジェクション攻撃
// SQL Injection
test('prevents SQL injection', async () => {
const malicious = "' OR '1'='1";
const response = await api.get(`/products?search=${malicious}`);
expect(response.body.length).toBeLessThan(100); // Not all products
});
// XSS
test('sanitizes HTML output', async () => {
const xss = '<script>alert("XSS")</script>';
await api.post('/comments', { text: xss });
const html = (await api.get('/comments')).body;
expect(html).toContain('<script>');
expect(html).not.toContain('<script>');
});
3. 暗号化の失敗
test('passwords are hashed', async () => {
await db.users.create({ email: '[email protected]', password: 'MyPassword123' });
const user = await db.users.findByEmail('[email protected]');
expect(user.password).not.toBe('MyPassword123');
expect(user.password).toMatch(/^\$2[aby]\$\d{2}\$/); // bcrypt
});
test('no sensitive data in API response', async () => {
const response = await api.get('/users/me');
expect(response.body).not.toHaveProperty('password');
expect(response.body).not.toHaveProperty('ssn');
});
4. セキュリティ設定の不備
test('errors don\'t leak sensitive info', async () => {
const response = await api.post('/login', { email: '[email protected]', password: 'wrong' });
expect(response.body.error).toBe('Invalid credentials'); // Generic message
});
test('sensitive endpoints not exposed', async () => {
const endpoints = ['/debug', '/.env', '/.git', '/admin'];
for (let ep of endpoints) {
expect((await fetch(`https://example.com${ep}`)).status).not.toBe(200);
}
});
5. レート制限
test('rate limiting prevents brute force', async () => {
const responses = [];
for (let i = 0; i < 20; i++) {
responses.push(await api.post('/login', { email: '[email protected]', password: 'wrong' }));
}
expect(responses.filter(r => r.status === 429).length).toBeGreaterThan(0);
});
セキュリティチェックリスト
認証
- 強力なパスワード要件(12 文字以上)
- パスワードのハッシュ化(bcrypt、scrypt、Argon2)
- 機密性の高い操作に MFA を適用
- ログイン失敗後にアカウントをロック
- ログイン後にセッション ID を変更
- セッションタイムアウト
認可
- すべてのリクエストで認可を確認
- 最小権限の原則
- 水平方向の権限昇格がない
- 垂直方向の権限昇格がない
データ保護
- すべての通信で HTTPS を使用
- 保存データを暗号化
- シークレットをコードやログに含めない
- 個人情報保護規制への準拠(GDPR)
入力検証
- サーバー側で検証
- パラメーター化クエリ(SQL インジェクションを防止)
- 出力エンコーディング(XSS を防止)
- レート制限
CI/CD との統合
# GitHub Actions
security-checks:
steps:
- name: Dependency audit
run: npm audit --audit-level=high
- name: SAST scan
run: npm run sast
- name: Secret scan
uses: trufflesecurity/trufflehog@main
- name: DAST scan
if: github.ref == 'refs/heads/main'
run: docker run owasp/zap2docker-stable zap-baseline.py -t https://staging.example.com
コミット前フック:
#!/bin/sh
git-secrets --scan
npm run lint:security
エージェント支援によるセキュリティテスト
// Comprehensive multi-layer scan
await Task("Security Scan", {
target: 'src/',
layers: { sast: true, dast: true, dependencies: true, secrets: true },
severity: ['critical', 'high', 'medium']
}, "qe-security-scanner");
// OWASP Top 10 testing
await Task("OWASP Scan", {
categories: ['broken-access-control', 'injection', 'cryptographic-failures'],
depth: 'comprehensive'
}, "qe-security-scanner");
// Validate fix
await Task("Validate Fix", {
vulnerability: 'CVE-2024-12345',
expectedResolution: 'upgrade package to v2.0.0',
retestAfterFix: true
}, "qe-security-scanner");
エージェント連携のヒント
メモリ名前空間
aqe/security/
├── scans/* - Scan results
├── vulnerabilities/* - Found vulnerabilities
├── fixes/* - Remediation tracking
└── compliance/* - Compliance status
フリート連携
const securityFleet = await FleetManager.coordinate({
strategy: 'security-testing',
agents: [
'qe-security-scanner',
'qe-api-contract-validator',
'qe-quality-analyzer',
'qe-deployment-readiness'
],
topology: 'parallel'
});
よくある間違い
❌ 隠すことで安全を確保する
/super-secret-admin に管理画面を隠す → 適切な認証を使用します
❌ クライアント側の検証のみを行う
JavaScript による検証は回避できます → 必ずサーバー側でも検証します
❌ ユーザー入力を信頼する
入力が安全だと仮定する → すべての入力をサニタイズ、検証、エスケープします
❌ シークレットをハードコードする
コードに API キーを記述する → 環境変数とシークレット管理を使用します
関連スキル
- agentic-quality-engineering - エージェントによるセキュリティ
- api-testing-patterns - API セキュリティテスト
- compliance-testing - GDPR、HIPAA、SOC2
覚えておくこと
攻撃者の視点で考えましょう: 何を壊そうとするかを考え、それをテストします。 防御者の視点で構築しましょう: 安全だと確認できるまでは、入力は悪意のあるものとみなします。 継続的にテストしましょう: セキュリティテストは一度きりではなく、継続的に行います。
エージェントを活用しましょう: エージェントは脆弱性スキャンを自動化し、修正状況を追跡し、修正内容を検証します。大規模なセキュリティ態勢の維持にエージェントを活用しましょう。
コメント
Markdown 対応