IPBUF安全漏洞报告
English
CVE-2026-33306 CVSS 7.5 高危

CVE-2026-33306 bcrypt-ruby整数溢出漏洞

披露日期: 2026-03-24

漏洞信息

漏洞编号
CVE-2026-33306
漏洞类型
整数溢出
CVSS评分
7.5 高危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
bcrypt-ruby

相关标签

整数溢出密码学bcrypt-rubyJRubyCVE-2026-33306

漏洞概述

bcrypt-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校验逻辑,应用层无法检测到安全性降低。攻击者若能获取到利用此漏洞生成的哈希值,即可利用常规硬件在极短时间内暴力破解出明文密码。

攻击链分析

STEP 1
信息收集
攻击者确认目标应用程序使用JRuby环境且集成了受影响版本的bcrypt-ruby库。
STEP 2
获取哈希
攻击者通过数据库泄露或其他方式获取目标系统中存储的密码哈希值,特别是以$2a$31$开头的哈希。
STEP 3
破解哈希
由于整数溢出导致计算强度为零,攻击者利用常规算力在极短时间内暴力破解出明文密码。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
require 'bcrypt' # PoC for CVE-2026-33306: Integer Overflow in bcrypt-ruby for JRuby # This script demonstrates that setting cost=31 results in zero iterations, # making the hash generation instant instead of taking 2^31 rounds. password = "test_password" puts "Testing bcrypt with cost=31 on JRuby..." start_time = Time.now # Generate hash with max cost (triggers the vulnerability) # On a patched version, this would take a very long time. hash = BCrypt::Password.create(password, :cost => 31) end_time = Time.now time_taken = end_time - start_time puts "Generated Hash: #{hash}" puts "Time elapsed: #{time_taken} seconds" if time_taken < 1.0 puts "[!] Vulnerability detected: Hash generation was too fast (zero iterations)." else puts "[+] System appears patched or cost is handled correctly." end

影响范围

bcrypt-ruby < 3.1.22

防御指南

临时缓解措施
如果无法立即升级,请将bcrypt算法的cost参数设置为小于31的值(例如10或12),以避免触发整数溢出并确保密钥增强循环正常执行。

参考链接

快速导航: 前沿安全 最新收录域名列表 最新威胁情报列表 最新网站排名列表 最新工具资源列表 最新CVE漏洞列表