在网络工程架构的发展历程中,数据压缩与密码学加密曾长期被视为天造地设的组合。跨国骨干网络的传输成本通常按流量计费,而在对称密码加密前对数据包进行无损压缩,既能减少网络传输字节,又能降低物理链路传输时延。早期经典虚拟专用网协议(如OpenVPN)直接将LZO和DEFLATE等压缩算法集成到传输管道中。
这种设计的理论预设直观明了:AES-256-GCM或ChaCha20-Poly1305等现代对称加密算法会将负载字节转化为无法区分的伪随机二进制流。传统观念认为,在网络链路上截获密文包的窃听者无法推断出任何明文底层信息。
然而在2018年,安全研究员Ahamed Nafeez公开了名为VORACLE的安全攻击(漏洞编号CVE-2018-3972,并于Black Hat USA和DEF CON 26大会发表)。VORACLE证实,在数据加密前执行压缩会在物理层引入严重的数据长度侧信道(side-channel)漏洞。链路上处于中间位置的监听者只需观测加密报文的尺寸波动,即可逐字节还原会话Cookie及HTTP身份验证令牌,全程无需攻破任何底层加密算法。
+-------------------------------------------------------------------------+
| VORACLE 数据压缩侧信道攻击原理 |
+-------------------------------------------------------------------------+
| |
| 攻击者注入猜测候选字符 ("Cookie: auth=a...") |
| 与受害者的真实机密令牌 ("Cookie: auth=s3cr3t...") 置于同一数据流 |
| |
| 合并明文流 (受害者秘密Cookie + 攻击者构造的探测字符串) |
| │ |
| ▼ |
| [ LZO / DEFLATE 压缩引擎 ] |
| │ |
| - 猜测错误 -> 字符未重复 -> 压缩输出体积保持较长 |
| - 猜测正确 -> 命中LZ77字典指针 -> 压缩输出体积明显缩小! |
| │ |
| ▼ |
| [ 对称加密模块 AES / ChaCha ] |
| │ |
| ▼ |
| 外层加密网络报文 (密文尺寸如实反映压缩后字节缩减量) |
| │ |
| 攻击者监听报文长度差分 -> 成功还原出真实机密字符! |
+-------------------------------------------------------------------------+
信息论视角与数据泄漏根源
要理解VORACLE攻击为何奏效,必须从数学原理剖析无损数据压缩算法。DEFLATE(RFC 1951)与LZO等标准算法主要依赖两大核心支柱:LZ77滑动窗口字典替换算法与霍夫曼(Huffman)前缀编码。
在LZ77算法中,编码器扫描输入的字节序列以寻找重复子串。当某段字节在滑动历史窗口(通常为32 KB或64 KB)内再次出现时,算法会将重复出现的子串替换为一个紧凑的双元指针:
- 距离(Distance): 原始子串距当前位置的前移字节数。
- 长度(Length): 连续匹配的相同字节数量。
若网络报文内包含两处完全相同的16字节字符串,第二次出现的部分将被替换为仅占2至3字节的引用指针。压缩后的总字节数会随着明文输入内冗余度的增加而显著下降。
这里出现了与密码学安全目标的冲突。对称加密算法提供的是内容机密性,确保攻击者无法解析密文数据位的明文语义;然而,常规加密算法并不提供长度机密性。
流加密算法(例如ChaCha20或AES-CTR模式)通过生成密钥流与明文进行1比1异或操作。412字节的输入明文必然生成严格对应的412字节密文(加上固定认证标签)。即使采用具备16字节定长填充的CBC分组模式,压缩产生的数据量削减依然会频繁跨越分组边界,以16字节为粒度向外泄漏长度信息。
当压缩发生在加密之前,加密报文的物理长度便直接成为明文数据冗余度的数学函数映射。
VORACLE在真实网络中的实施流程
VORACLE漏洞针对启用了压缩选项(配置为comp-lzo yes或compress指令)的OpenVPN隧道。攻击遵循自适应选择明文攻击(adaptive chosen-plaintext attack)模型:
1. 占据信道中间人观察点
攻击者在目标受害者的网络链路中建立中间人(on-path)监听位置,常见场景包括被控制的公共Wi-Fi接入点、存在缺陷的局域网路由器或上游网络交换节点。由于目标流量被封装在VPN隧道内,攻击者无法直接解析报文内容。
2. 诱导注入可控明文数据
攻击者诱导受害者加载受控网页,或向受害者正在访问的明文HTTP页面注入恶意脚本。该脚本在后台高频触发指向目标敏感站点(例如企业内网系统或银行网关)的跨源HTTP请求。
由于这些请求由受害者的浏览器发起,浏览器会在HTTP请求头中自动附带该目标站点的认证Cookie。与此同时,攻击者注入的脚本控制着请求路径或URL查询参数,从而将攻击者构造的候选字符精准注入到同一个HTTP请求报文内。
3. 压缩预言机(Compression Oracle)触发
受害者的操作系统将组合后的完整HTTP报文转交至VPN虚拟网卡。VPN软件在将数据包送入加密模块前,首先执行全局Payload压缩:
报文内的合并明文结构:
[GET /api/user?probe=GUESS_CHAR HTTP/1.1\r\n] <-- 攻击者可控的猜测字符串
[Cookie: auth_token=7a8b9c0d1e2f3a4b\r\n] <-- 受害者的机密认证凭据
若攻击者在URL参数中构造的猜测字符恰好与受害者会话凭据的前缀相吻合,LZ77压缩引擎立即识别出字节冗余,将其替换为紧凑指针,导致整个压缩后的数据体积收缩数个字节。
若猜测字符不匹配,则未能形成字典复用,压缩报文保持原有较大尺寸。
4. 逐字节还原机密信息
攻击者在链路外部持续监测从受害者设备发往VPN网关的加密UDP或TCP报文尺寸。只要检测到报文体积产生突降,即可判定当前猜测的字符为正确机密值。
通过逐位滑动探测窗口,攻击者可在数百至数千次轻量请求内,完整还原复杂的会话Cookie、CSRF令牌及用户身份标识,整个过程通常耗时不到两分钟。
历史脉络:从CRIME、BREACH到VORACLE
VORACLE并非孤立的密码学缺陷,而是数据压缩侧信道攻击在互联网协议栈各层演进的延续:
| 漏洞名称 | 披露年份 | 所处网络层次 | 目标协议 | 行业核心应对措施 |
|---|---|---|---|---|
| CRIME (RFC 7540 §10.6) | 2012 | 传输层 / 会话层 | TLS层压缩 | 主流浏览器与Web服务器彻底废除TLS压缩支持 |
| TIME | 2013 | 应用层 | HTTP响应报文压缩 | 引入响应随机填充,严格限制请求速率 |
| BREACH | 2013 | 应用层 | HTTP主体内容 (gzip/deflate) | 动态机密掩码,将用户输入与机密数据隔离 |
| VORACLE (CVE-2018-3972) | 2018 | 网络层 / 隧道层 | VPN隧道协议 (OpenVPN LZO) | 在VPN隧道配置中彻底禁用Payload数据压缩 |
2012年Julius Rizzo与Thai Duong披露针对TLS的CRIME攻击后,IETF工作组在RFC 7540(HTTP/2)规范中明令禁止TLS压缩。这是因为只要协议将高信任度的机密数据与不可信的用户输入在同一压缩上下文中复用,侧信道风险就必然存在。
早期VPN行业普遍存在认知盲区,误以为在网络层(Layer 3 IP报文)运作即可免受应用层漏洞影响。VORACLE无情打破了这一幻想:当不同信任级别的多路网络流量混入同一个启用了压缩的加密隧道时,底层数学规律同样成立。
WireGuard从设计之初坚决剔除压缩的考量
WireGuard协议发明人Jason Donenfeld在制定技术架构时,坚决拒绝在内核隧道中引入数据压缩机制。
传统企业级VPN协议因数十年的技术堆叠而过于臃肿,往往包含多种陈旧密码套件、动态协商及压缩选项。WireGuard反其道而行之,奉行密码学极简与攻击面收敛的工程理念。
WireGuard摒弃压缩基于三大深层技术原因:
- 彻底消除长度侧信道泄漏: 不设压缩意味着明文数据大小与链路帧格式保持固定的线性映射,攻击者无法借助压缩体积波动获取反馈信号。
- 内存安全性与确定性执行: zlib与LZO等压缩库包含极其复杂的状态机与动态解压缓冲区,历史上频频出现缓冲区溢出与内存破坏漏洞。WireGuard在操作系统内核空间内以恒定内存运行加密流程,杜绝动态内存分配。
- 避免计算抖动与性能损耗: 压缩计算耗时取决于明文数据的信息熵。互联网上已加密的数据(如HTTPS视频流或预压缩图片)无法被二次压缩,压缩器盲目遍历滑动窗口不仅毫无收益,反而空耗CPU时钟周期,在高吞吐并发环境下引发严重抖动与时延上升。
RiceGuard工程架构:零压缩与标准填充机制
在现代安全网络体系中,数据压缩已被定性为不可接受的系统性风险。VPNRice自研的RiceGuard核心协议引擎在客户端与服务端全面封禁数据压缩。
+-----------------------------------------------------------------------+
| RICEGUARD 安全封装架构流 |
+-----------------------------------------------------------------------+
| [ 用户原始数据:IP报文 ] |
| │ |
| ▼ |
| [ 坚决禁用压缩 ] -> 彻底阻断LZ77字典长度侧信道 |
| │ |
| ▼ |
| [ 标准定长对齐填充 ] -> 按预设模数平滑微小报文体积差异 |
| │ |
| ▼ |
| [ ChaCha20-Poly1305 ] -> 恒定时间认证加密计算 |
| │ |
| ▼ |
| [ 外层UDP数据报 ] -> 呈现规整线缆特征 |
+-----------------------------------------------------------------------+
RiceGuard采用多项针对性防护策略保障传输安全:
- 禁止加密前置压缩: 从网络传输流水线中完全移除压缩模块,所有IP报文均保持原始未压缩形态进入加密阶段。
- 标准化填充(Padding): RiceGuard合理运用报文协议内的填充字段,将短控制报文与变长查询请求规整为固定的尺寸阶梯,瓦解外部流量特征分析。
- 线速吞吐保障: 剔除高负载的解压运算后,数据隧道在千兆光纤网络下可跑满物理网卡线速,在高并发场景下保持稳定的低延迟。
了解关于全平台客户端安全配置的更多信息,可参阅官方VPN下载页面。
现有VPN基础设施的排查与加固指南
针对正在维护或使用自建VPN服务的网络管理员,建议立即审计现有配置文件,杜绝压缩配置引发的安全短板。
排查OpenVPN服务端与客户端配置
检查服务端配置文件(server.conf)与客户端配置文件(client.ovpn),定位以下可能存在的隐患指令:
# 存在风险的配置指令 - 建议立即清理或禁用:
comp-lzo yes
comp-lzo adaptive
compress lzo
compress deflate
若要使现有OpenVPN隧道免受VORACLE侧信道攻击,应迁移至禁用压缩的配置:
# 推荐的安全配置参数:
# 针对OpenVPN 2.4以上版本:
compress migrate
comp-lzo no
# 针对OpenVPN 2.5及更新版本:
# 在两端彻底关闭压缩支持:
compress stub-v2
配置comp-lzo no或完全移除相关指令,即可确保数据在加密封装前不受内容冗余度压缩影响。
系统管理员安全建议
- 逐步迁移至现代协议: 优先将传统隧道平滑升级至WireGuard或RiceGuard架构,从根本上剔除包含压缩模块的代码。
- 强制推行端到端HTTPS: 确保组织内部所有Web服务全面部署TLS 1.3与HSTS策略,阻断中间人注入明文探测报文的前提条件。
- 审计网络中间设备: 检查网络路径上的SD-WAN控制器与WAN加速网关,确认未在底层私自开启透明的数据包压缩机制。
密码学的发展规律表明,微小的性能优化往往容易诱发始料未及的安全裂痕。在加密隧道中,为了节省微量带宽而保留压缩,实际上破坏了数据传输的机密性根基。彻底剥离VPN隧道内的压缩机制,才是确保网络数据免遭侧信道窥探的根本途径。



