alejandrosaenz117/fetch-cwe-list
GitHub: alejandrosaenz117/fetch-cwe-list
一个 Node.js 模块,用于从 MITRE 实时拉取并解析最新或指定版本的 CWE 列表,解决本地维护权威弱点库繁琐且易过期的问题。
Stars: 10 | Forks: 2
# 获取 CWE 列表
一个简单、安全的 Node.js 模块,用于获取并解析最新的通用弱点枚举(CWE)列表,来源为 MITRE。
## 快速开始
```
npm install fetch-cwe-list
```
```
const fetchCweList = require('fetch-cwe-list')
// Fetch latest CWE list
const cweList = await fetchCweList()
console.log(`Fetched ${cweList.length} CWE entries`)
// Fetch specific version
const cweListV413 = await fetchCweList('4.13')
```
仅此而已。每个条目都包含解析后的 CWE 数据以及丰富的对外引用。
## 功能特性
- **实时数据** — 始终最新,直接从 MITRE 获取
- **丰富** — 包含 CAPEC 映射、CVE 上下文、层级关系与对外引用
- **缓存** — 可选 1 小时 TTL 缓存(可配置)
- **查询助手** — `findById`、`findByName`、`findByCapec` 用于常见查找
- **安全** — 30 秒超时、100MB 大小限制、XXE 防护、无共享状态
- **TypeScript** — 包含完整的类型定义
## 使用方法
### 获取并迭代
```
const cweList = await fetchCweList()
cweList.forEach(cwe => {
console.log(`${cwe.ID}: ${cwe.Name}`)
})
```
### 使用查询助手
```
const { findById, findByName, findByCapec } = require('fetch-cwe-list')
const cweList = await fetchCweList()
const cwe79 = findById(cweList, '79')
const injections = findByName(cweList, 'injection')
const xssCwes = findByCapec(cweList, '209') // CAPEC-209: XSS Using MIME Type Mismatch
```
### 访问丰富数据
```
const cweList = await fetchCweList()
const cwe79 = findById(cweList, '79')
// CAPEC attack patterns
console.log(cwe79.CAPEC_IDs) // ['63', '85', '209', '588', '591', '592']
// Hierarchy (parent weaknesses)
console.log(cwe79.Hierarchy.parents) // ['74']
// Known CVEs
cwe79.Known_CVEs.forEach(({ id, description }) => {
console.log(`${id}: ${description}`)
})
```
### 缓存控制
```
const { clearCache } = require('fetch-cwe-list')
const list1 = await fetchCweList() // Downloads, caches for 1 hour
const list2 = await fetchCweList() // Instant (cached)
// Bypass cache
const fresh = await fetchCweList('latest', { cache: false })
// Invalidate cache
clearCache()
```
## API 参考
### `fetchCweList([version], [opts])`
**参数:**
- `version`(字符串,可选) — 要获取的 CWE 版本(例如 `'4.13'`)。默认为 `'latest'`。
- `opts`(对象,可选) — 选项:
- `cache`(布尔值,可选) — 设为 `false` 可绕过缓存。默认:`true`
**返回值:**
- 解析为 CWE 对象数组的 Promise
**异常:**
- 如果下载失败、超时或版本未找到,将抛出错误
### `clearCache()`
清除内存缓存。缓存实例本身不会暴露,以防止通过 `cache.set()` 外部注入污染。
### `findById(cweList, id)`
按 ID 字符串查找单个 CWE。
**参数:**
- `cweList` — `fetchCweList()` 返回的数组
- `id`(字符串) — CWE ID,例如 `'79'`
**返回值:**
- CWE 对象或 `undefined`
### `findByName(cweList, pattern)`
查找名称中包含给定字符串(不区分大小写)的所有 CWE。
**参数:**
- `cweList` — `fetchCweList()` 返回的数组
- `pattern`(字符串) — 不区分大小写的子字符串
**返回值:**
- CWE 对象数组
**注意:** 出于防止 ReDoS 攻击的考虑,不支持正则表达式。
### `findByCapec(cweList, capecId)`
查找映射到给定 CAPEC ID 字符串的所有 CWE。
**参数:**
- `cweList` — `fetchCweList()` 返回的数组
- `capecId`(字符串) — CAPEC ID,例如 `'86'`
**返回值:**
- CWE 对象数组
## 数据结构
每个 CWE 条目包含 MITRE 的字段以及 v0.1.0 后的丰富数据:
| 字段 | 类型 | 始终存在 | 描述 |
|------|------|----------|------|
| `ID` | `string` | 是 | CWE ID(从数值解析器输出标准化) |
| `CAPEC_IDs` | `string[]` | 是 | 映射的 CAPEC 攻击模式 ID 数组(若无则为空) |
| `Known_CVEs` | `{ id, description }[]` | 是 | 来自 Observed_Examples 的 CVE(若无则为空数组) |
| `Hierarchy` | object | 否 | 父级关系(若无 Related_Weaknesses 则不存在) |
| `References.Full_Details` | object[] | 否 | 丰富的对外引用对象数组 |
示例条目:
```
{
ID: "79",
Name: "Improper Neutralization of Input During Web Page Generation ('Cross-site Scripting')",
Status: "Stable",
Description: "...",
CAPEC_IDs: ['63', '85', '209', '588', '591', '592'],
Known_CVEs: [
{ id: 'CVE-2021-1879', description: '...' }
],
Hierarchy: {
parents: ['74'],
relationships: [
{ nature: 'ChildOf', cweId: '74', viewId: '1000', ordinal: 'Primary' }
]
},
References: {
Reference: [{ External_Reference_ID: "REF-2" }],
Full_Details: [
{
Reference_ID: "REF-2",
Author: "OWASP",
Title: "Cross Site Scripting (XSS)",
URL: "https://www.owasp.org/..."
}
]
}
}
```
**注意:** 单个引用会自动规范化为数组,并像多个引用一样进行丰富。所有 ID 均标准化为字符串,以保证跨所有 API 表面的一致性。
## 许可证
MIT
## 作者
[Alejandro Saenz](https://github.com/alejandrosaenz117)
标签:CAPEC, CVE, GNU通用公共许可证, MITM代理, MITRE, Node.js, XML 请求, XXE防护, 代码安全, 外部引用, 安全, 安全开发, 安全配置, 数字签名, 数据获取, 查询辅助, 漏洞映射, 漏洞枚举, 类型定义, 缓存, 自定义脚本, 超时处理