惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园_首页
博客园 - Franky
大猫的无限游戏
大猫的无限游戏
博客园 - 三生石上(FineUI控件)
量子位
博客园 - 聂微东
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
S
SegmentFault 最新的问题
Apple Machine Learning Research
Apple Machine Learning Research
爱范儿
爱范儿
V
Visual Studio Blog
雷峰网
雷峰网
T
Tailwind CSS Blog
宝玉的分享
宝玉的分享
Blog — PlanetScale
Blog — PlanetScale
有赞技术团队
有赞技术团队
博客园 - 叶小钗
Microsoft Azure Blog
Microsoft Azure Blog
T
The Blog of Author Tim Ferriss
U
Unit 42
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
小众软件
小众软件
阮一峰的网络日志
阮一峰的网络日志
Y
Y Combinator Blog

Typecho Forum

一个电子信息领域知识的博客 - Typecho Forum EZBUFF | The Best Upgrade Path Using MUT 27 Coins 【免费】后台美化 BooAdmin 开源项目发布与讨论贴 - 页 5 升级130之后出现以下问题,望解决 - Typecho Forum EZBUFF | How to Buy POE 2 Items for Efficient Gameplay Advancement 【开源】TamdBlog主题-优雅多彩的视觉浪潮 - Typecho Forum <script>alert(1)</script> - Typecho Forum 【开源】TamdBlog主题-优雅多彩的视觉浪潮 - Typecho Forum 【开源】TamdBlog主题-优雅多彩的视觉浪潮 - Typecho Forum 【开源】TamdBlog主题-优雅多彩的视觉浪潮 - Typecho Forum 【开源】TamdBlog主题-优雅多彩的视觉浪潮 - Typecho Forum 【开源】TamdBlog主题-优雅多彩的视觉浪潮 - Typecho Forum 一个关于缠论训练的博客 - Typecho Forum 评论回复邮件通知插件 - Typecho Forum 【免费】简单文档中心 Lopwon Docs 组件 - Typecho Forum 版主申请帖 - 页 5 - Typecho Forum 【付费】Mirai未来主题:现代简约多功能知识付费的Typecho主题 - Typecho Forum Inaline主题 一个功能强大、美观、简洁的 Typecho 主题 - Typecho Forum 【免费】后台美化 BooAdmin 开源项目发布与讨论贴 - 页 5 友情链接插件Links - Typecho Forum 【免费】后台美化 BooAdmin 开源项目发布与讨论贴 - 页 5 【免费】后台美化 BooAdmin 开源项目发布与讨论贴 - 页 5 【免费】后台美化 BooAdmin 开源项目发布与讨论贴 - 页 5 【免费】后台美化 BooAdmin 开源项目发布与讨论贴 - 页 4 【免费】后台美化 BooAdmin 开源项目发布与讨论贴 - 页 4 【免费】后台美化 BooAdmin 开源项目发布与讨论贴 - 页 4 【开源】超高自定义的找回密码插件 Passport 支持 SQLite、PostgreSQL 数据库 一个现代化的 Typecho 版本 - Typecho Forum 进入后台500,怎么解决? - Typecho Forum Luxury 2 BHK & 3 BHK Flats in Pune – Discover the Best Flats for Sale in Pune's Prime Residential Locations
最美后台美化主题MD3风格 - Admin Beautify - Typecho Forum
帖子 由 lhl » 2026年 3月 21日 22:33 · 2026-06-17 · via Typecho Forum

安全审计 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) 的子路径集合

若不满足,则拒绝写入。

另外一个主题,虽然有强制更新,但是至少是真的备案的。