深入了解填充预言机攻击
逐步分析 CBC 填充预言机攻击,并了解为什么即使轻微的解密错误预言机也会造成灾难性后果。
深入了解填充预言机攻击 是 CoddyKit 上的免费 Cryptology Academy 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Cryptology Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Cryptology Academy 课程共包含 4 节课。
CBC 模式解密结构
在 CBC(密码分组链接)模式下,每个分组的解密都包括:使用分组密码解密密文分组,然后将结果与前一个密文分组进行 XOR 运算。这一 XOR 操作带来了一个关键特性:通过修改密文分组中的位,攻击者可以有规律地影响后续分组解密明文中的特定位。填充预言机攻击正是利用了这一特性。
PKCS#7 填充详解
分组密码要求输入采用固定大小的分组。PKCS#7 填充会填满最后一个分组:如果需要填充 3 个字节,就添加 3 个值都为 0x03 的字节。如果分组已经填满,就添加一个完整的填充分组,其中全部 16 个字节的值都是 0x10。解密期间,系统会验证填充字节是否一致(全部 N 个字节的值都为 N),然后将其移除。如果填充无效,解密应当失败。
预言机:利用填充验证
填充预言机是指任何能够透露解密后的密文是否具有有效 PKCS#7 填充的系统。预言机可能通过以下方式提供信号:明确的错误消息(填充无效)、不同的 HTTP 状态码(500 对比 403)、不同的错误响应正文,甚至是时间差异(有效填充的解密速度略快)。攻击者不需要知道密钥,只需要这个二元信号:填充有效或无效。
逐字节恢复明文
攻击者会针对特定的密文分组进行操作。要恢复明文的最后一个字节,攻击者会翻转前一个密文分组的最后一个字节,然后将修改后的密文发送给预言机。攻击者会遍历 256 个可能的值,直到预言机报告填充有效。产生有效填充(0x01)的值确定后,中间解密值也就已知了(它与修改后的字节进行 XOR 运算后得到 0x01)。再将该中间值与原始密文字节进行 XOR 运算,即可得到明文字节。
恢复完整分组
恢复最后一个字节后,接下来会针对倒数第二个字节。最后一个字节的中间值已经已知,因此可以将其强制设为 0x02。然后遍历倒数第二个字节的 256 个可能值,直到 0x02 0x02 形式的填充有效。对每个字节重复这一过程,即可恢复完整的 16 字节分组;平均每个分组需要 256 * 16 = 4,096 次预言机查询。预言机响应速度较快时,整个过程几秒钟即可完成。
恢复完整消息
对每个密文分组重复这一过程(不包括 IV,因为没有前一个分组就无法恢复 IV)。一个 128 字节的密文包含 8 个 AES 分组,完整解密平均需要大约 32,000 次预言机查询。对于每秒处理数百个请求的 Web 服务器,这只需要几分钟。攻击者无需获知加密密钥,就能恢复完整明文。
现实世界中的漏洞利用:POODLE
POODLE(降级旧式加密上的填充预言机)利用了 SSL 3.0 的 CBC 填充验证机制。SSL 3.0 使用的不是 PKCS#7 填充方案,但该攻击对预言机概念进行了适配。能够向 SSL 3.0 会话注入内容并强制客户端降级到 SSL 3.0 的攻击者,可以利用填充预言机技术恢复会话 Cookie。POODLE 促使 SSL 3.0 被弃用。
幸运十三与 BEAST
幸运十三(2013 年)利用了 TLS 的 CBC 先 MAC 后加密方案中的时间侧信道。根据填充是否有效,MAC 验证所需的时间会相差几纳秒,从而形成时间预言机。BEAST(2011 年)利用 TLS 1.0 CBC 模式中可预测的 IV,针对会话 Cookie 发起选择明文攻击。这两种攻击都表明,在 TLS 中正确实现 CBC 模式非常困难。
防御:使用 AEAD 而非 CBC
防御填充预言机攻击的根本方法,是使用 AEAD(带附加数据的认证加密)模式,而不是 CBC。AES-256-GCM 和 ChaCha20-Poly1305 等 AEAD 模式会在进行任何解密或填充检查之前验证认证信息。如果认证标签无效,解密就不会发生,也不会泄露任何填充信息。TLS 1.3 强制使用 AEAD,并完全移除了 CBC。
防御:先加密后 MAC
如果无法使用 AEAD,先加密后 MAC 构造会对密文(而不是明文)计算 MAC。在解密或检查填充之前,系统会先验证 MAC。如果 MAC 验证失败,操作会立即中止,且不会透露任何填充信息。为防止出现时间预言机,验证过程必须采用常数时间。MAC 验证失败不会透露填充是否原本有效。
检测填充预言机漏洞
要测试填充预言机漏洞,可以先加密一条已知消息,然后向应用提交修改后的密文并观察响应。如果有效填充和无效填充产生了可观察的不同响应(错误消息、状态码或响应时间),就说明存在填充预言机。自动化工具(如填充预言机测试工具和 PadBuster)会通过系统地修改密文并分析响应,专门检测 Web 应用中的填充预言机。
填充预言机机制
填充预言机攻击要在不知道密钥的情况下解密密文,目标系统必须提供什么条件?
填充预言机攻击回顾
填充预言机攻击回顾:CBC 解密的 XOR 特性允许攻击者受控地修改明文字节;PKCS#7 填充验证会泄露一个二元预言机信号;攻击者遍历字节值并观察有效或无效响应,从而逐字节恢复明文;现实中的漏洞利用包括 POODLE、幸运十三和 BEAST;防御方法是改用 AEAD(GCM、ChaCha20-Poly1305),在解密之前验证认证信息。
用 AI 导师学习 Cryptology Academy — 免费
在浏览器中编写并运行真实代码,获得全天候 AI 导师的即时帮助,并在网页或应用中继续学习。
- 课程
- 67
- 课程
- 261
常见问题解答
「深入了解填充预言机攻击」课时是免费的吗?
是的 — 「深入了解填充预言机攻击」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Cryptology Academy 课程的其余内容,请升级到 CoddyKit PRO。 Cryptology Academy 课程共包含 4 节课。
「深入了解填充预言机攻击」这节课中我会学到什么?
逐步分析 CBC 填充预言机攻击,并了解为什么即使轻微的解密错误预言机也会造成灾难性后果。 你通过在浏览器中直接运行的动手代码来练习 Cryptology Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Cryptology Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Cryptology Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。
「深入了解填充预言机攻击」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Cryptology Academy 课中编写并运行代码吗?
能。每节 Cryptology Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- 深入了解填充预言机攻击
- 重放攻击与随机数重复使用漏洞
- 应用层代码中的时序攻击
- 常见密码学误用模式