mcpField
P
patch-diff-analyzer

patch-diff-analyzer

github.com/hacktronai安全11567 次安装21 周前更新
代码仓库

关于 patch-diff-analyzer

Patch Diff Analyzer 是用于比较反编译后的 JAR 或 .NET 二进制文件、调查修补前后安全相关变化的技能。它指导工作区设置、差异生成和针对代码变更的审查。

主要功能

  1. 01反编译 JAR 和 DLL 文件
  2. 02用 Git 提交和标签跟踪版本
  3. 03生成差异及变更文件报告
  4. 04指导审查安全相关变更
  5. 05区分专有代码与第三方库

适用场景

  1. 01调查安全补丁中的变更
  2. 02在源码不可用时审查编译后的二进制文件
  3. 03聚焦分析专有代码中的补丁
  4. 04评估漏洞修复是否完整

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/hacktronai/skills --skill patch-diff-analyzer

安装后在 Claude Code 中输入/patch-diff-analyzer确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

README.md
examples/
example-workflow.md
scripts/
analyze-diff.sh
decompile-dll.sh
decompile-jar.sh
setup-workspace.sh

详细介绍

补丁差异分析器

重要:用户可能会要求分析已编译二进制文件(JAR、DLL 等)中的安全补丁,以了解修复了哪些漏洞。此扩展可帮助反编译二进制文件、生成差异并识别与安全相关的变更。

可用脚本

此扩展包含以下脚本:

  • setup-workspace.sh <workspace-name>

功能:

  1. 创建工作区目录
  2. 初始化 git 仓库以跟踪差异
  3. 配置用于提交的 git 用户
  4. 创建子目录:decompiled/、output/
  • decompile-jar.sh <app.jar> /decompiled/

功能:

  1. 在工作区目录中创建反编译目录
  2. 在该目录中反编译 jar 文件。
  • decompile-dll.sh <app.dll> /decompiled/

功能:

  1. 在工作区目录中创建反编译目录
  2. 在该目录中反编译 dll 文件。
  • analyze-diff.sh

功能:

  1. 验证 git 仓库是否有 2 个或更多提交
  2. 识别 unpatched 和 patched 标签(或使用 HEAD~1 和 HEAD)
  3. 生成差异统计信息
  4. 创建 patch-analysis.diff 文件
  5. 创建 changed-files.txt 列表

工作流决策树

当用户请求分析补丁时:

  1. 识别二进制文件:是否需要确定哪个文件是已打补丁版本,哪个是未打补丁版本?

  2. 文件格式:要分析哪种类型的二进制文件?

  3. 分析背景:用户是否提供了漏洞信息?

    • 是(提供了 CVE/描述) → 聚焦分析相关变更
    • 否(盲目分析) → 全面分析安全相关变更

二进制文件识别

关键:反编译前,务必正确识别已打补丁的二进制文件。

识别方法
  1. 明确命名:

    • 文件名为 patched.jar / unpatched.jar
    • 文件名为 vulnerable.jar / fixed.jar
    • → 按指定版本使用
  2. 版本号:

    • app-1.2.3.jar 与 app-1.2.4.jar
    • → 通常较高的版本号是已打补丁版本(1.2.4 > 1.2.3)
    • 语义化版本格式:major.minor.patch
  3. 文件时间戳:

    ls -lt *.jar
    
    • 较新的时间戳通常表示已打补丁版本
    • 注意:如果文件被复制或移动,这种方法并不可靠
  4. 无法确定时:

    • 务必向用户确认
    • 只要存在任何不确定性,就不要猜测

设置与反编译

工作区设置脚本

使用提供的设置脚本。


高效提取(跳过第三方库)

关键:对于 WAR 文件或大型应用,请仅在反编译前提取专有代码。这能显著节省时间和存储空间。

确定专有代码的位置

WAR 文件结构:

application.war
├── WEB-INF/
│   ├── classes/          ← Application code (DECOMPILE THIS)
│   │   └── com/
│   │       └── vendor/   ← Proprietary packages
│   └── lib/              ← Third-party JARs (SKIP THESE)
│       ├── jackson-*.jar
│       ├── spring-*.jar
│       └── hibernate-*.jar
└── META-INF/
仅提取专有代码
# 1. List WAR contents to identify proprietary packages
unzip -l unpatched.war | grep "WEB-INF/classes" | grep "\.class$" | head -30

# Look for company-specific packages:
# WEB-INF/classes/com/acme/
# WEB-INF/classes/com/vendor/
# WEB-INF/classes/org/internal/

# 2. Extract ONLY proprietary classes
mkdir -p temp-unpatched
unzip unpatched.war "WEB-INF/classes/com/vendor/*" -d temp-unpatched/
unzip unpatched.war "WEB-INF/classes/com/acme/*" -d temp-unpatched/

# 3. Create JAR from extracted classes
cd temp-unpatched/WEB-INF/classes
jar cf ../../../vendor-unpatched.jar .
cd ../../..

# 4. Repeat for patched version
mkdir -p temp-patched
unzip patched.war "WEB-INF/classes/com/vendor/*" -d temp-patched/
unzip patched.war "WEB-INF/classes/com/acme/*" -d temp-patched/
cd temp-patched/WEB-INF/classes
jar cf ../../../vendor-patched.jar .
cd ../../..

# Now decompile ONLY proprietary code (much faster!)

JAR 反编译工作流

第 1 步:反编译未打补丁版本(专有代码)
  • 使用扩展提供的 JAR 反编译脚本反编译 JAR。
第 2 步:提交未打补丁版本
cd <workspace>
git add -A
git commit -m "Unpatched version"
git tag unpatched

关键:差异分析脚本会使用 unpatched 标签。

第 3 步:反编译已打补丁版本

重要:先清空反编译目录,以免文件混杂。

rm -rf <workspace>/decompiled/*
第 4 步:提交已打补丁版本
cd <workspace>
git add -A
git commit -m "Patched version"
git tag patched

关键:差异分析脚本会使用 patched 标签。


.NET 反编译工作流

第 1 步:反编译未打补丁版本
  • 使用扩展提供的 DLL 反编译脚本反编译 DLL。
第 2-4 步:与 JAR 工作流相同

按照 JAR 工作流执行相同的 git 提交流程:

  1. 提交未打补丁的版本并添加标签
  2. 清空目录
  3. 反编译已打补丁的版本
  4. 提交已打补丁的版本并添加标签

差异生成与分析

生成差异
  • 使用 analyze-diff.sh <workspace> 生成 patch-analysis.diff 和 changed-files.txt 列表
阅读并分析差异

必须:完整阅读生成的差异文件。

不要使用 grep 或模式匹配。大模型必须阅读并推理实际的代码变更。


安全分析

关键:在此处运用安全专业知识,理解漏洞修复。

第 1 步:筛选第三方库

必须先做:分析变更之前,将专有代码与第三方库分开。

原因:

  • 第三方库更新是预期内且记录详尽的(Jackson、Spring、Hibernate 等)
  • 专有代码变更表明存在应用特定的安全修复
  • 自定义漏洞比已知的库 CVE 更值得关注
  • 聚焦专有代码有助于发现独特的攻击向量
第 2 步:分析流程
  1. 阅读每项变更:不要跳过任何修改,即使是很小的修改
  2. 理解上下文:查看周边代码,而不只是差异行
  3. 识别安全变更:区分安全修复与重构或功能变更
  4. 推理漏洞成因:之前可能发生什么攻击?修复阻止了什么?
  5. 评估修复完整性:修复是否全面?是否仍有绕过方式?
需要关注的内容

高优先级指标:

  • 在原本没有输入验证的地方新增验证
  • 对用户可控数据进行清理或编码
  • 新增身份验证或授权检查
  • 在访问数组或缓冲区之前进行边界检查
  • 类型检查或类型转换变更
  • 文件路径规范化
  • 使用参数化查询替代字符串拼接
  • 反序列化过滤器或允许列表
  • 资源限制(大小、超时、速率)

报告分析结果

报告结构

必须:分析报告采用以下结构:

# Patch Analysis Summary

## Overview
[Brief description of what was analyzed]

## Vulnerability Identified: [Type/CVE]

**Severity**: [Critical/High/Medium/Low]

## Detailed Analysis

### File: [path/to/file.java:line-range]

[Detailed analysis following the framework above]

## Completeness Assessment

[Is the fix complete? Any potential bypasses? Additional recommendations?]

## Confidence Level

Overall confidence: [HIGH/MEDIUM/LOW] ([percentage]%)

错误消息与解决方案

“未找到反编译器”

解决方案:安装 jadx(用于 JAR)或 ilspycmd(用于 DLL)

“不是 git 仓库”

解决方案:先运行 setup-workspace.sh 脚本

“至少需要 2 次提交”

解决方案:确保未打补丁和已打补丁的版本都已提交

“未发现差异”

解决方案:

  • 确认反编译的是不同版本
  • 检查 git log 中的提交记录
  • 这可能表示文件完全相同

评论

支持 Markdown