AgentSkillsCN

finding-sinks

分析 Web 项目中的危险 Sink 函数,识别潜在的命令执行、反序列化、表达式注入、SQL 注入、文件上传、JNDI 注入等安全漏洞入口点,并开展基础污点追踪分析。

SKILL.md
--- frontmatter
name: finding-sinks
description: 分析Web项目中的危险Sink函数,识别潜在的命令执行、反序列化、表达式注入、SQL注入、文件上传、JNDI注入等安全漏洞入口点,并进行基础污点追踪分析。
argument-hint: [project-path]
disable-model-invocation: false
user-invocable: true
context: fork
agent: general-purpose
allowed-tools:
  - Read
  - Grep
  - Glob
  - Task
  - Write

危险Sink函数分析

分析目标$ARGUMENTS

分析指定项目中的危险Sink函数,识别潜在安全漏洞入口点,并进行参数可控性分析。

何时使用

  • 代码审计初期:快速定位项目中的危险函数调用点
  • 漏洞挖掘:系统性搜索可能存在的安全漏洞入口
  • 安全评估:评估项目的整体安全风险面
  • 渗透测试准备:识别潜在的攻击入口点

典型输入:Web 项目根目录(Java / Python / Node.js / Go / PHP 等)

何时不使用

  • 分析单个已知漏洞:已明确知道漏洞位置,直接阅读代码即可
  • 需要完整污点追踪:本skill仅做基础1-2层追踪,复杂污点分析需专业工具
  • 需要修复建议:本skill仅输出分析结果,不提供修复方案
  • 框架级安全配置分析:框架配置问题需使用其他专门skill

重要约束

必须遵守以下规则

  1. 禁止修复建议:报告中不得包含任何安全建议、修复方案

  2. 完整分析:搜索到的每个结果都必须分析,不得遗漏

  3. 逐个处理

    • 必须对每个搜索结果逐个分析
    • 禁止使用"等"、"其他类似代码"等省略表述
    • 每个Sink都必须记录文件位置、行号、参数来源
  4. 参数追踪

    • 对每个Sink进行1-2层参数来源追踪
    • 判断参数是否来自用户可控输入
    • 标注可控性等级(高/中/低/需验证/不可控)
  5. 版本标记

    • 对于版本相关的Sink(如Fastjson、SnakeYAML)标注"需检查版本"
    • 不自动解析版本,由人工判断

语言识别

特征文件识别

通过特征文件快速识别项目语言:

特征文件语言
pom.xmlJava (Maven)
build.gradle / build.gradle.ktsJava (Gradle)
requirements.txt / pyproject.toml / setup.pyPython
package.jsonNode.js
go.modGo
composer.jsonPHP
*.csproj / *.sln.NET

关键依赖识别

在配置文件中搜索以下关键依赖并记录版本:

依赖关键词关注原因
fastjson / com.alibaba:fastjson反序列化漏洞
snakeyamlYAML反序列化
xstreamXML反序列化
jackson-databindJackson多态
mysql-connector-java / postgresql / h2JDBC漏洞

分析流程概览

本技能分为三个阶段执行:

第一阶段:语言框架识别

识别项目的编程语言和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类型参考文档
JavaRuntime, Fastjson, SpEL, OGNL, JNDIreferences/java.md

注意:目前仅支持Java语言,其他语言的参考文档待后续添加。


报告模板

最终报告请按照本 skill 目录下的 references/report-template.md 模板生成。

报告输出

分析完成后,报告需要同时

  1. 保存到文件:将完整报告写入项目根目录下的 sink-analysis-report.md
  2. 输出到对话:将完整报告作为最终响应返回给用户

文件输出路径$ARGUMENTS/sink-analysis-report.md

注意

  • 由于使用 context: fork 隔离执行,报告内容会作为子代理的最终输出返回到主对话
  • 确保报告内容完整,不要省略任何Sink
  • 文件输出便于用户后续查阅和分享

常见错误思维

警告:以下错误会导致分析不完整,必须避免。

错误思维正确做法
"搜索到太多结果,只分析部分"每个结果都必须分析和记录
"这个Sink参数看起来不可控"必须实际追踪参数来源,不能凭直觉
"文件上传太多了,跳过一些"全部记录,标注可控性后再筛选
"只搜索主要代码目录"第三方模块、依赖代码也要搜索
"这个库应该是安全版本"标注"需检查版本",不做版本假设
"用'等'省略类似代码"禁止省略,必须完整列出
"深入分析核心Sink就行"先广度搜索全部,再逐个分析
"参数来源太复杂放弃追踪"至少追踪1-2层,复杂的标注"需验证"