Formbricks高危安全漏洞CVE-2025-59934
Formpicks 项目是一个开源的调查与体验管理解决方案,是一个用于构建应用内和网站调查的开源平台,可用于构建应用内和网站调查。
Formpicks 是开源 Qualtrics 替代品,支持使用无代码编辑器创建具有多种问题类型产品内调查,用户可轻松定制满足自身需求调查问卷。
一、基本情况
Formpicks开源体验管理与调查平台可在网站、应用内及邮件中嵌入自定义调查,支持实时分析与用户细分,适合注重隐私与可定制团队。

Formpicks平台符合 GDPR、CCPA 等数据保护法规要求,并且正在获取 SOC 2 Type II 认证,因此这确保了用户数据的安全和合规处理。
栋科技漏洞库关注 Formpicks 受影响版本中存在一个 JWT 签名验证缺失的漏洞,漏洞现已追踪为CVE-2025-59934,CVSS3.X评分 9.4。
二、漏洞分析
CVE-2025-59934漏洞存在于 Formpicks 版本 4.0.1 之前,这一漏洞源于一个仅解码 JWT(jwt.decode)而不验证其签名的令牌验证程序。
具体来说,漏洞源于不当令牌验证逻辑,令牌验证例程仅对JWT进行解码(jwt.decode )而不验证其签名,允许攻击者绕过(JWT)验证。
这可导致电子邮件验证令牌登录路径和密码重置服务器操作均使用相同的验证器,该验证器不检查令牌的签名、过期时间、签发者或受众。
如果攻击者了解到受害者的实际user.id,他们可以构造一个带有 alg:"none" 头部的任意 JWT,并且使用它来验证身份和重置受害者的密码。
因此,攻击者可以绕过JSON Web Token(JWT)验证,获知受害者的实际user.id 即足以任意修改其密码,漏洞已在版本 4.0.1 得到修复。
verifyToken函数使用jwt.decode 解析载荷,而并非jwt.verify (不进行签名或过期检查),允许攻击者在获取用户ID字符串后完全接管账户。
由于Formpicks的电子邮件验证和密码重置流程均受此弱点影响,攻击者可随意重置凭证, effectively 将用户锁定在账户之外。
漏洞代码:
formpicks/apps/web/lib/jwt.ts
Lines 114 to 117 in 843110b
export const verifyToken = async (token: string): Promise<JwtPayload> => {
// First decode to get the ID
const decoded = jwt.decode(token);
const payload: JwtPayload = decoded as JwtPayload;
三、POC概念验证
前提:受害者的用户ID(例如,cmfuc8pk60000vxfjud7bcl2w)已被泄露。
恶意令牌生成:构造一个任意JWT,头部alg设为"none",载荷为{"id":"cmfuc8pk60000vxfjud7bcl2w"}。
请求路径:访问 /auth/forgot-password/reset?token=<伪造的JWT> 并提交密码重置表单。
服务器行为:verifyToken使用jwt.decode解析载荷,而非jwt.verify(不进行签名或过期检查)。
数据库查询:使用解析后的ID查询用户;若存在匹配用户,则更新密码。
根本原因:令牌验证仅依赖于jwt.decode,未验证签名、过期时间等。
1、python3 示例
管理员已设置登录后刷新可查看3、输入要设置的新密码

4、您可以看到密码已被强制更改为新密码

四、影响范围
Formpicks < 4.0.1
五、修复建议
Formpicks >= 4.0.1
六、参考链接
管理员已设置登录后刷新可查看