differential-review について
differential-reviewは、許可されたセキュリティレビュー向けの差分コードレビュー スキルです。コミットやプルリクエストで新たに生じたリスクに着目し、セキュリティ回帰、依存関係や設定の変更を調べ、修正案を含む形式化されたフィードバックを作成します。
主な機能
- 01Git差分のセキュリティ関連変更を分析
- 02新たな脆弱性と回帰を検出
- 03依存関係と設定の変更を評価
- 04認証・認可の変更と秘密情報を確認
- 05修正案付きのインライン指摘を作成
活用シーン
- 01管理するリポジトリのプルリクエストをレビュー
- 02マージ前にセキュリティ回帰を確認
- 03依存関係とインフラ設定の変更をレビュー
- 04CI/CDでコード差分をスキャン
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ oimiragieo/ agent-studio --skill differential-reviewインストール後、Claude Code で/differential-reviewを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
commands/differential-review.mdhooks/post-execute.cjspre-execute.cjsreferences/research-requirements.mdrules/differential-review.mdschemas/input.schema.jsonoutput.schema.jsonscripts/main.cjstemplates/implementation-template.md詳細
差分レビュー
セキュリティに関する注意事項
許可された用途のみ:これらのスキルは、防御的なセキュリティ分析と許可された調査を目的としています。
- 所有するリポジトリのプルリクエストのセキュリティレビュー
- CI/CD パイプラインでのマージ前セキュリティ検証
- コード変更におけるセキュリティリグレッションの検出
- コード変更のコンプライアンス検証
- 管理された環境での教育目的
以下の目的では絶対に使用しないでください:
- アクセスを許可されていないコードのレビュー
- 脆弱性を開示せずに悪用すること
- コードレビュープロセスの回避
- あらゆる違法行為
ステップ 1:差分を取得する
Git 差分の取得方法
# Review staged changes
git diff --cached
# Review specific commit
git diff HEAD~1..HEAD
# Review pull request (GitHub)
gh pr diff <PR-NUMBER>
# Review specific files
git diff --cached -- src/auth/ src/api/
# Review with context (10 lines)
git diff -U10 HEAD~1..HEAD
# Show only changed file names
git diff --name-only HEAD~1..HEAD
# Show stats (insertions/deletions per file)
git diff --stat HEAD~1..HEAD
変更されたファイルを分類する
セキュリティ上の機密性に基づいて、レビューの優先順位を付けます。
| 優先度 | ファイルパターン | 理由 |
|---|---|---|
| P0 | **/auth/**, **/security/**, **/crypto/** | セキュリティコードに直接関わる |
| P0 | *.env*, **/config/**, **/secrets/** | 設定とシークレット |
| P0 | **/middleware/**, **/guards/**, **/validators/** | セキュリティ制御 |
| P1 | **/api/**, **/routes/**, **/controllers/** | 攻撃対象領域 |
| P1 | package.json, requirements.txt, go.mod | 依存関係の変更 |
| P1 | Dockerfile, docker-compose.yml, *.yaml | インフラストラクチャ設定 |
| P2 | **/models/**, **/db/**, **/queries/** | データアクセス層 |
| P2 | **/utils/**, **/helpers/** | 共有ユーティリティコード |
| P3 | **/tests/**, **/docs/** | テストとドキュメント |
ステップ 2:セキュリティに重点を置いた差分分析
分析フレームワーク
変更された各ファイルについて、次のセキュリティ項目を評価します。
2.1 入力検証の変更
CHECK: Did the change modify input validation?
- Added validation: POSITIVE (verify correctness)
- Removed validation: CRITICAL (likely regression)
- Changed validation: INVESTIGATE (may weaken security)
- No validation on new input: WARNING (missing validation)
危険な兆候:
- 正規表現パターンの削除または弱体化
- 検証ミドルウェアのコメントアウト
strictモードからlooseモードへの変更any型の追加、または型チェックの無効化- 長さ制限や範囲チェックの削除
2.2 認証/認可の変更
CHECK: Did the change affect auth?
- New endpoint without auth middleware: CRITICAL
- Removed auth check: CRITICAL
- Changed permission levels: INVESTIGATE
- Modified token handling: INVESTIGATE
- Added new auth bypass: CRITICAL
危険な兆候:
- 認証ミドルウェアのないルートの追加
isAdminチェックの削除または弱体化- トークンの有効期限の大幅な延長
- セッション管理の変更
- CORS ポリシーの緩和
2.3 データフローの変更
CHECK: Did the change introduce new data flows?
- User input to database: CHECK for injection
- User input to HTML: CHECK for XSS
- User input to file system: CHECK for path traversal
- User input to command execution: CHECK for command injection
- User input to redirect: CHECK for open redirect
2.4 暗号処理の変更
CHECK: Did the change affect cryptography?
- Algorithm downgrade: CRITICAL (e.g., SHA-256 to MD5)
- Key size reduction: CRITICAL
- Removed encryption: CRITICAL
- Changed to ECB mode: CRITICAL
- Hardcoded key/IV: CRITICAL
2.5 エラー処理の変更
CHECK: Did the change affect error handling?
- Removed try/catch: WARNING
- Added stack trace in response: CRITICAL (info disclosure)
- Changed error to success: CRITICAL (fail-open)
- Swallowed exceptions: WARNING
2.6 依存関係の変更
CHECK: Did dependencies change?
- New dependency: CHECK for known CVEs
- Version downgrade: INVESTIGATE
- Removed security dependency: CRITICAL
- Changed to fork/alternative: INVESTIGATE
# Check new dependencies for known vulnerabilities
npm audit
pip audit
go list -m -json all | nancy sleuth
ステップ 3:インラインのセキュリティコメント
コメント形式
検出事項ごとに、次の構成に従ったインラインコメントを記述します。
**SECURITY [SEVERITY]**: [Brief description]
**Location**: `file.js:42` (in diff hunk)
**Category**: [OWASP/CWE category]
**Impact**: [What could go wrong]
**Remediation**: [How to fix]
```diff
- // Current (vulnerable)
- db.query("SELECT * FROM users WHERE id = " + userId);
+ // Suggested (safe)
+ db.query("SELECT * FROM users WHERE id = $1", [userId]);
```
### Severity Levels for Diff Findings
| Severity | Criteria | Action |
|----------|----------|--------|
| **CRITICAL** | Exploitable vulnerability introduced | Block merge |
| **HIGH** | Security regression or missing control | Block merge |
| **MEDIUM** | Weak pattern that could lead to vulnerability | Request changes |
| **LOW** | Style issue with security implications | Suggest improvement |
| **INFO** | Security observation, no immediate risk | Note for awareness |
## Step 4: Differential Security Report
### Report Template
```markdown
## Differential Security Review
**PR/Commit**: [reference]
**Author**: [author]
**Reviewer**: security-architect
**Date**: YYYY-MM-DD
**Files Changed**: X | Additions: +Y | Deletions: -Z
### Security Impact Summary
| Category | Before | After | Change |
|----------|--------|-------|--------|
| Input validation | X checks | Y checks | +/-N |
| Auth-protected routes | X routes | Y routes | +/-N |
| SQL parameterization | X% | Y% | +/-N% |
| Secrets exposure | X | Y | +/-N |
### Findings
#### CRITICAL
1. [Finding with full details and remediation]
#### HIGH
1. [Finding with full details and remediation]
#### MEDIUM
1. [Finding with full details and remediation]
### Verdict
- [ ] APPROVE: No security issues found
- [ ] APPROVE WITH CONDITIONS: Minor issues, fix before deploy
- [ ] REQUEST CHANGES: Security issues must be addressed
- [ ] BLOCK: Critical vulnerability introduced
ステップ 5:差分の自動スキャン
Semgrep の差分モード
# Scan only changed files
semgrep scan --config=p/security-audit --baseline-commit=main
# Scan diff between branches
semgrep scan --config=p/security-audit --baseline-commit=origin/main
# Output as SARIF for CI integration
semgrep scan --config=p/security-audit --baseline-commit=main --sarif --output=diff-results.sarif
カスタムの差分セキュリティチェック
# Check for secrets in diff
git diff --cached | grep -iE "(password|secret|api.?key|token|credential)\s*[=:]"
# Check for dangerous function additions
git diff --cached | grep -E "^\+" | grep -iE "(eval|exec|system|innerHTML|dangerouslySetInnerHTML)"
# Check for removed security middleware
git diff --cached | grep -E "^\-" | grep -iE "(authenticate|authorize|validate|sanitize|escape)"
# Check for new deferred security items (unresolved markers)
git diff --cached | grep -E "^\+" | grep -iE "(T0D0|F1XME|HACK|XXX).*(security|auth|vuln)"
GitHub Actions との統合
name: Security Diff Review
on: [pull_request]
jobs:
security-diff:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Semgrep diff scan
uses: returntocorp/semgrep-action@v1
with:
config: p/security-audit
- name: Check for secrets
run: |
git diff origin/main..HEAD | grep -iE "(password|secret|api.?key|token)\s*[=:]" && exit 1 || exit 0
## 差分でよく見られるセキュリティのデグレード
| パターン | 変更内容 | リスク |
|---|---|---|
helmet() ミドルウェアの削除 | セキュリティヘッダーの削除 | ヘッダーインジェクション、クリックジャッキング |
sameSite: 'strict' から 'none' への変更 | Cookie ポリシーの弱体化 | CSRF 攻撃 |
| レート制限ミドルウェアの削除 | レート制限の解除 | ブルートフォース攻撃、DoS |
cors({ origin: '*' }) の追加 | CORS のワイルドカード指定 | クロスオリジン攻撃 |
csrf() ミドルウェアの削除 | CSRF 保護の削除 | CSRF 攻撃 |
httpOnly: true から false への変更 | JavaScript から Cookie にアクセス可能 | XSS によるトークン窃取 |
関連スキル
static-analysis- コードベース全体の静的解析variant-analysis- パターンベースの脆弱性検出semgrep-rule-creator- カスタム検出ルールinsecure-defaults- ハードコードされた認証情報の検出security-architect- STRIDE 脅威モデリング
エージェントとの連携
- code-reviewer(主担当):セキュリティを強化したコードレビュー
- security-architect(主担当):変更内容のセキュリティ評価
- penetration-tester(副担当):検出事項の悪用可能性を検証
- developer(副担当):セキュリティを考慮した開発ガイダンス
鉄則
- 必ずレビュー前に変更ファイルをセキュリティ上の重要度(P0~P3)で分類してください。トリアージマップなしでコードの確認に着手してはいけません。最もリスクの高い変更を見落とします。
- 決してセキュリティミドルウェア(認証、CSRF、レート制限、helmet)の削除を通常のリファクタリングとして扱ってはいけません。必ず「重大」として指摘し、PR の説明に明確な正当化理由を求めてください。
- コンテキストを拡張した差分には、必ず
git diff -U10を使用してください。既定の3行のコンテキストでは、関数の並べ替えやミドルウェアの削除によるセキュリティのデグレードを検出するには不十分です。 - 新しいパブリックエンドポイントを追加する差分を承認する前に、認証ミドルウェアが適用されていることを必ず確認してください。認証されていないルートは、差分で頻繁に見られるセキュリティのデグレードです。
- 追加された行と同じ注意深さで、削除された行も必ず確認してください。検証、ログ記録、認証チェックなどのセキュリティ制御の削除は、新たに脆弱なコードを追加するのと同じくらい危険です。
反パターン
| 反パターン | 問題が起こる理由 | 正しい対応 |
|---|---|---|
| 周辺のコンテキストを読まずに変更行だけを確認する | 周辺の認証/ミドルウェアが削除されると、セキュリティの後退がリファクタリングのように見える | git diff -U10 を使い、変更前後の関数全体を読む |
| セキュリティ依存関係の削除を依存関係の更新として扱う | セキュリティパッケージ(helmet、csurf)を削除すると、その保護機能が気付かれないまま失われる | すべての依存関係の変更を分類し、セキュリティパッケージの削除には CRITICAL とフラグを付ける |
| 削除行の確認を省略する | 入力検証、認証チェック、ロギングの削除は、追加分のみを確認するレビューでは見えない | まず削除箇所を確認し、「どの保護機能が削除されたか」のリストを作成する |
| 認証チェックを確認せずに新しいルートを承認する | 明示的に追加されていない場合、新しいエンドポイントは既存のミドルウェアを迂回する | 差分に含まれる新しいルート/コントローラーごとにミドルウェアチェーンを確認する |
| CWE/OWASP の参照なしに「問題なさそう」といった曖昧な重要度を使う | 重要度が曖昧だと、修正の優先順位付けに一貫性がなくなる | 構造化された形式を使う:SECURITY [SEVERITY]、CWE、OWASP カテゴリー、修正方法 |
メモリープロトコル(必須)
開始前:
.claude/context/memory/learnings.md を読む
完了後:
- 新しいパターン ->
.claude/context/memory/learnings.md - 見つかった問題 ->
.claude/context/memory/issues.md - 行った決定 ->
.claude/context/memory/decisions.md
中断を想定してください:メモリーに記録されていなければ、何も起きていません。
コメント
Markdown 対応