Post

DNS安全

讲述了DNS面临的安全威胁以及常见的攻击手段,还有如何使用密码学进行DNS防护

DNS安全

1. DNS简介

dns介绍

2. DNS面临的安全威胁

  • 协议脆弱性:设计未考虑安全需求
    • 域名欺骗
    • 拒绝服务攻击
  • 实现脆弱性:软件代码漏洞
    • 算法实现缺陷
    • 软件安全漏洞
  • 操作脆弱性:管理、配置环节
    • 域名配置攻击
    • 域名注册攻击
    • 信息泄露

3. 针对DNS的攻击手段

3.1 域名欺骗

  • DNS不保护通信过程,可以伪造查询应答,篡改解析结果
  • 条件:解析器和递归服务器只接收对发出查询请求的应答
    • 目的端口与源IP地址
    • 查询三元组(NAME、TYPE、CLASS)& 查询ID
    • 应答内容合理
  • 不同攻击者的能力:控制服务器>在通信路径上>路径外
    • 控制服务器:最为简单,直接响应查询请求(DNS劫持)
    • 在通信路径上:发动中间人攻击,伪造应答十分容易
    • 在通信路径外:难度最大,需要更先进、复杂的手段
  • 缓存投毒:递归服务器具有缓存,向缓存中注入恶意信息,能影响更多用户

DNS劫持(可信服务器背叛)

DNS hijacking

  • 域名服务器被攻击或有意篡改数据
    • 例如用手机接入一个公共wifi热点,该热点可能受攻击者控制来伪造数据 dns_hijacking

中间人攻击

man in the middle(MITM)

  • 攻击者能够窃听查询请求,伪造应答
  • 攻击效果依赖于哪一个应答先到达解析器
    • 若攻击者伪造的应答先到达,则域名信息被篡改
  • 若攻击者位于客户端和权威服务器之间,则为中间人攻击 man_in_the_middle

ID猜测与查询预测

  • 攻击者不能窃听到客户端发送请求,尝试猜测ID和客户端UDP端口,共有$2^{32}$种可能
    • 一些实现的UDP端口固定,可进一步减小到 $2^{16}$
    • NAT可能降低端口的随机性
  • 攻击者需要预测QNAME和QTYPE,可以通过影响受害者的行为来实现 ID猜测和查询预测
  • 0x20编码方案
    • 目标:增加DNS查询的熵
    • 思路:增加域名的大小写设置
      • DNS对大小写不敏感,不干扰解析过程
    • 要求:服务器的应答必须保持大小写设置
      • 所有DNS服务器软件的行为都满足
    • 效果:每个字符都增加了一位的熵,从而增加了猜测的难度

缓存投毒

cache poisoning

  • DNS缓存:递归解析服务器会缓存近期的迭代查询结果,并用于应答查询请求,对于提升DNS系统工作效率至关重要
  • 定义:将恶意域名数据写入递归服务器缓存
    • 攻击范围:递归服务器的所有用户
    • 攻击时效:至少一个TTL,用户无法基于DNS协议提供反馈,来触发缓存条目刷新
  • 胶水记录注入
    • 早期攻击方法,已无效
    • 早期的DNS服务器软件实现中,无条件接受应答中的胶水记录,写入缓存,任何权威服务器都可以把任意域名数据写入递归服务器的缓存
    • 胶水记录注入
    • 管辖区规则
      • 定义了递归服务器对查询相应内容的接收规则
      • 管辖区:某个权威服务器具有直接或间接权威的域的集合
      • rule1: 回答必须相关
      • rule2: 回答必须在管辖区内
  • 名字链攻击
    • 利用CNAME随意控制解析路径
      • 受操纵客户端向受害递归服务器发送针对攻击服务器的请求
      • 受害递归服务器向攻击服务器发送请求
      • 攻击者伪造应答:攻击者控制域名->受害域名->攻击者指定IP地址
    • DNS协议不限制CNAME的使用方式,可以绕过管辖区规则
    • 名字链攻击
  • 简单攻击
    • 攻击者发送大量查询应答,随机设置端口、ID
    • 成功的条件苛刻:猜中全部信息,缓存中无相应条目
      • 攻击间隔长、窗口小:间隔一个TTL,赶在其他人查询前
    • 简单攻击
  • Kaminsky攻击
    • 利用操控查询+ID猜测来对缓存投毒,从而劫持一个域hit.edu.cn
      1. 攻击者利用受操纵客户端查询一个hit.edu.cn不存在的域名randomxx
      2. 受害递归服务器中缓存没有命中,于是发出查询
      3. 利用ID猜测,攻击者服务器发出大量应答,对缓存投毒,将hit.edu.cn的域名服务器定向到攻击者服务器
    • kaminsky攻击

3.2. DDoS攻击

  • 反射攻击
    • 攻击者伪造源IP地址为受害者
  • 放大攻击
    • 发送一个60B的UDP查询,服务器产生4KB的应答,流量放大了67倍

攻击模拟dns-amplification-attack

4. 密码学DNS防护手段

4.1 DNSSEC

概述

  • 将DNS层次化命名与公钥密码学结合
    • 用密码学来保护名字到地址映射
    • 利用DNS命名层次来形成PKI,形成从根到域名的信任链
  • 目标:保护递归服务器和权威服务器间通信的真实性,不保护整个DNS系统

密码学

  • 加盐哈希函数
    • 盐:一个非保密的随机串,用于增加消息的随机性
    • 在消息中加入盐,可以对抗普通的字典攻击,攻击者需要重新根据salt计算整个字典
  • 数字签名(Digital Signature)
    • 签名者用私钥加密消息,接收者用公钥验证签名
      • 一般bob会将消息进行散列,然后再进行签名,最后把原始消息和数字签名一起发送给alice
      • 而alice也会将消息进行散列$x_1$,然后用公钥对证书解密$x_2$,比对$x_1$与$x_2$是否一致
  • 数字证书(Digital Certificate)
    • 证书权威CA:可信的第三方
    • bob将公钥发送给CA,获得CA用其私钥签名的证书,然后将其发送给alice
    • alice用CA的公钥验证证书,确认bob公钥的真实性
  • 认证链
    • 以一个公钥为起点(信任锚),对下一个公钥证书进行认证,,被认证的公钥用来对下一个证书进行认证,如此认证下去
  • 公钥基础设施(PKI)
    • 一套提供基于数字签名的公钥认证的软硬件集合
    • PKI中只需要安全发布信任锚,就可以实现所有其他公钥的安全发布

流程和细节

1)新类型RR
类型说明
DNSKEYDNSSEC Public Key, zone的公钥
DSDelegation signer, 授权的公钥摘要
(子域的DNSKEY的哈希值)
RRSIGRR Signature, 资源记录的数字签名
NSECNext Secure,用于authenticated denial of existence
NSEC3hashed authenticated denial of existence
2)DNSKEY和签名
  • DNSKEY分离
    • 一个zone使用两个Key
      • KSK:对其他Key签名
      • ZSK:对zone中数据签名
    • 子zone提交自己的KSK的DS到父zone
  • Zone签名方法
    • 同一zone内的KSK对ZSK签名,产生RRSIG(ZSK)
    • ZSK对每一个RRset(域名和类型相同的一组RR)生成一个签名RRSIG
    • 父zone的ZSK对子zone的KSK的DS进行签名,生成RRSIG(DS),放在父zone处
  • 信任链:DNSKEY(信任锚) -> [DS -> DNSKEY]* -> RRset
3)报文的新标记
  • DNSSEC的新标记
  • Checking DisabledCD)标记
    • 由解析器在Query中设置,禁止递归服务器端进行真实性验证(由解析器自己来检查)
    • 若未设置,则由递归服务器检查
  • Authenticated DataAD)标记
    • 由递归服务器在Response中设置,表示应答中的Answer和Authority部分的所有数据通过了验证
    • 若未设置,则尚未验证
  • DNSSEC OKDO)标记
    • 由递归服务器在Query中设置,表示支持DNSSEC
    • 若未设置,则权威在应答中不应有DNSSEC信息示
4)递归服务器的状态
  1. Secure:具有一个信任锚,并获得了一条信任链,能够验证应答中的所有签名
    • 应答中设置AD标记
  2. Insecure:具有一个信任锚,一条信任链,但在一个授权点不存在DS记录,表示后续子分支无DNSSEC保护
  3. Bogus:具有信任锚,授权信息表明该数据应该被签名,但应答为通过验证
  4. Indeterminate:为缺省操作模式,没有信任锚来表明空间树上特定部分是安全的
5)key更新—Key Rollover(密钥滚动)
  • 原因:ZSK使用频率较高,密钥长度一般较短,以提高性能和效率,同时也意味着其安全性较低,需要定期更换
  • Pre-Publish Zone Signing Key Rollover:提前发布Key
    • pre-publish_key_rollover
    • 先将公钥发布到区域内的DNSKEY记录中,但不用它对区域内进行签名
    • 等待一段时间后,再用新ZSK对区域进行签名,并移除旧ZSK的签名
    • 再等待一段时间后,再移除旧ZSK的公钥
  • Double-Signature Zone Signing Key Rollover:同时发布Key和SIG
    • double-signature_ZSK_rollover
    • 先用新ZSK对区域进行签名,并保留旧ZSK的签名
    • 等待一段时间后,再移除旧ZSK的签名和公钥

4.2 DoT/DoH

  • 加密DNS流量,保护DNS通信
  • 主要保护桩解析器间的通信

DoT

DNS over TLS

DoT

  • TLS(传输层安全协议)
    • 目标:提供通信加密通道,保护通信内容的CIA安全属性
    • 工作在传输层,基于TCP建立安全连接
    • SSL是TLS的前身(TLS=SSL V3.1)
    • 默认443端口
    • 流程
      • 握手阶段
        • 确定使用的算法等会话参数
        • 交换并认证数字证书,交换密钥,产生共享的对称密钥
      • 数据传输阶段
        • 使用对称密钥进行加密通信

DoH

DNS over HTTPS

DoH

  • 使用HTTPS协议传输DNS请求/应答
    • GET/POST发送DNS请求,返回内容为DNS应答

4.3 ODNS

Oblivious DNS

ODNS

  • ODNS桩解析器在本地
  • 递归服务器知道“who”,不知道“what”
    • 域名使用ODNS权威服务器的公钥加密
  • ODNS权威服务器知道“what”,不知道“who”
This post is licensed under CC BY 4.0 by the author.