Static Code analysis tutorial with Konveyor and Kantra part - 1
Konveyor Kantra CLI是一个命令行工具,用于分析和转换应用程序源代码以支持现代化和迁移。它执行静态代码分析来检测问题。Kantra还可以提取元数据、生成部署资产(例如Kubernetes清单),并通过容器或本机方式运行。它支持多种语言,例如Java、Go、.Net和Node.js,并与CI/CD流水线集成。Kantra是自动化、LLM驱动的应用程序现代化工作流程(如Konveyor AI(Kai))的基础。
Kantra为Java领域提供了2400多个预构建规则。它涵盖了标准用例,如从一个JDK版本迁移到另一个版本、Spring到Spring、JBoss到Quarkus等。我们将在本博客系列中探讨所有这些内容。要开始使用Kantra并运行自定义规则,您需要一种方式来告诉它该做什么。可以把它想象成开车——您需要方向盘、踏板和按钮等控件来让它移动并执行您想要的操作。对于Kantra,主要的控制面板是Kantra命令行界面,简称Kantra CLI。
Kantra也捆绑在VSCode的Konveyor扩展中,但在本博客中,我们探讨CLI版本。Kantra CLI是您从终端或命令提示符运行的程序。它是您将使用的主要工具,用于:
- 开始分析项目的代码。
- 告诉Kantra在分析过程中使用哪些规则。
- 生成显示分析结果的报告。
- 运行自定义规则的测试以确保它们正常工作。
简单来说,CLI是您与Kantra分析引擎对话的方式。
安装
- 在此处下载kantra
- 解压存档
- 重命名Kantra cli并将其移动到PATH。(例如)
mv darwin-kantra $HOME/bin/kantra
- 将解压文件夹中的所有文件添加到.kantra
1
2
|
cd kantra.darwin.arm64/
mv * $HOME/.kantra
|
注意:Mac用户可能需要在运行CLI之前运行以下命令。
1
|
sudo xattr -dr com.apple.quarantine kantra
|
1
|
kantra analyze --input=tests/data/ssti-test-project --output=output --overwrite --target openjdk17 --rules rules
|
让我们看一个2022年报告的Apache Commons Text StringSubstitutor漏洞示例。
需要明确的是,此漏洞已有修复,代码仅用于说明Kantra的工作原理。此示例的源代码可以在此处的git上找到。
视觉概述
1
2
3
4
|
Applies -> Runs -> Organizes -> Contains -> Reports -> Evaluates against
Targets usage of -> Targets usage of -> Verifies -> Uses -> Comprises -> Asserts count of -> Uses
Kantra CLI -> Kantra Rule -> Rule Condition (When Clause) -> Kantra Test -> Test Case -> Analysis Data -> Incident
StringSubstitutor (Apache Commons Text) -> StringLookup (Apache Commons Text) -> Ruleset
|
用例:分析您的项目
使用Kantra CLI最常见的操作是运行代码分析。这是您根据提供的规则发现潜在问题的方式。
让我们看一个示例命令:
1
|
kantra analyze --input=tests/data/ssti-test-project --output=output --overwrite --target openjdk17 --rules rules
|
此命令告诉Kantra执行分析操作。让我们分解不同部分(称为“标志”或“参数”)的含义:
kantra analyze
:这是主命令,告诉Kantra启动分析作业。
--input=tests/data/ssti-test-project
:此标志告诉Kantra在哪里找到要分析的代码。在这种情况下,它指向一个特定的示例项目目录。
--output=output
:此标志告诉Kantra在哪里保存分析结果(报告)。这里,它将创建一个名为output的文件夹。
--overwrite
:如果您之前运行过分析,此标志很有用。它告诉Kantra替换指定--output
目录中的任何现有输出文件。
--target openjdk17
:此标志指定您要迁移到的目标环境。Kantra可以使用此信息根据目标平台或技术定制分析。
--rules rules
:此标志非常重要!它告诉Kantra在哪里找到用于分析的规则。在此示例中,它指向一个名为rules的目录。我们将在下一篇博客中了解更多关于规则集的内容。
当您运行此命令时,Kantra将读取--input
中的代码,应用--rules
中定义的逻辑,并在--output
目录中生成详细说明任何发现的报告。
分析器命令的输出应如下所示:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
INFO[0000] --run-local set. running analysis in containerless mode
INFO[0000] running source analysis
INFO[0000] creating provider config
INFO[0000] setting provider from provider config provider=java
INFO[0000] setting provider from provider config provider=builtin
INFO[0000] parsing rules for analysis rules=rules
INFO[0000] parsing rules for analysis rules=/Users/../.kantra/rulesets
INFO[0001] starting provider provider=builtin
INFO[0001] starting provider provider=java
INFO[0003] running depencency analysis
INFO[0003] evaluating rules for violations. see analysis.log for more info
INFO[0008] writing analysis results to output output=/Users/...security/ssti/output
INFO[0008] generating static report
INFO[0008] Static report created. Access it at this URL: URL="file:///Users/...security/ssti/output/static-report/index.html"
|
Kantra可以创建多种格式的输出。这里我只使用默认的html版本,它应该看起来像这样:
点击链接以获取有关事件和违规代码行的更多信息。以下是如何显示违规和代码行的方式。
如果您点击文件,它还应显示代码和确切的违规行。
此屏幕截图来自Kantra提供的一个标准规则。在开发自定义规则时,还可以编写测试用例。让我们也看看这个。
用例:运行规则测试
Kantra CLI的另一个关键用途,尤其是在开发自定义规则时,是运行测试。Kantra有一个内置的测试框架。kantra-examples项目包括示例规则的测试。
1
2
|
cd ssti/tests
kantra test .
|
cd ssti/tests
:第一部分只是将终端中的当前目录更改为ssti示例的测试文件所在的位置。
kantra test .
:这是Kantra命令。它告诉Kantra执行测试操作。.
表示“测试当前目录中的所有内容”。
运行此命令将执行该目录中定义的规则测试。这对于验证您的自定义规则是否正确识别专门为测试设计的示例代码片段中的问题非常有帮助。
幕后:CLI如何工作(简化)
您可能想知道当您键入像kantra analyze ...
这样的命令并按Enter时会发生什么。在高层面上,这是一个简单的过程:
- 您在终端中运行命令。
- Kantra CLI程序启动。
- CLI读取您键入的命令,包括所有标志(
--input
、--rules
等)。
- 根据命令(如analyze),CLI知道下一步该做什么。
- 对于analyze,CLI从您用
--rules
指定的位置加载规则集。
- CLI然后将控制权(以及加载的规则和输入位置)交给Kantra内的主分析引擎。
- 分析引擎读取您的项目代码(从
--input
)。
- 分析引擎使用规则的逻辑扫描代码中的模式或问题。
- 如果找到与规则匹配的内容,它会创建一个记录(事件,我们将在事件中介绍)。
- 扫描所有内容后,分析引擎将结果返回给CLI。
- CLI然后将这些结果格式化为报告并保存到您指定的
--output
位置。
这是一个非常基本的序列图,用于可视化此流程:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
|
项目代码 -> 规则文件 -> 分析引擎 -> Kantra CLI -> 用户
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
|