CVE-2026-33306bcrypt-ruby是OpenBSD bcrypt()密码哈希算法的Ruby绑定。在3.1.22版本之前,JRuby的Java BCrypt实现中存在一个整数溢出漏洞。当应用程序将成本参数设置为31(gem允许的最大值)时,有符号32位整数溢出会导致轮次计数变为负数,从而使密钥增强循环执行零次迭代。这导致哈希计算从原本的2^31轮指数增强退化为近似恒定时间的计算。生成的哈希值看起来有效且可以通过checkpw验证,使得应用程序无法察觉该弱点。
该漏洞源于JRuby实现中的BCrypt.java文件在计算密钥增强轮次时使用了有符号32位整数。正常情况下,bcrypt算法通过cost参数控制计算强度,公式为2^cost。当cost参数被设置为允许的最大值31时,计算结果(2^31)超出了有符号32位整数的最大值,发生溢出变为负数。在随后的循环逻辑中,负数导致循环体一次都不执行,即发生了“零迭代”现象。这意味着原本为了抵抗暴力破解而设计的指数级计算成本被完全移除,攻击者可以在极短时间内计算出哈希或进行碰撞攻击。由于生成的哈希格式符合标准($2a$31$...)且能通过checkpw校验逻辑,应用层无法检测到安全性降低。攻击者若能获取到利用此漏洞生成的哈希值,即可利用常规硬件在极短时间内暴力破解出明文密码。