security-specialist について
security-specialistは、リポジトリ監査や差分レビュー、ペネトレーションテスト、脅威モデリング、修正に対応するセキュリティスキルです。悪用可能性を証拠で示し、独立した敵対的検証を行い、スキャン状態を保持します。
主な機能
- 01リポジトリ、差分、実環境の調査ワークフロー
- 02脅威モデリングと攻撃経路分析
- 03証拠に基づく指摘と深刻度のルール
- 04フルスキャンでの敵対的検証
- 05SQLiteによるスキャン管理とHTMLレポート
活用シーン
- 01リポジトリを監査しローカル開発サーバーをテスト
- 02プルリクエストのセキュリティレビュー
- 03脅威モデルの作成や攻撃チェーンの追跡
- 04脆弱性修正の検証とレポート作成
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ fabricioctelles/ skills --skill security-specialistインストール後、Claude Code で/security-specialistを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/finding-format.mdreport-format.mdreport-schema.jsonscan-artifacts.mdseverity-policy.mdscripts/finalize.pypentest.pyrank_files.pyscan_db.pyvalidate-findings.cjssteering/attack-paths.mddiff-review.mddiscovery.mdfull-scan.mdhunting.mdpentest.mdremediation.mdreporting.mdthreat-model.mdtracking.mdtriage.mdvalidation.md詳細
セキュリティスペシャリスト
ソースコードのセキュリティ作業を行います。曖昧な分析ではありません。リポジトリを調査し、データフローを追跡し、実際のバグを見つけ、証拠を提示します。
ユーザーのニーズに合わせて、以下の表からワークフローを選んでください。その後、対応するステアリングドキュメントを読み、その指示に従ってください。ワークフローの順序を独自に変えてはいけません。手順を省くと、質の低い発見につながるためです。
基本原則
悪用できるものだけを報告する
すべての発見には、具体的な攻撃シナリオが必要です。攻撃者は誰で、何を行い、何を得るのでしょうか。「攻撃者が理論上……できる」は発見ではありません。「このリクエストを送ると、この結果が得られる」ことが発見です。
ベースラインを動的に特定する
フェーズ 1 では、このアプリケーションが何であるか、比較対象となるアプリケーションが何かを特定します。比較対象は、発見を退けるのではなく、調査の焦点を定めるために活用します。比較対象に同じパターンがあり、そこで悪用されたことがあるなら、発見の重要性はさらに高まります。同じパターンがあり、20 年間誰にも悪用されていないなら、報告する前にその理由を理解してください。
敵対的な検証
発見を検証するエージェントは、それを発見したエージェントとは別でなければなりません。調査エージェントが発見し、検証エージェントが誤検知を排除します。この分離は、レポートの品質にとって非常に重要です。
重大度は影響で決まる
重大度 = 発生可能性 × 影響度であり、チェックリストからの逸脱ではありません。攻撃者が具体的にどのような損害を与えるか説明できないなら、重大度を実際より高く見積もっている可能性があります。
多層防御の不備は脆弱性ではない
レイヤー A が攻撃を防いでいるなら、レイヤー B がないことは強化の提案であり、発見事項ではありません。
複数回の実行で網羅性が高まる
テストによると、1 回の実行で見つかる脆弱性は、複数回の実行で見つかる総数のおよそ半分です。実行ごとに異なるコードパスを調査します。過去の実行結果を参考に、さらに深く調査する箇所を決めてください。
入力モデル
スキャン範囲は、ユーザーが提供する情報によって異なります。
| ユーザーが提供する情報 | 実行内容 |
|---|---|
| パスのみ | SAST(ソースコード)→ 開発サーバーを起動 → DAST(localhost) |
| パス + URL | SAST(ソースコード)→ DAST(localhost)→ DAST(本番 URL、確認が必要) |
| URL のみ | URL を対象に DAST(localhost でない場合は確認) |
常に、最も侵襲性の低いレイヤーから始め、段階的に進めてください。3 層の相関分析(ソース → 開発環境 → 本番環境)により、最も強力な証拠が得られます。
認可確認
localhost、127.0.0.1、0.0.0.0、*.local、192.168.*、10.*、172.16-31.*→ 確認不要- それ以外 → 次のように質問してください。「[URL] にアクティブプローブを送信します。この対象をテストする権限がありますか? [y/n]」
ワークフロー
| やりたいこと | ステアリングドキュメント | よくある依頼 |
|---|---|---|
| リポジトリ全体をスキャンする | steering/full-scan.md | 「このリポジトリをスキャンして」「セキュリティ監査をして」「脆弱性を見つけて」 |
| 差分/PRをレビューする | steering/diff-review.md | 「このPRをレビューして」「変更内容を確認して」「この差分をセキュリティレビューして」 |
| 稼働中のターゲットにペネトレーションテストを行う | steering/pentest.md | 「これにペネトレーションテストをして」「target.comを調査して」「アプリを列挙して」 |
| 脆弱性を探す | steering/hunting.md | 「バグを探して」「攻撃クラスを調べて」「ワイルドカードエージェントを実行して」 |
| 脅威モデルを構築する | steering/threat-model.md | 「脅威モデルを作成して」「攻撃対象領域をマッピングして」「信頼境界を特定して」 |
| 攻撃経路を追跡する | steering/attack-paths.md | 「どう悪用される可能性があるか」「攻撃チェーン」「被害範囲」 |
| 新たな発見事項を見つける | steering/discovery.md | 「これらのファイルに問題がないか調べて」「ここで何が問題か」 |
| 発見事項をトリアージする | steering/triage.md | 「これらの優先順位をつけて」「重要なのはどれか」「深刻度を評価して」 |
| 脆弱性を修正する | steering/remediation.md | 「この脆弱性を修正して」「パッチを適用して」「修正案を提案して」 |
| 発見事項を時系列で追跡する | steering/tracking.md | 「これらの発見事項を追跡して」「GitHubのイシューにエクスポートして」「ステータスを更新して」 |
| 修正を検証する | steering/validation.md | 「この修正を検証して」「実際にパッチが適用されているか」「リグレッションを確認して」 |
| レポートを生成する | steering/reporting.md | 「レポートを書いて」「発見事項を要約して」「最終成果物を作成して」 |
スクリプト
ユーティリティスクリプトは、このスキルを基準とした scripts/ にあります。
python3 scripts/<name>.py [args] # Python utilities
node scripts/validate-findings.cjs <file> # Schema validator
| スクリプト | 目的 |
|---|---|
scan_db.py | SQLite CRUD:スキャンの初期化、発見事項の追加/検証/トリアージ、エクスポート |
rank_files.py | 発見作業用のファイルリスト作成に向けて、セキュリティ関連度でファイルをスコアリング |
pentest.py | 調査、列挙、脆弱性スキャンのラッパー(システムツール+Pythonのフォールバック) |
finalize.py | スキャンを確定:JSON+HTMLをエクスポートし、整合性ハッシュを計算 |
validate-findings.cjs | findings.json が report-schema.json に適合するか検証(依存関係なし、Node.js) |
参考資料
| ファイル | 対象範囲 | 読むタイミング |
|---|---|---|
references/report-format.md | HTMLレポートのテンプレート、CSS、構成、フッター | security-report.html を生成する前 |
references/finding-format.md | 発見事項の構造(シンプル形式+構造化形式) | 発見事項を記録する前 |
references/severity-policy.md | 深刻度の分類ルール+CVE相互参照プロトコル | 深刻度を設定する前 |
references/scan-artifacts.md | スキャンディレクトリの構造、ファイル名 | スキャンを初期化する前 |
references/report-schema.json | 構造化された findings.json 用のJSONスキーマ | フェーズ5の出力を記述する前 |
レポートの出力形式はHTML(security-report.html)です。色分けされた深刻度、折りたたみ可能な証拠、インタラクティブな深刻度フィルターを備えた、自己完結型のダークテーマのファイルです。外部依存関係はありません。
避けるべきアンチパターン
セキュリティ監査を役に立たなくする誤り:
-
OWASPから逸脱するものをすべてfindingとして列挙する。 OWASPはチェックリストであり、バグ一覧ではありません。実際のアプリケーションでは、必ず何らかのトレードオフがあります。
-
多層防御の不足をHIGH/CRITICALと評価する。「クエリビルダーが識別子をすでにエスケープしているのにvalidateIdentifierがない」ことは、HIGHではありません。
-
デプロイモデルを無視する。 CDNレイヤーでのレート制限は妥当なアーキテクチャです。すべてのアプリにアプリケーションレベルのレート制限が必要なわけではありません。
-
設計どおりの動作をバグとして扱う。 監査の前にトラストモデルを理解してください。設計上、管理者を全面的に信頼すると定められているなら、管理者が管理者向けの操作をすることはfindingではありません。
-
徹底的に見せるため、レポートにLOWを詰め込む。 LOWが10件あっても、役に立つレポートにはなりません。MEDIUMが3件あるほうが有用です。
-
証拠のない「可能性がある」finding。 悪用できるか、できないかです。「可能性として」や「理論上」という言葉が必要なら、調査が足りません。
-
コードベースの優れた点を無視する。 認証が堅牢なら、そのことを伝えてください。報告するfindingへの信頼が高まり、チームの優先順位付けにも役立ちます。
-
パーサーやランタイムに関する誤った前提に基づいてエクスプロイトを組み立てる。 最も説得力のある誤検知は、「パーサーはこれを……として解釈する」という、確認を伴わない推論から生まれます。エクスプロイトがパーサーの動作に依存する場合は、仕様を引用するか、テストしてください。思い込みで判断してはいけません。
-
ビジネスロジックや創造的な攻撃を見落とす。 標準的な脆弱性クラス(SQLi、XSS、SSRF)は、どのスキャナーでもチェックします。手動監査の価値は、スキャナーでは見つけられないもの、つまりロジックエラー、ステートマシン違反、攻撃の連鎖、暗黙の信頼前提を見つけることにあります。
-
簡単に諦める。「コードベースではパラメーター化クエリを使っているため、SQLインジェクションはない」というのは、怠慢な結論です。sql.raw()の使用箇所をすべて確認してください。動的な識別子も確認してください。search/FTSも確認してください。クエリビルダーを迂回するコードパスがないか確認してください。徹底してください。
厳守事項
これらはすべてのワークフローに適用されます。例外はありません。
- ユーザーの優先言語を尊重する。 レポートの内容はユーザーの言語にしてください。HTMLテンプレートの構造はそのままにします。
- 証拠がなければ、何も起きていないのと同じです。 すべてのfindingに、ソースの位置、データフローの追跡、具体的な悪用可能性の説明が必要です。
- 重大度を捏造しない。 影響を実証できない場合は、needs-investigationとマークしてください。
- スキャンの状態を保持する。 SQLiteデータベースには進捗が保存されています。絶対に消去しないでください。後続の実行は、中断したところから再開します。
- 確定後、findingは変更不可です。 最終確定後、元の証拠レコードは変更されません。
- 相対パスのみを使用する。 すべてのファイル参照には、リポジトリ相対パスを使用してください。
- CVEの重大度と実際の重大度は異なります。 必ず実際のプロジェクトでの使用状況と照合してください。
- 参照仕様に厳密に従う。 構造化出力を生成する前に、
references/内の該当ファイルを読んでください。 - 構造化出力を検証する。
findings.jsonを提出する前に、node scripts/validate-findings.cjsを実行してください。 - full-scanでは敵対的検証が必須です。 Phase 3またはPhase 6を絶対に省略しないでください。
レポート準拠チェックリスト
security-report.htmlを提出する前に、references/report-format.mdに照らしてすべてを確認してください。
構造(次の順序で存在すること)
- リポジトリ名を含む
<title> - メタグリッド:Repository、Date、Target、Methodology
- サマリーカード(重大度ごとの件数)
- エグゼクティブサマリーの段落
- フィルターボタン(Todos、Critical、High、Medium、Low、Info)
- 重大度の降順に並べたfindingカード
- CVE分析テーブル(依存関係に勧告がある場合)
- ペネトレーションテスト結果セクション(該当する場合)
- ネガティブ結果テーブル — テストした項目と、安全だと確認した項目
- 修正優先度テーブル
- フッター:
Generated by security-specialist skill by github.com/fabricioctelles/skills
スタイル
- ダークテーマ、重大度ごとに色分けされたバッジ
- 外部依存なし、オフラインで動作する
コンテンツの完全性
- 実施したすべてのテストがレポートに記載されている(肯定的な結果と否定的な結果の両方)
- 証拠は言い換えではなく、実際の出力である
- CVE の深刻度をプロジェクトの状況と照らし合わせている
- 発見事項を敵対的に検証している(フェーズ 3 に合格)
- 各発見事項に信頼度スコアが記載されている(フルスキャン)
得られた教訓
CVE の深刻度と実際の影響:必ず照合する
脆弱なコードパスに到達できないなら、CVSS 9.8 の CVE でも意味はありません。依存関係の CVE を分類する前に、前提条件を確認してください。
| 手順 | 確認する内容 | 該当しない場合 → |
|---|---|---|
| 1 | 脆弱な関数/モジュールが直接使われているか? | LOW または INFO に下げる |
| 2 | プロジェクトで問題を引き起こす機能が使われているか? | LOW または INFO に下げる |
| 3 | 環境条件を満たしているか? | LOW または INFO に下げる |
| 4 | DAST で悪用可能性を確認できたか? | 「本番環境では未確認」としてフラグを付ける |
3 層の相関分析
ローカルホストで確認された発見事項が、本番環境にも存在するとは限りません。インフラによって緩和されている可能性があるためです。両方を必ずテストし、その差異を記録してください。
ストレージの悪用は見過ごされがち
永続化されるフィールドの入力サイズが検証されていないケースは、見落とされることがよくあります。これは現実的な DoS の攻撃経路です。特に SQLite では、ディスクがいっぱいになるとアプリ全体が停止します。
複数回実行によるカバレッジ戦略
各実行では、前回までの実行で見落とされた点を明示的に対象にしてください。前回までにインジェクションのバグが 5 件見つかり、ロジックのバグが 0 件だった場合、次回はビジネスロジック、機能の悪用、ワイルドカードエージェントに重点を置くべきです。