危险Sink函数分析
分析目标:$ARGUMENTS
分析指定项目中的危险Sink函数,识别潜在安全漏洞入口点,并进行参数可控性分析。
何时使用
- •代码审计初期:快速定位项目中的危险函数调用点
- •漏洞挖掘:系统性搜索可能存在的安全漏洞入口
- •安全评估:评估项目的整体安全风险面
- •渗透测试准备:识别潜在的攻击入口点
典型输入:Web 项目根目录(Java / Python / Node.js / Go / PHP 等)
何时不使用
- •分析单个已知漏洞:已明确知道漏洞位置,直接阅读代码即可
- •需要完整污点追踪:本skill仅做基础1-2层追踪,复杂污点分析需专业工具
- •需要修复建议:本skill仅输出分析结果,不提供修复方案
- •框架级安全配置分析:框架配置问题需使用其他专门skill
重要约束
必须遵守以下规则:
- •
禁止修复建议:报告中不得包含任何安全建议、修复方案
- •
完整分析:搜索到的每个结果都必须分析,不得遗漏
- •
逐个处理:
- •必须对每个搜索结果逐个分析
- •禁止使用"等"、"其他类似代码"等省略表述
- •每个Sink都必须记录文件位置、行号、参数来源
- •
参数追踪:
- •对每个Sink进行1-2层参数来源追踪
- •判断参数是否来自用户可控输入
- •标注可控性等级(高/中/低/需验证/不可控)
- •
版本标记:
- •对于版本相关的Sink(如Fastjson、SnakeYAML)标注"需检查版本"
- •不自动解析版本,由人工判断
语言识别
特征文件识别
通过特征文件快速识别项目语言:
| 特征文件 | 语言 |
|---|---|
pom.xml | Java (Maven) |
build.gradle / build.gradle.kts | Java (Gradle) |
requirements.txt / pyproject.toml / setup.py | Python |
package.json | Node.js |
go.mod | Go |
composer.json | PHP |
*.csproj / *.sln | .NET |
关键依赖识别
在配置文件中搜索以下关键依赖并记录版本:
| 依赖关键词 | 关注原因 |
|---|---|
fastjson / com.alibaba:fastjson | 反序列化漏洞 |
snakeyaml | YAML反序列化 |
xstream | XML反序列化 |
jackson-databind | Jackson多态 |
mysql-connector-java / postgresql / h2 | JDBC漏洞 |
分析流程概览
本技能分为三个阶段执行:
第一阶段:语言框架识别
识别项目的编程语言和Web框架,确定使用哪份参考文档。
详细步骤请参见 本 skill 目录下的 workflows/phase1-language-detection.md
第二阶段:Sink搜索
根据识别的语言,使用对应的参考文档搜索各类危险Sink。
详细步骤请参见 本 skill 目录下的 workflows/phase2-sink-discovery.md
搜索类型:
| 漏洞类型 | 危害等级 | 典型Sink |
|---|---|---|
| 命令执行 | 严重 | Runtime.exec, ProcessBuilder |
| 反序列化 | 严重 | ObjectInputStream, Fastjson, XStream |
| 表达式注入 | 严重 | SpEL, OGNL, Groovy, ScriptEngine |
| SQL注入 | 高危 | ${}拼接, Statement |
| 文件上传 | 高危 | MultipartFile, 路径穿越 |
| ZipSlip | 高危 | ZipEntry.getName |
| JNDI注入 | 严重 | InitialContext.lookup |
| JDBC连接串 | 严重 | DriverManager.getConnection |
| 类初始化 | 严重 | Class.forName + newInstance |
第三阶段:Sink验证过滤
对搜索到的Sink进行参数来源分析和可控性判断。
详细步骤请参见 本 skill 目录下的 workflows/phase3-sink-validation.md
可控性分类:
| 等级 | 说明 |
|---|---|
| 可能可控 | 参数非硬编码,来源于变量/参数/外部输入 |
| 不可控 | 参数是硬编码字符串或常量 |
| 需验证 | 无法快速判断,需人工分析 |
| 误报 | 非实际Sink调用(注释、import、命名等) |
语言参考文档
根据识别的语言选择对应的参考文档(位于本 skill 目录下的 references/ 文件夹):
| 语言 | 常见Sink类型 | 参考文档 |
|---|---|---|
| Java | Runtime, Fastjson, SpEL, OGNL, JNDI | references/java.md |
注意:目前仅支持Java语言,其他语言的参考文档待后续添加。
报告模板
最终报告请按照本 skill 目录下的 references/report-template.md 模板生成。
报告输出
分析完成后,报告需要同时:
- •保存到文件:将完整报告写入项目根目录下的
sink-analysis-report.md - •输出到对话:将完整报告作为最终响应返回给用户
文件输出路径:$ARGUMENTS/sink-analysis-report.md
注意:
- •由于使用
context: fork隔离执行,报告内容会作为子代理的最终输出返回到主对话- •确保报告内容完整,不要省略任何Sink
- •文件输出便于用户后续查阅和分享
常见错误思维
警告:以下错误会导致分析不完整,必须避免。
| 错误思维 | 正确做法 |
|---|---|
| "搜索到太多结果,只分析部分" | 每个结果都必须分析和记录 |
| "这个Sink参数看起来不可控" | 必须实际追踪参数来源,不能凭直觉 |
| "文件上传太多了,跳过一些" | 全部记录,标注可控性后再筛选 |
| "只搜索主要代码目录" | 第三方模块、依赖代码也要搜索 |
| "这个库应该是安全版本" | 标注"需检查版本",不做版本假设 |
| "用'等'省略类似代码" | 禁止省略,必须完整列出 |
| "深入分析核心Sink就行" | 先广度搜索全部,再逐个分析 |
| "参数来源太复杂放弃追踪" | 至少追踪1-2层,复杂的标注"需验证" |