安全研究/和中谈安全/安全漏洞CPE检索机制介绍
安全漏洞CPE检索机制介绍
2026-01-30 02:28分享

什么是CPE

在网络安全领域,CPE(Common Platform Enumeration,通用平台枚举)是一种标准化的标识符体系,用于唯一标识和描述信息技术系统中的硬件、操作系统、应用程序及其他软件组件。它由美国国家标准与技术研究院(NIST)维护,是网络安全漏洞管理和资产识别的关键工具。

CPE的核心作用

  1. 统一标识
    CPE为各类IT资产提供唯一的、结构化的命名规范,避免因命名差异导致的混淆。例如,不同厂商可能对同一软件使用不同名称,CPE通过标准化格式解决这一问题。
  2. 漏洞关联
    在漏洞数据库(如NVD,National Vulnerability Database)中,CPE用于将漏洞(CVE)与受影响的软硬件关联。例如,漏洞CVE-2021-44228(Log4j)会关联到CPE标识的受影响Log4j版本。
  3. 资产管理与自动化
    安全工具(如漏洞扫描器、SIEM系统)利用CPE识别目标系统中的组件,自动化匹配已知漏洞或配置缺陷。

CPE的命名格式

CPE遵循以下结构化语法(符合CPE 2.3标准):

Plain Text
cpe:2.3:类型:厂商:产品:版本:更新:版本类型:语言:其他属性

示例

cpe:2.3:a:microsoft:office:2019::en

表示:Microsoft Office 2019英文版(应用程序类)。

 

cpe:2.3:o:linux:linux_kernel:5.4.0

表示:Linux内核5.4.0(操作系统类)。

 

NVD Configurations

在网络安全领域,NVD Configurations(美国国家漏洞数据库配置)是指美国国家漏洞数据库(National Vulnerability Database, NVD)中针对软件或硬件系统的配置项(Configuration Items, CIs)及其关联漏洞的标准化描述。它是NVD提供的一种结构化数据,用于帮助组织识别和管理与系统配置相关的安全风险。

 

数据示例(CVE-2019-6110):

JSON
[
  {
    "nodes": [
      {
        "negate": false,
        "cpeMatch": [
          {
            "criteria": "cpe:2.3:a:openbsd:openssh:*:*:*:*:*:*:*:*",
            "vulnerable": true,
            "matchCriteriaId": "52D09A55-B853-43B5-8397-E2AC6CD0EBBC",
            "versionEndIncluding": "7.9"
          },
          {
            "criteria": "cpe:2.3:a:winscp:winscp:*:*:*:*:*:*:*:*",
            "vulnerable": true,
            "matchCriteriaId": "3D0A98E2-B715-4EF5-9CF8-07500E119271",
            "versionEndIncluding": "5.13"
          }
        ],
        "operator": "OR"
      }
    ]
  },
  {
    "nodes": [
      {
        "negate": false,
        "cpeMatch": [
          {
            "criteria": "cpe:2.3:a:netapp:element_software:-:*:*:*:*:*:*:*",
            "vulnerable": true,
            "matchCriteriaId": "85DF4B3F-4BBC-42B7-B729-096934523D63"
          },
          {
            "criteria": "cpe:2.3:a:netapp:ontap_select_deploy:-:*:*:*:*:*:*:*",
            "vulnerable": true,
            "matchCriteriaId": "7E968916-8CE0-4165-851F-14E37ECEA948"
          },
          {
            "criteria": "cpe:2.3:a:netapp:storage_automation_store:-:*:*:*:*:*:*:*",
            "vulnerable": true,
            "matchCriteriaId": "7B7A6697-98CC-4E36-93DB-B7160F8399F9"
          }
        ],
        "operator": "OR"
      }
    ]
  },
  {
    "nodes": [
      {
        "negate": false,
        "cpeMatch": [
          {
            "criteria": "cpe:2.3:o:siemens:scalance_x204rna_firmware:*:*:*:*:*:*:*:*",
            "vulnerable": true,
            "matchCriteriaId": "0D3A0312-1249-4257-98F1-57E8959989C5",
            "versionEndExcluding": "3.2.7"
          }
        ],
        "operator": "OR"
      },
      {
        "negate": false,
        "cpeMatch": [
          {
            "criteria": "cpe:2.3:h:siemens:scalance_x204rna:-:*:*:*:*:*:*:*",
            "vulnerable": false,
            "matchCriteriaId": "EA8B483F-0FD2-49F8-A86A-672A6E007949"
          }
        ],
        "operator": "OR"
      }
    ],
    "operator": "AND"
  },
  {
    "nodes": [
      {
        "negate": false,
        "cpeMatch": [
          {
            "criteria": "cpe:2.3:o:siemens:scalance_x204rna_eec_firmware:*:*:*:*:*:*:*:*",
            "vulnerable": true,
            "matchCriteriaId": "FC0C9671-47BB-43CB-8906-9BC2B86B3229",
            "versionEndExcluding": "3.2.7"
          }
        ],
        "operator": "OR"
      },
      {
        "negate": false,
        "cpeMatch": [
          {
            "criteria": "cpe:2.3:h:siemens:scalance_x204rna_eec:-:*:*:*:*:*:*:*",
            "vulnerable": false,
            "matchCriteriaId": "C834C295-D600-44E8-9783-49A319084F5A"
          }
        ],
        "operator": "OR"
      }
    ],
    "operator": "AND"
  }
]

 

含义解释

 

逻辑运算符operator

operator 表示逻辑运算符,用于组合多个CPE匹配条件(cpeMatch),决定如何判断一个系统是否受漏洞影响。主要有两种取值:AND/OR

JSON
"nodes": [
  {
    "cpeMatch": [
      {"criteria": "cpe:2.3:a:openbsd:openssh:*:*:*:*:*:*:*:*", "vulnerable": true, "versionEndIncluding": "7.9"},
      {"criteria": "cpe:2.3:a:winscp:winscp:*:*:*:*:*:*:*:*", "vulnerable": true, "versionEndIncluding": "5.13"}
    ],
    "operator": "OR"
  }
]

  • 这里的OR表示系统安装了OpenSSH 7.9及以下版本 或 WinSCP 5.13及以下版本时,均受漏洞影响。

 

JSON
"nodes": [
  {
    "cpeMatch": [{"criteria": "cpe:2.3:o:siemens:scalance_x204rna_firmware:*:*:*:*:*:*:*:*", "vulnerable": true, "versionEndExcluding": "3.2.7"}],
    "operator": "OR"
  },
  {
    "cpeMatch": [{"criteria": "cpe:2.3:h:siemens:scalance_x204rna:-:*:*:*:*:*:*:*", "vulnerable": false}],
    "operator": "OR"
  }
],
"operator": "AND"

  • AND表示系统需同时满足:
  1. 固件版本为scalance_x204rna_firmware且低于2.7(vulnerable: true);
  2. 硬件设备为scalance_x204rna且不受影响(vulnerable: false)。
    (注:此处的逻辑需结合vulnerable字段理解,实际场景中可能用于排除特定硬件型号。)

 

版本边界条件

  • versionEndExcluding:版本右边界,但不包含此版本,类似 <
  • versionEndIncluding:版本右边界,同时包含此版本,类似 <=
  • versionStartExcluding:版本左边界,但包含此版本,类似 >
  • versionStartInncluding:版本左边界,同时包含此版本,类似 >=

 

受漏洞影响标记vulnerable

表示当前CPE标识的产品或版本是否受漏洞影响

和中科技灵鹫峰平台的漏洞匹配技术方案

ES搜索引擎

基础库平台采用Elasticsearch数据库作为安全漏洞的搜索引擎

索引结构和CPE预处理

elasticsearch的索引,类似传统数据库的table,以下是cpe_math的索引

  • 索引配置:

JSON
"cpe_match": {
    "type": "nested",
    "properties": {
        "part": {"type": "keyword"},
        "vendor": {"type": "keyword"},
        "product": {"type": "keyword"},
        "version": {"type": "keyword"},
        "update": {"type": "keyword"},
        "edition": {"type": "keyword"},
        "language": {"type": "keyword"},
        "sw_edition": {"type": "keyword"},
        "target_sw": {"type": "keyword"},
        "target_hw": {"type": "keyword"},
        "other": {"type": "keyword"},
        "vulnerable": {"type": "boolean"},
        "version_end_excluding": {"type": "keyword"},
        "version_end_including": {"type": "keyword"},
        "version_start_excluding": {"type": "keyword"},
        "version_start_including": {"type": "keyword"},
    }
}

爬虫脚本会将原始的Configurations字段进行拆分充足,将所有的叶子节点进行解析,将cpe拆分为类型、厂商、产品、版本等字段,将版本边界条件转为统一数据格式,并取出vulnerable字段拼凑成一个独立的cpe_match,如上述漏洞的第一个节点如下:

JSON
{
  "part": "a",
  "other": "*",
  "update": "*",
  "vendor": "openbsd",
  "edition": "*",
  "product": "openssh",
  "version": "*",
  "language": "*",
  "target_hw": "*",
  "target_sw": "*",
  "sw_edition": "*",
  "vulnerable": true,
  "version_end_excluding": null,
  "version_end_including": "00007:00009",
  "version_start_excluding": null,
  "version_start_including": null
}

这里有2个问题要说明:

  • 版本格式化:原始的版本右边界为9,此处转换为00007:00009,是为了方便使用字典序进行比较,在版本号比较中,形如1.10 > 1.9,是不符合字典序的,所以要进行位数填充。

Python
def format_version_part(part) -> str:
    try:
        num = int(part)
        if num > 99999:
            return ':' + part
        else:
            return "{:05d}".format(num)
    except ValueError:
        return part

def format_version(version: str) -> str:
    parts = re.findall(r'\w+', version)
    for i in range(0, len(parts)):
        parts[i] = format_version_part(parts[i])
    return ':'.join(parts)

  1. a) 为什么是填充5位而不是更多?
    根据统计,五位数的版本号足以满足绝大多数数字风格的版本号命名,超过99999的数字版本号占比低于5%,同时,在版本号中过长的数字往往并不表示数字含义,比如202507101123,实际上并不是数字而是日期,本身已经满足字典序,不需要再做转换。
  2. b) 如果不是数字风格的版本号,如何处理

首先仍然按照惯例进行拆分,比如3.5.alpha,会拆分为[3,5,alpha],然后将数字部分进行格式化,非数字部分进行保留,结果是00003:00005:alpha,这样做的结果是3.5.alpha < 3.5.beta 3.6.alpha > 3.5.beta

 

  • 逻辑运算符operator的处理:目前的策略是直接忽略,匹配漏洞仅根据cpe、版本边界、vulnerable进行匹配,这样做的原因是, 简化了漏洞匹配方式,提高性能 2.虽然是组合漏洞,但是只要受漏洞影响,仍然进行匹配。比如CVE-2015-3067,其Configurations的第一个节点如下:

 

可以看到这是一个在windows和mac_os_x平台上的adobe软件漏洞,但是二者均受漏洞影响,如果严格按照2者同时存在才能匹配到,那么adobe:acrobat的cpe也无法匹配到该漏洞

匹配规则

  1. 对输入的CPE进行解析,和之前提到的一样,拆分成类型/厂商/产品/版本等字段,具体有多少字段取决于输入,如输入"cpe:2.3:o.microsoft:windows",则只会拆分出 类型:o, 厂商:microsoft, 产品:widnows
  2. 对输入项拆分后的所有字段进行匹配,均满足规则才算匹配成功
  3. 对于具体的输入匹配规则如下

字段

匹配规则

示例

类型(part)

精确匹配,支持通配符

 

厂商(vendor)

精确匹配,支持通配符

 

产品(product)

精确匹配,支持通配符

如输入cpe:2.3:o:microsoft:windows_*,可匹配windows10 windows11等多个产品

版本(version)

1.将版本号进行解析后格式化,然后每个版本部分进行精确匹配,不支持通配符

2.对于漏洞CPE中,版本为*的部分,继续比较版本边界条件,输入的版本号需要满足版本范围

如输入cpe:2.3:a:openbsd:openssh:7.4,则必须满足以下所有条件

1. 类型字段为a

2. 厂商字段为openbsd

3. 产品名称为openssh

4. 版本号为00007:00004 或者 版本号为*且满足边界条件(无边界条件则自动满足)

5. vulnerable为true

更新/补丁版本

精确匹配,支持通配符

 

版本类型

精确匹配,支持通配符

 

语言

精确匹配,支持通配符

 

其他

精确匹配,支持通配符

 

匹配语句DSL

JSON
{
    'bool': {
        'must': [
            {
                'nested': {
                    'path': 'cpe_match',
                    'query': {
                        'bool': {
                            'must': [
                                {'term': {'cpe_match.part': 'a'}},
                                {'term': {'cpe_match.vendor': 'openbsd'}},
                                {'term': {'cpe_match.product': 'openssh'}},
                                {'bool': {
                                    'should': [
                                        # 要么准确匹配7.4
                                        {'term': {'cpe_match.version': '7.4'}},
                                        # 要么匹配版本为*,且版本范围值满足
                                        {
                                            'bool': {
                                                'must': [
                                                    {'term': {'cpe_match.version': '*'}},
                                                    # 同时满足4个边界条件
                                                    {'bool': {
                                                        'must': [
                                                            # 条件1 cpe_match.version_end_excluding 要么为null,要么>7.4
                                                            {'bool': {
                                                                'should': [
                                                                    # 为null
                                                                    {'bool': {'must_not': [{'exists': {'field': 'cpe_match.version_end_excluding'}}]}},
                                                                    # > 00007:00004
                                                                    {'range': {'cpe_match.version_end_excluding': {'gt': '00007:00004'}}}
                                                                ]
                                                            }},
                                                            # 条件2 cpe_match.version_end_including 要么为null,要么>=7.4
                                                            {'bool': {
                                                                'should': [
                                                                    # 为null
                                                                    {'bool': {'must_not': [{'exists': {'field': 'cpe_match.version_end_including'}}]}},
                                                                    # >= 00007:00004
                                                                    {'range': {'cpe_match.version_end_including': {'gte': '00007:00004'}}}
                                                                ]
                                                            }},
                                                            # 条件3 cpe_match.version_start_excluding 要么为null,要么<7.4
                                                            {'bool': {
                                                                'should': [
                                                                    # 为null
                                                                    {'bool': {'must_not': [{'exists': {'field': 'cpe_match.version_start_excluding'}}]}},
                                                                    # <= 00007:00004
                                                                    {'range': {'cpe_match.version_start_excluding': {'lt': '00007:00004'}}}
                                                                ]
                                                            }},
                                                            # 条件4 cpe_match.version_start_including 要么为null,要么<=7.4
                                                            {'bool': {
                                                                'should': [
                                                                    # 为null
                                                                    {'bool': {'must_not': [{'exists': {'field': 'cpe_match.version_start_including'}}]}},
                                                                    # <= 00007:00004
                                                                    {'range': {'cpe_match.version_start_including': {'lte': '00007:00004'}}}
                                                                ]
                                                            }},
                                                        ]
                                                    }}
                                                ]
                                            }
                                        }
                                    ]
                                }}
                            ]
                        }
                    }
                }
            }
        ]
    },

})