@comate/zulu 1.2.1-beta.1 → 1.3.0
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/auto-commit-comate/SKILL.md +260 -0
- package/comate-engine/assets/skills/auto-commit-comate/references/data_structures.md +189 -0
- package/comate-engine/assets/skills/auto-commit-comate/references/new_version_instruction.md +209 -0
- package/comate-engine/assets/skills/auto-commit-comate/references/old_version_instruction.md +208 -0
- package/comate-engine/assets/skills/auto-commit-comate/scripts/git_diff_cli.py +196 -0
- package/comate-engine/assets/skills/{smart-commit → auto-commit-comate}/scripts/git_utils.py +20 -10
- package/comate-engine/assets/skills/{smart-commit → auto-commit-comate}/scripts/icafe/client.py +69 -40
- package/comate-engine/assets/skills/{smart-commit → auto-commit-comate}/scripts/icafe/farseer.py +8 -9
- package/comate-engine/assets/skills/{smart-commit → auto-commit-comate}/scripts/icafe/matching.py +65 -9
- package/comate-engine/assets/skills/auto-commit-comate/scripts/match_card_cli.py +37 -0
- package/comate-engine/assets/skills/cnap-comate/SKILL.md +157 -0
- package/comate-engine/assets/skills/cnap-comate/references/cases.md +198 -0
- package/comate-engine/assets/skills/cnap-comate/references/deploy-troubleshoot.md +15 -0
- package/comate-engine/assets/skills/cnap-comate/references/install.md +43 -0
- package/comate-engine/assets/skills/cnap-comate/references/kubectl.md +55 -0
- package/comate-engine/assets/skills/cnap-comate/references/login.md +125 -0
- package/comate-engine/assets/skills/cnap-comate/references/oncall.md +24 -0
- package/comate-engine/assets/skills/cnap-comate/scripts/install_cnap_cli.sh +36 -0
- package/comate-engine/assets/skills/code-security/SKILL.md +176 -0
- package/comate-engine/assets/skills/code-security/references/credential_hosting.md +102 -0
- package/comate-engine/assets/skills/code-security/references/vul_repair_sensitive.md +219 -0
- 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 +99 -0
- package/comate-engine/assets/skills/code-security/scripts/credential_poll.py +350 -0
- package/comate-engine/assets/skills/code-security/scripts/http_client.py +173 -0
- package/comate-engine/assets/skills/code-security/scripts/parse_scan_result.py +301 -0
- package/comate-engine/assets/skills/code-security/scripts/repair_vulnerability.py +261 -0
- package/comate-engine/assets/skills/code-security/scripts/report_chat.py +198 -0
- package/comate-engine/assets/skills/code-security/scripts/scan_vulnerability.py +316 -0
- package/comate-engine/assets/skills/code-security-comate/SKILL.md +219 -0
- package/comate-engine/assets/skills/code-security-comate/references/credential_hosting.md +102 -0
- package/comate-engine/assets/skills/code-security-comate/references/vul_repair-go_sql_injection.md +399 -0
- package/comate-engine/assets/skills/code-security-comate/references/vul_repair-java_sql_injection.md +591 -0
- package/comate-engine/assets/skills/code-security-comate/references/vul_repair-php_sql_injection.md +318 -0
- package/comate-engine/assets/skills/code-security-comate/references/vul_repair-python_sql_injection.md +198 -0
- package/comate-engine/assets/skills/code-security-comate/references/vul_repair_sensitive.md +219 -0
- package/comate-engine/assets/skills/code-security-comate/scripts/credential_hosting.py +87 -0
- package/comate-engine/assets/skills/code-security-comate/scripts/credential_poll.py +345 -0
- package/comate-engine/assets/skills/code-security-comate/scripts/http_client.py +173 -0
- package/comate-engine/assets/skills/code-security-comate/scripts/parse_scan_result.py +392 -0
- package/comate-engine/assets/skills/code-security-comate/scripts/repair_vulnerability.py +245 -0
- package/comate-engine/assets/skills/code-security-comate/scripts/report_chat.py +145 -0
- package/comate-engine/assets/skills/code-security-comate/scripts/scan_vulnerability.py +444 -0
- package/comate-engine/assets/skills/code-security-comate/scripts/utils.py +153 -0
- package/comate-engine/assets/skills/comate-docs-comate/SKILL.md +148 -0
- package/comate-engine/assets/skills/comate-docs-comate/references/doc-map-extended.md +78 -0
- package/comate-engine/assets/skills/comate-docs-comate/references/models-and-billing.md +51 -0
- package/comate-engine/assets/skills/comate-docs-comate/references/product-overview.md +73 -0
- package/comate-engine/assets/skills/comate-docs-comate/references/query_content.md +83 -0
- package/comate-engine/assets/skills/comate-docs-comate/references/query_repo.md +57 -0
- package/comate-engine/assets/skills/comate-docs-comate/scripts/ku_operator.py +1575 -0
- package/comate-engine/assets/skills/create-image-comate/SKILL.md +278 -0
- package/comate-engine/assets/skills/create-skill-comate/SKILL.md +308 -217
- package/comate-engine/assets/skills/create-skill-comate/agents/analyzer.md +274 -0
- package/comate-engine/assets/skills/create-skill-comate/agents/comparator.md +202 -0
- package/comate-engine/assets/skills/create-skill-comate/agents/grader.md +223 -0
- package/comate-engine/assets/skills/create-skill-comate/assets/eval_review.html +146 -0
- package/comate-engine/assets/skills/create-skill-comate/eval-viewer/generate_review.py +489 -0
- package/comate-engine/assets/skills/create-skill-comate/eval-viewer/viewer.html +1325 -0
- package/comate-engine/assets/skills/create-skill-comate/references/schemas.md +430 -0
- package/comate-engine/assets/skills/create-skill-comate/scripts/__init__.py +0 -0
- package/comate-engine/assets/skills/create-skill-comate/scripts/__pycache__/__init__.cpython-311.pyc +0 -0
- package/comate-engine/assets/skills/create-skill-comate/scripts/__pycache__/aggregate_benchmark.cpython-311.pyc +0 -0
- package/comate-engine/assets/skills/create-skill-comate/scripts/aggregate_benchmark.py +412 -0
- package/comate-engine/assets/skills/create-skill-comate/scripts/generate_report.py +334 -0
- package/comate-engine/assets/skills/create-skill-comate/scripts/package_skill.py +140 -0
- package/comate-engine/assets/skills/create-skill-comate/scripts/utils.py +53 -0
- package/comate-engine/assets/skills/find-skills-comate/SKILL.md +15 -12
- package/comate-engine/assets/skills/find-skills-comate/scripts/fetch_skills.py +32 -3
- package/comate-engine/assets/skills/get-ugate-token-comate/SKILL.md +159 -0
- package/comate-engine/assets/skills/get-ugate-token-comate/getUgateToken.py +150 -0
- package/comate-engine/assets/skills/icafe-comate/SKILL.md +240 -0
- package/comate-engine/assets/skills/icafe-comate/references/ai-workflows.md +233 -0
- package/comate-engine/assets/skills/icafe-comate/references/commands.md +1147 -0
- package/comate-engine/assets/skills/icafe-comate/references/error-handling.md +164 -0
- package/comate-engine/assets/skills/icafe-comate/references/git-auto-bindcard-workflow.md +201 -0
- package/comate-engine/assets/skills/icafe-comate/references/git-bindcard-workflow.md +327 -0
- package/comate-engine/assets/skills/icafe-comate/references/iql-syntax.md +327 -0
- package/comate-engine/assets/skills/icafe-comate/references/platform-concepts.md +317 -0
- package/comate-engine/assets/skills/icafe-comate/references/smart-create-workflow.md +171 -0
- package/comate-engine/assets/skills/icafe-comate/references/smart-find-workflow.md +127 -0
- package/comate-engine/assets/skills/icafe-comate/references/smart-update-workflow.md +118 -0
- package/comate-engine/assets/skills/icode-comate/SKILL.md +366 -0
- package/comate-engine/assets/skills/icode-comate/references/api/add_reviewers.md +44 -0
- package/comate-engine/assets/skills/icode-comate/references/api/build_fetch_command.md +89 -0
- package/comate-engine/assets/skills/icode-comate/references/api/check_repo_permission.md +89 -0
- package/comate-engine/assets/skills/icode-comate/references/api/create_branch.md +79 -0
- package/comate-engine/assets/skills/icode-comate/references/api/create_draft_comment.md +109 -0
- package/comate-engine/assets/skills/icode-comate/references/api/get_ai_cr_result.md +190 -0
- package/comate-engine/assets/skills/icode-comate/references/api/get_ai_review.md +97 -0
- package/comate-engine/assets/skills/icode-comate/references/api/get_diff_content.md +92 -0
- package/comate-engine/assets/skills/icode-comate/references/api/get_diff_file.md +88 -0
- package/comate-engine/assets/skills/icode-comate/references/api/get_machine_check.md +73 -0
- package/comate-engine/assets/skills/icode-comate/references/api/get_my_reviews.md +115 -0
- package/comate-engine/assets/skills/icode-comate/references/api/get_person_commit.md +89 -0
- package/comate-engine/assets/skills/icode-comate/references/api/get_person_repo.md +63 -0
- package/comate-engine/assets/skills/icode-comate/references/api/get_repo_branch.md +62 -0
- package/comate-engine/assets/skills/icode-comate/references/api/get_repo_config.md +91 -0
- package/comate-engine/assets/skills/icode-comate/references/api/get_repo_members.md +118 -0
- package/comate-engine/assets/skills/icode-comate/references/api/get_repo_reviews.md +91 -0
- package/comate-engine/assets/skills/icode-comate/references/api/get_review_comments.md +87 -0
- package/comate-engine/assets/skills/icode-comate/references/api/get_review_info.md +81 -0
- package/comate-engine/assets/skills/icode-comate/references/api/get_submit_settings.md +105 -0
- package/comate-engine/assets/skills/icode-comate/references/api/icode-api.md +86 -0
- package/comate-engine/assets/skills/icode-comate/references/api/publish_comments.md +72 -0
- package/comate-engine/assets/skills/icode-comate/references/api/set_review_score.md +58 -0
- package/comate-engine/assets/skills/icode-comate/references/api/start_ai_review.md +77 -0
- package/comate-engine/assets/skills/icode-comate/references/api/submit_review.md +50 -0
- package/comate-engine/assets/skills/icode-comate/references/api/trigger_ai_cr.md +63 -0
- package/comate-engine/assets/skills/icode-comate/references/feature/add-reviewer.md +92 -0
- package/comate-engine/assets/skills/icode-comate/references/feature/fix-machine-check.md +144 -0
- package/comate-engine/assets/skills/icode-comate/references/feature/merge-cr.md +100 -0
- package/comate-engine/assets/skills/icode-comate/references/feature/ssh-setup.md +106 -0
- package/comate-engine/assets/skills/icode-comate/references/feature/submit-acr.md +135 -0
- package/comate-engine/assets/skills/icode-comate/references/feature/submit-cr.md +123 -0
- package/comate-engine/assets/skills/icode-comate/references/git/clone.md +67 -0
- package/comate-engine/assets/skills/icode-comate/references/git/icode-git.md +68 -0
- package/comate-engine/assets/skills/icode-comate/references/git/push.md +64 -0
- package/comate-engine/assets/skills/icode-comate/references/git/push_cr.md +103 -0
- package/comate-engine/assets/skills/icode-comate/references/install.md +144 -0
- package/comate-engine/assets/skills/icode-comate/references/login.md +111 -0
- package/comate-engine/assets/skills/icode-comate/scripts/add-reviewer.sh +154 -0
- package/comate-engine/assets/skills/icode-comate/scripts/common.sh +145 -0
- package/comate-engine/assets/skills/icode-comate/scripts/fix-machine-check.sh +131 -0
- package/comate-engine/assets/skills/icode-comate/scripts/merge-cr.sh +105 -0
- package/comate-engine/assets/skills/icode-comate/scripts/ssh-setup.sh +159 -0
- package/comate-engine/assets/skills/icode-comate/scripts/submit-acr.sh +236 -0
- package/comate-engine/assets/skills/icode-comate/scripts/submit-cr.sh +104 -0
- package/comate-engine/assets/skills/icode-comate/scripts/test-preflight.sh +89 -0
- package/comate-engine/assets/skills/ku-operator-comate/SKILL.md +121 -0
- package/comate-engine/assets/skills/ku-operator-comate/examples.md +190 -0
- package/comate-engine/assets/skills/ku-operator-comate/references/add_member.md +49 -0
- package/comate-engine/assets/skills/ku-operator-comate/references/change_scope.md +38 -0
- package/comate-engine/assets/skills/ku-operator-comate/references/copy_doc.md +50 -0
- package/comate-engine/assets/skills/ku-operator-comate/references/create_doc.md +61 -0
- package/comate-engine/assets/skills/ku-operator-comate/references/delete_doc.md +31 -0
- package/comate-engine/assets/skills/ku-operator-comate/references/edit_content.md +568 -0
- package/comate-engine/assets/skills/ku-operator-comate/references/move_doc.md +45 -0
- package/comate-engine/assets/skills/ku-operator-comate/references/query_comment.md +79 -0
- package/comate-engine/assets/skills/ku-operator-comate/references/query_content.md +83 -0
- package/comate-engine/assets/skills/ku-operator-comate/references/query_flowchart.md +84 -0
- package/comate-engine/assets/skills/ku-operator-comate/references/query_permission.md +38 -0
- package/comate-engine/assets/skills/ku-operator-comate/references/query_recent_view.md +67 -0
- package/comate-engine/assets/skills/ku-operator-comate/references/query_repo.md +57 -0
- package/comate-engine/assets/skills/ku-operator-comate/references/query_user_info.md +37 -0
- package/comate-engine/assets/skills/ku-operator-comate/references/update_member.md +41 -0
- package/comate-engine/assets/skills/ku-operator-comate/references/upload_attachment.md +52 -0
- package/comate-engine/assets/skills/ku-operator-comate/scripts/ku_operator.py +1575 -0
- package/comate-engine/node_modules/better-sqlite3/node_modules/.bin/prebuild-install +2 -2
- package/comate-engine/node_modules/tree-sitter-bash/node_modules/.bin/node-gyp-build +2 -2
- package/comate-engine/node_modules/tree-sitter-bash/node_modules/.bin/node-gyp-build-optional +2 -2
- package/comate-engine/node_modules/tree-sitter-bash/node_modules/.bin/node-gyp-build-test +2 -2
- package/comate-engine/package.json +2 -0
- package/comate-engine/server.js +263 -79
- package/dist/bundle/index.js +8 -8
- package/package.json +1 -1
- package/comate-engine/assets/skills/figma2code-comate/codeConnect.md +0 -37
- package/comate-engine/assets/skills/figma2code-comate/designToken.md +0 -3
- package/comate-engine/assets/skills/figma2code-comate/f2cMcp.md +0 -59
- package/comate-engine/assets/skills/smart-commit/SKILL.md +0 -646
- package/comate-engine/node_modules/@comate/plugin-host/dist/index-AZIho4HV.js +0 -1
- package/comate-engine/node_modules/@comate/plugin-host/dist/user-BIpzRUfb.js +0 -44
- /package/comate-engine/assets/skills/{smart-commit → auto-commit-comate}/references/issue_type_mapping.json +0 -0
- /package/comate-engine/assets/skills/{smart-commit → auto-commit-comate}/references/query_reference.md +0 -0
- /package/comate-engine/assets/skills/{smart-commit → auto-commit-comate}/scripts/compat.py +0 -0
- /package/comate-engine/assets/skills/{smart-commit → auto-commit-comate}/scripts/create_card_cli.py +0 -0
- /package/comate-engine/assets/skills/{smart-commit → auto-commit-comate}/scripts/icafe/__init__.py +0 -0
- /package/comate-engine/assets/skills/{smart-commit → auto-commit-comate}/scripts/logger.py +0 -0
- /package/comate-engine/assets/skills/{smart-commit → auto-commit-comate}/scripts/recognize_card_cli.py +0 -0
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
# CNAP CLI 登录认证
|
|
2
|
+
|
|
3
|
+
## 登录命令概览
|
|
4
|
+
|
|
5
|
+
| 命令 | 用途 | 推荐场景 |
|
|
6
|
+
|------|------|----------|
|
|
7
|
+
| `cnap login status` | 查看当前登录状态 | 登录前后检查 |
|
|
8
|
+
| `cnap login ugate` | UGate Token 登录 | AI Agent、自动化脚本 |
|
|
9
|
+
| `cnap login qrcode` | 扫码登录 | 人工操作 |
|
|
10
|
+
| `cnap login totp` | TOTP 登录 | 自动化脚本 |
|
|
11
|
+
| `cnap logout` | 退出登录 | 清理登录凭证 |
|
|
12
|
+
|
|
13
|
+
## 登录方式详解
|
|
14
|
+
|
|
15
|
+
### 1. UGate Token 登录(推荐 Agent)
|
|
16
|
+
|
|
17
|
+
适用于 AI Agent 和自动化脚本场景,无需人工交互。
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
# 交互式:提示输入 Token
|
|
21
|
+
cnap login ugate
|
|
22
|
+
|
|
23
|
+
# 非交互式:直接传入 Token
|
|
24
|
+
cnap login ugate --token <ugate-token>
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
**获取 Token**:访问 https://uuap.baidu.com/agent/token
|
|
28
|
+
|
|
29
|
+
**参数说明**:
|
|
30
|
+
|
|
31
|
+
| 参数 | 简写 | 必填 | 说明 |
|
|
32
|
+
|------|------|------|------|
|
|
33
|
+
| `--token` | `-t` | 否 | UGate Token,直接传入则非交互式 |
|
|
34
|
+
| `--username` | `-u` | 否 | 期望的用户名,用于校验 Token 是否属于该用户 |
|
|
35
|
+
|
|
36
|
+
**username 校验示例**:
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
# 指定期望用户名,Token 必须属于该用户,否则报错
|
|
40
|
+
cnap login ugate --username dongshuzhao --token <token>
|
|
41
|
+
|
|
42
|
+
# 输出示例:
|
|
43
|
+
# UGate logged in successfully as: dongshuzhao
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
### 2. 扫码登录
|
|
47
|
+
|
|
48
|
+
适用于人工操作,需要使用如流手机 App 扫描二维码确认登录。
|
|
49
|
+
|
|
50
|
+
```bash
|
|
51
|
+
# 交互式扫码登录
|
|
52
|
+
cnap login qrcode
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
扫码后在如流手机 App 中确认授权。
|
|
56
|
+
|
|
57
|
+
### 3. TOTP 登录
|
|
58
|
+
|
|
59
|
+
适用于自动化脚本,需要先申请 TOTP Secret。
|
|
60
|
+
|
|
61
|
+
```bash
|
|
62
|
+
# 使用 TOTP Secret 登录
|
|
63
|
+
cnap login totp --secret <your-secret>
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
**参数说明**:
|
|
67
|
+
|
|
68
|
+
| 参数 | 简写 | 必填 | 说明 |
|
|
69
|
+
|------|------|------|------|
|
|
70
|
+
| `--secret` | `-s` | 是 | TOTP Secret |
|
|
71
|
+
|
|
72
|
+
### 4. 查看登录状态
|
|
73
|
+
|
|
74
|
+
```bash
|
|
75
|
+
cnap login status
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
输出示例:
|
|
79
|
+
|
|
80
|
+
```
|
|
81
|
+
Logged in as: dongshuzhao
|
|
82
|
+
Login method: ugate
|
|
83
|
+
Token expires: 2026-04-03 12:00:00
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
### 5. 退出登录
|
|
87
|
+
|
|
88
|
+
```bash
|
|
89
|
+
cnap logout
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
退出后清除本地保存的登录凭证。
|
|
93
|
+
|
|
94
|
+
## 常见问题
|
|
95
|
+
|
|
96
|
+
### Token 过期
|
|
97
|
+
|
|
98
|
+
Token 有有效期限制,过期后需要重新登录:
|
|
99
|
+
|
|
100
|
+
```bash
|
|
101
|
+
cnap login ugate --token <new-token>
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
### 权限不足
|
|
105
|
+
|
|
106
|
+
如果遇到权限报错,联系账号管理员获取相应权限。
|
|
107
|
+
|
|
108
|
+
### 登录状态异常
|
|
109
|
+
|
|
110
|
+
如果遇到登录状态异常,可以尝试:
|
|
111
|
+
|
|
112
|
+
```bash
|
|
113
|
+
# 退出登录后重新登录
|
|
114
|
+
cnap logout
|
|
115
|
+
cnap login ugate --token <token>
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
## 登录凭证存储
|
|
119
|
+
|
|
120
|
+
登录成功后,凭证会保存在配置文件中:
|
|
121
|
+
|
|
122
|
+
- **UGate**:保存用户名到 `~/.cnap/config.yaml` 的 `auth.ugate.username`
|
|
123
|
+
- Token 信息由 oneauth 库管理
|
|
124
|
+
|
|
125
|
+
切换登录方式时,凭证会自动保存。
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# 相关平台产品介绍及值班表
|
|
2
|
+
|
|
3
|
+
## 相关值班表
|
|
4
|
+
|
|
5
|
+
- CNAP(本产品,一站式云原生应用平台):CNAP云原生一站式用户问题值班表[https://zhiban.baidu-int.com/detail?id=68523]
|
|
6
|
+
- EKS(云上百度K8s集群资源,对应集群Type=EKS):弹性容器服务EKS[https://zhiban.baidu-int.com/detail?id=65239]
|
|
7
|
+
- iRegistry(镜像仓库):iRepo/iRegistry/Magellan/EMC/依赖仓库 值班表[https://zhiban.baidu-int.com/detail?id=64974]
|
|
8
|
+
- iPipe(流水线):agile[https://zhiban.baidu-int.com/detail?id=66735]
|
|
9
|
+
- BCloud(编译构建集群):编译工具团队[https://zhiban.baidu-int.com/detail?id=65680]
|
|
10
|
+
- iCode(代码库):iCode值班[https://zhiban.baidu-int.com/detail?id=64808]
|
|
11
|
+
|
|
12
|
+
## 用户群
|
|
13
|
+
|
|
14
|
+
用户可以加入CNAP用户群,即时获得支持:
|
|
15
|
+
|
|
16
|
+
- CNAP一站式用户群:5602724
|
|
17
|
+
- CNAP一站式用户群(2):8689677
|
|
18
|
+
|
|
19
|
+
## 使用方法
|
|
20
|
+
|
|
21
|
+
使用 `zhiban-search` Skill(从你的市场搜索,或者下载并安装此 https://bj.bcebos.com/onetool/skills/zhiban-search/1.0.7/zhiban-search.zip),根据值班表ID(URL参数里的id)或者值班表名称,可获得值班人信息。
|
|
22
|
+
|
|
23
|
+
示例(查询CNAP当前值班表):
|
|
24
|
+
`/zhiban-search search -i 68523`
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
VERSION=0.7.0
|
|
3
|
+
|
|
4
|
+
# 获取当前系统的 GOOS 和 GOARCH
|
|
5
|
+
os=$(uname -s)
|
|
6
|
+
if [ "${os}" == "Linux" ]; then
|
|
7
|
+
GOOS=linux
|
|
8
|
+
else
|
|
9
|
+
echo "Unsupported OS: ${os}"
|
|
10
|
+
exit 1
|
|
11
|
+
fi
|
|
12
|
+
arch=$(uname -m)
|
|
13
|
+
if [ "${arch}" == "x86_64" || "${arch}" == "amd64" ]; then
|
|
14
|
+
GOARCH=amd64
|
|
15
|
+
elif [ "${arch}" == "aarch64" || "${arch}" == "aarch64" ]; then
|
|
16
|
+
GOARCH=arm64
|
|
17
|
+
else
|
|
18
|
+
echo "Unsupported architecture: ${arch}"
|
|
19
|
+
exit 1
|
|
20
|
+
fi
|
|
21
|
+
|
|
22
|
+
# 设置 Go 二进制文件名
|
|
23
|
+
TAR_FILE="cnap-cli-${VERSION}-${GOOS}-${GOARCH}.tar.gz"
|
|
24
|
+
CNAP_DIR="${HOME}/.cnap/bin"
|
|
25
|
+
TAR_DIR="${CNAP_DIR}/cnap.tar.gz"
|
|
26
|
+
BINARY_DIR="${CNAP_DIR}/cnap"
|
|
27
|
+
|
|
28
|
+
# 创建目录
|
|
29
|
+
mkdir -p ${CNAP_DIR}
|
|
30
|
+
rm -f ${TAR_DIR}
|
|
31
|
+
rm -f ${BINARY_DIR}
|
|
32
|
+
|
|
33
|
+
# 下载对应的 Go 二进制文件
|
|
34
|
+
curl -s -S http://bj.bcebos.com/appspace/cnap-cli/release/${TAR_FILE} -o ${TAR_DIR} || wget http://bj.bcebos.com/appspace/cnap-cli/release/${TAR_FILE} -O ${TAR_DIR} -q
|
|
35
|
+
tar xzvf ${TAR_DIR} -C ${CNAP_DIR}
|
|
36
|
+
chmod a+x ${BINARY_DIR}
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: code-security
|
|
3
|
+
description: 代码安全漏洞扫描与修复工具。当用户需要以下操作时使用本 skill:(1) 扫描项目代码中的安全漏洞(SQL注入、XSS、XXE、路径遍历、硬编码凭证等);(2) 自动修复扫描发现的漏洞;(3) 查看漏洞扫描报告;(4) 对 Java、Go、Python、JavaScript、C/C++ 等语言的项目进行安全检测;(5) 硬编码凭证的修复和托管。触发关键词:代码安全、漏洞扫描、安全扫描、漏洞修复、代码审计、SAST、硬编码、凭证托管。
|
|
4
|
+
metadata:
|
|
5
|
+
enableWhen:
|
|
6
|
+
- isInternal
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# Code Security - 代码安全漏洞扫描与修复
|
|
10
|
+
|
|
11
|
+
## 概述
|
|
12
|
+
|
|
13
|
+
本 skill 将用户项目代码上传至安全扫描服务端进行扫描,返回 SARIF 格式漏洞报告,并支持自动修复。支持两类漏洞修复:普通漏洞修复和硬编码凭证修复与托管。
|
|
14
|
+
|
|
15
|
+
所有中间结果文件(`scan_result.json`、`parsed_result.json`、`repair_result.json`)默认保存在 skill 安装目录下的 `.tmp/<项目名>_<哈希>/` 目录中,按项目隔离、不会污染用户项目。脚本标准输出会打印文件绝对路径,使用该路径读取即可。
|
|
16
|
+
|
|
17
|
+
## 工作流
|
|
18
|
+
|
|
19
|
+
### 漏洞扫描
|
|
20
|
+
|
|
21
|
+
执行扫描:
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
python3 scripts/scan_vulnerability.py --root-path <项目目录> --username ${COMATE_USERNAME} --chat-id ${COMATE_SESSION_ID}
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
`<项目目录>` 是指用户项目的根目录(即待扫描代码所在目录),而非 skill 安装目录。`--chat-id` 用于关联扫描任务与当前对话。
|
|
28
|
+
|
|
29
|
+
扫描流程:
|
|
30
|
+
|
|
31
|
+
1. 获取扫描配置(支持的文件类型、超时时间等)
|
|
32
|
+
2. 遍历项目目录,收集文件哈希
|
|
33
|
+
3. 创建 bundle 并上传缺失文件
|
|
34
|
+
4. 发起扫描并轮询结果
|
|
35
|
+
5. 结果保存到 skill 临时目录下的 `scan_result.json`,标准输出打印结果文件绝对路径
|
|
36
|
+
|
|
37
|
+
扫描完成后的执行步骤:
|
|
38
|
+
|
|
39
|
+
1. 脚本将 SARIF 格式漏洞报告保存到 `scan_result.json` 文件中,标准输出仅打印文件路径
|
|
40
|
+
2. **必须立即执行数据上报**(参数说明见「数据上报」章节):
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
python3 scripts/report_chat.py --username ${COMATE_USERNAME} --chat-id ${COMATE_SESSION_ID} --scan-result <scan_result.json路径> --root-path <项目目录> --status 0 --ide ${COMATE_IDE_NAME} --query <用户输入>
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
如果扫描失败,改为 `--status 1 --err-message <失败原因>`,`--scan-result` 可省略。
|
|
47
|
+
|
|
48
|
+
3. 执行解析脚本解析和展示扫描结果(见「漏洞解析与展示」章节)
|
|
49
|
+
4. 如果存在漏洞,扫描完成后进入漏洞分类和修复逻辑
|
|
50
|
+
|
|
51
|
+
### 漏洞解析与展示
|
|
52
|
+
|
|
53
|
+
扫描完成后,执行解析脚本对结果进行分类和格式化展示:
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
python3 scripts/parse_scan_result.py --scan-result <scan_result.json路径>
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
脚本功能:
|
|
60
|
+
|
|
61
|
+
1. 解析 SARIF 格式扫描结果,自动按 ruleID 是否包含 `sensitive` 分类为普通漏洞和硬编码漏洞
|
|
62
|
+
2. 标准输出打印 Markdown 格式漏洞报告,包含漏洞名称、描述、位置链接、等级、数据流、修复建议
|
|
63
|
+
3. 在输出目录生成 `parsed_result.json`(路径打印到 stderr),包含结构化漏洞数据供后续修复使用
|
|
64
|
+
|
|
65
|
+
**展示要求(严格遵守)**:脚本标准输出的内容是已经格式化好的 Markdown 漏洞报告,**必须将标准输出内容原样展示给用户,禁止总结、改写、精简或重新组织**。不要用自己的话概述漏洞信息,直接复制粘贴脚本的标准输出即可。
|
|
66
|
+
|
|
67
|
+
然后根据 `parsed_result.json` 中的 `common_count` 进入修复流程:
|
|
68
|
+
|
|
69
|
+
- 如果存在普通漏洞(`common_count > 0`),直接进入普通漏洞修复流程
|
|
70
|
+
- 如果没有普通漏洞,仅展示扫描报告,不进行修复
|
|
71
|
+
|
|
72
|
+
<!-- TODO: 后续版本恢复硬编码漏洞修复支持
|
|
73
|
+
- 如果同时存在两种漏洞,给出3个选项让用户选择(使用Questions组件):
|
|
74
|
+
1. 修复普通漏洞 - 自动修复 SQL 注入、XXE 等常规漏洞
|
|
75
|
+
2. 修复硬编码漏洞 - 进入凭证托管流程,将硬编码凭证替换为环境变量
|
|
76
|
+
3. 仅查看漏洞信息,暂不修复
|
|
77
|
+
- 如果只有普通漏洞,直接进入普通修复流程
|
|
78
|
+
- 如果只有硬编码漏洞,直接进入硬编码修复流程
|
|
79
|
+
-->
|
|
80
|
+
|
|
81
|
+
### 普通漏洞修复
|
|
82
|
+
|
|
83
|
+
直接传入解析结果文件执行修复:
|
|
84
|
+
|
|
85
|
+
```bash
|
|
86
|
+
python3 scripts/repair_vulnerability.py --root-path <项目目录> --username ${COMATE_USERNAME} --parsed-result <parsed_result.json路径>
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
脚本自动从 `parsed_result.json` 提取普通漏洞并按文件聚合,然后调用修复接口。
|
|
90
|
+
|
|
91
|
+
修复逻辑:
|
|
92
|
+
|
|
93
|
+
1. 一定要调用工具脚本进行修复,不要擅自修改其他部分的代码
|
|
94
|
+
2. 结果保存到 skill 临时目录下的 `repair_result.json`,标准输出打印结果文件绝对路径
|
|
95
|
+
3. 执行完成后,使用 Read 工具读取结果文件获取修复结果
|
|
96
|
+
4. 如果返回的修复结果缺失必要的包或第三方组件,帮忙增加导入代码
|
|
97
|
+
5. 每获取一个文件修复结果,就根据 diff_content 修改文件内容(使用 to_content 替换 from_content),并默认采纳
|
|
98
|
+
6. 所有文件修复完成后,自动执行一次复测扫描(流程与「漏洞扫描」章节一致),对比修复前后的漏洞数量,向用户说明修复效果。**复测扫描完成后同样必须立即执行数据上报**(命令和参数同「漏洞扫描」章节中的上报步骤)。展示格式:
|
|
99
|
+
|
|
100
|
+
```
|
|
101
|
+
修复完成,正在执行复测扫描验证修复效果...
|
|
102
|
+
|
|
103
|
+
**复测结果**:修复前共 N 个普通漏洞,修复后剩余 M 个,本次修复 X 个漏洞。
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
如果复测仍存在未修复的漏洞,展示剩余漏洞列表(格式同漏洞报告),并提示用户可以选择继续修复或忽略。
|
|
107
|
+
|
|
108
|
+
7. 复测完成后,清理临时文件:`python3 -c "import shutil; shutil.rmtree('<临时目录绝对路径>')"` 删除该项目的临时目录(即 `.tmp/<项目名>_<哈希>/` 整个目录)。如果同时存在硬编码漏洞且用户后续还需修复,则暂不删除,等硬编码流程结束后统一清理。
|
|
109
|
+
8. 进入单元测试阶段(流程见「单元测试」章节)。
|
|
110
|
+
|
|
111
|
+
### 硬编码漏洞修复与凭证托管
|
|
112
|
+
|
|
113
|
+
完整流程见 [references/credential_hosting.md](references/credential_hosting.md)。
|
|
114
|
+
|
|
115
|
+
### 单元测试
|
|
116
|
+
|
|
117
|
+
修复和复测完成后,为修改过的文件生成或更新单元测试,验证修复不会破坏原有功能。
|
|
118
|
+
|
|
119
|
+
流程:
|
|
120
|
+
|
|
121
|
+
1. 收集本次修复涉及的所有文件列表
|
|
122
|
+
2. 检查项目中是否已有对应的测试文件(按项目约定的测试目录和命名规则查找,如 `*Test.java`、`*_test.go`、`test_*.py`、`*.test.js` 等)
|
|
123
|
+
3. 提示用户确认是否需要生成单测:
|
|
124
|
+
|
|
125
|
+
```
|
|
126
|
+
修复已完成,是否为修改的文件生成单元测试?
|
|
127
|
+
1. 生成单测 - 为修改的文件生成或更新单元测试
|
|
128
|
+
2. 跳过单测 - 不生成单元测试
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
4. 用户选择生成后,针对每个修改的文件:
|
|
132
|
+
- 如果已有测试文件:阅读现有测试,补充针对修复点的测试用例(不破坏已有用例)
|
|
133
|
+
- 如果没有测试文件:按项目测试框架和目录结构创建新测试文件
|
|
134
|
+
5. 测试用例重点覆盖:修复前的漏洞场景应被正确防御(如参数化查询替代拼接、环境变量替代硬编码等)
|
|
135
|
+
6. 生成完成后,尝试运行测试(根据项目构建工具选择命令,如 `mvn test`、`go test`、`pytest`、`npm test` 等),如果运行失败则根据报错修正测试代码,直到测试通过
|
|
136
|
+
|
|
137
|
+
### 数据上报
|
|
138
|
+
|
|
139
|
+
每次扫描完成后(包括首次扫描和复测扫描,无论成功或失败),**必须执行数据上报**。上报失败不影响主流程,仅在 stderr 输出警告。
|
|
140
|
+
|
|
141
|
+
```bash
|
|
142
|
+
python3 scripts/report_chat.py --username ${COMATE_USERNAME} --chat-id ${COMATE_SESSION_ID} --scan-result <扫描结果文件路径> --root-path <项目目录> [--status <状态码>] [--err-message <错误信息>] [--git-url <仓库URL>] [--git-branch <分支>] [--ide ${COMATE_IDE_NAME}] [--query <用户输入>]
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
参数说明:
|
|
146
|
+
|
|
147
|
+
- `--chat-id`:使用 `${COMATE_SESSION_ID}` 作为对话唯一标识
|
|
148
|
+
- `--scan-result`:扫描结果 JSON 文件路径(即 `scan_result.json`),脚本自动从中提取漏洞信息
|
|
149
|
+
- `--root-path`:项目根目录,用于计算漏洞文件的哈希值
|
|
150
|
+
- `--status`:执行状态码,`0` 表示成功,`1` 表示失败(默认 `0`)
|
|
151
|
+
- `--err-message`:失败时的错误信息
|
|
152
|
+
- `--git-url` / `--git-branch`:从项目 git 信息获取
|
|
153
|
+
- `--ide`:使用 `${COMATE_IDE_NAME}`
|
|
154
|
+
- `--query`:用户发起扫描时的输入文本
|
|
155
|
+
|
|
156
|
+
上报时机:
|
|
157
|
+
|
|
158
|
+
1. 首次扫描完成后(成功 `--status 0`,失败 `--status 1 --err-message <原因>`)
|
|
159
|
+
2. 复测扫描完成后(参数同上)
|
|
160
|
+
|
|
161
|
+
## 脚本说明
|
|
162
|
+
|
|
163
|
+
脚本必须使用 python3 执行。执行脚本时**不要重定向 stderr**(如 `2>/tmp/xxx.txt`),脚本的 stderr 包含进度信息和输出文件路径,重定向会导致关键信息丢失。直接执行即可:
|
|
164
|
+
|
|
165
|
+
```bash
|
|
166
|
+
python3 scripts/xxx.py --参数 值
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
| 脚本 | 功能 |
|
|
170
|
+
| --------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
171
|
+
| `scripts/scan_vulnerability.py` | 漏洞扫描:上传代码、创建 bundle、执行扫描,结果保存到 `scan_result.json` |
|
|
172
|
+
| `scripts/parse_scan_result.py` | 扫描结果解析:解析 SARIF 格式结果,标准输出 Markdown 报告,生成 `parsed_result.json` 结构化数据 |
|
|
173
|
+
| `scripts/repair_vulnerability.py` | 漏洞修复:支持 `--parsed-result` 直接传入解析结果文件(自动提取普通漏洞并聚合),或 `--vulnerability-info` 传入 JSON。结果保存到 `repair_result.json`。硬编码修复为本地直接修复,参考 `references/vul_repair_sensitive.md` |
|
|
174
|
+
| `scripts/credential_poll.py` | 凭证配置轮询:WebSocket 监听网页配置完成事件,`--output` 保存结果到文件 |
|
|
175
|
+
| `scripts/credential_hosting.py` | 凭证托管:`--poll-result` 从轮询结果文件自动提取参数,将凭证托管到平台 |
|
|
176
|
+
| `scripts/report_chat.py` | 对话结果上报:扫描完成后向服务端上报对话信息和漏洞数据 |
|
|
@@ -0,0 +1,102 @@
|
|
|
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/<项目名>_<哈希>/` 整个目录)。然后进入单元测试阶段(流程见「单元测试」章节)。
|
|
@@ -0,0 +1,219 @@
|
|
|
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
|
+
```
|