本文分享自华为云开发者社区《用CWE API 减轻软件产品中的安全风险》作者: Uncle_Tom
1. CWE REST API 推出的目的
8 月 8 号,CWE™ 计划推出了“CWE REST API”。
CWE™计划由美国网络安全与基础设施安全局(Cybersecurity & Infrastructure Security Agency(CISA))资助的国土安全系统工程与发展研究所(Homeland Security Systems Engineering and Development Institute(HSSEDI))运营。
“CWE REST API” 是一项由CWE REST API工作组推动的社区驱动的工作。API 的目的是简化安全软件和硬件架构师、EDA 工具开发人员、验证工程师之间的接口,用于减轻其产品,以及数据库本身中的安全风险。
从项目负责的两个主要负责人,一个来自Synopsys,另一个来自MITRE。
CWE REST API 为以下人员提供了一种简单有效的方式来保持 CWE 最新的内容信息:
- 漏洞管理领域的项目合作伙伴
- 软件 (software(SW)) 和硬件 (hardware(HW)) 开发人员
- 架构师
- 电子设计自动化 (electronic design automation(EDA)) 工具开发人员
- 验证工程师
- 其他关心降低其产品安全风险的人
API 推出为下游下游应用程序,始终保持最新状态,这将成为利用 CWE 内容更改的重大改进。
2. 访问 CWE REST API
用于访问 CWE REST API 的根 URL,无需注册或使用任何凭据即可使用。
建议使用 API 在本地填充 CWE 内容的缓存,每当有新版本可用时,都可以刷新该缓存。
CWE REST API 的根 URL: https://cwe-api.mitre.org/api/v1/
可以直接在浏览器中直接输入这个地址加上相应的请求。
-
例如查找当前的 API CWE 的版本
- 请求:
https://cwe-api.mitre.org/api/v1/cwe/version
- 响应回复
- 请求:
{
"ContentVersion": "4.15",
"ContentDate": "2024-07-16",
"TotalWeaknesses": 964,
"TotalCategories": 409,
"TotalViews": 54
}
可以看到当前版本为最新的 CWE 4.15,总共有 964 个弱点节点,409 个分类节点,54 个弱点视图。
有关 CWE 4.15 的介绍详见:《CWE 4.15 - AI/ML 引入的应用缺陷》
3. CWE REST API 简介
CWE REST API 的相关介绍放在了: https://github.com/CWE-CAPEC/REST-API-wg
- API 主要包含以下API:
3.1. 查找CWE 版本(/cwe/version)
-
API作用:查找当前 CWE 的版本
-
请求:
https://cwe-api.mitre.org/api/v1/cwe/version
-
响应回复
{
"ContentVersion": "4.15",
"ContentDate": "2024-07-16",
"TotalWeaknesses": 964,
"TotalCategories": 409,
"TotalViews": 54
}
3.2. 查找CWE ID 类型(/cwe/{id(s)})
-
API作用:查找一个或多个CWE ID的类型,ID之间使用逗号分隔。
-
请求:查找节点1400,284,1396,269,260,259,384 的类型
https://cwe-api.mitre.org/api/v1/cwe/1400,284,1396,269,260,259,384
-
响应回复
[
{
"Type": "view",
"ID": "1400"
},
{
"Type": "pillar_weakness",
"ID": "284"
},
{
"Type": "category",
"ID": "1396"
},
{
"Type": "class_weakness",
"ID": "269"
},
{
"Type": "base_weakness",
"ID": "260"
},
{
"Type": "variant_weakness",
"ID": "259"
},
{
"Type": "compound_weakness",
"ID": "384"
}
]
- 现有 CWE 节点类型
图标 | 类型 | 节点数量 | 说明 |
---|---|---|---|
视图(View) | 50 | 视图表示一种视角,人们可能会用它来查看目录中的弱点。 | |
支柱(Weakness-Pillar) | 10 | 最抽象的弱点类型,代表与之相关的所有类(class)/基本(base)/变体(Variant)的主题。 支柱不同于类别,因为从技术上讲,支柱仍然是一种描述错误的弱点,而类别则代表用于对相关事物进行分组的常见特征。 | |
分类(Category) | 374 | 分类是基于某些共同特征或属性的弱点的集合。类别主要用作CWE的组织机制,不应由外部源映射到。 | |
类别(Weakness-Class) | 110 | 一种以非常抽象的方式描述的弱点,通常与任何特定的语言或技术无关。 比支柱弱点更具体,但比基本弱点更笼统。 类级别的弱点通常用以:行为、属性和资源维度中的1-2来描述问题。 | |
基础(Weakness-Base) | 520 | 一种更具体的弱点类型,大部分与资源或技术无关,但具有足够的详细信息以提供检测和预防的特定方法。基本级别的弱点通常用以:行为、属性、技术、语言和资源维度中2-3个维度来描述问题。 | |
变体(Weakness-Variant) | 292 | 是与特定类型的产品相关的弱点,通常与特定的语言或技术相关。比基本弱点更具体。变体级别的弱点通常用以:行为、属性、技术、语言和资源维度中3-5个维度来描述问题。 | |
复合缺陷(Weakness-Compound)的组合(Composite)方式 | 7 | 由两个或多个不同的弱点组成的复合元素,其中所有弱点都必须同时存在才能出现潜在的弱点。消除任何弱点可以消除或显着降低风险。一个弱点 X 可以被“分解”为组件弱点 Y 和 Z。在某些情况下,一个弱点对于组合可能不是必不可少的,但改变其性质时,该弱点有可能会变成缺陷。 |
- 各类型之间的关系: > 、 > > > 、
3.3. 查找弱点节点信息(/cwe/weakness/{id(s)}
-
API作用:查找弱点节点的信息。
- 输入的是CWE 的ID;
- ID 的类型只能是:pillar_weakness, class_weakness, base_weakness, variant_weakness, compound_weakness;
- 可以同时输入多个 CWE ID,每个 ID 之间用逗号分隔。
-
请求:查找 CWE-120:未进行输入大小检查的缓冲区拷贝(传统缓冲区溢出) 的信息
https://cwe-api.mitre.org/api/v1/weakness/120
-
响应回复
3.4. 查找分类节点信息(/cwe/category/{id(s)})
-
API作用:查找分类节点的信息。
- 输入的是CWE 的ID;
- ID 的类型只能是:category;
- 可以同时输入多个 CWE ID,每个 ID 之间用逗号分隔。
-
请求:查找类别节点 CWE-1399:内存安全 的信息
https://cwe-api.mitre.org/api/v1/category/1399
-
响应回复
3.5. 查找视图节点信息(/cwe/view/{id(s)})
-
API作用:查找视图节点的信息。
- 输入的是CWE 的ID;
- ID 的类型只能是:view;
- 可以同时输入多个 CWE ID,每个 ID 之间用逗号分隔。
-
请求:查找视图 CWE-1400:软件安全保障综合分类 的信息
https://cwe-api.mitre.org/api/v1/cwe/view/1400
-
响应回复
3.6. 查找弱点节点在视图中的父节点(/cwe/{id}/parents?view={viewId})
-
API作用:查找弱点节点在不同视图中的父节点。
-
请求:CWE-272:最小特权原则违背 的父节点
https://cwe-api.mitre.org/api/v1/cwe/272/parents
-
响应回复
[
{
"Type": "class_weakness",
"ID": "271",
"ViewID": "1000",
"Primary_Parent": true
},
{
"Type": "category",
"ID": "1011",
"ViewID": "1008"
},
{
"Type": "category",
"ID": "1149",
"ViewID": "1133"
},
{
"Type": "category",
"ID": "1396",
"ViewID": "1400"
},
{
"Type": "category",
"ID": "265",
"ViewID": "699"
},
{
"Type": "category",
"ID": "254",
"ViewID": "700"
},
{
"Type": "category",
"ID": "748",
"ViewID": "734"
},
{
"Type": "category",
"ID": "859",
"ViewID": "844"
},
{
"Type": "category",
"ID": "901",
"ViewID": "888"
}
]
-
API作用:查找弱点节点在指定视图中的父节点。
-
请求:CWE-272:最小特权原则违背 在CWE-1000:研究者视图中的父节点
https://cwe-api.mitre.org/api/v1/cwe/623/parents?view=1000
-
响应回复
[
{
"Type": "class_weakness",
"ID": "271",
"ViewID": "1000",
"Primary_Parent": true
}
]
- CWE-272:最小特权原则违背 在CWE-1000:研究者视图 中的父节点是 CWE-271:特权放弃/降低错误
3.7. 查找弱点节点在视图中的后代节点(/cwe/{id}/descendants?view={viewId})
-
API作用:查找弱点节点在视图中的后代节点,即这个节点的所有子节点。
-
请求:查找 CWE-119:内存缓冲区边界内操作的限制不恰当 的后代节点
https://cwe-api.mitre.org/api/v1/cwe/119/descendants
-
响应回复
-
在视图:CWE-1000:研究者视图, CWE-1003:简化弱点映射到发布漏洞视图, CWE-1305:2020 CISQ 质量度量视图中都有弱点CWE-119:内存缓冲区边界内操作的限制不恰当 ,可以查找这个节点的后代节点。
-
API作用:查找弱点节点在指定视图中的后代节点。
-
请求:查找 CWE-119:内存缓冲区边界内操作的限制不恰当 在视图 CWE-1000:研究者视图 中的后代节点
https://cwe-api.mitre.org/api/v1/cwe/119/descendants?view=1000
-
响应回复
-
只查找CWE-1000:研究者视图中,CWE-119:内存缓冲区边界内操作的限制不恰当 的后代节点。
- CWE-1000:研究者视图中 CWE-119:内存缓冲区边界内操作的限制不恰当 的实际位置
3.8. 查找弱点节点的子节点(/cwe/{id}/children?view={viewId})
-
API作用:查找弱点节点在视图中的子节点,即这个节点的儿子节点。
-
请求:查找 CWE-119:内存缓冲区边界内操作的限制不恰当 在视图 CWE-1000:研究者视图 中的子节点
https://cwe-api.mitre.org/api/v1/cwe/119/children?view=1000
-
响应回复
-
[
{
"Type": "base_weakness",
"ID": "120",
"ViewID": "1000"
},
{
"Type": "base_weakness",
"ID": "125",
"ViewID": "1000"
},
{
"Type": "base_weakness",
"ID": "466",
"ViewID": "1000"
},
{
"Type": "base_weakness",
"ID": "786",
"ViewID": "1000"
},
{
"Type": "base_weakness",
"ID": "787",
"ViewID": "1000"
},
{
"Type": "base_weakness",
"ID": "788",
"ViewID": "1000"
},
{
"Type": "base_weakness",
"ID": "805",
"ViewID": "1000"
},
{
"Type": "base_weakness",
"ID": "822",
"ViewID": "1000"
},
{
"Type": "base_weakness",
"ID": "823",
"ViewID": "1000"
},
{
"Type": "base_weakness",
"ID": "824",
"ViewID": "1000"
},
{
"Type": "base_weakness",
"ID": "825",
"ViewID": "1000"
}
]
- CWE-1000:研究者视图中 CWE-119:内存缓冲区边界内操作的限制不恰当 的子节点
3.9. 查找弱点节点的祖先(/cwe/{id}/ancestors?view={viewId})
- API作用:查找弱点节点在各个视图中的祖先,即查找这个节点的父节点,直到根节点。
- 请求:查找 CWE-119:内存缓冲区边界内操作的限制不恰当 各视图 中祖先
https://cwe-api.mitre.org/api/v1/cwe/119/ancestors
- 响应回复
- 请求:查找 CWE-119:内存缓冲区边界内操作的限制不恰当 各视图 中祖先
很多视图中都包含 CWE-119:内存缓冲区边界内操作的限制不恰当。
- API作用:查找弱点节点在指定视图中的祖先。
-
请求:查找 CWE-119:内存缓冲区边界内操作的限制不恰当 在视图 CWE-1000:研究者视图 中祖先
https://cwe-api.mitre.org/api/v1/cwe/119/ancestors?view=1000
-
响应回复
-
[
{
"Data": {
"Type": "class_weakness",
"ID": "119",
"ViewID": "1000"
},
"Parents": [
{
"Data": {
"Type": "class_weakness",
"ID": "118",
"ViewID": "1000"
},
"Parents": [
{
"Data": {
"Type": "pillar_weakness",
"ID": "664",
"ViewID": "1000"
},
"Parents": [
{
"Data": {
"Type": "view",
"ID": "1000",
"ViewID": "1000"
},
"Parents": null
}
]
}
]
}
]
}
]
- CWE-119:内存缓冲区边界内操作的限制不恰当 在CWE-1000:研究者视图中的祖先
4. CWE REST API 提供的 CWE JSON 格式
在 https://github.com/CWE-CAPEC/REST-API-wg/ 还提供了 CWE 的 JSON 格式。
- REST-API 目录结构如下
4.1. Json Schema
Json schema 是用来定义Json 文件的格式。这里使用的是 2020-12 的版本: “https://json-schema.org/draft/2020-12/output/schema”
Json schema 存放在目录: specifications 目录下。
这些 Schema 为每个 Json 文件给出了 Json 文件格式的定义,包括 Json 结构,字段类型,枚举值等。可以用这些 Json schema 来校验里面的 Json文件。
4.2. CWE Json 文件
- 所有 CWE REST API 需要用到的 Json 文件 都存放在目录: json_repo 目录下。
- C 目录:存放 409 个 CWE 类 Json 文件;
- V 目录: 存放 54 个 CWE 视图 Json 文件;
- W 目录: 存放 964 个 CWE 弱点 Json 文件;
- 在项目的根目录下还有两个可以利用的 Json 文件:
- cwe.json: CWE 各节点信息;
- cwe_tree.json: CWE 节点关系;
5. 总结
- CWE REST API 为安全需要提供了一种简单的获取 CWE 信息的接口;
- API 提供了查找:版本、节点类型、节点(弱点、类、视图)信息, 以及节点在视图中的父节点、祖先、子节点和所有子节点的查询能力;
- 提供了 CWE 的 Json 格式文件, 让使用者在除了 XML 格式外多了一个选择;
6. 参考
- CWE REST-API Quick Start