
























安全审计 AdminBeautify_Updater 自动更新机制有风险
本报告针对插件自动更新模块进行安全性审计,重点分析远程更新链路、文件写入行为以及潜在可利用风险。
结论:当前实现存在供应链攻击面与任意文件写入风险,在公网环境中不建议直接使用。
一、源码关键路径(节选)
更新行为的核心链路如下:
代码: 全选
$zipContent = $this->httpDownloadWithProgress($downloadUrl, ...);
$zipFile = $this->tmpDir . '/update.zip';
file_put_contents($zipFile, $zipContent);
$zip->open($zipFile);
$entryName = $zip->getNameIndex($i);
$destPath = $extractDir . '/' . $entryName;
file_put_contents($destPath, $content);
$this->copyDir($sourceDir, $this->pluginDir, $skipDirs);
传输层实现如下:
代码: 全选
CURLOPT_SSL_VERIFYPEER => false,
CURLOPT_SSL_VERIFYHOST => false,
以及:
代码: 全选
'ssl' => [
'verify_peer' => false,
'verify_peer_name' => false,
]
镜像机制如下:
代码: 全选
$mirroredUrl = $mirror . $url;
$result = $this->httpGet($mirroredUrl, $timeout);
二、风险机理分析
该模块的安全边界完全建立在“下载内容可信”这一隐含前提上,但代码中未提供任何验证机制。更新包来源既可能是 GitHub 官方接口返回的地址,也可能被镜像代理重写。在传输过程中,TLS 验证被显式关闭,使得 HTTPS 链路失去认证能力,从而无法抵御中间人攻击。在这种情况下,任意具备网络劫持能力的攻击者均可返回伪造的 ZIP 内容。
在文件处理阶段,压缩包中的条目名称直接参与路径拼接:
代码: 全选
$destPath = $extractDir . '/' . $entryName;
该行为未进行路径规范化或边界检查,意味着压缩包中若包含“../”序列,则可构造路径逃逸,使写入位置突破临时目录限制。例如:
代码: 全选
../../../../../../var/www/html/shell.php
在解压阶段将被解释为目标路径,从而导致任意文件写入。这一问题属于典型的 Zip Slip 漏洞,其本质是“外部输入控制文件系统写入路径”。
在覆盖阶段:
代码: 全选
$this->copyDir($sourceDir, $this->pluginDir, $skipDirs);
程序未对文件类型、路径范围或内容合法性进行任何约束,且默认执行覆盖写入。这意味着,一旦攻击者控制 ZIP 内容,不仅可以在插件目录内植入后门,还可以结合路径穿越漏洞,静默替换站点中的敏感文件,包括但不限于:
代码: 全选
index.php
config.inc.php
其他插件入口文件
Web 根目录脚本
此外,更新流程为静默执行,无差异对比、无文件列表提示、无人工确认,这使得上述替换行为在实际运行中难以被察觉。
三、可利用攻击路径
在具备网络层干预能力的前提下(如 DNS 劫持、反向代理污染、镜像源被控制),攻击流程可以形式化描述如下:
代码: 全选
1. 劫持更新请求或镜像源返回
2. 返回伪造 ZIP 文件
3. ZIP 内构造:
- 恶意 Plugin.php(后门)
- 含 ../ 的路径实现目录逃逸
4. 更新程序下载并解压
5. 文件被写入插件目录或站点任意位置
6. PHP 文件被加载执行
由于代码中未进行哈希校验、签名验证或来源认证,上述过程不需要突破应用层逻辑,仅依赖传输链路即可完成。
四、问题性质判定
从安全模型角度,该实现具备以下特征:
1. 远程输入(ZIP 内容)直接进入文件系统
2. 写入路径由外部数据控制(未校验)
3. 写入内容随后参与 PHP 执行
因此可以归类为:
远程代码执行风险(RCE) + 任意文件写入漏洞
其中,“任意文件写入”由路径未校验导致,“RCE”由 PHP 文件覆盖执行链路触发。
五、修复方向(原则性说明)
修复必须同时约束“来源可信性”与“写入边界”。
在传输层,应恢复 TLS 验证,确保远程服务器身份可被验证;在内容层,应引入不可伪造的完整性校验(如 SHA256 或签名机制),使下载内容具备可验证性;在文件系统层,应对压缩包路径进行规范化处理,禁止出现任何形式的目录逃逸;在覆盖阶段,应限制写入范围仅限插件目录内部,并对目标路径进行 realpath 校验,确保其始终位于允许目录之下。
路径校验的核心约束可以形式化表达为:
代码: 全选
realpath(target) ∈ realpath(allowed_base) 的子路径集合
若不满足,则拒绝写入。
另外一个主题,虽然有强制更新,但是至少是真的备案的。
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。