Skip to content

Commit 00eacc6

Browse files
committed
feature: update
1 parent f3cf1c1 commit 00eacc6

File tree

2 files changed

+170
-148
lines changed

2 files changed

+170
-148
lines changed

README.md

Lines changed: 71 additions & 148 deletions
Original file line numberDiff line numberDiff line change
@@ -1,176 +1,99 @@
11
# CodeAuditAssistant
22

3-
**Author**:SpringKill、Unam4
3+
Language: **English** | [中文](README.zh-CN.md)
44

5-
**插件支持版本**`IDEA >= 2022.3`
5+
## Overview
6+
CodeAuditAssistant is an IntelliJ IDEA plugin for JVM code auditing. It provides sink discovery, call-graph analysis, and JAR decompilation to help reviewers locate risky code paths faster.
67

7-
**Kotlin**:JDK17+
8+
## Requirements
9+
- IntelliJ IDEA `>= 2022.3`
10+
- JDK `17+`
811

9-
脱更很久终于和大家见面了,前`SecurityInspector` 的正式版`CodeAuditAssistant` 现在开启测试。
12+
## Core Features
13+
### 1) SinkFinder
14+
Built-in sink rules for common Java Web vulnerabilities and risky component calls. Results are shown in IDEA Problem View and support navigation to source on double-click.
1015

11-
从24年11月拖更到25年的4月,我们团队和个人都经历了很多事情,不过好在一切基本已经尘埃落定。
16+
### 2) Code Analysis (Call Graph)
17+
Generate call graphs for `Entire` project or `Selected Module`. Search supports:
18+
- `ROOT -> SINK` path search
19+
- `SINK`-only reverse path lookup
20+
- `Search as sink` from a right-clicked method
1221

13-
`卫界安全` 的资助下,我们将继续为大家持续提供开源项目,我们团队也将成为`卫界安全` 资助的开源团队,为大家带来更多的**可靠的****强大的**安全工具。
22+
Method filter examples:
23+
- `ParamType`: `java.lang.String,*`
24+
- `Annotations`: `@Override,@xxx`
1425

15-
项目中还存在一些已知和未知的`bug`,欢迎提交 `issue`,我们会尽快进行优化和修复,并邀请对代码安全感兴趣的师傅共同开发和维护。
26+
### 3) Decompiler (Experimental)
27+
Supports JAR decompilation from the plugin UI. The current implementation is still under optimization.
1628

17-
## 功能介绍
29+
## Workflow Demo (Screenshots)
30+
### 1) SinkFinder Flow
31+
Step 1: Collect sink findings in IDEA Problem View.
32+
![Sink collection](./img/image-20250331010159751.png)
1833

19-
### 代码检查
34+
Step 2: Double-click an item to jump to source code.
35+
![Sink jump to source](./img/image-20250331010358550.png)
2036

21-
`CodeAuditAssistant` 是一个代码审计辅助插件,其包含三部分功能:`Decompiler``Code Analysis``SinkFinder`,三个部分共同配合来实现强大的代码审计辅助。
37+
### 2) Decompiler Flow
38+
Step 1: Select a target JAR and click `Run` in the decompiler panel.
39+
![Decompiler panel](./img/image-20250331010458737.png)
2240

23-
#### SinkFinder
41+
### 3) Call-Graph Flow
42+
Step 1: Open the Code Analysis panel and click `Generate CallGraph`.
43+
![Call graph main panel](./img/image-20250331010441318.png)
2444

25-
`SinkFinder` 内置了常见的`Java` 代码`Web`漏洞`sink` 点,高危组件调用`sink` 点,通过`Idea` 自身的`Problem` 模块进入,通过此模块你可以快速收集项目中的`Sink` 点:
45+
Step 2: Choose the build scope (`Entire` or `Selected Module`).
46+
![Scope selection](./img/image-20250331010933308.png)
2647

27-
![image-20250331010159751](./img/image-20250331010159751.png)
48+
Step 3: You can also build from the editor context menu on a method.
49+
![Context menu build](./img/image-20250331123256112.png)
2850

29-
`Sink` 收集完毕后,双击即可跳转到代码所在位置:
51+
Step 4: Enable `Info` and `Path` for richer metadata and path results.
52+
![Info and Path options](./img/image-20250331123349918.png)
3053

31-
![image-20250331010358550](./img/image-20250331010358550.png)
54+
Step 5: Open the method finder panel and filter by signature/annotations.
55+
![Method finder panel](./img/image-20250331124009118.png)
3256

33-
#### 反编译
57+
Step 6: Example filtered method list.
58+
![Method finder example](./img/image-20250331124429606.png)
3459

35-
反编译模块和原来目前没有更改,在列表中选择要反编译的`jar` 包后,点击`Run` 即可反编译回源代码(目前没有做任何优化、失败率高)。
60+
Step 7: Search a `ROOT -> SINK` path.
61+
![Root to sink search](./img/image-20250331124823202.png)
3662

37-
![](./img/image-20250331010458737.png)
63+
Step 8: Search by `SINK` only when the entry point is unknown.
64+
![Sink-only search](./img/image-20250331124952438.png)
3865

39-
#### 代码分析
66+
Step 9: Use `Search as sink` from right-click to auto-fill and search.
67+
![Search as sink](./img/image-20250331125202792.png)
4068

41-
本次更新的最大内容是代码分析模块,通过此模块你可以快速查找一个方法的调用路径,下面逐步介绍功能:
69+
Step 10: Read runtime status (`CallGraph`, node count, memory, messages).
70+
![Status panel](./img/image-20250331125415889.png)
4271

43-
![image-20250331010441318](./img/image-20250331010441318.png)
72+
### 4) Search Result Icon Legend
73+
Path node icon:
74+
![Path icon](./img/image-20250331125928270.png)
4475

45-
首先是功能区,`Generate CallGraph` 按钮用于生成项目的调用图,旁边的**下拉菜单**用来选取调用图的**构建范围**,如果你选择了`Entire` 则会对整个项目进行构建,如果你选择了`Selected Module` 那么在你点击`Generate CallGraph` 的时候就会弹出一个窗口用来选择构建范围。
76+
Method declaration icon:
77+
![Declaration icon](./img/image-20250331130037060.png)
4678

47-
![](./img/image-20250331010933308.png)
79+
Method invocation icon:
80+
![Call icon](./img/image-20250331130128343.png)
4881

49-
除了这种方式构建图之外,你还可以使用右键点击某一个方法的形式进行图构建:
82+
Object creation / method-search result icon:
83+
![New object icon](./img/image-20250331130217321.png)
5084

51-
![image-20250331123256112](./img/image-20250331123256112.png)
85+
## Build & Run
86+
- Build plugin artifact: `./gradlew buildPlugin`
87+
- Run sandbox IDE for local debugging: `./gradlew runIde`
88+
- Full build: `./gradlew build`
5289

53-
在构建图之前,你应该看到了界面上的两个复选框,这两个框分别代表:
90+
## Known Limitations
91+
- Current path search is DFS-based and may not show all parallel paths in dense graphs.
92+
- Call graph is not yet persisted across sessions.
93+
- Duplicate root/source nodes may create repeated paths in some results.
5494

55-
`Info`:收集全部方法相关信息(用于按条件查找特定的方法)
56-
57-
`Path`:构建图时包含方法的调用路径(用于构建方法的调用关系)
58-
59-
一般情况下,如果你的代码量不是很大并且电脑内存充足,建议全都选上。
60-
61-
![image-20250331123349918](./img/image-20250331123349918.png)
62-
63-
隐藏窗口:
64-
65-
点击此按钮可唤出一个隐藏窗口,如果在上一步构件图的时候你勾选了`Info` 就可以在这里快速按照条件查找想要的方法:
66-
67-
其中的`ParamType` 输入框需要使用全限定类名,用英文逗号分隔,并支持使用`*` 作为通配符,示例如下:
68-
69-
`java.lang.String,*` 用这个参数可以查找到所有第一个参数是`String` 类型,第二个参数是任意类型的方法。
70-
71-
其中`Annotations` 字段同样是用英文逗号分隔,但是不用写全限定类名,示例如下:
72-
73-
`@Override,@xxx` 用这个参数可以查找到所有拥有`Override`注解和`xxx`注解的方法。
74-
75-
![](./img/image-20250331124009118.png)
76-
77-
使用示例:
78-
79-
![image-20250331124429606](./img/image-20250331124429606.png)
80-
81-
搜索路径:
82-
83-
当你完成了图的构建之后(进度条可能会因为你的工具窗口太窄而无法显示,你可以选择将工具窗口拖出来作为一个独立的窗口使用),就可以使用搜索功能进行搜索:
84-
85-
搜索有三种方式,第一种是如果你想要查找指定两个方法的调用路径,只需要将起始方法作为`ROOT`,将结束方法作为`SINK`然后点击`Search` 就可以快速搜索,搜索结果进行双击就能跳转到代码对应的位置(有可能不准确):
86-
87-
![image-20250331124823202](./img/image-20250331124823202.png)
88-
89-
第二种方式是如果你不知道起点,只想找到某一个方法的调用链/位置的时候,单独输入`SINK` 也可以进行查找:
90-
91-
![image-20250331124952438](./img/image-20250331124952438.png)
92-
93-
第三种方法是,当你在程序中发现了一个有趣的方法,并想查找所有能够调用到该方法的路径时,可以通过右键菜单中的`Search as sink` 进行搜索,点击后会自动将你选中的方法名填写到`SINK`搜索框中并自动运行搜索:
94-
95-
![image-20250331125202792](./img/image-20250331125202792.png)
96-
97-
所有的结果折叠可以用`回车` 展开或重新折叠,所有的节点都可以双击跳转到指定的位置。
98-
99-
100-
101-
<img src="/home/springkill/.config/Typora/typora-user-images/image-20250401025726431.png" alt="image-20250401025726431" style="zoom: 33%;" />检测`log4j` 示例
102-
103-
#### 展示界面
104-
105-
当你没有进行任何操作的时候,会看到如下界面:
106-
107-
其中`Root Methods`中用来展示所有的**没有被其他人调用的方法**
108-
109-
`Info` 中用来展示一些提示信息,它会识别你的系统平台(方便提交ISSUE的时候进行识别),在没有构建图的时候`CallGraph` 的状态是Not Ready,只有当你成功构建图之后状态才会变成Ready。
110-
111-
`MethodNode`用来展示当前的调用图中有多少节点,以及下方会展示使用了多少内存,是否有提示信息或者报错信息等内容。
112-
113-
![image-20250331125415889](./img/image-20250331125415889.png)
114-
115-
`Search Results`界面用来展示搜索结果:
116-
117-
<img src="./img/image-20250331125928270.png" alt="image-20250331125928270" style="zoom:10%;" />图标用来表示搜索路径
118-
119-
<img src="./img/image-20250331130037060.png" alt="image-20250331130037060" style="zoom:10%;" />图标用爱表示方法声明,也就是方法被定义的位置
120-
121-
<img src="./img/image-20250331130128343.png" alt="image-20250331130128343" style="zoom:10%;" />用来表示方法的调用
122-
123-
<img src="./img/image-20250331130217321.png" alt="image-20250331130217321" style="zoom:10%;" />用来展示对象的新建,当前版本也用来表示隐藏窗口中的方法的搜索结果
124-
125-
`文件图标` 当前版本用来表示一个接口中的方法或者抽象类中的方法被实现或重写
126-
127-
## 注意&功能开发
128-
129-
我们很关注您的代码安全,相信您也一样,所以在使用过程中如有想要的功能以及`bug` 等问题,请及时提出,我们会尽快进行优化/修复。
130-
131-
当前版本使用的路径搜索方法为`DFS` 算法,此方法对于两点中有多条路径的情况可能展示不全,当前可以采用分段搜索的方式进行查找,为了解决这个问题我们将做:
132-
133-
搜索功能优化
134-
135-
路径查找方法优化
136-
137-
图结构优化
138-
139-
当前版本的`CallGraph` 不能持久化保存,为此我们将做:
140-
141-
调用图持久化
142-
143-
方法变动监听
144-
145-
当前版本搜索时的`Root/Source` 可能重复,造成结果中有相同的路径,为此我们将做:
146-
147-
`Root/Source` 节点去重和路径去重
148-
149-
其他feature:
150-
151-
支持直接对lib jar的搜索,移除反编译
152-
153-
搜索结果高亮优化
154-
155-
……
156-
157-
欢迎各位师傅提出`Issue` 帮助项目改进!
158-
159-
## 关于后续版本
160-
161-
我们计划会在后期推出`Pro` 版本,在开源版中提出Issue并被采纳的师傅,我们会赠送`Pro` 的授权码。
162-
163-
`Pro` 版本不同于开源版本,会采用自研的特殊引擎以及特殊机制进行分析,`Pro`计划拥有以下功能:
164-
165-
`Pro` 版本的目的是为了一键精准识别漏洞,尽可能去除误报,支持一键生成报告,以图做到一键扫描,一键报告的形式,更适合刚刚入门代码审计但是直接需要报告的人群。
166-
167-
| 功能差异 | 开源版 | PRO版 |
168-
| :------: | :----------------: | :----------------------------------: |
169-
| 语言支持 | 全部JVM语言 | 更多语言(Python、go等) |
170-
| 污点分析 | 仅方法调用 | 更完善的污点分析能力 |
171-
| 报告导出 | 不支持 | 支持导出报告 |
172-
| SCA | 后续仅支持依赖分析 | 更加精准的调用级SCA分析 |
173-
| AI辅助 || 独创的AI分析模式,不同于市面任何产品 |
174-
| …… | …… | …… |
175-
176-
## 结语
95+
## Roadmap
96+
- Improve path search completeness and graph model.
97+
- Add call graph persistence and change monitoring.
98+
- Deduplicate root/source nodes and repeated paths.
99+
- Improve search-result highlighting and library JAR analysis workflow.

README.zh-CN.md

Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
# CodeAuditAssistant
2+
3+
语言: [English](README.md) | **中文**
4+
5+
## 项目简介
6+
CodeAuditAssistant 是一款用于 JVM 代码审计的 IntelliJ IDEA 插件,提供 Sink 收集、调用图分析和 JAR 反编译能力,帮助审计人员更快定位风险路径。
7+
8+
## 环境要求
9+
- IntelliJ IDEA `>= 2022.3`
10+
- JDK `17+`
11+
12+
## 核心功能
13+
### 1) SinkFinder
14+
内置常见 Java Web 漏洞 sink 规则及高危组件调用点。结果展示在 IDEA Problem 视图中,双击可跳转到代码位置。
15+
16+
### 2) 代码分析(调用图)
17+
支持按 `Entire` 全项目或 `Selected Module` 模块生成调用图。搜索支持:
18+
- `ROOT -> SINK` 路径搜索
19+
-`SINK` 的反向调用链搜索
20+
- 右键方法 `Search as sink` 快速搜索
21+
22+
方法筛选示例:
23+
- `ParamType``java.lang.String,*`
24+
- `Annotations``@Override,@xxx`
25+
26+
### 3) 反编译(实验性)
27+
支持在插件界面中对 JAR 进行反编译,当前实现仍在优化中。
28+
29+
## 流程演示(截图)
30+
### 1)SinkFinder 流程
31+
步骤 1:在 IDEA Problem 视图中收集 sink 结果。
32+
![Sink 收集](./img/image-20250331010159751.png)
33+
34+
步骤 2:双击结果项可跳转到对应源码位置。
35+
![Sink 跳转源码](./img/image-20250331010358550.png)
36+
37+
### 2)反编译流程
38+
步骤 1:在反编译面板选择目标 JAR 后点击 `Run`
39+
![反编译面板](./img/image-20250331010458737.png)
40+
41+
### 3)调用图流程
42+
步骤 1:进入代码分析面板,点击 `Generate CallGraph`
43+
![调用图主面板](./img/image-20250331010441318.png)
44+
45+
步骤 2:选择构建范围(`Entire``Selected Module`)。
46+
![范围选择](./img/image-20250331010933308.png)
47+
48+
步骤 3:也可在编辑器中右键方法直接触发构建。
49+
![右键构建](./img/image-20250331123256112.png)
50+
51+
步骤 4:建议按需勾选 `Info``Path` 以获取更多信息和路径。
52+
![Info 和 Path 选项](./img/image-20250331123349918.png)
53+
54+
步骤 5:打开方法查找面板,按签名/注解筛选方法。
55+
![方法查找面板](./img/image-20250331124009118.png)
56+
57+
步骤 6:方法筛选结果示例。
58+
![方法筛选示例](./img/image-20250331124429606.png)
59+
60+
步骤 7:执行 `ROOT -> SINK` 路径搜索。
61+
![Root 到 Sink 搜索](./img/image-20250331124823202.png)
62+
63+
步骤 8:当起点未知时,使用仅 `SINK` 搜索。
64+
![仅 Sink 搜索](./img/image-20250331124952438.png)
65+
66+
步骤 9:使用右键 `Search as sink` 自动填充并搜索。
67+
![Search as sink](./img/image-20250331125202792.png)
68+
69+
步骤 10:通过状态区查看 `CallGraph`、节点数、内存和提示信息。
70+
![状态面板](./img/image-20250331125415889.png)
71+
72+
### 4)搜索结果图标说明
73+
路径节点图标:
74+
![路径图标](./img/image-20250331125928270.png)
75+
76+
方法声明图标:
77+
![声明图标](./img/image-20250331130037060.png)
78+
79+
方法调用图标:
80+
![调用图标](./img/image-20250331130128343.png)
81+
82+
对象创建 / 方法检索结果图标:
83+
![新建对象图标](./img/image-20250331130217321.png)
84+
85+
## 构建与运行
86+
- 构建插件产物:`./gradlew buildPlugin`
87+
- 启动沙箱 IDE 调试:`./gradlew runIde`
88+
- 完整构建:`./gradlew build`
89+
90+
## 已知限制
91+
- 当前路径搜索基于 DFS,在复杂图中可能无法完整展示所有并行路径。
92+
- 调用图暂不支持会话间持久化。
93+
- 部分场景下根节点/源节点重复可能导致结果路径重复。
94+
95+
## 后续计划
96+
- 优化路径搜索完整性与图结构模型。
97+
- 增加调用图持久化与方法变更监听。
98+
- 去重根节点/源节点及重复路径。
99+
- 优化搜索结果高亮与第三方 JAR 分析流程。

0 commit comments

Comments
 (0)