@comate/zulu 1.4.0 → 1.4.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/comate-engine/assets/skills/code-security/SKILL.md +254 -63
- package/comate-engine/assets/skills/code-security/references/credential_hosting.md +263 -97
- package/comate-engine/assets/skills/code-security/references/framework_detection.md +91 -0
- package/comate-engine/assets/skills/code-security/references/vul_repair_sensitive.md +143 -74
- package/comate-engine/assets/skills/code-security/scripts/credential_hosting.py +12 -3
- package/comate-engine/assets/skills/code-security/scripts/credential_open_page.py +3 -3
- package/comate-engine/assets/skills/code-security/scripts/credential_poll.py +1 -1
- package/comate-engine/assets/skills/code-security/scripts/credential_print_url.py +43 -0
- package/comate-engine/assets/skills/code-security/scripts/credential_url.py +22 -2
- package/comate-engine/assets/skills/code-security/scripts/dodo/dodo_session.sh +183 -0
- package/comate-engine/assets/skills/code-security/scripts/ducc/get_claude_session_id.sh +8 -4
- package/comate-engine/assets/skills/code-security/scripts/ducc/open_browser.py +15 -18
- package/comate-engine/assets/skills/code-security/scripts/http_client.py +2 -3
- package/comate-engine/assets/skills/code-security/scripts/repair_vulnerability.py +3 -3
- package/comate-engine/assets/skills/code-security/scripts/report_chat.py +2 -2
- package/comate-engine/assets/skills/code-security/scripts/scan_vulnerability.py +7 -7
- package/comate-engine/assets/skills/code-security/scripts/utils.py +26 -11
- package/comate-engine/package.json +2 -0
- package/comate-engine/server.js +27 -27
- package/dist/bundle/index.js +6 -6
- package/package.json +1 -1
|
@@ -2,28 +2,58 @@
|
|
|
2
2
|
|
|
3
3
|
**【强制执行总则】** 以下步骤必须严格按顺序执行,不得跳过任何步骤,不得调换顺序。每个步骤完成后才能进入下一步。
|
|
4
4
|
|
|
5
|
+
## 通用规则
|
|
6
|
+
|
|
7
|
+
以下规则在多个步骤中复用,后续步骤以「按通用规则 X」引用。
|
|
8
|
+
|
|
9
|
+
### 规则 A:选项展示方式(按环境区分)
|
|
10
|
+
|
|
11
|
+
- **Dodo 环境(`_IDE` 为 `DODO`)**:不使用 AskUserQuestion 组件,在聊天框中直接输出编号列表,(**不要使用代码块模式展示**),用户回复数字编号或选项内容即可继续。
|
|
12
|
+
- **非 Dodo 环境**:使用 AskUserQuestion 工具让用户选择(**不得展示「Other」选项,选项为必选,未选择时 Continue 按钮不可点击**)。
|
|
13
|
+
|
|
14
|
+
### 规则 B:Dodo 环境文字消息输出
|
|
15
|
+
|
|
16
|
+
在 Dodo 环境中需要向用户输出进度/结果信息时,执行方式如下:
|
|
17
|
+
|
|
18
|
+
1. **调用方式**:必须使用 `infoflow-notify` 技能发送一条独立文字消息,消息直接呈现在如流聊天框中
|
|
19
|
+
2. **调用时机**:在执行目标操作(如运行脚本、轮询等)的前或后,按各步骤指定的时机发送
|
|
20
|
+
3. **消息内容**:将各步骤中「按规则 B 发送:`...`」引号内的完整文本作为消息体,不得截断、改写或合并多条
|
|
21
|
+
4. **禁止替代**:不得用普通文字回复、工具调用结果展示、或思考过程输出来替代 `infoflow-notify` 技能调用
|
|
22
|
+
5. **每条独立发送**:如果同一步骤有多条规则 B 消息(如轮询前和轮询后各一条),必须分别调用 `infoflow-notify` 逐条发送,不得合并为一条
|
|
23
|
+
|
|
24
|
+
### 规则 C:浏览器打开链接(按环境区分)
|
|
25
|
+
|
|
26
|
+
- **Dodo 环境**:仅在聊天框中输出可点击链接,**不执行 webbrowser 命令**。
|
|
27
|
+
- **非 Dodo 环境**:输出链接后,额外执行 `python3 -c "import webbrowser; webbrowser.open('<URL>')"` 在外部浏览器中打开。
|
|
28
|
+
|
|
5
29
|
## 流程概览
|
|
6
30
|
|
|
7
31
|
```
|
|
8
32
|
步骤一:打开硬编码风险治理网页
|
|
9
33
|
↓
|
|
10
|
-
|
|
34
|
+
步骤二:等待凭证配置完成
|
|
11
35
|
↓
|
|
12
|
-
步骤三:修复硬编码代码(本地修复,按 vul_repair_sensitive.md
|
|
36
|
+
步骤三:修复硬编码代码(本地修复,按 vul_repair_sensitive.md 规则,修复后以表格总结展示修复变化)
|
|
37
|
+
├→ 非 Dodo 环境:展示代码变动后直接进入步骤四
|
|
38
|
+
└→ Dodo 环境:展示代码变动后执行子步骤 3.1~3.3
|
|
39
|
+
3.1 创建 iCafe 卡片(标题:修复硬编码账密风险)
|
|
40
|
+
3.2 提交代码到 iCode(commit: {卡片编号} : 修复硬编码账密风险)
|
|
41
|
+
3.3 展示 iCode 代码链接和 iCafe 卡片链接
|
|
13
42
|
↓
|
|
14
43
|
步骤四:托管凭证(用户选择托管或跳过)
|
|
15
|
-
├→ 托管凭证 → 执行托管脚本
|
|
16
|
-
└→ 跳过托管
|
|
44
|
+
├→ 托管凭证 → 执行托管脚本
|
|
45
|
+
└→ 跳过托管
|
|
17
46
|
↓
|
|
18
|
-
步骤五:提交代码并合入
|
|
19
|
-
├→ 选择1
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
47
|
+
步骤五:提交代码并合入icode
|
|
48
|
+
├→ 选择1:已提交合入,清理历史 → 步骤六(清理历史 commit)→ 清理临时文件 → 结束
|
|
49
|
+
├→ 选择2:已提交合入,流程结束 → 清理临时文件 → 结束
|
|
50
|
+
├→ 选择3:未提交合入,复测扫描 → 复测扫描 → 提示提交并合入 → 步骤五
|
|
51
|
+
└→ 选择4:未提交合入,单元测试 → 单元测试 → 复测扫描 → 提示提交并合入 → 步骤五
|
|
52
|
+
|
|
53
|
+
步骤六:清理历史 git commit 记录
|
|
54
|
+
├→ 选择1:已完成清理,申请结单 → 申请结单 → 清理临时文件 → 结束
|
|
55
|
+
├→ 选择2:已完成清理,稍后手动申请结单 → 清理临时文件 → 结束
|
|
56
|
+
└→ 选择3:未清理,后续手动清理 → 清理临时文件 → 结束
|
|
27
57
|
```
|
|
28
58
|
|
|
29
59
|
---
|
|
@@ -37,18 +67,24 @@
|
|
|
37
67
|
脚本会自动构建凭证配置网页 URL,并在 IDE 内嵌浏览器中自动打开:
|
|
38
68
|
|
|
39
69
|
```bash
|
|
40
|
-
python3 scripts/credential_open_page.py \
|
|
41
|
-
--chat-id "
|
|
42
|
-
--username "
|
|
43
|
-
--ide-name "
|
|
44
|
-
--project-dir "<项目目录绝对路径>"
|
|
70
|
+
output=$(python3 <SKILL_DIR>/scripts/credential_open_page.py \
|
|
71
|
+
--chat-id "<会话ID>" \
|
|
72
|
+
--username "<用户名>" \
|
|
73
|
+
--ide-name "<IDE类型>" \
|
|
74
|
+
--project-dir "<项目目录绝对路径>")
|
|
75
|
+
echo "$output"
|
|
45
76
|
```
|
|
46
77
|
|
|
78
|
+
参数说明:
|
|
79
|
+
- `--chat-id`、`--username`、`--ide-name`:使用步骤一获取的 `_CHAT_ID`、`_USERNAME`、`_IDE` 值
|
|
80
|
+
|
|
47
81
|
脚本说明:
|
|
48
82
|
- `--project-dir`:当前扫描的项目目录,用于自动从 git remote 获取 `repo` 标识;若无 git 信息则使用目录名
|
|
49
83
|
- 脚本通过 comate-kernel socket 在 IDE 内嵌浏览器中自动打开网页
|
|
50
84
|
- 若 kernel socket 不可用,自动降级为 `--open-url` 触发 `simpleBrowser.api.open`
|
|
51
85
|
|
|
86
|
+
**【强制执行】** 脚本执行完成后,必须将脚本的**标准输出内容原样输出到聊天框**(即直接作为回复正文发送给用户),不得仅保留在执行日志中。脚本标准输出包含可点击的 Markdown 链接,用户需要在聊天框中看到并点击该链接。输出完成后,立即进入步骤二。
|
|
87
|
+
|
|
52
88
|
### DUCC 环境
|
|
53
89
|
|
|
54
90
|
`credential_open_page.py` 负责输出可点击链接,`scripts/ducc/open_browser.py` 负责在内嵌浏览器中打开,两者接收相同参数,共用公共模块 `credential_url.py` 构建 URL:
|
|
@@ -56,36 +92,94 @@ python3 scripts/credential_open_page.py \
|
|
|
56
92
|
```bash
|
|
57
93
|
# 在内嵌浏览器中打开
|
|
58
94
|
python3 scripts/ducc/open_browser.py \
|
|
59
|
-
--chat-id "
|
|
60
|
-
--username "
|
|
61
|
-
--ide-name "
|
|
95
|
+
--chat-id "<会话ID>" \
|
|
96
|
+
--username "<用户名>" \
|
|
97
|
+
--ide-name "<IDE类型>" \
|
|
98
|
+
--project-dir "<项目目录绝对路径>"
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
参数说明:
|
|
102
|
+
- `--chat-id`、`--username`、`--ide-name`:使用步骤一获取的 `_CHAT_ID`、`_USERNAME`、`_IDE` 值
|
|
103
|
+
|
|
104
|
+
### Dodo 环境
|
|
105
|
+
|
|
106
|
+
**【强制执行 - 严格按以下两步顺序执行,不得跳过任何步骤】**
|
|
107
|
+
|
|
108
|
+
**第一步:输出进度信息并执行脚本获取 URL**
|
|
109
|
+
|
|
110
|
+
按规则 B 发送进度消息:`📍 正在构建硬编码风险治理网页链接...`
|
|
111
|
+
|
|
112
|
+
然后执行脚本获取 URL:
|
|
113
|
+
|
|
114
|
+
```bash
|
|
115
|
+
python3 scripts/credential_print_url.py \
|
|
116
|
+
--chat-id "<会话ID>" \
|
|
117
|
+
--username "<用户名>" \
|
|
118
|
+
--ide "<IDE类型>" \
|
|
62
119
|
--project-dir "<项目目录绝对路径>"
|
|
63
120
|
```
|
|
64
121
|
|
|
122
|
+
禁止跳过脚本、禁止自行构造或伪造 URL,链接地址必须来自脚本的 stdout 输出。
|
|
123
|
+
|
|
124
|
+
**第二步:按规则 B 输出链接消息,然后自动进入步骤二**
|
|
125
|
+
|
|
126
|
+
消息内容(`<实际URL>` 替换为脚本 stdout 输出的完整 URL):
|
|
127
|
+
|
|
128
|
+
```
|
|
129
|
+
✅ 构建完成 — 已获取硬编码风险治理网页链接
|
|
130
|
+
|
|
131
|
+
请点击以下链接打开硬编码风险治理网页,配置凭证信息:
|
|
132
|
+
|
|
133
|
+
[打开硬编码风险治理界面](<实际URL>)
|
|
134
|
+
|
|
135
|
+
请在网页中完成凭证配置并点击「修复代码」按钮,我将自动检测到配置完成并继续执行修复流程。
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
**输出该消息后,立即自动进入步骤二,无需等待用户回复。**
|
|
139
|
+
|
|
140
|
+
脚本说明:
|
|
141
|
+
- 脚本使用绝对路径加载 `credential_url` 模块,无论从哪个目录调用都能正确运行
|
|
142
|
+
- 输出标准 Markdown 超链接,用户点击后直接在本地浏览器中打开
|
|
143
|
+
- `--ide` 使用步骤一获取的 `_IDE` 值(Dodo 环境下为 `DODO`)
|
|
144
|
+
|
|
65
145
|
---
|
|
66
146
|
|
|
67
|
-
**【强制执行】**
|
|
147
|
+
**【强制执行】** 无论哪种环境,无论网页是否成功自动打开,都必须将可点击链接完整展示在聊天框的回复正文中,不得省略。
|
|
68
148
|
|
|
69
149
|
## 步骤二:等待凭证配置完成
|
|
70
150
|
|
|
71
|
-
**【强制执行】**
|
|
151
|
+
**【强制执行】** 步骤一执行完成后,立即执行以下轮询脚本,无需等待用户任何操作。
|
|
152
|
+
|
|
153
|
+
此步骤是后续修复流程的前置依赖,未执行将导致整个硬编码修复流程中断。
|
|
72
154
|
|
|
73
155
|
```bash
|
|
74
|
-
python3 scripts/credential_poll.py --chat-id
|
|
156
|
+
python3 scripts/credential_poll.py --chat-id <会话ID> --username <用户名> --output <临时目录>/poll_result.json
|
|
75
157
|
```
|
|
76
158
|
|
|
77
|
-
|
|
159
|
+
参数说明:
|
|
160
|
+
- `--chat-id`、`--username`:使用步骤一获取的 `_CHAT_ID`、`_USERNAME` 值
|
|
161
|
+
|
|
162
|
+
`<临时目录>` 使用与 `scan_result.json` 同一目录(即 `<_TMP_DIR>/.code-security/<项目名>_<哈希>/`)。
|
|
78
163
|
|
|
79
|
-
该脚本通过 WebSocket
|
|
164
|
+
该脚本通过 WebSocket 连接服务端,等待用户在网页完成配置并点击「修复代码」。收到数据后输出到标准输出并保存到 `--output` 指定的文件。配置数据包含以下关键字段:
|
|
80
165
|
|
|
81
166
|
- `data.files`:待修复文件列表(含 vulList 和 extra.secret 信息)
|
|
82
167
|
- `data.credentials`:凭证名值对列表
|
|
83
168
|
- `data.deployment`:托管平台信息(platform、platformName)
|
|
84
169
|
- `data.repo`:代码库语言和框架信息
|
|
85
|
-
- `data.succMsg
|
|
86
|
-
- `data.errorMsg
|
|
170
|
+
- `data.succMsg`:凭证托管成功的提示信息,**不是操作结果**
|
|
171
|
+
- `data.errorMsg`:凭证托管失败的提示信息,**不是操作结果**
|
|
87
172
|
- `chatUUID`:此次会话 ID
|
|
88
173
|
|
|
174
|
+
**poll_result.json中的`data.errorMsg`和`data.succMsg`字段仅作为提示信息,不是实际的操作结果,后面操作流程根据实际操作结果来选择展示`data.errorMsg`和`data.succMsg`的一种**
|
|
175
|
+
|
|
176
|
+
**【Dodo 环境进度通知】**
|
|
177
|
+
|
|
178
|
+
- 轮询前,按规则 B 发送:`📍 等待凭证配置完成(WebSocket 轮询中...)`
|
|
179
|
+
- 轮询成功后,按规则 B 发送:`✅ 完成 — 已收到凭证配置数据,正在修复硬编码代码,请稍候...`
|
|
180
|
+
|
|
181
|
+
**发送完成消息后,立即自动进入步骤三,无需等待用户回复。**
|
|
182
|
+
|
|
89
183
|
## 步骤三:修复硬编码代码
|
|
90
184
|
|
|
91
185
|
**【强制执行】** 收到凭证配置数据后,必须在本地直接修复硬编码漏洞,不调用后端修复服务。必须先读取 `references/vul_repair_sensitive.md` 文档中的修复规则再执行修复。
|
|
@@ -93,23 +187,84 @@ python3 scripts/credential_poll.py --chat-id ${_CHAT_ID} --username ${_USERNAME}
|
|
|
93
187
|
修复输入数据来自 `poll_result.json` 文件(由步骤二保存),其中 `data.files`、`data.repo`、`data.deployment` 包含了修复所需的全部信息。
|
|
94
188
|
|
|
95
189
|
修复流程:
|
|
96
|
-
1. 读取 `references/vul_repair_sensitive.md`
|
|
97
|
-
2.
|
|
98
|
-
3.
|
|
99
|
-
|
|
190
|
+
1. 读取 `references/vul_repair_sensitive.md` 全文,重点掌握「稳定性总原则」与「通用修复流程(2.1)」后再执行后续步骤
|
|
191
|
+
2. 按文件遍历 `data.files`,对每个文件的 `vulList` **按 `line` 降序排序**后再逐漏洞处理;同一行存在多个漏洞时,按 `extra.secret.start.col` **降序**依次替换,避免列偏移
|
|
192
|
+
3. 对每个漏洞**独立判断**修复方式(禁止基于内容相似性批量推断):
|
|
193
|
+
- `extra.secret.credentialName` **不为空** → 托管方式:根据文件类型选择对应规则(代码文件参考 2.2、配置文件参考 2.3),**仅替换 `[start.col, end.col]` 范围内的字符**,行内其余内容(空格、引号、注释、分隔符)一律不动
|
|
194
|
+
- `extra.secret.credentialName` **为空** → 删除方式(参考 2.4):按文件类型清空值,保留语法结构,确保文件可正常解析/编译
|
|
195
|
+
4. 修复后校验:重新读取文件,逐项确认(a)目标位置已替换;(b)非目标行/列未被改动;(c)文件整体语法/缩进合法;发现问题立即回滚并重新修复
|
|
196
|
+
5. **【强制执行,禁止跳过】** 显式读取 `data.deployment.platform` 的值,根据结果执行以下分支(禁止凭印象或推断跳过此步骤):
|
|
197
|
+
- 若 `platform == 4`:按 `references/vul_repair_sensitive.md` 第 3 节「引入SDK」引入 keyless-sdk;`credentialID` 必须与 `data.deployment.credential_id` 完全一致;已有 SDK 依赖与初始化的项目不要重复引入;引入后重新读取相关文件,确认依赖与初始化代码均已正确写入
|
|
198
|
+
- 若 `platform != 4`:明确跳过,不引入 SDK
|
|
199
|
+
6. 代码修复完成后,先输出步骤三的进度信息,再按以下格式展示代码变动:
|
|
200
|
+
|
|
201
|
+
修复完成后追加输出:
|
|
202
|
+
|
|
203
|
+
**第一部分:整体汇总(一行)**
|
|
204
|
+
|
|
205
|
+
✅ 共修复 **{N}** 处硬编码,{简述变更内容,如"敏感密钥已替换为环境变量读取"}
|
|
206
|
+
|
|
207
|
+
**第二部分:逐文件细节(每个文件一块)**
|
|
208
|
+
|
|
209
|
+
📄 `{文件相对路径}`
|
|
210
|
+
```diff
|
|
211
|
+
{行号}: {未变动的上下文行(可选)}
|
|
212
|
+
- {行号}: {修复前代码原文}
|
|
213
|
+
+ {行号}: {修复后代码原文}
|
|
214
|
+
{行号}: {未变动的上下文行(可选)}
|
|
215
|
+
```
|
|
100
216
|
|
|
101
|
-
|
|
217
|
+
**格式要求:**
|
|
218
|
+
1. 汇总行中修复数量使用加粗(**N**)
|
|
219
|
+
2. 文件路径使用反引号高亮,每个文件只展示一次,不带行号
|
|
220
|
+
3. 代码块使用 diff 语法,- 表示删除行,+ 表示新增行,无前缀表示上下文行
|
|
221
|
+
4. 同一文件的多处修改合并在一个 diff 块中,按行号顺序展示,不同修改处之间用 `...` 分隔
|
|
222
|
+
5. 每行代码前必须标注行号,格式为 `{行号}: {代码}`
|
|
223
|
+
6. 多个文件按文件顺序依次展示,每个文件之间空一行
|
|
224
|
+
7. **【重要】** 当使用批量替换(如 `replace_all=true`)处理多行相同内容的修改时,必须在 diff 中逐一展示每一处修改的变更,不得只展示第一处。例如:如果第46-52行都是将相同的密码替换为空值,则必须在 diff 中从第46行到第52行,每一行都分别标注 `- {修复前}` 和 `+ {修复后}`,即使修改内容完全相同也不能省略
|
|
225
|
+
|
|
226
|
+
### 步骤三完成后的环境区分处理
|
|
102
227
|
|
|
103
|
-
|
|
228
|
+
**非 Dodo 环境**:代码变动展示完成后,**立即自动进入步骤四,无需等待用户回复**。
|
|
104
229
|
|
|
105
|
-
|
|
106
|
-
- **不得展示「Other」选项**
|
|
107
|
-
- **选项为必选**,用户未做选择时 Continue 按钮不可点击
|
|
230
|
+
**Dodo 环境(`_IDE` 为 `DODO`)**:代码变动展示完成后,必须严格按以下顺序执行三个子步骤,全部完成后再进入步骤四:
|
|
108
231
|
|
|
232
|
+
**子步骤 3.1:创建 iCafe 卡片**
|
|
233
|
+
|
|
234
|
+
使用 `icafe` 技能,在用户最近操作的 iCafe 空间中创建一张卡片:
|
|
235
|
+
- 卡片标题:`修复硬编码账密风险`
|
|
236
|
+
- 卡片类型:Task
|
|
237
|
+
|
|
238
|
+
创建成功后,记录返回的卡片编号(如 `SPACE-123`),后续步骤需要使用。
|
|
239
|
+
|
|
240
|
+
**子步骤 3.2:提交代码到 iCode**
|
|
241
|
+
|
|
242
|
+
使用 `icode` 技能,将本次代码变动提交到当前代码分支:
|
|
243
|
+
- commit 信息格式:`{icafe卡片编号} : 修复硬编码账密风险`
|
|
244
|
+
- 示例:`SPACE-123 : 修复硬编码账密风险`
|
|
245
|
+
- 提交到当前分支(即 `git branch --show-current` 的结果)
|
|
246
|
+
- **仅是提交并推送到iCode,不要直接合入iCode远程分支**
|
|
247
|
+
|
|
248
|
+
**子步骤 3.3:展示 iCode 代码链接**
|
|
249
|
+
|
|
250
|
+
提交成功后,在代码变动展示内容末尾追加 iCode 代码链接:
|
|
251
|
+
|
|
252
|
+
```
|
|
253
|
+
🔗 本次提交已推送到 iCode:[查看代码变更](<iCode提交链接>)
|
|
254
|
+
📋 关联 iCafe 卡片:[{icafe卡片编号}](<icafe卡片链接>)
|
|
255
|
+
```
|
|
256
|
+
|
|
257
|
+
三个子步骤全部完成后,**立即自动进入步骤四,无需等待用户回复**。
|
|
258
|
+
|
|
259
|
+
## 步骤四:托管凭证
|
|
260
|
+
|
|
261
|
+
**【强制执行】** 必须向用户提供以下选项,等待用户确认后再继续,不得自动跳过。
|
|
262
|
+
|
|
263
|
+
按规则 A 展示选项:
|
|
109
264
|
```
|
|
110
265
|
代码修复已完成,请 Review 修复后的代码。确认无误后,选择后续操作:
|
|
111
266
|
1. 托管凭证 - 将凭证托管到 {platformName} 平台
|
|
112
|
-
2. 跳过托管 -
|
|
267
|
+
2. 跳过托管 - 仅完成代码修复(如删除无效凭证等),不托管凭证
|
|
113
268
|
```
|
|
114
269
|
|
|
115
270
|
用户必须选择其中一项后才能继续。
|
|
@@ -117,9 +272,12 @@ Questions 组件使用规范:
|
|
|
117
272
|
**用户选择「托管凭证」时**,执行:
|
|
118
273
|
|
|
119
274
|
```bash
|
|
120
|
-
python3 scripts/credential_hosting.py --poll-result <poll_result.json路径> --username
|
|
275
|
+
python3 scripts/credential_hosting.py --poll-result <poll_result.json路径> --username <用户名>
|
|
121
276
|
```
|
|
122
277
|
|
|
278
|
+
参数说明:
|
|
279
|
+
- `--username`:使用步骤一获取的 `_USERNAME` 值
|
|
280
|
+
|
|
123
281
|
脚本自动从 `poll_result.json` 中提取 `chatUUID`、`deployment.platformName`、`data.credentials`,无需手动传递这些参数。
|
|
124
282
|
托管完成后,从 `poll_result.json` 中读取 `data.succMsg`, 展示给用户:
|
|
125
283
|
```
|
|
@@ -130,33 +288,31 @@ python3 scripts/credential_hosting.py --poll-result <poll_result.json路径> --u
|
|
|
130
288
|
{errorMsg}
|
|
131
289
|
```
|
|
132
290
|
|
|
133
|
-
|
|
134
291
|
**用户选择「跳过托管」时**,直接进入步骤五。
|
|
135
292
|
|
|
136
293
|
完成步骤四后,进入步骤五。
|
|
137
294
|
|
|
138
295
|
## 步骤五:提交代码并合入
|
|
139
296
|
|
|
140
|
-
|
|
297
|
+
提示用户需要提交并合入代码到远程仓库。
|
|
141
298
|
|
|
142
|
-
|
|
143
|
-
- **不得展示「Other」选项**
|
|
144
|
-
- **选项为必选**,用户未做选择时 Continue 按钮不可点击
|
|
299
|
+
**【强制执行】** 向用户确认代码是否提交并推送合入远程仓库,不得自动跳过。
|
|
145
300
|
|
|
301
|
+
按规则 A 展示选项:
|
|
146
302
|
```
|
|
147
|
-
|
|
148
|
-
1.
|
|
149
|
-
2.
|
|
150
|
-
3.
|
|
151
|
-
4.
|
|
303
|
+
请确认代码是否已经提交并合入icode,选择后续操作:
|
|
304
|
+
1. 已提交合入 - 继续清理历史git commit记录
|
|
305
|
+
2. 已提交合入 - 流程结束,后续再做处理
|
|
306
|
+
3. 未提交合入 - 进行复测扫描
|
|
307
|
+
4. 未提交合入 - 完善单元测试
|
|
152
308
|
```
|
|
153
309
|
|
|
154
310
|
根据用户选择执行对应分支:
|
|
155
311
|
|
|
156
|
-
- **选择 1
|
|
157
|
-
- **选择 2
|
|
158
|
-
- **选择 3
|
|
159
|
-
- **选择 4
|
|
312
|
+
- **选择 1(已提交合入,清理历史)**→ 进入步骤六(清理历史 commit),清理完成后进入「清理临时文件」
|
|
313
|
+
- **选择 2(已提交合入,流程结束)**→ 进入「清理临时文件」后结束
|
|
314
|
+
- **选择 3(未提交合入,复测扫描)**→ 进入「复测扫描」→ 提示提交并合入 → 回到步骤五
|
|
315
|
+
- **选择 4(未提交合入,单元测试)**→ 进入「单元测试」→「复测扫描」→ 提示提交并合入 → 回到步骤五
|
|
160
316
|
|
|
161
317
|
## 步骤六:清理历史 git commit 记录
|
|
162
318
|
|
|
@@ -169,7 +325,7 @@ Questions 组件使用规范:
|
|
|
169
325
|
- HTTP 格式(`https://icode.baidu.com/baidu/scan/cnap-test`):取域名后的路径部分,去掉 `.git` 后缀
|
|
170
326
|
- 若无 git 信息则使用项目目录名;`/` 不需要编码,直接拼接
|
|
171
327
|
|
|
172
|
-
1.
|
|
328
|
+
1. 输出以下内容到聊天框:
|
|
173
329
|
|
|
174
330
|
```
|
|
175
331
|
代码已合入,建议立即清理 Git 历史记录,防止历史 commit 中残留的硬编码凭证泄露。
|
|
@@ -177,35 +333,26 @@ Questions 组件使用规范:
|
|
|
177
333
|
请点击以下链接进入清理平台:[历史 Commit 清理平台](https://commit-clean.baidu-int.com/task?repo=<REPO>)
|
|
178
334
|
```
|
|
179
335
|
|
|
180
|
-
2.
|
|
336
|
+
2. 按规则 C 处理浏览器打开(URL 为 `https://commit-clean.baidu-int.com/task?repo=<REPO>`)。
|
|
181
337
|
|
|
182
|
-
|
|
183
|
-
python3 -c "import webbrowser; webbrowser.open('https://commit-clean.baidu-int.com/task?repo=<REPO>')"
|
|
184
|
-
```
|
|
185
|
-
|
|
186
|
-
3. 通过 Questions 组件让用户确认(**不得展示「Other」选项,选项为必选,未选择时 Continue 按钮不可点击**):
|
|
338
|
+
3. 按规则 A 展示选项,让用户确认是否完成历史记录清理:
|
|
187
339
|
|
|
188
340
|
```
|
|
189
|
-
|
|
190
|
-
1. 已完成清理 -
|
|
191
|
-
2.
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
用户选择后,使用 Questions 组件询问是否申请结单(**不得展示「Other」选项,选项为必选**):
|
|
195
|
-
|
|
196
|
-
```
|
|
197
|
-
是否申请结单?
|
|
198
|
-
1. 是,立即申请结单
|
|
199
|
-
2. 否,稍后手动处理
|
|
341
|
+
请确认是否完成历史记录清理:
|
|
342
|
+
1. 已完成清理 - 立即申请结单
|
|
343
|
+
2. 已完成清理 - 稍后手动申请结单,流程结束
|
|
344
|
+
3. 未清理 - 后续手动清理,流程结束
|
|
200
345
|
```
|
|
201
346
|
|
|
202
347
|
根据用户选择:
|
|
203
|
-
-
|
|
204
|
-
-
|
|
348
|
+
- **选择 1(已完成清理,申请结单)**→ 执行「申请结单」→ 清理临时文件 → **流程结束**
|
|
349
|
+
- **选择 2(已完成清理,稍后手动申请结单)**→ 清理临时文件 → **流程结束**
|
|
350
|
+
- **选择 3(未清理,稍后手动清理)**→ 清理临时文件 → **流程结束**
|
|
205
351
|
|
|
206
352
|
## 单元测试
|
|
207
353
|
|
|
208
|
-
进入单元测试阶段(流程见 SKILL.md
|
|
354
|
+
进入单元测试阶段(流程见 SKILL.md「单元测试」章节)。
|
|
355
|
+
**【强制执行】在单元测试步骤结束后,提示用户需要提交并合入代码,进入步骤五:提交代码并合入。**
|
|
209
356
|
|
|
210
357
|
## 复测扫描
|
|
211
358
|
|
|
@@ -219,27 +366,17 @@ python3 -c "import webbrowser; webbrowser.open('https://commit-clean.baidu-int.c
|
|
|
219
366
|
|
|
220
367
|
如果复测仍存在未修复的硬编码漏洞,展示剩余漏洞列表(格式同漏洞报告),并提示用户可以选择继续修复或忽略。
|
|
221
368
|
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
```
|
|
225
|
-
是否申请结单?
|
|
226
|
-
1. 是,立即申请结单
|
|
227
|
-
2. 否,稍后手动处理
|
|
228
|
-
```
|
|
229
|
-
|
|
230
|
-
根据用户选择:
|
|
231
|
-
- **选择「是,立即申请结单」**→ 执行「申请结单」→ 清理临时文件 → **流程结束**
|
|
232
|
-
- **选择「否,稍后手动处理」**→ 进入清理临时文件
|
|
369
|
+
**【强制执行】复测扫描结束后,提示用户需要提交并合入代码,进入步骤五:提交代码并合入**
|
|
233
370
|
|
|
234
371
|
## 清理临时文件
|
|
235
372
|
|
|
236
|
-
所有流程结束后,清理临时文件:`python3 -c "import shutil; shutil.rmtree('<临时目录绝对路径>')"` 删除该项目的临时目录(即
|
|
373
|
+
所有流程结束后,清理临时文件:`python3 -c "import shutil; shutil.rmtree('<临时目录绝对路径>')"` 删除该项目的临时目录(即 `<_TMP_DIR>/.code-security/<项目名>_<哈希>/` 整个目录)。
|
|
237
374
|
|
|
238
375
|
## 申请结单
|
|
239
376
|
|
|
240
377
|
用户选择「是,立即申请结单」时:
|
|
241
378
|
|
|
242
|
-
1.
|
|
379
|
+
1. 输出以下内容到聊天框:
|
|
243
380
|
|
|
244
381
|
```
|
|
245
382
|
请点击以下链接,在工单系统中申请结单:
|
|
@@ -247,18 +384,47 @@ python3 -c "import webbrowser; webbrowser.open('https://commit-clean.baidu-int.c
|
|
|
247
384
|
[申请结单](https://security.baidu.com/ticket/pending/list)
|
|
248
385
|
```
|
|
249
386
|
|
|
250
|
-
2.
|
|
251
|
-
|
|
252
|
-
```bash
|
|
253
|
-
python3 -c "import webbrowser; webbrowser.open('https://security.baidu.com/ticket/pending/list')"
|
|
254
|
-
```
|
|
387
|
+
2. 按规则 C 处理浏览器打开(URL 为 `https://security.baidu.com/ticket/pending/list`)。Dodo 环境下按规则 B 发送上述链接消息。
|
|
255
388
|
|
|
256
389
|
3. 输出提示:
|
|
257
390
|
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
391
|
+
已为您打开申请结单页面,请在工单列表中找到对应工单并申请结单。
|
|
392
|
+
|
|
393
|
+
本轮治理流程到此结束。总结本轮治理操作的变更并输出,提醒用户注意以下事项:
|
|
394
|
+
|
|
395
|
+
注意事项:
|
|
396
|
+
1. 合入代码后需要重新打包、部署才能生效。
|
|
397
|
+
(1)如果托管环境是cnap时,需要提醒用户:如果cnap应用是原地升级应用时,部署时pod重建策略需选择【任何情况都重建】;否则不用提醒。
|
|
398
|
+
2. 建议在测试环境先部署测试验证,然后在线上环境灰度发布。
|
|
399
|
+
|
|
400
|
+
|
|
401
|
+
## 技能插件使用总结(Skill Plugin Reference)
|
|
402
|
+
|
|
403
|
+
硬编码风险治理流程中,各步骤所依赖的技能插件如下:
|
|
404
|
+
|
|
405
|
+
### 主流程使用的插件
|
|
406
|
+
|
|
407
|
+
| 流程步骤 | 使用的技能插件 | 用途说明 |
|
|
408
|
+
|----------|--------------|---------|
|
|
409
|
+
| 步骤二:代码库获取(Dodo 环境) | `knowledge-fetch` | 从 iCode 拉取代码仓库到本地,供后续扫描使用 |
|
|
410
|
+
| 步骤三:代码提交(Dodo 环境子步骤 3.1) | `icafe-assistant` (`icafe`) | 在用户最近操作的 iCafe 空间中创建「修复硬编码账密风险」Task 卡片 |
|
|
411
|
+
| 步骤三:代码提交(Dodo 环境子步骤 3.2) | `icode-git-commit` (`icode`) | 将本次硬编码修复的代码变更提交到 iCode 当前分支 |
|
|
412
|
+
| 步骤六:进度通知 | `infoflow-notify` | 在 Dodo 环境各关键节点通过如流聊天框发送进度消息 |
|
|
413
|
+
|
|
414
|
+
### 脚本插件(Python 脚本,位于 `scripts/` 目录)
|
|
415
|
+
|
|
416
|
+
| 脚本文件 | 功能说明 |
|
|
417
|
+
| ---------------------------| ------------------------------------------------------------------------------------------------------|
|
|
418
|
+
| `credential_url.py` | 构建硬编码风险治理网页 URL(各环境共用的公共模块) |
|
|
419
|
+
| `credential_open_page.py` | Comate / DUCC 环境:自动构建 URL 并在 IDE 内嵌浏览器中打开配置网页 |
|
|
420
|
+
| `credential_print_url.py` | Dodo 环境:构建 URL 并输出到 stdout,供聊天框展示可点击链接 |
|
|
421
|
+
| `credential_poll.py` | 通过 WebSocket 轮询等待用户在网页完成凭证配置并点击「修复代码」,将配置数据保存到 `poll_result.json` |
|
|
422
|
+
| `credential_hosting.py` | 将用户配置的凭证托管到目标平台(从 `poll_result.json` 读取 chatUUID、deployment、credentials) |
|
|
423
|
+
|
|
424
|
+
### 外部平台链接
|
|
261
425
|
|
|
262
|
-
|
|
426
|
+
| 平台 | 链接模板 | 触发场景 |
|
|
427
|
+
|------|---------|---------|
|
|
428
|
+
| 历史 Commit 清理平台 | `https://commit-clean.baidu-int.com/task?repo=<REPO>` | 步骤六:用户确认代码已合入后,引导清理历史 git commit 中残留的硬编码凭证 |
|
|
429
|
+
| 安全工单申请结单 | `https://security.baidu.com/ticket/pending/list` | 申请结单:用户完成历史记录清理后,跳转工单系统申请结单 |
|
|
263
430
|
|
|
264
|
-
用户选择「否,稍后手动处理」时,跳过此步骤,继续后续流程。
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
# 代码框架识别指南
|
|
2
|
+
|
|
3
|
+
在修复配置文件中的硬编码敏感信息前,需先识别代码库使用的语言和框架,以选择正确的修复策略。
|
|
4
|
+
|
|
5
|
+
## Go GDP 框架识别
|
|
6
|
+
|
|
7
|
+
GDP(Go Development Platform)是百度内部Go开发框架,使用其配置模块时有特定的密钥托管方式(SSM)。
|
|
8
|
+
|
|
9
|
+
### 识别维度
|
|
10
|
+
|
|
11
|
+
#### 1. go.mod 依赖检查
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
grep "icode.baidu.com/baidu/gdp" go.mod
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
GDP相关依赖:
|
|
18
|
+
- `icode.baidu.com/baidu/gdp/conf` - 配置模块
|
|
19
|
+
- `icode.baidu.com/baidu/gdp/env` - 环境变量模块
|
|
20
|
+
|
|
21
|
+
#### 2. import 语句检查
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
grep -r "icode.baidu.com/baidu/gdp/conf" --include="*.go" .
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
#### 3. conf.Parse 调用检查
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
grep -r "conf.Parse" --include="*.go" .
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
典型用法:
|
|
34
|
+
```go
|
|
35
|
+
if err := conf.Parse("app.toml", &config); err != nil {
|
|
36
|
+
return err
|
|
37
|
+
}
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
#### 4. 配置文件GDP特征语法
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
grep -r "{env\.\|{gdp\.\|{ssm\.\|<\$" conf/ --include="*.toml"
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
GDP特征语法示例:
|
|
47
|
+
```toml
|
|
48
|
+
Listen = "0.0.0.0:{env.LISTEN_PORT|8080}"
|
|
49
|
+
FileName = "{gdp.LogDir}/service.log"
|
|
50
|
+
Password = "{ssm.db_password}"
|
|
51
|
+
idc = "<$idc$>"
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
#### 5. 配置目录结构
|
|
55
|
+
|
|
56
|
+
```bash
|
|
57
|
+
ls -la conf/ conf_online/ 2>/dev/null
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
GDP典型目录:`conf/app.toml`、`conf/server.toml`、`conf/logit/`、`conf/servicer/`
|
|
61
|
+
|
|
62
|
+
### 判断结论
|
|
63
|
+
|
|
64
|
+
| 条件 | 判断结果 |
|
|
65
|
+
|------|----------|
|
|
66
|
+
| go.mod有GDP依赖 + 有import + 有conf.Parse | 确定使用GDP配置 |
|
|
67
|
+
| 只有go.mod依赖 | 引入了但可能未使用 |
|
|
68
|
+
| 配置文件有 `{env.}` / `{ssm.}` 语法 | 高概率使用GDP |
|
|
69
|
+
| 都不满足 | 未使用GDP配置模块 |
|
|
70
|
+
|
|
71
|
+
## 通用框架识别策略
|
|
72
|
+
|
|
73
|
+
| 语言 | 识别方式 | 常见框架 |
|
|
74
|
+
|------|----------|----------|
|
|
75
|
+
| Java | pom.xml / build.gradle 依赖 | Spring Boot, GDP-Java |
|
|
76
|
+
| Go | go.mod 依赖 | GDP, Gin, Kratos |
|
|
77
|
+
| Python | requirements.txt / pyproject.toml | Django, Flask |
|
|
78
|
+
| JavaScript | package.json 依赖 | Express, Next.js |
|
|
79
|
+
|
|
80
|
+
### 快速识别命令
|
|
81
|
+
|
|
82
|
+
```bash
|
|
83
|
+
# 识别语言
|
|
84
|
+
ls go.mod pom.xml build.gradle package.json requirements.txt pyproject.toml Cargo.toml 2>/dev/null
|
|
85
|
+
|
|
86
|
+
# Go GDP检测
|
|
87
|
+
grep -c "icode.baidu.com/baidu/gdp" go.mod 2>/dev/null
|
|
88
|
+
|
|
89
|
+
# Java Spring检测
|
|
90
|
+
grep -c "spring-boot" pom.xml 2>/dev/null || grep -c "spring-boot" build.gradle 2>/dev/null
|
|
91
|
+
```
|