CVE-2026-61500|RejettoHFS会话伪造导致远程代码执行(POC)

admin 2026-10-07 04:52:26 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 本文披露RejettoHFS3.x会话伪造漏洞CVE-2026-61500,源于Math.random()生成会话签名密钥致可预测,攻击者经未认证接口采集随机数,用Z3求解器还原PRNG状态并回溯密钥,伪造管理员会话借servercode功能实现未授权RCE,CVSS9.8。建议升级至3.2.1或显式配置强随机COOKIESIGN_KEYS,收敛公网暴露面。 综合评分: 95 文章分类: 漏洞分析,WEB安全,红队,渗透测试


CVE-2026-61500 | Rejetto HFS会话伪造导致远程代码执行(POC)

alicy alicy

信安百科

2026年10月6日 09:00 河北

在小说阅读器读本章

去阅读

在公众号小说中沉浸阅读

免责声明:本文仅供安全研究与防御学习交流。漏洞技术细节均来源于公开可查证的安全研究资料,请勿将相关技术用于非授权测试,由此产生的一切后果与作者无关。

#

0x00、前言

Rejetto HFS(HTTP File Server)是一款已有二十余年历史的开源文件服务器,以轻量、开箱即用著称,常被用来快速搭建网页文件共享服务,大量实例直接暴露于互联网。它的 2.x 版本(Delphi 编写)曾在 2024 年因未授权模板注入漏洞 CVE-2024-23692 被 CISA 列入已知被利用漏洞(KEV)目录;此后项目使用 TypeScript 全面重写为 3.x。

2026 年 9 月 30 日,Horizon3.ai 研究员 Zach Hanley 披露:借助 Anthropic 的安全研究模型 Mythos,他们在重写后的代码里发现了一个 CVSS 9.8 的认证绕过漏洞,且技术细节公开后数日内就被监测到在野利用。这个用 Math.random() 签名会话 Cookie 的老毛病,为何多年无人发现,如今又被 AI 一眼识破?

#

0x01、漏洞描述

CVE-2026-61500(CWE-338,使用密码学不安全的伪随机数生成器)的根源是 HFS 3.x 对随机数的两处误用:

其一,管理员未显式配置 COOKIE_SIGN_KEYS 时,会话 Cookie 的签名密钥由 Math.random() 生成,而 V8 引擎中该函数基于 xorshift128+ 算法,输出完全可逆;

其二,未认证的登录接口 loginSrp1 会把 Math.random() 的原始输出存入会话并随 Set-Cookie 明文下发。攻击者无需任何凭据,只需发起约 12 次登录请求收集泄露值,即可用 Z3 求解器还原 PRNG 内部状态,回溯推出进程启动时生成的签名密钥,进而伪造管理员会话 Cookie,最后借管理接口的 server_code 功能执行任意代码,实现未授权 RCE。全程无需用户交互,唯一前提是目标存在可登录的管理员账户。

#

0x02、CVE 编号

| 项目 | 内容 | | — | — | | CVE 编号 | CVE-2026-61500 | | 漏洞类型 | 会话签名密钥可预测 → 管理员会话伪造 → RCE(CWE-338) | | 危险评分 | CVSS v3.1:9.8 Critical;CVSS v4.0:9.3 Critical | | 影响组件 | Rejetto HFS(TypeScript 重写版 3.x) |

#

0x03、影响版本

| 产品 | 受影响版本 | 修复版本 | | — | — | — | | Rejetto HFS 3.x | 3.0.0 – 3.2.0 | 3.2.1(2026-07-13 发布) |

补丁先行一步:v3.2.1 早在 2026 年 7 月 13 日即发布,比 Horizon3 公开技术细节早了 79 天。官方发布说明写道:”Multiple security vulnerabilities have been found in all previous versions, potentially allowing an attacker to gain administrative access to HFS.”(所有历史版本中均发现多个安全漏洞,攻击者可能借此获得 HFS 的管理权限。)

另注:HFS 2.x 为 Delphi 编写的独立代码库,不受本漏洞影响,但其自身存在 CVE-2024-23692 等历史漏洞,同样不建议继续使用。

#

0x04、漏洞详情

1、签名密钥从哪里来

HFS 3.x 基于 Node.js 的 Koa 框架构建。Koa 通过 keygrip 库为所有会话 Cookie 做 HMAC 签名,签名密钥来自应用初始化时传入的 keys。HFS 的处理逻辑如下:

// src/index.ts:41-43(漏洞版本,原注释因排版折行展示)
const keys = process.env.COOKIE_SIGN_KEYS?.split(',')
    // randomness at start gives some extra security,
    // btu also invalidates existing sessions
    || [randomId(30)]
export const app = new Koa({ keys })

当环境变量 COOKIE_SIGN_KEYS 未设置时(默认即如此,且整个代码库中没有任何地方自动设置它),签名密钥就是 randomId(30) 在进程启动瞬间的返回值。而 randomId 的实现基于 Math.random().toString(36).substring(2,12).replace(/l/g,'L') 的递归拼接——randomId(30) 在进程启动时恰好消耗 3 次连续的 Math.random() 输出。

Mythos 原始输出节选(中译):当 COOKIE_SIGN_KEYS 未设置时,Koa keygrip 密钥为 randomId(30)(index.ts:41-42),randomId(cross.ts:334-341)由 Math.random().toString(36) 构建——V8 xorshift128+,非密码学安全且可逆。进程还会向远程客户端泄露原始 Math.random 输出:loginSrp1 设置 const sid = Math.random()(api.auth.ts:78)并存入 ctx.session.loggingIn,而 koa-session 的 Cookie 是 base64 JSON,客户端会在自己的 Set-Cookie 中收到那个精确的 52-bit double。

2、V8 的 Math.random() 为什么不安全

在 V8(Node.js 的 JavaScript 引擎)中,Math.random() 由 xorshift128+ 算法驱动:内部状态仅两个 64 位整数,所有运算在 GF(2) 上完全可逆。只要观测到若干连续输出(借助公开工具 3–5 个即可),就能重建内部状态,并向前、向后步进推出任意时刻的输出。HFS 的要害在于:进程启动时生成的签名密钥,与此后登录接口产生的随机数,来自同一条可预测的随机流。

3、泄露通道:登录接口直接吐出原始随机数

HFS 登录采用 SRP 协议,其中第一步 loginSrp1 无需密码即可调用。该接口用 Math.random() 生成登录中间值 sid 并存入会话对象:

// src/api.auth.ts —— loginSrp1(未认证即可调用)
const { srpServer, ...rest } = await srpServerStep1(account)
const sid = Math.random()
ongoingLogins[sid] = srpServer
setTimeout(()=> delete ongoingLogins[sid], 60_000)
ctx.session.loggingIn = { username, sid } // temporarily store until process is complete

关键在于 koa-session 的存储方式:会话内容以 base64(JSON) 形式放在 Cookie 里——只做签名、不做加密。任何发起登录的客户端,都能从自己的 Set-Cookie 中解码出那个精确的 52-bit 双精度浮点数。攻击者每调用一次 loginSrp1,就能采集一个连续的 Math.random() 原始输出。

4、完整攻击链与 RCE

Horizon3 在披露文章中给出端到端利用链,共六步:

第 1 步 · 枚举确认:利用一个用户枚举漏洞(Mythos 同样发现了它)确认内置 admin 账户存在;

第 2 步 · 采集泄露值:调用未认证的泄露点 12 次,收集 12 个原始 Math.random() 输出;

第 3 步 · 求解状态:将观测值作为约束输入 Z3 SMT 求解器,恢复 xorshift128+ 内部状态;

第 4 步 · 回溯密钥:将状态回溯步进至进程启动时刻,重建 randomId(30) 生成的签名密钥——候选密钥可用攻击者自己合法会话 Cookie 的 HMAC 签名离线验证,直到命中;

第 5 步 · 伪造会话:用重建密钥为 admin 用户签发伪造会话 Cookie:

// 伪造会话内容(引自 Horizon3 披露的 Mythos 分析)
{username:'admin', ts:now, allow_session_ip_change:true}

第 6 步 · 落地 RCE:伪造 Cookie 通过认证后,滥用 HFS 管理接口的 server_code 功能——它允许创建能执行任意 JavaScript 的自定义端点——在服务器上执行系统命令。

几个让攻击“万无一失”的细节:koa-session 无外部存储、会话全部在 Cookie 中;prepareState 默认信任会话内的 username(invalidateSessionBefore 默认为空表);IP 绑定可通过伪造字段 allow_session_ip_change 绕过;ctxAdminAccess 纯粹依据 ctx.state.account 判定管理员权限,且默认 admin_net 为空、不施加任何网络限制。此外,服务端 Math.random() 的消费者只有启动密钥与 sid 两处,候选密钥的搜索空间极小。V8 内部 64 条一批、倒序消费的缓存机制会让回溯略复杂,但并不构成障碍。

#

已关注

关注

重播 分享 赞

关闭

观看更多

更多

退出全屏

切换到竖屏全屏退出全屏

信安百科已关注

分享视频

,时长00:34

0/0

00:00/00:34

切换到横屏模式

继续播放

[ ]

进度条,百分之0

播放

00:00

/

00:34

00:34

倍速

全屏

倍速播放中

0.5倍0.75倍1.0倍1.5倍2.0倍

超清流畅

 您的浏览器不支持 video 标签

继续观看

CVE-2026-61500 | Rejetto HFS会话伪造导致远程代码执行(POC)

观看更多

转载

,

CVE-2026-61500 | Rejetto HFS会话伪造导致远程代码执行(POC)

信安百科已关注

分享点赞在看

已同步到看一看写下你的评论

视频详情

#

0x05、个人观察与判断

设计点评:源码注释“randomness at start gives some extra security”说明作者有安全意识,却选错了原语——Math.random() 从不承诺密码学安全,签名密钥应取自 CSPRNG;koa-session“签名不加密”又让泄露值明文可读。两个低危误用叠加,即成 9.8 分 RCE。

趋势思考:据 VulnCheck 统计,这是已知第二个被证实遭在野利用的 AI 发现漏洞。当 PRNG 状态恢复、SMT 求解这类数学密集型攻击被模型一键化,过去因武器化成本高而“安全”的漏洞类别将批量进入攻击射程,弱随机数该从审计清单末尾提到最前了。

排查建议:升级至 3.2.1,或显式配置强随机的 COOKIE_SIGN_KEYS 并重启;通过资产测绘收敛公网暴露的 HFS 实例,管理界面不应直连互联网;核查 server_code 等自定义端点配置与管理日志,发现异常立即轮换密钥并排查持久化后门。

#

0x06、参考链接

1、Github项目地址:

https://github.com/aramosf/CVE-2026-61500

2、Horizon3.ai 核心技术分析:攻击链细节与 Mythos 发现过程

Horizon3’s Tales from the Trenches: Anthropic’s Mythos and Rejetto HFS

3、Rejetto HFS 官方修复公告(Release 3.2.1)

https://github.com/rejetto/hfs/releases/tag/v3.2.1



— END —

❤ 如果觉得有帮助,点个红心支持一下吧。


免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。

本文转载自:信安百科 alicy alicy《CVE-2026-61500 | Rejetto HFS会话伪造导致远程代码执行(POC)》

评论:0   参与:  0