code-abyss 1.6.15 → 1.7.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/bin/install.js +25 -4
- package/package.json +2 -2
- package/skills/SKILL.md +24 -16
- package/skills/domains/ai/SKILL.md +2 -2
- package/skills/domains/ai/prompt-and-eval.md +279 -0
- package/skills/domains/architecture/SKILL.md +2 -3
- package/skills/domains/architecture/security-arch.md +87 -0
- package/skills/domains/data-engineering/SKILL.md +188 -26
- package/skills/domains/development/SKILL.md +1 -4
- package/skills/domains/devops/SKILL.md +3 -5
- package/skills/domains/devops/performance.md +63 -0
- package/skills/domains/devops/testing.md +97 -0
- package/skills/domains/frontend-design/SKILL.md +12 -3
- package/skills/domains/frontend-design/claymorphism/SKILL.md +117 -0
- package/skills/domains/frontend-design/claymorphism/references/tokens.css +52 -0
- package/skills/domains/frontend-design/engineering.md +287 -0
- package/skills/domains/frontend-design/glassmorphism/SKILL.md +138 -0
- package/skills/domains/frontend-design/glassmorphism/references/tokens.css +32 -0
- package/skills/domains/frontend-design/liquid-glass/SKILL.md +135 -0
- package/skills/domains/frontend-design/liquid-glass/references/tokens.css +81 -0
- package/skills/domains/frontend-design/neubrutalism/SKILL.md +141 -0
- package/skills/domains/frontend-design/neubrutalism/references/tokens.css +44 -0
- package/skills/domains/infrastructure/SKILL.md +174 -34
- package/skills/domains/mobile/SKILL.md +211 -21
- package/skills/domains/orchestration/SKILL.md +1 -0
- package/skills/domains/security/SKILL.md +4 -6
- package/skills/domains/security/blue-team.md +57 -0
- package/skills/domains/security/red-team.md +54 -0
- package/skills/domains/security/threat-intel.md +50 -0
- package/skills/orchestration/multi-agent/SKILL.md +195 -46
- package/skills/run_skill.js +134 -0
- package/skills/tools/gen-docs/SKILL.md +6 -4
- package/skills/tools/gen-docs/scripts/doc_generator.js +349 -0
- package/skills/tools/verify-change/SKILL.md +8 -6
- package/skills/tools/verify-change/scripts/change_analyzer.js +270 -0
- package/skills/tools/verify-module/SKILL.md +6 -4
- package/skills/tools/verify-module/scripts/module_scanner.js +145 -0
- package/skills/tools/verify-quality/SKILL.md +5 -3
- package/skills/tools/verify-quality/scripts/quality_checker.js +276 -0
- package/skills/tools/verify-security/SKILL.md +7 -5
- package/skills/tools/verify-security/scripts/security_scanner.js +133 -0
- package/skills/domains/COVERAGE_PLAN.md +0 -232
- package/skills/domains/ai/model-evaluation.md +0 -790
- package/skills/domains/ai/prompt-engineering.md +0 -703
- package/skills/domains/architecture/compliance.md +0 -299
- package/skills/domains/architecture/data-security.md +0 -184
- package/skills/domains/data-engineering/data-pipeline.md +0 -762
- package/skills/domains/data-engineering/data-quality.md +0 -894
- package/skills/domains/data-engineering/stream-processing.md +0 -791
- package/skills/domains/development/dart.md +0 -963
- package/skills/domains/development/kotlin.md +0 -834
- package/skills/domains/development/php.md +0 -659
- package/skills/domains/development/swift.md +0 -755
- package/skills/domains/devops/e2e-testing.md +0 -914
- package/skills/domains/devops/performance-testing.md +0 -734
- package/skills/domains/devops/testing-strategy.md +0 -667
- package/skills/domains/frontend-design/build-tools.md +0 -743
- package/skills/domains/frontend-design/performance.md +0 -734
- package/skills/domains/frontend-design/testing.md +0 -699
- package/skills/domains/infrastructure/gitops.md +0 -735
- package/skills/domains/infrastructure/iac.md +0 -855
- package/skills/domains/infrastructure/kubernetes.md +0 -1018
- package/skills/domains/mobile/android-dev.md +0 -979
- package/skills/domains/mobile/cross-platform.md +0 -795
- package/skills/domains/mobile/ios-dev.md +0 -931
- package/skills/domains/security/secrets-management.md +0 -834
- package/skills/domains/security/supply-chain.md +0 -931
- package/skills/domains/security/threat-modeling.md +0 -828
- package/skills/run_skill.py +0 -88
- package/skills/tests/README.md +0 -225
- package/skills/tests/SUMMARY.md +0 -362
- package/skills/tests/__init__.py +0 -3
- package/skills/tests/test_change_analyzer.py +0 -558
- package/skills/tests/test_doc_generator.py +0 -538
- package/skills/tests/test_module_scanner.py +0 -376
- package/skills/tests/test_quality_checker.py +0 -516
- package/skills/tests/test_security_scanner.py +0 -426
- package/skills/tools/gen-docs/scripts/doc_generator.py +0 -491
- package/skills/tools/verify-change/scripts/change_analyzer.py +0 -529
- package/skills/tools/verify-module/scripts/module_scanner.py +0 -321
- package/skills/tools/verify-quality/scripts/quality_checker.py +0 -481
- package/skills/tools/verify-security/scripts/security_scanner.py +0 -368
|
@@ -1,828 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: threat-modeling
|
|
3
|
-
description: 威胁建模方法论。STRIDE、PASTA、攻击树、威胁矩阵、风险评估。当用户提到威胁建模、STRIDE、PASTA、攻击树、威胁矩阵、风险评估、安全设计时使用。
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# 🎯 威胁建模 · Threat Modeling
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
## 威胁建模流程
|
|
10
|
-
|
|
11
|
-
```
|
|
12
|
-
资产识别 → 架构分解 → 威胁枚举 → 风险评级 → 缓解措施 → 验证
|
|
13
|
-
│ │ │ │ │ │
|
|
14
|
-
└─ 数据流 ─┴─ 信任边界 ─┴─ STRIDE ─┴─ CVSS ─┴─ 控制 ─┴─ 测试
|
|
15
|
-
```
|
|
16
|
-
|
|
17
|
-
## STRIDE 方法论
|
|
18
|
-
|
|
19
|
-
### STRIDE 威胁分类
|
|
20
|
-
|
|
21
|
-
| 威胁 | 含义 | 目标 | 示例 |
|
|
22
|
-
|------|------|------|------|
|
|
23
|
-
| **S**poofing | 身份伪造 | 认证 | 伪造 JWT、会话劫持 |
|
|
24
|
-
| **T**ampering | 数据篡改 | 完整性 | 修改请求参数、SQL注入 |
|
|
25
|
-
| **R**epudiation | 否认 | 不可否认性 | 无审计日志、删除操作记录 |
|
|
26
|
-
| **I**nformation Disclosure | 信息泄露 | 机密性 | 敏感数据暴露、目录遍历 |
|
|
27
|
-
| **D**enial of Service | 拒绝服务 | 可用性 | DDoS、资源耗尽 |
|
|
28
|
-
| **E**levation of Privilege | 权限提升 | 授权 | 越权访问、提权漏洞 |
|
|
29
|
-
|
|
30
|
-
### STRIDE 威胁建模模板
|
|
31
|
-
|
|
32
|
-
```yaml
|
|
33
|
-
# threat-model.yaml
|
|
34
|
-
system:
|
|
35
|
-
name: "用户认证系统"
|
|
36
|
-
version: "1.0"
|
|
37
|
-
owner: "安全团队"
|
|
38
|
-
|
|
39
|
-
assets:
|
|
40
|
-
- name: "用户凭证"
|
|
41
|
-
classification: "高度机密"
|
|
42
|
-
storage: "数据库加密存储"
|
|
43
|
-
|
|
44
|
-
- name: "会话令牌"
|
|
45
|
-
classification: "机密"
|
|
46
|
-
storage: "Redis + HttpOnly Cookie"
|
|
47
|
-
|
|
48
|
-
components:
|
|
49
|
-
- name: "Web 前端"
|
|
50
|
-
type: "客户端"
|
|
51
|
-
trust_level: "不可信"
|
|
52
|
-
|
|
53
|
-
- name: "API 网关"
|
|
54
|
-
type: "服务端"
|
|
55
|
-
trust_level: "可信边界"
|
|
56
|
-
|
|
57
|
-
- name: "认证服务"
|
|
58
|
-
type: "服务端"
|
|
59
|
-
trust_level: "可信"
|
|
60
|
-
|
|
61
|
-
data_flows:
|
|
62
|
-
- id: "DF-01"
|
|
63
|
-
source: "Web 前端"
|
|
64
|
-
destination: "API 网关"
|
|
65
|
-
protocol: "HTTPS"
|
|
66
|
-
data: "用户名/密码"
|
|
67
|
-
trust_boundary: true
|
|
68
|
-
|
|
69
|
-
threats:
|
|
70
|
-
- id: "T-001"
|
|
71
|
-
category: "Spoofing"
|
|
72
|
-
component: "API 网关"
|
|
73
|
-
description: "攻击者伪造 JWT 令牌"
|
|
74
|
-
impact: "高"
|
|
75
|
-
likelihood: "中"
|
|
76
|
-
risk: "高"
|
|
77
|
-
mitigations:
|
|
78
|
-
- "使用强签名算法 (RS256)"
|
|
79
|
-
- "验证 iss/aud/exp 声明"
|
|
80
|
-
- "密钥轮转策略"
|
|
81
|
-
status: "已缓解"
|
|
82
|
-
|
|
83
|
-
- id: "T-002"
|
|
84
|
-
category: "Information Disclosure"
|
|
85
|
-
component: "认证服务"
|
|
86
|
-
description: "错误消息泄露用户存在性"
|
|
87
|
-
impact: "低"
|
|
88
|
-
likelihood: "高"
|
|
89
|
-
risk: "中"
|
|
90
|
-
mitigations:
|
|
91
|
-
- "统一错误消息"
|
|
92
|
-
- "限制登录尝试次数"
|
|
93
|
-
status: "已缓解"
|
|
94
|
-
```
|
|
95
|
-
|
|
96
|
-
### STRIDE 自动化分析
|
|
97
|
-
|
|
98
|
-
```python
|
|
99
|
-
#!/usr/bin/env python3
|
|
100
|
-
"""STRIDE 威胁自动枚举"""
|
|
101
|
-
import yaml
|
|
102
|
-
from typing import List, Dict
|
|
103
|
-
|
|
104
|
-
STRIDE_RULES = {
|
|
105
|
-
"Spoofing": [
|
|
106
|
-
"是否验证用户身份?",
|
|
107
|
-
"是否使用强认证机制?",
|
|
108
|
-
"是否防护会话劫持?"
|
|
109
|
-
],
|
|
110
|
-
"Tampering": [
|
|
111
|
-
"数据传输是否加密?",
|
|
112
|
-
"是否验证输入完整性?",
|
|
113
|
-
"是否使用签名/HMAC?"
|
|
114
|
-
],
|
|
115
|
-
"Repudiation": [
|
|
116
|
-
"是否记录审计日志?",
|
|
117
|
-
"日志是否防篡改?",
|
|
118
|
-
"是否支持不可否认性?"
|
|
119
|
-
],
|
|
120
|
-
"Information Disclosure": [
|
|
121
|
-
"敏感数据是否加密?",
|
|
122
|
-
"是否存在信息泄露点?",
|
|
123
|
-
"错误消息是否安全?"
|
|
124
|
-
],
|
|
125
|
-
"Denial of Service": [
|
|
126
|
-
"是否有速率限制?",
|
|
127
|
-
"是否防护资源耗尽?",
|
|
128
|
-
"是否有熔断机制?"
|
|
129
|
-
],
|
|
130
|
-
"Elevation of Privilege": [
|
|
131
|
-
"是否实施最小权限?",
|
|
132
|
-
"是否验证授权?",
|
|
133
|
-
"是否防护提权攻击?"
|
|
134
|
-
]
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
def analyze_component(component: Dict) -> List[Dict]:
|
|
138
|
-
"""分析组件威胁"""
|
|
139
|
-
threats = []
|
|
140
|
-
trust_level = component.get("trust_level", "不可信")
|
|
141
|
-
|
|
142
|
-
for category, questions in STRIDE_RULES.items():
|
|
143
|
-
threat = {
|
|
144
|
-
"component": component["name"],
|
|
145
|
-
"category": category,
|
|
146
|
-
"questions": questions,
|
|
147
|
-
"risk_level": "高" if trust_level == "不可信" else "中"
|
|
148
|
-
}
|
|
149
|
-
threats.append(threat)
|
|
150
|
-
|
|
151
|
-
return threats
|
|
152
|
-
|
|
153
|
-
def generate_report(model_file: str):
|
|
154
|
-
"""生成威胁报告"""
|
|
155
|
-
with open(model_file) as f:
|
|
156
|
-
model = yaml.safe_load(f)
|
|
157
|
-
|
|
158
|
-
print(f"# 威胁建模报告: {model['system']['name']}\n")
|
|
159
|
-
|
|
160
|
-
for component in model.get("components", []):
|
|
161
|
-
print(f"## 组件: {component['name']}")
|
|
162
|
-
threats = analyze_component(component)
|
|
163
|
-
|
|
164
|
-
for threat in threats:
|
|
165
|
-
print(f"\n### {threat['category']} (风险: {threat['risk_level']})")
|
|
166
|
-
for q in threat['questions']:
|
|
167
|
-
print(f" - {q}")
|
|
168
|
-
|
|
169
|
-
if __name__ == "__main__":
|
|
170
|
-
generate_report("threat-model.yaml")
|
|
171
|
-
```
|
|
172
|
-
|
|
173
|
-
## PASTA 方法论
|
|
174
|
-
|
|
175
|
-
### PASTA 七阶段流程
|
|
176
|
-
|
|
177
|
-
```
|
|
178
|
-
阶段 I → 阶段 II → 阶段 III → 阶段 IV → 阶段 V → 阶段 VI → 阶段 VII
|
|
179
|
-
定义目标 技术范围 应用分解 威胁分析 漏洞分析 攻击建模 风险管理
|
|
180
|
-
│ │ │ │ │ │ │
|
|
181
|
-
业务影响 架构图谱 数据流图 威胁情报 弱点枚举 攻击树 缓解策略
|
|
182
|
-
```
|
|
183
|
-
|
|
184
|
-
### PASTA 阶段实施
|
|
185
|
-
|
|
186
|
-
```python
|
|
187
|
-
#!/usr/bin/env python3
|
|
188
|
-
"""PASTA 威胁建模框架"""
|
|
189
|
-
from dataclasses import dataclass
|
|
190
|
-
from typing import List
|
|
191
|
-
from enum import Enum
|
|
192
|
-
|
|
193
|
-
class PastaStage(Enum):
|
|
194
|
-
OBJECTIVES = 1 # 定义目标
|
|
195
|
-
SCOPE = 2 # 技术范围
|
|
196
|
-
DECOMPOSITION = 3 # 应用分解
|
|
197
|
-
THREAT_ANALYSIS = 4 # 威胁分析
|
|
198
|
-
VULNERABILITY = 5 # 漏洞分析
|
|
199
|
-
ATTACK_MODELING = 6 # 攻击建模
|
|
200
|
-
RISK_MANAGEMENT = 7 # 风险管理
|
|
201
|
-
|
|
202
|
-
@dataclass
|
|
203
|
-
class BusinessObjective:
|
|
204
|
-
"""业务目标"""
|
|
205
|
-
name: str
|
|
206
|
-
description: str
|
|
207
|
-
security_requirements: List[str]
|
|
208
|
-
compliance: List[str]
|
|
209
|
-
|
|
210
|
-
@dataclass
|
|
211
|
-
class TechnicalScope:
|
|
212
|
-
"""技术范围"""
|
|
213
|
-
components: List[str]
|
|
214
|
-
technologies: List[str]
|
|
215
|
-
trust_boundaries: List[str]
|
|
216
|
-
data_classification: dict
|
|
217
|
-
|
|
218
|
-
@dataclass
|
|
219
|
-
class Threat:
|
|
220
|
-
"""威胁"""
|
|
221
|
-
id: str
|
|
222
|
-
name: str
|
|
223
|
-
category: str
|
|
224
|
-
likelihood: str
|
|
225
|
-
impact: str
|
|
226
|
-
attack_vector: str
|
|
227
|
-
|
|
228
|
-
class PASTAModel:
|
|
229
|
-
def __init__(self, system_name: str):
|
|
230
|
-
self.system_name = system_name
|
|
231
|
-
self.objectives = []
|
|
232
|
-
self.scope = None
|
|
233
|
-
self.threats = []
|
|
234
|
-
self.vulnerabilities = []
|
|
235
|
-
self.attacks = []
|
|
236
|
-
self.risks = []
|
|
237
|
-
|
|
238
|
-
def stage1_define_objectives(self, objectives: List[BusinessObjective]):
|
|
239
|
-
"""阶段 I: 定义业务目标"""
|
|
240
|
-
self.objectives = objectives
|
|
241
|
-
print(f"[Stage I] 已定义 {len(objectives)} 个业务目标")
|
|
242
|
-
|
|
243
|
-
def stage2_define_scope(self, scope: TechnicalScope):
|
|
244
|
-
"""阶段 II: 定义技术范围"""
|
|
245
|
-
self.scope = scope
|
|
246
|
-
print(f"[Stage II] 范围包含 {len(scope.components)} 个组件")
|
|
247
|
-
|
|
248
|
-
def stage3_decompose_application(self):
|
|
249
|
-
"""阶段 III: 应用分解"""
|
|
250
|
-
# 生成数据流图、架构图
|
|
251
|
-
print("[Stage III] 应用分解完成")
|
|
252
|
-
|
|
253
|
-
def stage4_analyze_threats(self, threat_intel: List[Threat]):
|
|
254
|
-
"""阶段 IV: 威胁分析"""
|
|
255
|
-
self.threats = threat_intel
|
|
256
|
-
print(f"[Stage IV] 识别 {len(threat_intel)} 个威胁")
|
|
257
|
-
|
|
258
|
-
def stage5_analyze_vulnerabilities(self):
|
|
259
|
-
"""阶段 V: 漏洞分析"""
|
|
260
|
-
# 扫描已知漏洞
|
|
261
|
-
print("[Stage V] 漏洞分析完成")
|
|
262
|
-
|
|
263
|
-
def stage6_model_attacks(self):
|
|
264
|
-
"""阶段 VI: 攻击建模"""
|
|
265
|
-
# 构建攻击树
|
|
266
|
-
print("[Stage VI] 攻击建模完成")
|
|
267
|
-
|
|
268
|
-
def stage7_manage_risks(self):
|
|
269
|
-
"""阶段 VII: 风险管理"""
|
|
270
|
-
# 计算风险评分,制定缓解策略
|
|
271
|
-
print("[Stage VII] 风险管理完成")
|
|
272
|
-
|
|
273
|
-
def generate_report(self) -> str:
|
|
274
|
-
"""生成完整报告"""
|
|
275
|
-
report = f"# PASTA 威胁建模报告: {self.system_name}\n\n"
|
|
276
|
-
report += f"## 业务目标\n"
|
|
277
|
-
for obj in self.objectives:
|
|
278
|
-
report += f"- {obj.name}: {obj.description}\n"
|
|
279
|
-
return report
|
|
280
|
-
|
|
281
|
-
# 使用示例
|
|
282
|
-
model = PASTAModel("电商支付系统")
|
|
283
|
-
model.stage1_define_objectives([
|
|
284
|
-
BusinessObjective(
|
|
285
|
-
name="保护支付数据",
|
|
286
|
-
description="确保支付信息机密性和完整性",
|
|
287
|
-
security_requirements=["加密传输", "PCI DSS合规"],
|
|
288
|
-
compliance=["PCI DSS", "GDPR"]
|
|
289
|
-
)
|
|
290
|
-
])
|
|
291
|
-
```
|
|
292
|
-
|
|
293
|
-
## 攻击树建模
|
|
294
|
-
|
|
295
|
-
### 攻击树结构
|
|
296
|
-
|
|
297
|
-
```
|
|
298
|
-
[窃取用户资金]
|
|
299
|
-
│
|
|
300
|
-
┌─────────────────┼─────────────────┐
|
|
301
|
-
│ │ │
|
|
302
|
-
[盗取凭证] [篡改交易] [社会工程]
|
|
303
|
-
│ │ │
|
|
304
|
-
┌───┴───┐ ┌───┴───┐ ┌───┴───┐
|
|
305
|
-
[钓鱼] [暴力破解] [MITM] [SQL注入] [钓鱼] [假冒客服]
|
|
306
|
-
```
|
|
307
|
-
|
|
308
|
-
### 攻击树 DSL
|
|
309
|
-
|
|
310
|
-
```yaml
|
|
311
|
-
# attack-tree.yaml
|
|
312
|
-
attack_tree:
|
|
313
|
-
root:
|
|
314
|
-
goal: "窃取用户资金"
|
|
315
|
-
type: "OR"
|
|
316
|
-
children:
|
|
317
|
-
- goal: "盗取凭证"
|
|
318
|
-
type: "OR"
|
|
319
|
-
cost: "低"
|
|
320
|
-
skill: "中"
|
|
321
|
-
detection: "中"
|
|
322
|
-
children:
|
|
323
|
-
- goal: "钓鱼攻击"
|
|
324
|
-
type: "LEAF"
|
|
325
|
-
cost: "低"
|
|
326
|
-
skill: "低"
|
|
327
|
-
detection: "低"
|
|
328
|
-
success_rate: 0.15
|
|
329
|
-
mitigations:
|
|
330
|
-
- "安全意识培训"
|
|
331
|
-
- "邮件过滤"
|
|
332
|
-
- "2FA"
|
|
333
|
-
|
|
334
|
-
- goal: "暴力破解"
|
|
335
|
-
type: "LEAF"
|
|
336
|
-
cost: "低"
|
|
337
|
-
skill: "低"
|
|
338
|
-
detection: "高"
|
|
339
|
-
success_rate: 0.05
|
|
340
|
-
mitigations:
|
|
341
|
-
- "账户锁定策略"
|
|
342
|
-
- "验证码"
|
|
343
|
-
- "速率限制"
|
|
344
|
-
|
|
345
|
-
- goal: "篡改交易"
|
|
346
|
-
type: "AND"
|
|
347
|
-
cost: "高"
|
|
348
|
-
skill: "高"
|
|
349
|
-
detection: "高"
|
|
350
|
-
children:
|
|
351
|
-
- goal: "拦截通信"
|
|
352
|
-
type: "LEAF"
|
|
353
|
-
mitigations: ["TLS 1.3", "证书固定"]
|
|
354
|
-
|
|
355
|
-
- goal: "绕过签名验证"
|
|
356
|
-
type: "LEAF"
|
|
357
|
-
mitigations: ["HMAC-SHA256", "密钥管理"]
|
|
358
|
-
```
|
|
359
|
-
|
|
360
|
-
### 攻击树分析工具
|
|
361
|
-
|
|
362
|
-
```python
|
|
363
|
-
#!/usr/bin/env python3
|
|
364
|
-
"""攻击树风险计算"""
|
|
365
|
-
import yaml
|
|
366
|
-
from typing import Dict, List
|
|
367
|
-
|
|
368
|
-
class AttackNode:
|
|
369
|
-
def __init__(self, data: Dict):
|
|
370
|
-
self.goal = data["goal"]
|
|
371
|
-
self.type = data["type"]
|
|
372
|
-
self.cost = data.get("cost", "未知")
|
|
373
|
-
self.skill = data.get("skill", "未知")
|
|
374
|
-
self.detection = data.get("detection", "未知")
|
|
375
|
-
self.success_rate = data.get("success_rate", 0.0)
|
|
376
|
-
self.mitigations = data.get("mitigations", [])
|
|
377
|
-
self.children = [AttackNode(c) for c in data.get("children", [])]
|
|
378
|
-
|
|
379
|
-
def calculate_risk(self) -> float:
|
|
380
|
-
"""计算攻击成功概率"""
|
|
381
|
-
if self.type == "LEAF":
|
|
382
|
-
return self.success_rate
|
|
383
|
-
|
|
384
|
-
if self.type == "OR":
|
|
385
|
-
# OR 节点:至少一个子节点成功
|
|
386
|
-
prob = 0.0
|
|
387
|
-
for child in self.children:
|
|
388
|
-
prob = prob + child.calculate_risk() - prob * child.calculate_risk()
|
|
389
|
-
return prob
|
|
390
|
-
|
|
391
|
-
if self.type == "AND":
|
|
392
|
-
# AND 节点:所有子节点都成功
|
|
393
|
-
prob = 1.0
|
|
394
|
-
for child in self.children:
|
|
395
|
-
prob *= child.calculate_risk()
|
|
396
|
-
return prob
|
|
397
|
-
|
|
398
|
-
return 0.0
|
|
399
|
-
|
|
400
|
-
def get_critical_paths(self, threshold: float = 0.1) -> List[str]:
|
|
401
|
-
"""获取高风险路径"""
|
|
402
|
-
paths = []
|
|
403
|
-
risk = self.calculate_risk()
|
|
404
|
-
|
|
405
|
-
if risk >= threshold:
|
|
406
|
-
path = f"{self.goal} (风险: {risk:.2%})"
|
|
407
|
-
paths.append(path)
|
|
408
|
-
|
|
409
|
-
for child in self.children:
|
|
410
|
-
child_paths = child.get_critical_paths(threshold)
|
|
411
|
-
paths.extend([f" └─ {p}" for p in child_paths])
|
|
412
|
-
|
|
413
|
-
return paths
|
|
414
|
-
|
|
415
|
-
def analyze_attack_tree(tree_file: str):
|
|
416
|
-
"""分析攻击树"""
|
|
417
|
-
with open(tree_file) as f:
|
|
418
|
-
data = yaml.safe_load(f)
|
|
419
|
-
|
|
420
|
-
root = AttackNode(data["attack_tree"]["root"])
|
|
421
|
-
|
|
422
|
-
print(f"攻击目标: {root.goal}")
|
|
423
|
-
print(f"总体风险: {root.calculate_risk():.2%}\n")
|
|
424
|
-
print("高风险路径:")
|
|
425
|
-
for path in root.get_critical_paths():
|
|
426
|
-
print(path)
|
|
427
|
-
|
|
428
|
-
if __name__ == "__main__":
|
|
429
|
-
analyze_attack_tree("attack-tree.yaml")
|
|
430
|
-
```
|
|
431
|
-
|
|
432
|
-
## 威胁矩阵 (MITRE ATT&CK)
|
|
433
|
-
|
|
434
|
-
### ATT&CK 战术映射
|
|
435
|
-
|
|
436
|
-
```python
|
|
437
|
-
#!/usr/bin/env python3
|
|
438
|
-
"""MITRE ATT&CK 威胁映射"""
|
|
439
|
-
from typing import List, Dict
|
|
440
|
-
|
|
441
|
-
ATTACK_TACTICS = {
|
|
442
|
-
"TA0001": "初始访问 (Initial Access)",
|
|
443
|
-
"TA0002": "执行 (Execution)",
|
|
444
|
-
"TA0003": "持久化 (Persistence)",
|
|
445
|
-
"TA0004": "权限提升 (Privilege Escalation)",
|
|
446
|
-
"TA0005": "防御规避 (Defense Evasion)",
|
|
447
|
-
"TA0006": "凭证访问 (Credential Access)",
|
|
448
|
-
"TA0007": "发现 (Discovery)",
|
|
449
|
-
"TA0008": "横向移动 (Lateral Movement)",
|
|
450
|
-
"TA0009": "收集 (Collection)",
|
|
451
|
-
"TA0010": "渗出 (Exfiltration)",
|
|
452
|
-
"TA0011": "影响 (Impact)"
|
|
453
|
-
}
|
|
454
|
-
|
|
455
|
-
class ThreatMapping:
|
|
456
|
-
def __init__(self):
|
|
457
|
-
self.mappings = []
|
|
458
|
-
|
|
459
|
-
def add_threat(self, threat: Dict):
|
|
460
|
-
"""添加威胁映射"""
|
|
461
|
-
self.mappings.append(threat)
|
|
462
|
-
|
|
463
|
-
def generate_matrix(self) -> str:
|
|
464
|
-
"""生成威胁矩阵"""
|
|
465
|
-
matrix = "# ATT&CK 威胁矩阵\n\n"
|
|
466
|
-
|
|
467
|
-
for tactic_id, tactic_name in ATTACK_TACTICS.items():
|
|
468
|
-
threats = [t for t in self.mappings if tactic_id in t.get("tactics", [])]
|
|
469
|
-
|
|
470
|
-
if threats:
|
|
471
|
-
matrix += f"## {tactic_name}\n\n"
|
|
472
|
-
matrix += "| 技术 | 检测 | 缓解 |\n"
|
|
473
|
-
matrix += "|------|------|------|\n"
|
|
474
|
-
|
|
475
|
-
for threat in threats:
|
|
476
|
-
matrix += f"| {threat['technique']} | "
|
|
477
|
-
matrix += f"{threat.get('detection', 'N/A')} | "
|
|
478
|
-
matrix += f"{threat.get('mitigation', 'N/A')} |\n"
|
|
479
|
-
|
|
480
|
-
matrix += "\n"
|
|
481
|
-
|
|
482
|
-
return matrix
|
|
483
|
-
|
|
484
|
-
# 使用示例
|
|
485
|
-
mapping = ThreatMapping()
|
|
486
|
-
mapping.add_threat({
|
|
487
|
-
"technique": "T1566.001 - 钓鱼邮件",
|
|
488
|
-
"tactics": ["TA0001"],
|
|
489
|
-
"detection": "邮件网关检测",
|
|
490
|
-
"mitigation": "安全意识培训"
|
|
491
|
-
})
|
|
492
|
-
mapping.add_threat({
|
|
493
|
-
"technique": "T1078 - 有效账户",
|
|
494
|
-
"tactics": ["TA0001", "TA0003", "TA0004"],
|
|
495
|
-
"detection": "异常登录检测",
|
|
496
|
-
"mitigation": "MFA + 最小权限"
|
|
497
|
-
})
|
|
498
|
-
|
|
499
|
-
print(mapping.generate_matrix())
|
|
500
|
-
```
|
|
501
|
-
|
|
502
|
-
### ATT&CK Navigator 配置
|
|
503
|
-
|
|
504
|
-
```json
|
|
505
|
-
{
|
|
506
|
-
"name": "威胁覆盖矩阵",
|
|
507
|
-
"versions": {
|
|
508
|
-
"attack": "14",
|
|
509
|
-
"navigator": "4.9.1",
|
|
510
|
-
"layer": "4.5"
|
|
511
|
-
},
|
|
512
|
-
"domain": "enterprise-attack",
|
|
513
|
-
"description": "组织威胁覆盖情况",
|
|
514
|
-
"techniques": [
|
|
515
|
-
{
|
|
516
|
-
"techniqueID": "T1566.001",
|
|
517
|
-
"tactic": "initial-access",
|
|
518
|
-
"color": "#ff6666",
|
|
519
|
-
"comment": "高风险:钓鱼攻击频繁",
|
|
520
|
-
"enabled": true,
|
|
521
|
-
"score": 90
|
|
522
|
-
},
|
|
523
|
-
{
|
|
524
|
-
"techniqueID": "T1078",
|
|
525
|
-
"tactic": "persistence",
|
|
526
|
-
"color": "#ffcc66",
|
|
527
|
-
"comment": "中风险:凭证管理待加强",
|
|
528
|
-
"enabled": true,
|
|
529
|
-
"score": 60
|
|
530
|
-
}
|
|
531
|
-
]
|
|
532
|
-
}
|
|
533
|
-
```
|
|
534
|
-
|
|
535
|
-
## 风险评估
|
|
536
|
-
|
|
537
|
-
### CVSS 评分计算
|
|
538
|
-
|
|
539
|
-
```python
|
|
540
|
-
#!/usr/bin/env python3
|
|
541
|
-
"""CVSS v3.1 评分计算器"""
|
|
542
|
-
from enum import Enum
|
|
543
|
-
|
|
544
|
-
class AttackVector(Enum):
|
|
545
|
-
NETWORK = 0.85
|
|
546
|
-
ADJACENT = 0.62
|
|
547
|
-
LOCAL = 0.55
|
|
548
|
-
PHYSICAL = 0.2
|
|
549
|
-
|
|
550
|
-
class AttackComplexity(Enum):
|
|
551
|
-
LOW = 0.77
|
|
552
|
-
HIGH = 0.44
|
|
553
|
-
|
|
554
|
-
class Impact(Enum):
|
|
555
|
-
HIGH = 0.56
|
|
556
|
-
LOW = 0.22
|
|
557
|
-
NONE = 0.0
|
|
558
|
-
|
|
559
|
-
def calculate_cvss(av: AttackVector, ac: AttackComplexity,
|
|
560
|
-
c_impact: Impact, i_impact: Impact, a_impact: Impact) -> float:
|
|
561
|
-
"""计算 CVSS 基础分"""
|
|
562
|
-
# 简化计算(实际 CVSS 更复杂)
|
|
563
|
-
exploitability = 8.22 * av.value * ac.value
|
|
564
|
-
impact_score = 1 - ((1 - c_impact.value) * (1 - i_impact.value) * (1 - a_impact.value))
|
|
565
|
-
|
|
566
|
-
if impact_score <= 0:
|
|
567
|
-
return 0.0
|
|
568
|
-
|
|
569
|
-
base_score = min(10.0, (exploitability + impact_score * 10) * 0.6)
|
|
570
|
-
return round(base_score, 1)
|
|
571
|
-
|
|
572
|
-
# 示例:远程 SQL 注入
|
|
573
|
-
score = calculate_cvss(
|
|
574
|
-
AttackVector.NETWORK,
|
|
575
|
-
AttackComplexity.LOW,
|
|
576
|
-
Impact.HIGH, # 机密性
|
|
577
|
-
Impact.HIGH, # 完整性
|
|
578
|
-
Impact.HIGH # 可用性
|
|
579
|
-
)
|
|
580
|
-
print(f"CVSS 评分: {score} (严重)")
|
|
581
|
-
```
|
|
582
|
-
|
|
583
|
-
### 风险矩阵
|
|
584
|
-
|
|
585
|
-
```python
|
|
586
|
-
#!/usr/bin/env python3
|
|
587
|
-
"""风险评估矩阵"""
|
|
588
|
-
|
|
589
|
-
LIKELIHOOD = {
|
|
590
|
-
"极低": 1,
|
|
591
|
-
"低": 2,
|
|
592
|
-
"中": 3,
|
|
593
|
-
"高": 4,
|
|
594
|
-
"极高": 5
|
|
595
|
-
}
|
|
596
|
-
|
|
597
|
-
IMPACT = {
|
|
598
|
-
"可忽略": 1,
|
|
599
|
-
"低": 2,
|
|
600
|
-
"中": 3,
|
|
601
|
-
"高": 4,
|
|
602
|
-
"严重": 5
|
|
603
|
-
}
|
|
604
|
-
|
|
605
|
-
def calculate_risk(likelihood: str, impact: str) -> tuple:
|
|
606
|
-
"""计算风险等级"""
|
|
607
|
-
score = LIKELIHOOD[likelihood] * IMPACT[impact]
|
|
608
|
-
|
|
609
|
-
if score >= 15:
|
|
610
|
-
return (score, "严重", "立即处理")
|
|
611
|
-
elif score >= 10:
|
|
612
|
-
return (score, "高", "优先处理")
|
|
613
|
-
elif score >= 6:
|
|
614
|
-
return (score, "中", "计划处理")
|
|
615
|
-
else:
|
|
616
|
-
return (score, "低", "监控")
|
|
617
|
-
|
|
618
|
-
# 风险评估示例
|
|
619
|
-
threats = [
|
|
620
|
-
{"name": "SQL 注入", "likelihood": "高", "impact": "严重"},
|
|
621
|
-
{"name": "XSS", "likelihood": "中", "impact": "中"},
|
|
622
|
-
{"name": "信息泄露", "likelihood": "低", "impact": "高"}
|
|
623
|
-
]
|
|
624
|
-
|
|
625
|
-
print("风险评估结果:\n")
|
|
626
|
-
for threat in threats:
|
|
627
|
-
score, level, action = calculate_risk(threat["likelihood"], threat["impact"])
|
|
628
|
-
print(f"{threat['name']}: {level} (评分: {score}) - {action}")
|
|
629
|
-
```
|
|
630
|
-
|
|
631
|
-
## 数据流图 (DFD)
|
|
632
|
-
|
|
633
|
-
### DFD 建模
|
|
634
|
-
|
|
635
|
-
```
|
|
636
|
-
外部实体 进程 数据存储
|
|
637
|
-
┌─────────┐ ╔═════════╗ ║ ║
|
|
638
|
-
│ 用户 │ ───> ║ Web服务 ║ ───> ║ 数据库 ║
|
|
639
|
-
└─────────┘ ╚═════════╝ ║ ║
|
|
640
|
-
│
|
|
641
|
-
v
|
|
642
|
-
[数据流]
|
|
643
|
-
```
|
|
644
|
-
|
|
645
|
-
### DFD Python 生成
|
|
646
|
-
|
|
647
|
-
```python
|
|
648
|
-
#!/usr/bin/env python3
|
|
649
|
-
"""数据流图生成器"""
|
|
650
|
-
from dataclasses import dataclass
|
|
651
|
-
from typing import List
|
|
652
|
-
|
|
653
|
-
@dataclass
|
|
654
|
-
class Entity:
|
|
655
|
-
"""外部实体"""
|
|
656
|
-
id: str
|
|
657
|
-
name: str
|
|
658
|
-
type: str # external/process/datastore
|
|
659
|
-
|
|
660
|
-
@dataclass
|
|
661
|
-
class DataFlow:
|
|
662
|
-
"""数据流"""
|
|
663
|
-
id: str
|
|
664
|
-
source: str
|
|
665
|
-
destination: str
|
|
666
|
-
data: str
|
|
667
|
-
protocol: str
|
|
668
|
-
encrypted: bool
|
|
669
|
-
|
|
670
|
-
class DFDModel:
|
|
671
|
-
def __init__(self):
|
|
672
|
-
self.entities = []
|
|
673
|
-
self.flows = []
|
|
674
|
-
|
|
675
|
-
def add_entity(self, entity: Entity):
|
|
676
|
-
self.entities.append(entity)
|
|
677
|
-
|
|
678
|
-
def add_flow(self, flow: DataFlow):
|
|
679
|
-
self.flows.append(flow)
|
|
680
|
-
|
|
681
|
-
def identify_trust_boundaries(self) -> List[DataFlow]:
|
|
682
|
-
"""识别信任边界"""
|
|
683
|
-
boundaries = []
|
|
684
|
-
for flow in self.flows:
|
|
685
|
-
src = next(e for e in self.entities if e.id == flow.source)
|
|
686
|
-
dst = next(e for e in self.entities if e.id == flow.destination)
|
|
687
|
-
|
|
688
|
-
if src.type == "external" or dst.type == "external":
|
|
689
|
-
boundaries.append(flow)
|
|
690
|
-
|
|
691
|
-
return boundaries
|
|
692
|
-
|
|
693
|
-
def generate_threats(self) -> List[dict]:
|
|
694
|
-
"""基于 DFD 生成威胁"""
|
|
695
|
-
threats = []
|
|
696
|
-
boundaries = self.identify_trust_boundaries()
|
|
697
|
-
|
|
698
|
-
for flow in boundaries:
|
|
699
|
-
if not flow.encrypted:
|
|
700
|
-
threats.append({
|
|
701
|
-
"flow": flow.id,
|
|
702
|
-
"threat": "数据传输未加密",
|
|
703
|
-
"category": "Information Disclosure",
|
|
704
|
-
"severity": "高"
|
|
705
|
-
})
|
|
706
|
-
|
|
707
|
-
return threats
|
|
708
|
-
|
|
709
|
-
# 使用示例
|
|
710
|
-
dfd = DFDModel()
|
|
711
|
-
dfd.add_entity(Entity("E1", "用户", "external"))
|
|
712
|
-
dfd.add_entity(Entity("P1", "Web服务", "process"))
|
|
713
|
-
dfd.add_entity(Entity("D1", "数据库", "datastore"))
|
|
714
|
-
|
|
715
|
-
dfd.add_flow(DataFlow("F1", "E1", "P1", "登录凭证", "HTTPS", True))
|
|
716
|
-
dfd.add_flow(DataFlow("F2", "P1", "D1", "SQL查询", "TCP", False))
|
|
717
|
-
|
|
718
|
-
threats = dfd.generate_threats()
|
|
719
|
-
for threat in threats:
|
|
720
|
-
print(f"[{threat['severity']}] {threat['flow']}: {threat['threat']}")
|
|
721
|
-
```
|
|
722
|
-
|
|
723
|
-
## 缓解措施库
|
|
724
|
-
|
|
725
|
-
### 安全控制映射
|
|
726
|
-
|
|
727
|
-
```yaml
|
|
728
|
-
# security-controls.yaml
|
|
729
|
-
controls:
|
|
730
|
-
- id: "AC-01"
|
|
731
|
-
name: "访问控制策略"
|
|
732
|
-
category: "访问控制"
|
|
733
|
-
mitigates:
|
|
734
|
-
- "Spoofing"
|
|
735
|
-
- "Elevation of Privilege"
|
|
736
|
-
implementation:
|
|
737
|
-
- "实施 RBAC"
|
|
738
|
-
- "最小权限原则"
|
|
739
|
-
- "定期权限审计"
|
|
740
|
-
|
|
741
|
-
- id: "SC-08"
|
|
742
|
-
name: "传输机密性"
|
|
743
|
-
category: "系统通信"
|
|
744
|
-
mitigates:
|
|
745
|
-
- "Information Disclosure"
|
|
746
|
-
- "Tampering"
|
|
747
|
-
implementation:
|
|
748
|
-
- "强制 TLS 1.3"
|
|
749
|
-
- "证书固定"
|
|
750
|
-
- "禁用弱加密套件"
|
|
751
|
-
|
|
752
|
-
- id: "AU-02"
|
|
753
|
-
name: "审计事件"
|
|
754
|
-
category: "审计与问责"
|
|
755
|
-
mitigates:
|
|
756
|
-
- "Repudiation"
|
|
757
|
-
implementation:
|
|
758
|
-
- "记录所有安全事件"
|
|
759
|
-
- "集中日志管理"
|
|
760
|
-
- "日志完整性保护"
|
|
761
|
-
```
|
|
762
|
-
|
|
763
|
-
## 威胁建模工具
|
|
764
|
-
|
|
765
|
-
| 工具 | 类型 | 特点 |
|
|
766
|
-
|------|------|------|
|
|
767
|
-
| Microsoft Threat Modeling Tool | 桌面应用 | STRIDE 自动化 |
|
|
768
|
-
| OWASP Threat Dragon | Web/桌面 | 开源、DFD 支持 |
|
|
769
|
-
| IriusRisk | 商业平台 | 自动化威胁库 |
|
|
770
|
-
| Threagile | CLI | 代码化威胁建模 |
|
|
771
|
-
| PyTM | Python 库 | 编程式建模 |
|
|
772
|
-
|
|
773
|
-
## 最佳实践
|
|
774
|
-
|
|
775
|
-
### 威胁建模检查清单
|
|
776
|
-
|
|
777
|
-
```markdown
|
|
778
|
-
## 前期准备
|
|
779
|
-
- [ ] 识别关键资产和数据
|
|
780
|
-
- [ ] 定义安全目标和合规要求
|
|
781
|
-
- [ ] 组建跨职能团队
|
|
782
|
-
|
|
783
|
-
## 建模过程
|
|
784
|
-
- [ ] 绘制架构图和数据流图
|
|
785
|
-
- [ ] 标识信任边界
|
|
786
|
-
- [ ] 枚举威胁(STRIDE/PASTA)
|
|
787
|
-
- [ ] 评估风险等级
|
|
788
|
-
- [ ] 制定缓解措施
|
|
789
|
-
|
|
790
|
-
## 验证与维护
|
|
791
|
-
- [ ] 安全测试验证
|
|
792
|
-
- [ ] 定期更新模型
|
|
793
|
-
- [ ] 跟踪缓解措施实施
|
|
794
|
-
- [ ] 事件后复盘更新
|
|
795
|
-
```
|
|
796
|
-
|
|
797
|
-
### 持续威胁建模
|
|
798
|
-
|
|
799
|
-
```python
|
|
800
|
-
#!/usr/bin/env python3
|
|
801
|
-
"""持续威胁建模集成"""
|
|
802
|
-
import subprocess
|
|
803
|
-
import json
|
|
804
|
-
|
|
805
|
-
def threat_model_as_code():
|
|
806
|
-
"""威胁建模即代码"""
|
|
807
|
-
# 1. 从架构代码生成模型
|
|
808
|
-
subprocess.run(["terraform", "graph", "-type=plan"],
|
|
809
|
-
stdout=open("arch.dot", "w"))
|
|
810
|
-
|
|
811
|
-
# 2. 自动威胁分析
|
|
812
|
-
subprocess.run(["threagile", "analyze", "-model", "threat-model.yaml"])
|
|
813
|
-
|
|
814
|
-
# 3. 生成报告
|
|
815
|
-
with open("risks.json") as f:
|
|
816
|
-
risks = json.load(f)
|
|
817
|
-
|
|
818
|
-
# 4. 质量门禁
|
|
819
|
-
critical_risks = [r for r in risks if r["severity"] == "critical"]
|
|
820
|
-
if critical_risks:
|
|
821
|
-
print(f"发现 {len(critical_risks)} 个严重风险,阻止部署")
|
|
822
|
-
exit(1)
|
|
823
|
-
|
|
824
|
-
if __name__ == "__main__":
|
|
825
|
-
threat_model_as_code()
|
|
826
|
-
```
|
|
827
|
-
|
|
828
|
-
---
|