@comate/zulu 1.3.5 → 1.3.6
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/server.js +21 -21
- package/dist/bundle/index.js +2 -2
- package/package.json +1 -1
- package/comate-engine/assets/skills/auto-commit/SKILL.md +0 -436
- package/comate-engine/assets/skills/auto-commit/references/issue_type_mapping.json +0 -19
- package/comate-engine/assets/skills/auto-commit/references/new_version_instruction.md +0 -196
- package/comate-engine/assets/skills/auto-commit/references/old_version_instruction.md +0 -189
- package/comate-engine/assets/skills/auto-commit/references/query_reference.md +0 -176
- package/comate-engine/assets/skills/auto-commit/scripts/compat.py +0 -86
- package/comate-engine/assets/skills/auto-commit/scripts/create_card_cli.py +0 -67
- package/comate-engine/assets/skills/auto-commit/scripts/git_diff_cli.py +0 -196
- package/comate-engine/assets/skills/auto-commit/scripts/git_utils.py +0 -230
- package/comate-engine/assets/skills/auto-commit/scripts/icafe/__init__.py +0 -66
- package/comate-engine/assets/skills/auto-commit/scripts/icafe/client.py +0 -473
- package/comate-engine/assets/skills/auto-commit/scripts/icafe/farseer.py +0 -52
- package/comate-engine/assets/skills/auto-commit/scripts/icafe/matching.py +0 -781
- package/comate-engine/assets/skills/auto-commit/scripts/logger.py +0 -32
- package/comate-engine/assets/skills/auto-commit/scripts/match_card_cli.py +0 -37
- package/comate-engine/assets/skills/auto-commit/scripts/recognize_card_cli.py +0 -63
- package/comate-engine/assets/skills/auto-commit-comate/references/new_version_instruction.md +0 -209
- package/comate-engine/assets/skills/auto-commit-comate/references/old_version_instruction.md +0 -208
- package/comate-engine/assets/skills/auto-commit-comate/scripts/compat.py +0 -86
- package/comate-engine/assets/skills/build-web-page-comate/SKILL.md +0 -160
- package/comate-engine/assets/skills/build-web-page-comate/setup-html-scaffold.md +0 -49
- package/comate-engine/assets/skills/build-web-page-comate/setup-react-scaffold.md +0 -103
- package/comate-engine/assets/skills/build-web-page-comate/work-with-user-intent.md +0 -112
- package/comate-engine/assets/skills/code-security/SKILL.md +0 -176
- package/comate-engine/assets/skills/code-security/references/credential_hosting.md +0 -102
- package/comate-engine/assets/skills/code-security/references/vul_repair_sensitive.md +0 -219
- package/comate-engine/assets/skills/code-security/scripts/build_repair_info.py +0 -0
- package/comate-engine/assets/skills/code-security/scripts/credential_hosting.py +0 -99
- package/comate-engine/assets/skills/code-security/scripts/credential_poll.py +0 -350
- package/comate-engine/assets/skills/code-security/scripts/http_client.py +0 -173
- package/comate-engine/assets/skills/code-security/scripts/parse_scan_result.py +0 -301
- package/comate-engine/assets/skills/code-security/scripts/repair_vulnerability.py +0 -261
- package/comate-engine/assets/skills/code-security/scripts/report_chat.py +0 -198
- package/comate-engine/assets/skills/code-security/scripts/scan_vulnerability.py +0 -316
- package/comate-engine/assets/skills/comate-docs-comate/references/query_content.md +0 -83
- package/comate-engine/assets/skills/comate-docs-comate/references/query_repo.md +0 -57
- package/comate-engine/assets/skills/comate-docs-comate/scripts/ku_operator.py +0 -1575
- package/comate-engine/assets/skills/create-skill-comate/references/output-patterns.md +0 -82
- package/comate-engine/assets/skills/create-skill-comate/references/workflows.md +0 -28
- package/comate-engine/assets/skills/create-skill-comate/scripts/init_skill.py +0 -308
- package/comate-engine/node_modules/@comate/plugin-host/dist/index-B8VdZIx4.js +0 -1
- package/comate-engine/node_modules/@comate/plugin-host/dist/index-QEN4ay0E.js +0 -1
- package/comate-engine/node_modules/@comate/plugin-host/dist/user-DAIE9qbz.js +0 -44
- package/comate-engine/node_modules/@comate/plugin-host/dist/user-vP8ulngb.js +0 -44
|
@@ -1,102 +0,0 @@
|
|
|
1
|
-
# 硬编码漏洞修复与凭证托管
|
|
2
|
-
|
|
3
|
-
硬编码修复有四个步骤:凭证配置 → 代码修复 → 用户确认 → 凭证托管。
|
|
4
|
-
|
|
5
|
-
## 步骤一:打开凭证配置网页
|
|
6
|
-
|
|
7
|
-
输出可点击的链接让用户打开凭证托管助手网页,网页 URL 格式及输出示例如下:
|
|
8
|
-
```
|
|
9
|
-
请点击以下链接打开凭证托管助手,配置凭证信息:
|
|
10
|
-
|
|
11
|
-
[打开凭证托管助手](//command:simpleBrowser.api.open?https%3A%2F%2Fcomate-sec-test.baidu-int.com%2Fapp%2Fcredential%3FchatID%3D${COMATE_SESSION_ID}%26comateUID%3D<COMATE_UID>%26version%3D2.9.1%26repo%3D<REPO>%26ideType%3D${COMATE_IDE_NAME})
|
|
12
|
-
|
|
13
|
-
配置完成后请在网页中点击「生成代码」按钮,我会自动检测到配置完成并继续执行修复。
|
|
14
|
-
```
|
|
15
|
-
|
|
16
|
-
其中:
|
|
17
|
-
- `COMATE_UID` 为 `${COMATE_USERNAME}` 的 MD5 字符串的前 12 位,使用 `python3 -c "import hashlib; print(hashlib.md5('${COMATE_USERNAME}'.encode()).hexdigest()[:12])"` 计算
|
|
18
|
-
- `REPO` 是代码库标识,可以从项目目录的 git remote 获取(如 `baidu/scan/cnap-test`),如果没有 git 信息则使用项目目录名
|
|
19
|
-
|
|
20
|
-
要使用实际构造的字符串来替换上述的 url 参数,url 中的%26不要解码,避免 & 符号影响 markdown 链接。
|
|
21
|
-
|
|
22
|
-
## 步骤二:等待凭证配置完成
|
|
23
|
-
|
|
24
|
-
打开网页后,立即执行轮询脚本等待用户配置,使用 `--output` 将结果保存到临时目录:
|
|
25
|
-
|
|
26
|
-
```bash
|
|
27
|
-
python3 scripts/credential_poll.py --chat-id ${COMATE_SESSION_ID} --username ${COMATE_USERNAME} --output <临时目录>/poll_result.json
|
|
28
|
-
```
|
|
29
|
-
|
|
30
|
-
`<临时目录>` 使用与 `scan_result.json` 同一目录(即 `.tmp/<项目名>_<哈希>/`)。
|
|
31
|
-
|
|
32
|
-
该脚本通过 WebSocket 连接服务端,等待用户在网页完成配置并点击「生成代码」。收到数据后输出到标准输出并保存到 `--output` 指定的文件。配置数据包含以下关键字段:
|
|
33
|
-
|
|
34
|
-
- `data.files`:待修复文件列表(含 vulList 和 extra.secret 信息)
|
|
35
|
-
- `data.credentials`:凭证名值对列表
|
|
36
|
-
- `data.deployment`:托管平台信息(platform、platformName)
|
|
37
|
-
- `data.repo`:代码库语言和框架信息
|
|
38
|
-
- `data.succMsg`:托管成功提示信息
|
|
39
|
-
- `data.errorMsg`:托管失败提示信息
|
|
40
|
-
- `chatUUID`:此次会话 ID
|
|
41
|
-
|
|
42
|
-
## 步骤三:修复硬编码代码
|
|
43
|
-
|
|
44
|
-
收到凭证配置数据后,在本地直接修复硬编码漏洞,不调用后端修复服务。修复流程参考 `references/vul_repair_sensitive.md` 文档中的详细说明。
|
|
45
|
-
|
|
46
|
-
修复输入数据来自 `poll_result.json` 文件(由步骤二保存),其中 `data.files`、`data.repo`、`data.deployment` 包含了修复所需的全部信息。
|
|
47
|
-
|
|
48
|
-
修复流程:
|
|
49
|
-
1. 读取 `references/vul_repair_sensitive.md` 中的修复规则
|
|
50
|
-
2. 遍历 `data.files` 中的每个文件,根据文件类型(代码文件/配置文件)、语言(`data.repo.language`)、框架(`data.repo.framework`)和平台(`data.deployment.platform`)确定修复策略
|
|
51
|
-
3. 根据每个漏洞的 `extra.secret.credentialName`、`extra.secret.start`、`extra.secret.end` 定位敏感信息并替换为环境变量读取方式
|
|
52
|
-
4. 如果 `data.deployment.platform` 为 4,还需引入 keyless-sdk(参考 `references/vul_repair_sensitive.md` 的「引入SDK」章节)
|
|
53
|
-
|
|
54
|
-
## 步骤四:凭证托管
|
|
55
|
-
|
|
56
|
-
代码修复完成后,提示用户确认修复结果,然后提供托管选项:
|
|
57
|
-
|
|
58
|
-
```
|
|
59
|
-
代码修复已完成,请 Review 修复后的代码。确认无误后,选择「托管凭证」将凭证托管到平台。
|
|
60
|
-
1. 托管凭证 - 将凭证托管到 {platformName} 平台
|
|
61
|
-
2. 跳过托管 - 仅完成代码修复,不托管凭证
|
|
62
|
-
```
|
|
63
|
-
|
|
64
|
-
用户选择托管后执行:
|
|
65
|
-
|
|
66
|
-
```bash
|
|
67
|
-
python3 scripts/credential_hosting.py --poll-result <poll_result.json路径> --username ${COMATE_USERNAME}
|
|
68
|
-
```
|
|
69
|
-
|
|
70
|
-
脚本自动从 `poll_result.json` 中提取 `chatUUID`、`deployment.platformName`、`data.credentials`,无需手动传递这些参数。
|
|
71
|
-
|
|
72
|
-
托管完成后,从 `poll_result.json` 中读取 `data.succMsg` 展示给用户。如果失败,展示 `data.errorMsg`。
|
|
73
|
-
|
|
74
|
-
托管成功后,通过 Questions 组件提示用户进行历史 commit 清理。`succMsg` 中包含清理平台地址,需要从中提取链接并突出展示。提示格式:
|
|
75
|
-
|
|
76
|
-
```
|
|
77
|
-
凭证托管已完成。由于历史 commit 中可能仍残留硬编码凭证,建议立即清理 Git 历史记录,防止凭证泄露。
|
|
78
|
-
|
|
79
|
-
{succMsg}
|
|
80
|
-
|
|
81
|
-
请确认:
|
|
82
|
-
1. 已完成清理 - 我已清理历史 commit,继续后续流程
|
|
83
|
-
2. 稍后处理 - 跳过清理,继续后续流程
|
|
84
|
-
```
|
|
85
|
-
|
|
86
|
-
用户选择后继续执行复测扫描。
|
|
87
|
-
|
|
88
|
-
## 复测扫描
|
|
89
|
-
|
|
90
|
-
托管成功后,自动执行一次复测扫描(流程与「漏洞扫描」章节一致),对比修复前后的硬编码漏洞数量,向用户说明修复效果。复测结果同样需要静默执行数据上报。展示格式:
|
|
91
|
-
|
|
92
|
-
```
|
|
93
|
-
托管完成,正在执行复测扫描验证修复效果...
|
|
94
|
-
|
|
95
|
-
**复测结果**:修复前共 N 个硬编码漏洞,修复后剩余 M 个,本次修复 X 个漏洞。
|
|
96
|
-
```
|
|
97
|
-
|
|
98
|
-
如果复测仍存在未修复的硬编码漏洞,展示剩余漏洞列表(格式同漏洞报告),并提示用户可以选择继续修复或忽略。
|
|
99
|
-
|
|
100
|
-
## 清理临时文件
|
|
101
|
-
|
|
102
|
-
复测完成后,清理临时文件:`python3 -c "import shutil; shutil.rmtree('<临时目录绝对路径>')"` 删除该项目的临时目录(即 `.tmp/<项目名>_<哈希>/` 整个目录)。然后进入单元测试阶段(流程见「单元测试」章节)。
|
|
@@ -1,219 +0,0 @@
|
|
|
1
|
-
# 敏感信息硬编码漏洞修复流程
|
|
2
|
-
|
|
3
|
-
修复漏洞分为以下三个步骤:
|
|
4
|
-
1. 读取漏洞报告
|
|
5
|
-
2. 修复硬编码漏洞
|
|
6
|
-
3. 引入SDK(如果需要)
|
|
7
|
-
|
|
8
|
-
## 读取漏洞报告
|
|
9
|
-
|
|
10
|
-
基于凭证配置网页回传的数据获取漏洞报告,示例如下:
|
|
11
|
-
```json
|
|
12
|
-
{
|
|
13
|
-
"scanChatID": "从 credential_poll 返回的 chatUUID",
|
|
14
|
-
"repo": {
|
|
15
|
-
"language": "java",
|
|
16
|
-
"framework": "springboot"
|
|
17
|
-
},
|
|
18
|
-
"deployment": {
|
|
19
|
-
"platform": 2,
|
|
20
|
-
"platformName": "ipipe"
|
|
21
|
-
},
|
|
22
|
-
"files": [
|
|
23
|
-
{
|
|
24
|
-
"name": "src/main/resources/application.properties",
|
|
25
|
-
"hash": "文件SHA256",
|
|
26
|
-
"vulList": [
|
|
27
|
-
{
|
|
28
|
-
"ruleID": "codescan_generic_password-config_sensitive",
|
|
29
|
-
"line": 35,
|
|
30
|
-
"hash": "漏洞hash",
|
|
31
|
-
"extra": {
|
|
32
|
-
"secret": {
|
|
33
|
-
"credentialName": "KL_SPRING_DATASOURCE_PASSWORD",
|
|
34
|
-
"start": {"col": 28, "line": 35},
|
|
35
|
-
"end": {"col": 43, "line": 35}
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
]
|
|
40
|
-
}
|
|
41
|
-
],
|
|
42
|
-
"trigger": 1,
|
|
43
|
-
"type": 4
|
|
44
|
-
}
|
|
45
|
-
```
|
|
46
|
-
各字段说明如下:
|
|
47
|
-
* repo:代码库信息
|
|
48
|
-
* language:代码语言
|
|
49
|
-
* framework:代码框架
|
|
50
|
-
* deployment:部署信息
|
|
51
|
-
* platform:部署平台,1 表示 cnap,2 表示 ipipe,3 表示 opera,4 表示 datamanage
|
|
52
|
-
* platformName:部署平台名称(如 ipipe、cnap、opera、datamanage)
|
|
53
|
-
* credential_id:凭证 ID(platform 为 4 时使用,用于引入 keyless-sdk)
|
|
54
|
-
* files:文件信息
|
|
55
|
-
* name:漏洞文件的相对路径
|
|
56
|
-
* vulList:漏洞列表
|
|
57
|
-
* extra.secret.start:敏感信息的开始位置(行、列)
|
|
58
|
-
* extra.secret.end:敏感信息的结束位置(行、列)
|
|
59
|
-
* extra.secret.credentialName:建议使用的环境变量名称
|
|
60
|
-
|
|
61
|
-
## 修复漏洞
|
|
62
|
-
硬编码漏洞修复的本质就是改变原来在代码中的硬编码敏感信息写法,改为从环境变量中读取敏感信息。修复时遍历漏洞报告中的所有文件和漏洞,逐个修复,按以下流程进行处理。
|
|
63
|
-
|
|
64
|
-
### 代码文件
|
|
65
|
-
如果漏洞文件是代码文件,比如 java、go、php、py 等,则根据各语言的写法生成读取环境变量的代码,并替换掉原来的硬编码敏感信息,注意有以下几点要求:
|
|
66
|
-
1. 与环境变量读取无关的其他代码和字符不要做任何改动
|
|
67
|
-
2. 如果漏洞行是被引号包裹的纯字符串,输出时保留其结构不变,仍然可以直接执行字符串操作,但要避免空字符串的拼接
|
|
68
|
-
3. 不要给出环境变量默认值
|
|
69
|
-
4. 如果代码开头存在空格、tab等缩进,保留原始代码的缩进,不要清除两端的空白字符
|
|
70
|
-
5. 如果是 python 语言,使用 os.environ 的方式获取环境变量,而不是 os.getenv
|
|
71
|
-
6. 如果是 go 语言,不能在 const 中读取环境变量,在 const 下方重新定义读取代码,并删除 const 的硬编码的值
|
|
72
|
-
7. 如果是 java 语言,且 platform 为 4 时,则采用 System.getProperty 的语法读取变量
|
|
73
|
-
8. 如果原文件中缺失读取环境变量所需的第三方库,则自动引入,比如 python 的 os 库,go 的 os 库等
|
|
74
|
-
|
|
75
|
-
### 配置文件
|
|
76
|
-
如果漏洞文件是配置文件,比如 yml、properties、ini 等,则结合语言和框架共同决定如何修改代码,修改原则如下:
|
|
77
|
-
1. 如果语言为 go,框架为 gdp,toml 后缀的文件直接使用特定的占位符替换敏感信息,占位符的环境变量名称根据 credential_name 命名,示例如下:
|
|
78
|
-
```toml
|
|
79
|
-
// 修复前
|
|
80
|
-
password=123123123
|
|
81
|
-
// 修复后
|
|
82
|
-
password=${env.KL_PASSWORD}
|
|
83
|
-
```
|
|
84
|
-
2. 除第一种情况之外,其他语言、框架、配置文件类型,使用常规的环境变量占位符替换敏感信息,占位符的环境变量名称根据 credential_name 命名。
|
|
85
|
-
```toml
|
|
86
|
-
// 修复前
|
|
87
|
-
password=123123123
|
|
88
|
-
// 修复后
|
|
89
|
-
password=${KL_PASSWORD}
|
|
90
|
-
```
|
|
91
|
-
|
|
92
|
-
漏洞报告可能涉及多个文件,修复时按文件进行聚合,优先将一个文件中的漏洞全部修复完成再修复其他漏洞。
|
|
93
|
-
|
|
94
|
-
## 引入SDK
|
|
95
|
-
从第一个漏洞报告读取数据,如果 platform 为 4 时需要引入 keyless-sdk 并添加初始化代码。通过该 sdk 将凭证注入到环境变量中,然后其他位置的代码才能读取到环境变量。注意,只有平台为 4 时才需要引入 sdk,其他平台不需要。不同语言 sdk 及初始化代码添加方式如下。
|
|
96
|
-
|
|
97
|
-
#### java 语言
|
|
98
|
-
pom.xml 文件中添加 keyless-sdk 依赖,其中的注释需要保留。
|
|
99
|
-
```xml
|
|
100
|
-
<!-- keyless-sdk dependency -->
|
|
101
|
-
<dependency>
|
|
102
|
-
<groupId>com.baidu.xbu-data</groupId>
|
|
103
|
-
<artifactId>keyless-sdk</artifactId>
|
|
104
|
-
<version>1.0.2</version>
|
|
105
|
-
</dependency>
|
|
106
|
-
```
|
|
107
|
-
项目启动的函数中添加以下初始化代码,注意其中的 credentialID 需要与漏洞报告中的 credential_id 保持一致。
|
|
108
|
-
```java
|
|
109
|
-
import com.baidu.keyless.KeylessClient;
|
|
110
|
-
|
|
111
|
-
public class KeylessAppCredentialDemo {
|
|
112
|
-
public static void main(String[] args) {
|
|
113
|
-
// 初始化 keyless-sdk 开始
|
|
114
|
-
// step1: 设置 credentialID 构建 client,详情可参考 https://ku.baidu-int.com/d/BRnvQROwD8akQY
|
|
115
|
-
String credentialID = "appDemo_prod";
|
|
116
|
-
KeylessClient keylessClient = KeylessClient.builder()
|
|
117
|
-
.credentialId(credentialID)
|
|
118
|
-
.build();
|
|
119
|
-
// step2: 获取凭证信息并注入到系统环境变量中
|
|
120
|
-
try {
|
|
121
|
-
keylessClient.load();
|
|
122
|
-
} catch (Exception e) {
|
|
123
|
-
System.out.println("load keyless client error: " + e.getMessage());
|
|
124
|
-
}
|
|
125
|
-
// 初始化 keyless-sdk 结束
|
|
126
|
-
// 以下为其他原始代码
|
|
127
|
-
... ...
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
```
|
|
131
|
-
|
|
132
|
-
#### go 语言
|
|
133
|
-
go.mod 文件中添加 keyless-sdk 依赖,其中的注释需要保留。
|
|
134
|
-
```mod
|
|
135
|
-
require (
|
|
136
|
-
icode.baidu.com/baidu/xbu-data/things-go keyless-sdk-2.2.0 // keyless-sdk dependency
|
|
137
|
-
)
|
|
138
|
-
```
|
|
139
|
-
项目启动的函数中添加以下初始化代码,注意其中的 CredentialID 需要与漏洞报告中的 credential_id 保持一致。
|
|
140
|
-
```go
|
|
141
|
-
package main
|
|
142
|
-
|
|
143
|
-
import (
|
|
144
|
-
"icode.baidu.com/baidu/xbu-data/things-go/pkg/keyless"
|
|
145
|
-
)
|
|
146
|
-
|
|
147
|
-
func main() {
|
|
148
|
-
// 初始化 keyless-sdk 开始
|
|
149
|
-
// step1: 设置 CredentialID 构建 client,详情可参考 https://ku.baidu-int.com/d/G_QqzMQrQR9_K_
|
|
150
|
-
req := &keyless.GetCredentialReq{
|
|
151
|
-
CredentialID: "appDemo_prod", // 凭证标识
|
|
152
|
-
}
|
|
153
|
-
// step2: 获取凭证信息并注入到系统环境变量中
|
|
154
|
-
client := keyless.NewClient(req)
|
|
155
|
-
err := client.Load()
|
|
156
|
-
if err != nil {
|
|
157
|
-
fmt.Println(err.Error())
|
|
158
|
-
return
|
|
159
|
-
}
|
|
160
|
-
// 初始化 keyless-sdk 结束
|
|
161
|
-
// 以下为其他原始代码
|
|
162
|
-
... ...
|
|
163
|
-
}
|
|
164
|
-
```
|
|
165
|
-
|
|
166
|
-
#### python 语言
|
|
167
|
-
requirements.txt 文件中添加 keyless-sdk 依赖,其中的注释需要保留。
|
|
168
|
-
```txt
|
|
169
|
-
// keyless-sdk dependency
|
|
170
|
-
credential-vault-sdk>=0.1.12(Python3 版本添加此依赖)
|
|
171
|
-
credential-vault-sdk-py2>=0.1.9(Python2 版本添加此依赖)
|
|
172
|
-
```
|
|
173
|
-
初始化代码如下,注意
|
|
174
|
-
* 其中的 credential_id 需要与漏洞报告中的 credential_id 保持一致;
|
|
175
|
-
* 如果是完整的服务或项目,初始化代码要添加在项目启动的函数中;
|
|
176
|
-
* 如果是独立的 Python 脚本文件,每个独立的文件都要添加 keyless-sdk 依赖和初始化代码。
|
|
177
|
-
```python
|
|
178
|
-
from credential_vault_sdk.keyless_client import KeylessClient
|
|
179
|
-
|
|
180
|
-
def main():
|
|
181
|
-
# 初始化 keyless-sdk 开始
|
|
182
|
-
# step1: 设置 credential_id 构建 client,详情可参考 https://ku.baidu-int.com/d/HWaSIaQSThk88b
|
|
183
|
-
client = KeylessClient(credential_id="appDemo_prod")
|
|
184
|
-
# step2: 获取凭证信息并注入到系统环境变量中
|
|
185
|
-
client.load()
|
|
186
|
-
# 初始化 keyless-sdk 结束
|
|
187
|
-
# 以下为其他原始代码
|
|
188
|
-
... ...
|
|
189
|
-
```
|
|
190
|
-
|
|
191
|
-
#### C++ 语言
|
|
192
|
-
在文件开始引入头文件和命名空间,其中的注释需要保留:
|
|
193
|
-
```C++
|
|
194
|
-
// keyless-sdk dependency
|
|
195
|
-
#include "keyless/keyless_client.h"
|
|
196
|
-
|
|
197
|
-
using namespace baidu::credentialvault::cppsdk;
|
|
198
|
-
```
|
|
199
|
-
|
|
200
|
-
项目启动的函数中添加以下初始化代码,注意其中的 credentialID 需要与漏洞报告中的 credential_id 保持一致。
|
|
201
|
-
```C++
|
|
202
|
-
#include "keyless/keyless_client.h"
|
|
203
|
-
|
|
204
|
-
using namespace baidu::credentialvault::cppsdk;
|
|
205
|
-
|
|
206
|
-
int main(int argc, char *argv[]) {
|
|
207
|
-
// 初始化 keyless-sdk 开始
|
|
208
|
-
// step1: 设置 credential_id 构建 client,详情可参考 https://ku.baidu-int.com/d/x5s_A3YHll0PvR
|
|
209
|
-
KeylessClient client = KeylessClient("appDemo_prod");
|
|
210
|
-
// step2: 获取凭证信息并注入到系统环境变量中
|
|
211
|
-
KeylessStatus load_result = client.load();
|
|
212
|
-
if (!load_result.ok()) {
|
|
213
|
-
return 0;
|
|
214
|
-
}
|
|
215
|
-
// 初始化 keyless-sdk 结束
|
|
216
|
-
// 以下为其他原始代码
|
|
217
|
-
... ...
|
|
218
|
-
}
|
|
219
|
-
```
|
|
File without changes
|
|
@@ -1,99 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env python3
|
|
2
|
-
"""
|
|
3
|
-
凭证托管工具 - 将凭证托管到第三方平台(iPipe/CNAP/datamanage)。
|
|
4
|
-
|
|
5
|
-
用法:
|
|
6
|
-
python3 credential_hosting.py --poll-result <poll_result.json路径> --username <用户名>
|
|
7
|
-
|
|
8
|
-
也可手动指定各参数(不推荐,仅向后兼容):
|
|
9
|
-
python3 credential_hosting.py --chat-id <chatID> --platform <platformName> --username <用户名> --credentials '<JSON>'
|
|
10
|
-
|
|
11
|
-
使用 --poll-result 时,自动从 credential_poll.py 的输出文件中提取 chatUUID、deployment.platformName、data.credentials。
|
|
12
|
-
"""
|
|
13
|
-
|
|
14
|
-
import argparse
|
|
15
|
-
import hashlib
|
|
16
|
-
import json
|
|
17
|
-
import logging
|
|
18
|
-
import sys
|
|
19
|
-
import uuid
|
|
20
|
-
|
|
21
|
-
import http_client # noqa: F401 (triggers shared logging config)
|
|
22
|
-
|
|
23
|
-
HOST = "https://comate-sec.baidu-int.com"
|
|
24
|
-
USER_ID = ""
|
|
25
|
-
USERNAME = ""
|
|
26
|
-
|
|
27
|
-
logger = logging.getLogger("credential_hosting")
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
def build_headers(chat_id):
|
|
31
|
-
return {
|
|
32
|
-
"Comate-User-Id": USER_ID,
|
|
33
|
-
"Comate-Username": USERNAME,
|
|
34
|
-
"SAST-Chat-ID": chat_id,
|
|
35
|
-
"SAST-Request-ID": str(uuid.uuid4()),
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
def hosting_credentials(chat_id, platform, credentials):
|
|
40
|
-
"""将凭证托管到指定平台。"""
|
|
41
|
-
url = "{}/api/v1/deployments/{}/credentials".format(HOST, platform)
|
|
42
|
-
payload = {
|
|
43
|
-
"configs": credentials,
|
|
44
|
-
"scanChatID": chat_id,
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
logger.info("credential_hosting: chat_id=%s, platform=%s, credentials_count=%d",
|
|
48
|
-
chat_id, platform, len(credentials))
|
|
49
|
-
print("正在托管凭证到 {} 平台...".format(platform), file=sys.stderr)
|
|
50
|
-
return http_client.post(url, headers=build_headers(chat_id), json_body=payload)
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
def main():
|
|
54
|
-
global USER_ID, USERNAME
|
|
55
|
-
parser = argparse.ArgumentParser(description="凭证托管工具")
|
|
56
|
-
parser.add_argument("--poll-result", default=None, help="credential_poll.py 输出的结果文件路径,自动提取所需参数")
|
|
57
|
-
parser.add_argument("--chat-id", default=None, help="scanChatID(使用 --poll-result 时可省略)")
|
|
58
|
-
parser.add_argument("--platform", default=None, help="托管平台名称(使用 --poll-result 时可省略)")
|
|
59
|
-
parser.add_argument("--username", required=True, help="Comate 用户名")
|
|
60
|
-
parser.add_argument("--credentials", default=None, help="凭证配置 JSON(使用 --poll-result 时可省略)")
|
|
61
|
-
args = parser.parse_args()
|
|
62
|
-
|
|
63
|
-
USERNAME = args.username
|
|
64
|
-
USER_ID = hashlib.md5(args.username.encode("utf-8")).hexdigest()[:12]
|
|
65
|
-
|
|
66
|
-
chat_id = args.chat_id
|
|
67
|
-
platform = args.platform
|
|
68
|
-
credentials = None
|
|
69
|
-
|
|
70
|
-
if args.poll_result:
|
|
71
|
-
# 从 poll_result 文件提取所有参数
|
|
72
|
-
try:
|
|
73
|
-
with open(args.poll_result, "r", encoding="utf-8") as f:
|
|
74
|
-
poll_data = json.load(f)
|
|
75
|
-
except Exception as e:
|
|
76
|
-
print("错误: 读取 poll-result 失败 {}: {}".format(args.poll_result, e), file=sys.stderr)
|
|
77
|
-
sys.exit(1)
|
|
78
|
-
|
|
79
|
-
chat_id = chat_id or poll_data.get("chatUUID", "")
|
|
80
|
-
data = poll_data.get("data", {})
|
|
81
|
-
platform = platform or data.get("deployment", {}).get("platformName", "")
|
|
82
|
-
credentials = data.get("credentials")
|
|
83
|
-
elif args.credentials:
|
|
84
|
-
try:
|
|
85
|
-
credentials = json.loads(args.credentials)
|
|
86
|
-
except json.JSONDecodeError as e:
|
|
87
|
-
print("错误: 凭证 JSON 解析失败: {}".format(e), file=sys.stderr)
|
|
88
|
-
sys.exit(1)
|
|
89
|
-
|
|
90
|
-
if not chat_id or not platform or credentials is None:
|
|
91
|
-
print("错误: 缺少必要参数。使用 --poll-result 或同时提供 --chat-id、--platform、--credentials", file=sys.stderr)
|
|
92
|
-
sys.exit(1)
|
|
93
|
-
|
|
94
|
-
result = hosting_credentials(chat_id, platform, credentials)
|
|
95
|
-
print(json.dumps(result, ensure_ascii=False, indent=2))
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
if __name__ == "__main__":
|
|
99
|
-
main()
|