01
管理员先行动

在比较防火墙之前更新 Forminator

防火墙是一个附加层,不能替代更正的上传逻辑。

  1. 1
    安装最新支持的 Forminator 版本

    NVD 将 1.24.6 之前的版本识别为受影响的版本。不要仅仅因为旧的历史版本包含原始更正就安装它。

  2. 2
    确认当前版本

    检查 WordPress 插件屏幕上显示的版本,并验证废弃的副本没有留在服务器的其他位置。

  3. 3
    查看较旧的暴露站点

    如果 1.24.6 或更早版本接受公共图像后上传,请调查意外的可执行文件,尤其是在上传目录下,并查看相关的请求和文件更改日志。

  4. 4
    将可疑文件视为事件

    保留日志和备份、调查持久性、在遏制后轮换受影响的凭据,并遵循 恶意软件清理指南.

02
CVE-2023-4596

简单的英语漏洞

受影响的图像后路径在完成决定是否允许其最终文件类型的检查之前写入了一个文件。

在 Forminator 到 1.24.6 中, upload_post_image() 读取上传的数据,选择最终的文件名,然后写入文件。之后代码才调用 WordPress 文件类型检查来确定最终扩展名是否属于允许的图像列表。

WordPress 变更集将写入移至成功的验证分支内。这个顺序很重要:验证只有在服务器创建文件之前运行时才能拒绝危险的最终名称。

03
存档支持什么

历史测试范围

存档保留了表格和散文,但没有足够的细节来进行当前或完全可重现的比较。

测试日期
2023 年 9 月 2 日
目标
Forminator 1.24.6 后期图片上传路径
流量来源
根据原始文章,AWS 微型服务器
测试输入
文章引用的公共Exploit-DB样本;这里没有复制有效负载
产品展示
Wordfence、NinjaFirewall、Shield Security、SiteGround Security 和 BitFire
配置声明
作者报告说启用了所有现成的安全选项

更新后的表格保留了 BitFire 撰写的过时观察结果,而不是重新测试。下面的每个状态都是原始图例的文本替换:已阻止、已绕过、未阻止或手动规则。没有推断出丢失的结果。

04
持久的教训

链条可能被中断的七个地方

每个控件看到同一请求的不同部分。一个有用的设计并不依赖于所有七个工作。

01限制客户端

机器人身份或请求策略可以停止第一个连接。

02检查原来的名字

拒绝明显危险的延期。

03验证最终名称

清理或重命名后再次检查。

04检查内容

超越可执行 PHP 的扩展名。

05授权写入

运行时策略可以拒绝未经授权的 PHP 写入。

06阻止执行

服务器策略可以使上传目录保持不可执行。

07限制出站流量

网络策略可以限制已知的命令和控制行为。

第一到第五阶段可以阻止文件被创建或接受。第六阶段允许普通上传存在,但阻止 Web 服务器以 PHP 形式运行它们。第七阶段发生较晚,可以限制一种妥协后的通信;它不会撤消先前的上传。

05
保留历史结果

2023 年 9 月测试结果

将每个单元格读取为“在此测试中”,并将缺失版本限制应用于整个表。

在此测试中被阻止在此测试中被绕过本次测试中未被阻止手动缓解可用但未启用/测试未记录
BitFire 编写的 Forminator 1.24.6 测试,2023 年 9 月 2 日。未记录产品版本。
安全插件1. 客户限制2. 扩展检查3. 最终名称验证4.内容检查5.运行时写控制6.上传执行策略7. 出站工具流量
字栅栏本次测试中未被阻止在此测试中被绕过本次测试中未被阻止在此测试中被绕过本次测试中未被阻止手动缓解可用但未启用/测试本次测试中未被阻止
忍者防火墙本次测试中未被阻止在此测试中被绕过本次测试中未被阻止本次测试中未被阻止本次测试中未被阻止手动缓解可用但未启用/测试本次测试中未被阻止
盾牌安全本次测试中未被阻止本次测试中未被阻止本次测试中未被阻止本次测试中未被阻止本次测试中未被阻止本次测试中未被阻止本次测试中未被阻止
站点地面安全本次测试中未被阻止本次测试中未被阻止本次测试中未被阻止本次测试中未被阻止本次测试中未被阻止本次测试中未被阻止本次测试中未被阻止
BitFire在此测试中被阻止在此测试中被阻止手动缓解可用但未启用/测试在此测试中被阻止在此测试中被阻止手动缓解可用但未启用/测试在此测试中被阻止

旧符号如何更新: 四个原始符号类别现在写为“已阻止”、“已绕过”、“未阻止”和“可手动缓解”。为了完整性起见,图例中包含“未记录”,但单元格不需要“未记录”,因为旧表格的每个位置都有一个符号。

06
直接报道的内容

每个产品的观察

这些注释解释了历史表。他们没有对当前功能或当前默认配置做出任何声明。

字栅栏

官方插件页面

原始测试报告客户端限制并未停止请求。它的扩展名和文件内容检查识别了部分示例,但被测试变体绕过。没有最终名称或运行时写入控制停止请求。该文章报告称,可以通过优化/手动服务器规则来阻止上传下的直接 PHP 访问,但缓解措施并不属于测试结果的一部分。出站工具流量未被阻止。

忍者防火墙

官方插件页面

测试请求未因客户端限制、最终名称验证、内容检查、运行时写入控制或出站过滤而停止。测试中绕过了扩展检查。旧文章描述了用于拒绝上传下的 PHP 访问的手动选项,但没有将其作为启用的控件进行测试。

盾牌安全

官方插件页面

所观察到的七个阶段都没有阻止记录配置中的此特定请求。这一狭隘的结果并不能确定 Shield Security 现在支持什么、其他配置会做什么,或者不相关的控制是否有效。

站点地面安全

官方插件页面

在记录的配置中,七个阶段都没有阻止此特定请求。该测试仅限于该上传链,不应推广到产品的其他安全或帐户功能。

BitFire

官方插件页面

记录的配置在客户端限制、扩展检查、文件内容检查、运行时写入控制和出站过滤方面阻止请求。最初的散文指出,机器人政策可能会以宽松的模式有所不同。它将评估清理后的最终名称归功于扩展检查,而专用清理挂钩阶段和服务器上传目录规则被标记为手动缓解措施而不是测试块。

07
管理员应该保留什么

围绕上传构建独立的控件

桌子会老化。安全设计原则不依赖于特定产品。

修补易受攻击的软件

消除已知的错误,而不是要求每个防御层永远弥补它。

写入前验证

在存储之前检查原始名称和最终清理或生成的文件名。

检查内容和扩展

文件名是一个信号。上传的字节和预期的媒体行为提供了额外的证据。

保持上传不可执行

在应用程序和托管要求允许的情况下,配置上传目录,以便 PHP 无法在那里执行。

在运行时授权危险写入

第二个边界可以拒绝不属于经过身份验证的预期操作的可执行写入。

监控文件和出站行为

查找意外的可执行文件、上传后的更改、直接访问以及异常的外部连接。

08
方法论和披露

限制、商业利益和来源

公平的比较使不确定性变得可见,并为读者提供主要证据。

主要和官方参考资料

关于作者

科里·马什

Cory 拥有 20 多年的互联网安全经验,是 BitFire 项目的首席开发人员。

阅读更多 BitFire 研究 →
谨慎使用历史检验

有证据可以改善这一记录吗?

发送注明日期的版本、配置、可重现的结果或更正。我们将审查有用的文档并使限制可见。

免费保护我的网站 →