security-code-review について
Python、C++、Shell、Markdown を対象とするセキュリティレビュー用スキルです。言語別のチェックリストとツールの指針を備え、結果を定められた CSV 形式で出力する手順も示します。
主な機能
- 01Python、C++、Shell、Markdown のレビュー
- 02言語別のセキュリティリスク確認
- 03静的解析・実行時ツールの提案
- 04CSV レポートの生成と検証
活用シーン
- 01コードレビューで脆弱性を確認
- 02推論サービスコードの既知リスクを点検
- 03CI/CD スキャンのチェック手順を策定
- 04手動確認用のレビュー報告を作成
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ ascend/ agent-skills --skill security-code-reviewインストール後、Claude Code で/security-code-reviewを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/cpp.mdlessons-learned.mdmarkdown.mdpython.mdshell.md詳細
多语言安全代码审查 (Security Code Review)
适用场景
- 安全审查: 对 Python、C++、Shell、Markdown 文件进行安全代码审查
- Code Review: 在代码评审中检查安全漏洞
- 新代码编写: 编写安全的代码,避免常见漏洞
- 合规检查: 满足安全合规要求 (CWE, CERT, OWASP)
- CI/CD 集成: 在流水线中集成安全扫描工具
审查工作流程
执行安全审查时,按以下步骤进行:
- 确定审查范围:识别目标代码的语言类型(Python/C++/Shell/Markdown)
- 加载对应参考:根据语言读取
references/下的详细审查指南 - 逐项检查:按照下方各语言的审查要点和检查清单执行
- 查阅历史经验:对于推理服务相关代码,读取
references/lessons-learned.md排查已知问题模式 - 生成审查报告:按照本文件末尾的输出规范生成 CSV 报告
Python 安全审查
详细代码示例和安全/不安全对比:读取
references/python.md
审查覆盖的 10 个关键领域:
| # | 领域 | 核心风险 | 关键搜索模式 |
|---|---|---|---|
| 1 | 代码注入 | 任意代码执行 | eval(, exec(, shell=True |
| 2 | SQL 注入 | 数据泄露/篡改 | f"SELECT, cursor.execute(f" |
| 3 | 反序列化 | RCE | pickle.loads, yaml.load( (无 safe_load) |
| 4 | 路径遍历 | 任意文件读取 | os.path.join( + 用户输入, 无 realpath 校验 |
| 5 | 敏感信息泄露 | 密钥暴露 | 硬编码 API_KEY=, PASSWORD=, logger.*(password |
| 6 | assert 误用 | 权限绕过 | assert user.is_admin, assert.*auth |
| 7 | 临时文件 | 竞态/符号链接攻击 | open("/tmp/ (未用 tempfile) |
| 8 | ReDoS | CPU 耗尽 | (a+)+, (.*)*, 嵌套量词 |
| 9 | JSON 嵌套深度 | 栈溢出/资源耗尽 | json.loads( 无深度限制 (CWE-674, CWE-400) |
| 10 | 特殊 Token 注入 | 进程崩溃/DoS | np.where(np.equal(input_ids, 无配对校验 (CWE-129, CWE-248) |
Python 安全工具:
| 工具 | 用途 | 命令 |
|---|---|---|
| bandit | 静态安全分析 | bandit -r src/ |
| pip-audit | 依赖漏洞扫描 | pip-audit |
| pylint | 代码质量 + 部分安全规则 | pylint src/ |
| mypy | 类型检查,防止类型混淆 | mypy src/ |
| semgrep | 自定义安全规则 | semgrep --config=p/python |
C++ 安全审查
详细代码示例和安全/不安全对比:读取
references/cpp.md
审查覆盖的 11 个关键领域:
| # | 领域 | 核心风险 | 关键搜索模式 |
|---|---|---|---|
| 1 | 缓冲区溢出 | 代码执行 | strcpy(, sprintf(, gets( |
| 2 | 内存管理 | UAF/Double-free | new/delete (非智能指针), raw pointer |
| 3 | 整数溢出 | 缓冲区分配错误 | new char[size] 无范围检查 |
| 4 | 格式化字符串 | 内存读写 | printf(user_input), fprintf(stderr, var) |
| 5 | 未初始化变量 | 未定义行为 | 声明后未赋值即使用 |
| 6 | RAII/资源泄漏 | 资源耗尽 | fopen/fclose, mutex.lock()/.unlock() |
| 7 | 线程安全 | 数据竞争 | 非 atomic 跨线程变量, 无锁共享数据 |
| 8 | 类型转换 | 类型混淆 | C 风格强转 (Type*)ptr, 尤其是向下转型 |
| 9 | JSON 嵌套深度 | 栈溢出 | nlohmann::json::parse( 无深度限制 (CWE-674) |
| 10 | 服务资源上限 | OOM | 配置参数组合峰值内存超物理内存 (CWE-400, CWE-770) |
| 11 | 特殊 Token 注入 | 段错误/崩溃 | Token 配对假设, 固定偏移访问 (CWE-129, CWE-248) |
C++ 安全工具:
| 工具 | 用途 | 命令/用法 |
|---|---|---|
| AddressSanitizer | 内存错误检测 | -fsanitize=address |
| ThreadSanitizer | 数据竞争检测 | -fsanitize=thread |
| UBSanitizer | 未定义行为检测 | -fsanitize=undefined |
| Valgrind | 内存泄漏检测 | valgrind --leak-check=full ./app |
| cppcheck | 静态分析 | cppcheck --enable=all src/ |
| clang-tidy | Linter + 安全规则 | clang-tidy -checks='*' src/*.cpp |
| Coverity | 企业级静态分析 | CI 集成 |
Shell 安全审查
详细代码示例和安全/不安全对比:读取
references/shell.md
审查覆盖的 8 个关键领域:
| # | 领域 | 核心风险 | 关键搜索模式 |
|---|---|---|---|
| 1 | 脚本头部 | 静默失败 | 缺少 set -euo pipefail |
| 2 | 变量引用 | 命令注入/误删 | $var (未用 "$var") |
| 3 | 命令注入 | 任意命令执行 | eval "$user_input" |
| 4 | 临时文件 | 竞态条件 | > /tmp/fixed_name (未用 mktemp) |
| 5 | 权限 | 未授权访问 | chmod 777, chmod 666 |
| 6 | PATH 安全 | 路径劫持 | 关键命令未用绝对路径 |
| 7 | 信号处理 | 资源泄漏 | 缺少 trap cleanup EXIT |
| 8 | 输入验证 | 路径遍历 | 未校验的 $filename 直接 cat |
Shell 安全工具:
| 工具 | 用途 | 命令 |
|---|---|---|
| ShellCheck | Shell 脚本静态分析 | shellcheck script.sh |
| shfmt | Shell 格式化 | shfmt -d script.sh |
Markdown 安全审查
详细代码示例和安全/不安全对比:读取
references/markdown.md
审查覆盖的 4 个关键领域:
| # | 领域 | 核心风险 | 关键搜索模式 |
|---|---|---|---|
| 1 | XSS 注入 | 脚本执行 | <script>, <iframe>, onerror=, onmouseover= |
| 2 | 链接安全 | XSS/钓鱼 | javascript:, data:, vbscript: |
| 3 | 敏感信息 | 密钥泄露 | sk-, ghp_, AKIA, 内部 IP/URL |
| 4 | 图片安全 | 追踪/DoS | 外部追踪像素, 超大图片 |
過去のセキュリティ問題から得た教訓
詳細なケース分析と調査チェックリスト:
references/lessons-learned.mdを参照してください。
推論サービスエンジンのコードをレビューする際は、次の既知の問題パターンを重点的に確認してください。
| 番号 | 問題 | 重大度 | 主な教訓 |
|---|---|---|---|
| SEC-EXP-001 | 設定パラメーターの組み合わせによる OOM | CRITICAL | ピークメモリ = maxReqs × bodyLimit × JSON増幅係数。各パラメーターは個別には妥当でも、組み合わせると物理メモリを超過します。 |
| SEC-EXP-002 | <|begin_of_image|> に <|end_of_image|> がないことで DoS が発生 | CRITICAL | 特殊トークンが対になっていると仮定し、検証せずにハードコードされたインデックスでアクセスします。 |
| SEC-EXP-003 | <|vision_start|><|video_pad|><|vision_end|> が形式上の前提を破る | CRITICAL | トークン列が独自プロトコルの形式に従うと仮定し、固定オフセットで値を取得することで範囲外アクセスが発生します。 |
一般的なセキュリティ要件 (Constraints)
必ず守ること (MUST)
- 入力検証:すべての外部入力を検証し、ユーザーデータを決して信頼しないでください。
- パラメーター化クエリ:インジェクション攻撃を防ぐために、パラメーター化クエリを使用してください。
- 最小権限:プロセス、ファイル、ユーザーには必要最小限の権限を付与してください。
- 安全なデフォルト値:変数の初期化とエラー処理には、安全なデフォルト値を使用してください。
- 依存関係の監査:依存関係に既知の脆弱性がないか、定期的にスキャンしてください。
- 機密情報の保護:キー、パスワード、トークンは環境変数で管理してください。
- ログのマスキング:ログにパスワードやキーなどの機密情報を記録しないでください。
- エラー処理:エラーメッセージから内部実装の詳細が漏えいしないようにしてください。
- JSON のネスト深度の検証:すべての外部 JSON リクエストについて、解析前または解析時にネスト深度を検証し、スタックオーバーフローやリソース枯渇攻撃を防いでください (CWE-674, CWE-400)。
- サービス化されたリクエストのリソース上限の検証:サービスの設定パラメーター(最大同時実行数、リクエストボディの上限、リクエストヘッダーの上限など)を組み合わせた際のピークメモリが、デプロイ環境で使用可能なメモリを下回る必要があります。JSON/XML などのデシリアライズライブラリによるメモリ増幅係数も考慮してください (CWE-400, CWE-770)。
- 特殊トークン入力の検証:マルチモーダルや複数ターンの会話などの状況で使われる特殊トークン(begin/end_of_image、vision_start/end など)について、ペアの完全性とシーケンス形式の妥当性を検証する必要があります。トークン列の形式を暗黙に仮定してはなりません。IndexError/out_of_range によるプロセスのクラッシュを防ぐため、フレームワーク層で必ず捕捉してください (CWE-129, CWE-248, CWE-20)。
禁止事項 (MUST NOT)
- eval 系関数の禁止:Python の
eval()/exec()、Shell のevalを禁止します。C++ に同等の関数はありませんが、動的コード生成も禁止です。 - キーのハードコード禁止:コード内にパスワード、API Key、トークンをハードコードしないでください。
- 機密ファイルのコミット禁止:
.env、秘密鍵、証明書をバージョン管理にコミットしないでください。 - エラーの無視禁止:例外を黙って握りつぶしたり、戻り値を無視したりしないでください。
- 過度に広い権限の禁止:
chmod 777や、制限のない0.0.0.0でのリスニングを使用しないでください。 - 非推奨の安全でない関数の使用禁止:
gets()、sprintf()、strcpy()などを使用しないでください。
セキュリティレビューのチェックリスト (Checklist)
Python
- [ ] 无 eval()/exec() 使用不受信任的输入
- [ ] 无 pickle.loads() 加载不受信任的数据
- [ ] 使用 yaml.safe_load() 替代 yaml.load()
- [ ] subprocess 调用不使用 shell=True
- [ ] SQL 查询使用参数化方式
- [ ] 文件路径操作有路径遍历防护
- [ ] 无硬编码的密钥/密码
- [ ] 日志不记录敏感信息
- [ ] 未使用 assert 进行安全/权限相关检查
- [ ] 依赖已通过 pip-audit/bandit 扫描
- [ ] 正则表达式无 ReDoS 风险
- [ ] 临时文件使用 tempfile 模块
- [ ] JSON 请求解析入口有嵌套深度限制(建议 ≤ 32 层)
- [ ] 递归遍历 JSON 数据结构有深度保护
- [ ] 多模态特殊 Token(begin/end_of_image、vision_start/end 等)校验了配对完整性,不假设成对出现
- [ ] 推理请求处理路径有框架层 IndexError/ValueError/KeyError 兜底捕获,防止单请求异常导致进程崩溃
C++
- [ ] 无缓冲区溢出风险 (strcpy → strncpy/std::string)
- [ ] 使用智能指针管理内存
- [ ] 无 use-after-free / double-free
- [ ] 整数运算有溢出检查
- [ ] printf 系列函数使用固定格式字符串
- [ ] 所有变量在使用前初始化
- [ ] 资源管理遵循 RAII 原则
- [ ] 多线程代码无数据竞争
- [ ] 使用 C++ 风格类型转换 (static_cast/dynamic_cast)
- [ ] 编译启用安全选项 (-Wall -Werror -fsanitize=address)
- [ ] JSON 请求解析入口有嵌套深度限制(建议 ≤ 32 层)
- [ ] 递归遍历 JSON 数据结构有深度参数并设上限
- [ ] 服务配置参数组合后峰值内存不超过部署环境可用内存(考虑 JSON 放大系数)
- [ ] 存在运行时内存水位监控或请求准入控制机制
- [ ] 多模态特殊 Token(boi/eoi、vision_start/end 等)校验了配对完整性和序列格式,不做隐式格式假设
- [ ] model forward / pre-processing 路径有框架层 std::out_of_range/std::invalid_argument 兜底 catch,防止进程崩溃
Shell
- [ ] 脚本使用 set -euo pipefail
- [ ] 所有变量使用双引号包裹 ("$var")
- [ ] 无 eval 使用用户输入
- [ ] 临时文件使用 mktemp
- [ ] 文件权限不超过 755(脚本)/ 644(配置)
- [ ] 关键命令使用绝对路径
- [ ] 有 trap 清理机制
- [ ] 输入经过验证和过滤
- [ ] 通过 ShellCheck 无警告
- [ ] 不使用 . 或空目录在 PATH 中
Markdown
- [ ] 无内嵌 <script>/<iframe> 标签
- [ ] 无 javascript:/data: 协议链接
- [ ] 无硬编码密钥/密码/Token
- [ ] 无内部 IP 地址或内部 URL 泄露
- [ ] 外部图片来源可信
- [ ] 无追踪像素
推奨ツール一覧
| 言語 | ツール | 種類 | 説明 |
|---|---|---|---|
| Python | bandit | 静的解析 | Python のセキュリティ脆弱性を検出 |
| Python | pip-audit | 依存関係スキャン | Python の依存関係の脆弱性を確認 |
| Python | semgrep | ルールエンジン | カスタムセキュリティルールに一致するものを検出 |
| Python | mypy | 型チェック | 型安全性を確保し、型の混同を防止 |
| C++ | AddressSanitizer | 実行時検出 | メモリエラーを検出 |
| C++ | ThreadSanitizer | 実行時検出 | データ競合を検出 |
| C++ | cppcheck | 静的解析 | C/C++ の静的解析 |
| C++ | clang-tidy | リンター | コード品質とセキュリティルールをチェック |
| C++ | Valgrind | 実行時検出 | メモリリークを検出 |
| Shell | ShellCheck | 静的解析 | Shell スクリプトのセキュリティを解析 |
| 一般 | git-secrets | コミット前フック | キーのコミットを防止 |
| 一般 | trufflehog | キースキャン | コード内のキーをスキャン |
| 一般 | gitleaks | キースキャン | Git リポジトリでのキー漏えいを検出 |
| Markdown | markdownlint | リンター | Markdown の書式をチェック |
参考標準
- CWE Top 25
- OWASP Top 10
- CERT C++ Secure Coding
- CERT C Secure Coding
- Bandit Documentation
- ShellCheck Wiki
レビュー結果の出力 (Output)
レビュープロセスの要件
この Skill を使用してコードリポジトリのセキュリティレビューを行う場合(引数に review キーワードを含む場合)、すべてのレビューが完了した後、結果を CSV ファイルに自動的に保存してください。これはレビュープロセスの最後に必ず実行する手順です。
CSV 出力仕様
ファイル名: security_code_review_report.csv
保存場所: レビュー対象のコードリポジトリのルートディレクトリ(review <path> の <path> の下)
文字コード: UTF-8
CSV には次の 9 列を含めてください(ヘッダーは固定):
编号,严重级别,漏洞类别,语言,文件路径,行号,问题描述,风险说明,建议修复方案
| 列名 | 説明 | 値の例 |
|---|---|---|
| 番号 | 一意の番号。形式は 重大度の頭文字-連番 | C-01, H-05, M-12, L-03 |
| 重大度 | 4 段階:CRITICAL / HIGH / MEDIUM / LOW | CRITICAL |
| 脆弱性の種類 | セキュリティ脆弱性の分類名 | コマンドインジェクション、安全でないデシリアライズ、スレッド安全性、パストラバーサル |
| 言語 | コードの言語/ファイルの種類 | Python、C++、Shell、Markdown、Docker、Config |
| ファイルパス | リポジトリのルートディレクトリからの相対ファイルパス | src/utils/file_utils.py |
| 行番号 | 問題のコードがある行番号。複数行の場合はカンマで区切る | 79、40-44, 220-232 |
| 問題の説明 | 発見した問題の簡潔な説明 | pickle.loads() が共有メモリからのデータをデシリアライズしている |
| リスクの説明 | 問題によって生じる可能性のあるセキュリティリスク | 攻撃者が悪意のある pickle payload を注入し、RCE を実行できる |
| 推奨される修正方法 | 具体的な修正方法とコード例 | pickle.loads() を json.loads() に置き換える |
CSV 形式の要件
- カンマ区切りとし、カンマを含むフィールド値は二重引用符で囲んでください。
- フィールド値内の二重引用符は、二重引用符を 2 つ重ねてエスケープしてください(
"")。 - 1 行目をヘッダー行とし、以降の各行には検出事項を 1 件ずつ記載してください。
- 重大度の高い順に並べてください:CRITICAL → HIGH → MEDIUM → LOW
- 同じ重大度の中では、番号順に並べてください。
- ファイルパスは相対パス(リポジトリのルートディレクトリからの相対パス)を使用してください。
出力手順
レビュー完了後、次の手順を実行してください。
- すべての検出事項を集約:すべてのレビューエージェント/スキャンの結果を収集します。
- 重複を統合:重複する検出事項を統合し、各レコードが一意であることを確認します。
- CSV を生成:上記の仕様に従って CSV ファイルを生成し、出力先に書き込みます。
- CSV を検証:Python の csv モジュールを使用して、ファイル形式が正しく、行数と検出事項数が一致することを検証します。
- 概要を出力:ファイルの場所と重大度ごとの件数をユーザーに報告します。
出力例
编号,严重级别,漏洞类别,语言,文件路径,行号,问题描述,风险说明,建议修复方案
C-01,CRITICAL,不安全反序列化,Python,src/utils/share_memory.py,79,"pickle.loads() 反序列化来自共享内存的数据","攻击者可注入恶意 pickle payload 实现 RCE","用 json.loads() 替代 pickle.loads()"
H-01,HIGH,命令注入,Shell,scripts/run.sh,52,"eval 执行含用户输入的命令字符串","模型路径含 shell 元字符时可注入任意命令","改用 bash 数组构建命令, 消除 eval"
M-01,MEDIUM,线程安全,C++,src/thread_pool.h,45,"m_shutdown 为非原子 bool 跨线程读写","数据竞争导致工作线程可能无法退出","改为 std::atomic<bool>"
L-01,LOW,临时文件安全,Python,tests/test_utils.py,30,"硬编码 /tmp 路径","共享 CI 环境中符号链接攻击风险","使用 tempfile.mkdtemp()"
注意事項
- レビューで問題が見つからなかった場合でも、CSV ファイル(ヘッダー行のみ)を生成し、ユーザーに「セキュリティ上の問題は見つかりませんでした」と伝えてください
- CSV ファイルは人によるレビューに使用するため、説明は明確かつ具体的にし、曖昧な表現は避けてください
- レビュー対象がリポジトリ全体ではなく特定のファイルのみの場合は、そのファイルがあるディレクトリに CSV を保存してください
- CSV を生成した後、Python スクリプトで形式を検証し、Excel/WPS で正しく開けることを確認してください
メタデータ
- バージョン: 2.0.0
- 最終更新日: 2026-04-24
- 言語: Python, C++, Shell/Bash, Markdown
- タグ:
#security#code-review#python#cpp#shell#markdown#OWASP#CWE