当算法变成后门:JWT 的 Algorithm Confusion 攻击

你登录了一个网站,服务器发给你一个 JWT,里面用 RS256(非对称签名)保护你的身份。看起来很安全——私钥在服务器手里,攻击者没法伪造签名。但问题是,很多 JWT 库在验证时做了一个"贴心"的设计:它们从 token 的 header 里读取 alg 字段,然后以此决定验证方式。攻击者只需要把 header 里的 algRS256 改成 HS256,再用自己的公钥作为 HMAC 密钥对 payload 签名,服务器就会用公钥做 HMAC 验证——而公钥是公开的。一瞬间,非对称签名的安全假设被绕过了,攻击者可以用任意 payload 伪造合法 token。2015 年这个漏洞同时出现在至少五个主流 JWT 库里,包括 node-jws、ruby-jwt 和 python-jose。根本原因不是密码学出了问题,而是实现把"算法选择权"交给了不受信任的输入。修复方式很直接:验证时硬编码期望的算法,拒绝从 token header 动态读取。换句话说,。这个教训不仅适用于 JWT——任何安全协议里,如果验证逻辑依赖攻击者可控的元数据,类似的混淆攻击就必然存在。

#Security