flawopen.com/Incidents/bricksforge-pro-forms-upload-metadata-october-2026
●
Bricksforge WordPress plugin · CVE-2026-85097 · 2026-10-07 · CVSS 9.8 · 严重
安全研究 · FlawOpen
CVE-2026-85097:Bricksforge Pro Forms 上传缺陷
CVE-2026-85097 使未认证请求能够利用 Bricksforge Pro Forms 中已验证的临时文件内容与客户端可控目标元数据之间的不一致。Patchstack 报告了利用尝试;请更新插件并调查暴露的站点。[1], [2], [3], [4], [5]
💡 通俗易懂的原理解析 (ELI5)
想象一个收发室先确认包裹里是无害图片,却允许寄件人在包裹送到某个会把特定标签当程序打开的办公室前更换标签。Bricksforge 检查了临时上传文件,但之后提交表单时仍可提供不同的目标名称。防护办法是让文件身份和存储目标在整个流程中始终由服务器控制。[3], [2]
核心概念与专有名词
框架映射
- 本指南所述弱点的 CWE 参考: CWE-434
报告的版本状态与运维处置
| 证据来源 | 来源说明 | 防护处置 |
|---|---|---|
| Wordfence CNA / CVE 记录 | 描述了未认证任意文件上传;记录中的受影响范围截至 3.1.8.9。 | 将其视为 CNA 记录的影响范围,而不是已部署站点安全无虞的证明。 |
| Patchstack(2026 年 10 月 8 日) | 报告首次于 10 月 7 日观察到利用尝试,并将 3.1.8.10 标为已修复版本。 | 将其视为 Patchstack 报告的修复边界;逐个核实每个站点实际安装的插件版本。 |
| Bricksforge 公开更新日志 | 4.0.1 版列出 Pro Forms 上传安全修复,但未说明 3.1.8.10 这一边界。 | 不要仅凭更新日志推断 4.0.1 是首个修复版本,或某个具体 3.x 版本已经安全。 |
| 可从外部访问或疑似受侵的站点 | 来源报告了利用尝试,但没有证明每个被攻击的站点都已失陷。 | 升级到当前受支持的版本;检查上传及 Web 服务器日志,并调查异常文件后再宣布恢复完成。 |
事件演进时间线
2026-10-07
2026-10-08
攻击执行流程分解
步骤 2
源代码对比:漏洞与安全实现
此通用示例展示由服务器管理的上传身份、按用户查询、重新检查内容类型、生成文件名和私有存储。它不是 Bricksforge 源码或其实际补丁。生产代码还必须实施大小限制、安全权限、原子状态转换和符合上下文的文件提供方式;受影响站点应更新到供应商支持的已修复版本。[2], [3]
存在漏洞的实现
function finalize_upload( array $item, string $stagedPath, string $uploadDir ): string {
// 客户端元数据会在此前的 MIME 检查之后决定最终文件名。
$name = basename( (string) parse_url( $item['file']['url'], PHP_URL_PATH ) );
$destination = $uploadDir . DIRECTORY_SEPARATOR . $name;
if ( ! rename( $stagedPath, $destination ) ) {
throw new RuntimeException( 'Could not finalize upload' );
}
return $destination;
}
加固后的安全修复
function finalize_upload( string $uploadId, UploadRegistry $registry, string $privateDir ): string {
// 从服务器端记录解析所有者和路径,绝不依赖客户端 URL。
$upload = $registry->findPendingForCurrentUser( $uploadId );
if ( $upload === null || ! is_file( $upload->path ) ) {
throw new RuntimeException( 'Unknown pending upload' );
}
$types = [ 'image/jpeg' => 'jpg', 'image/png' => 'png' ];
$mime = ( new finfo( FILEINFO_MIME_TYPE ) )->file( $upload->path );
if ( ! isset( $types[ $mime ] ) ) {
throw new RuntimeException( 'Unsupported file type' );
}
$destination = $privateDir . DIRECTORY_SEPARATOR . bin2hex( random_bytes( 16 ) ) . '.' . $types[ $mime ];
if ( ! rename( $upload->path, $destination ) ) {
throw new RuntimeException( 'Could not finalize upload' );
}
$registry->markConsumed( $uploadId );
return $destination;
}
工程与系统安全加固清单
- ✓盘点生产、预发布和托管客户站点中的 Bricksforge 版本;将受影响安装更新到供应商当前支持的版本。Patchstack 将 3.1.8.10 标为修复版本,而供应商 changelog 记录 4.0.1 的安全修复,却未说明 3.x 的确切边界。[1], [2], [3], [4], [5]
- ✓FlawOpen 运维建议:在完成上传时,将客户端提交的名称、URL、路径和 MIME 标签全部视为不可信;根据服务器端上传记录和依据实际检查内容制定的允许列表生成存储名称与路径。
- ✓FlawOpen 运维建议:尽可能将上传文件存储在可执行 Web 根目录之外;否则配置 Web 服务器,禁止所有上传和临时上传目录执行脚本。
- ✓FlawOpen 运维建议:将每个待处理上传记录绑定到创建它的表单会话,限制为单次使用,并拒绝缺失、过期、重放或不匹配的标识符。
- ✓FlawOpen 运维建议:如果易受影响的站点曾公开访问,请检查 Web 和应用日志中的异常表单上传以及上传目录中新建的文件;先保留证据,并遵循托管方的事件响应流程再清理。
- ✓FlawOpen 运维建议:添加回归测试覆盖不匹配元数据、不允许的内容、跨会话 ID、过期 ID 和重放 ID;确认请求被拒绝,且不会向可执行位置写入文件。