DNSSEC 密钥标签碰撞
摘要 DNSSEC 通过数字签名保证 DNS 数据的完整性,其信任锚点由 DNSKEY 记录的密钥标签标识。解析器在验证签名时,根据授权签名者(Signer)字段中的密钥标签查找对应的 DNSKEY。然而,16 位的密钥标签空间仅有 65536 种可能,攻击者可以暴力生成一个与信任锚标签相同的恶意密钥,并将其植入精心构造的子域 NSEC3 记录中。部分递归解析器(如 Unbound)在解析路径上的密钥选择逻辑存在缺陷:当响应中包含与当前信任锚标签匹配的非权威 DNSKEY 时,可能错误地将其用于验证签名,导致攻击者伪造的签名被接受,整个 DNSSEC 验证降级为“无保护”状态。 DNSSEC 密钥标签与解析器信任模型 密钥标签的计算方法 DNSSEC 使用 DNSKEY 记录存储区的公钥,每个密钥由 16 位的密钥标签唯一标识(在 RRSIG 和 DS 记录中引用)。密钥标签的计算过程如下(RFC 4034 附录 B):将 DNSKEY 的 RDATA(标志位、协议、算法、公钥)按网络字节序拼接,然后逐 16 位累加,最后取低 16 位作为标签。算法简单,无密码学强度,仅作为快速索引。 由于算法可逆性弱,攻击者无法直接计算出与特定标签匹配的公钥,但可以反复生成密钥对,计算标签,直到碰出目标标签。对于 16 位空间,平均需要约 32768 次尝试,现代 CPU 在毫秒级内即可完成。因此,密钥标签的碰撞是现实可行的。 解析器的密钥选择路径 以 Unbound 为例,验证签名时的密钥选择流程: 解析器收到包含 RRSIG 的响应,提取 Signer 字段,其中含有密钥标签。…