zkrana/joomla-security-scanner

GitHub: zkrana/joomla-security-scanner

一款 Joomla 安全扫描扩展,用于检测并清除由 SP Page Builder RCE 漏洞及 JCE 组件二次感染遗留的恶意软件、webshell 和篡改痕迹。

Stars: 11 | Forks: 1

# 🛡️ MuRu Guard Security Scanner (Joomla 扩展) ![Downloads](https://img.shields.io/github/downloads/zkrana/joomla-security-scanner/total) 。*请从 [`dist/`](dist) 文件夹下载最新版本。* 一款 Joomla 扩展,用于检测并协助清除由 **SP Page Builder `uploadCustomIcon` 未授权 RCE 漏洞**(6.6.2 之前版本)遗留的恶意软件。它还会检查 **JCE 编辑器组件 (`com_jce`)**,该组件已被报告为通过 SPPB 入侵的站点上的二次感染媒介。 像任何其他 Joomla 扩展一样安装。在 Joomla 管理后台运行,受 Joomla 自身的身份验证和 ACL 保护 —— 无需单独的访问密钥,没有公开访问的扫描文件,事后也无需记住删除任何内容。 需要帮助?联系我或发送电子邮件至 zkranao@gmail.com ## 🚧 临时通知:GitHub Releases 目前不可用 GitHub 遇到了平台级的 GitHub Actions 故障 —— 工作流运行无限期地停留在“排队”状态,或者在有任何作业运行之前的启动阶段就失败。这不是本仓库代码或工作流配置特有的问题(已经检查过计费、权限和 runner 配置,并向 GitHub 支持人员报告了此问题);它阻碍了自动化流水线向 [Releases](../../releases) 页面发布新的 release zip。 **在 GitHub 解决此问题之前,请直接从本仓库的 [`dist/`](dist) 文件夹中获取最新的可安装 zip 包** —— 它们的构建方式与 release 流水线通常的构建方式完全相同,只是作为替代品提交到了这里。现在包含**两个** zip 包(见下文):扫描器组件本身,以及其新增的配套实时保护插件。一旦 Releases 恢复正常,此通知将被撤下。 ## ⚠️ 关键安全通知 2026 年 6 月,SP Page Builder 6.6.2 以下版本被披露存在一个严重的未授权 RCE 漏洞。该漏洞允许攻击者在无需登录的情况下上传 PHP webshell,读取 `configuration.php`,创建恶意的 Super User 账户,并将 Stored XSS payload 注入到 Helix Ultimate 的 mega-menu 项中 —— 通常在发现易受攻击站点后的几分钟内就会完成这些操作。 **在做任何其他事情之前:** 1. **将 SP Page Builder 更新至 6.6.2 或更高版本。** 扫描仍然存在漏洞的站点只意味着明天还要再次清理相同的感染。 2. **如果安装了 JCE,请更新或移除它。** 多个主机报告称,在同样遭到 SPPB 漏洞利用的站点上,`com_jce` 内部也出现了恶意软件 —— 很可能是同一个攻击者在获得立足点后,将 JCE 的文件浏览器上传路径作为备用手段重新利用。 3. **进行完整备份**,并尽可能在站点的 staging 副本上而不是生产环境中运行首次扫描。 ## ✨ 功能介绍 | 类别 | 详情 | |---|---| | 🛡️ **保护模式 (新增)** | 配套插件会**实时检查对站点的每一个请求** —— 不仅仅是在你打开扫描器时 —— 检查 webshell 交互、SPPB `uploadCustomIcon` RCE、已知的恶意软件投放文件名、路径遍历探测和暴力破解登录尝试,并具有独立的启用开关,用于实际拦截高置信度匹配和暴力破解 IP。检测到的所有内容都会显示在分区的**保护日志**中(IP、时间、规则、严重程度、已拦截/仅记录)。请参阅下方的 [🛡️ 保护模式](#-protection-mode-real-time-attack-blocking) | | 🗂 文件系统扫描 | 遍历 `media/`、`images/`、`templates/`、`tmp/`、`cache/`、SPPB 和 JCE 组件目录、Joomla 核心入口点以及 webroot 本身 | | 🧬 内容特征码 | 标记已知的 webshell 模式(`eval(base64_decode(...))`、`assert($_POST...)`、`gsocket`、诸如 c99/r57/WSO 等通用 shell)、流包装器 payload 加载(`zip://`、`phar://`、`compress.zlib://`)、从字节数组进行的 `chr()` 解码、字符串查找混淆、自我复制的 dropper 逻辑,以及 `` 标签脚本注入 | | 🚪 核心入口点完整性 | 检查 `index.php`、`administrator/index.php`、`api/index.php` 和 `includes/app.php`,查看是否有任何在 Joomla 的 `_JEXEC` bootstrap *之前*执行的代码 —— 这正是真实世界中“前置 payload”感染所使用的模式 | | 📛 文件名模式 | 匹配来自真实 SPPB 入侵事件的已知恶意命名约定(例如 `codex-sppb-*.php`),以及会泄露与当前活动配置相同凭据的备份/重复的 `configuration.php` 文件(`configuration.bak.php` 等) | | 🔢 数字投放文件夹 | 标记位于 `templates/`、`media/` 或 `images/` 中随机命名的数字文件夹 —— 一种常见的自动投放模式 —— 同时能正确忽略合法的基于日期的上传文件夹(`images/2026/06/17/`) | | 🎭 伪装 `index.php` 检测 | Joomla 标准的 `index.php` 存根是一个单行的“禁止直接访问”防护;除此之外的任何内容都会被标记为可能的伪装 webshell | | 🌐 Webroot 卫生检查 | 任何直接位于 `configuration.php` 旁边且无法识别的顶级文件夹或散乱文件都会被标记 —— 内置排除 Google Search Console 站点验证文件(`google*.html`)的规则 | | 🎯 置信度评分 | 每个发现都被标记为 **High** 或 **Medium**,以便您可以快速进行分类排查,而无需猜测 | | 🧩 JCE 覆盖范围 | 将相同的启发式规则应用于 `media/com_jce`、`administrator/components/com_jce`、`components/com_jce` 和 `plugins/editors/jce`,并调整了允许列表,以避免标记 JCE 自身合法的核心/MVC 文件 | | 👤 恶意 Super Users | 标记具有攻击者模式用户名(`webmanager83`、`codex*`)或 `@secure.local` 电子邮件域名的账户 | | 🗄 数据库扫描 | 检查 `#__menu` 是否存在 Helix Ultimate mega-menu XSS 注入(广泛的特征码集,而不仅仅是一个已知的 payload 字符串),检查 `#__sppagebuilder_assets` 是否存在注入的 `eval`/`base64_decode` 内容和恶意 iconfont 注册,并检查 `#__template_styles` 是否存在篡改网页的信息 | | 🧹 引导式清理 | 具有用于文件/文件夹的内置删除操作(范围仅限于当前扫描运行中标记的项目)、用于注入菜单项的**精准参数清理器**(见下文),以及用于恶意资产行的删除操作 | ## 📦 安装说明 本扩展以**两个**标准的 Joomla 扩展包形式提供 —— 无需手动上传文件,无需生成密钥,也无需保护单独的 URL: - **`com_muruguard`** —— 扫描器组件本身。必需。 - **`plg_muruguardshield`** —— 配套的实时保护模式插件。可选,但如果您不仅需要按需扫描,还需要实时的攻击/暴力破解拦截功能,请一并安装 —— 请参阅下方的 [🛡️ 保护模式](#-protection-mode-real-time-attack-blocking)。 ### 1. 下载安装包 ### 2. 通过 Joomla 管理后台安装 1. 以 Super User 身份登录您的 Joomla 管理后台。 2. 转到 **System → Import → Extensions**(或在较旧的 Joomla 版本中为 **System → Manage → Install**)。 3. 先上传 `com_muruguard-X.X.X.zip`,然后上传 `plg_muruguardshield-X.X.X.zip`(或者通过 **Install from Folder / URL** 让 Joomla 指向其中任意一个)。 4. 安装完成后,扫描器会出现在管理侧边栏的 **Components → MuRu Guard** 下。 5. 如果您安装了插件,请在 **System → Manage → Plugins** 下启用它,搜索“MuRu Guard Shield”,然后将其打开。在*此处*启用**并且**从扫描器自身的设置面板中打开保护模式之前,它不会执行任何操作 —— 见下文。 ### 3. 设置权限(可选但推荐) 默认情况下,只有 Super Users 可以访问该组件。如果您想将扫描任务委派给受信任的管理员而又不授予完整的 Super User 权限,请转到 **System → Users → Access Levels / Permissions**,并将 `com_muruguard` 的 **Manage**、**Clean**、**Delete** 或 **Change Settings** 权限授予相关的用户组。 ### 4. 运行扫描 打开 **Components → MuRu Guard → Scan**。点击 **🔍 Run a Scan** —— 这会打开一个模态框,您可以在其中选择要包含的目录和检查项(或者直接保留所有项的选中状态),然后在其内部点击 **Run**。结果将按置信度水平分组显示,并带有用于您要处理的项目的复选框。 无需 API 密钥,无需单独的登录屏幕,事后也无需锁定公共 URL —— 访问控制完全由 Joomla 现有的用户/会话/ACL 系统处理,并且该组件只能由具有适当权限的、已通过身份验证的管理员会话访问,这与任何其他 Joomla 组件一样。 ## 🧪 检测详情 ### 文件系统 - 被投放进 `media/`、`images/` 或 icon-font 资产文件夹中的 PHP/phtml/phar 文件 - 匹配 `eval(base64_decode($_POST...))`、基于 cookie 限制的后门、`gsocket` 指示符、通用 webshell 特征码、流包装器 payload 加载以及从字节数组进行的 `chr()` 混淆的内容 - **核心入口点篡改** —— 在 `index.php` 或其他核心入口点中,在 Joomla 的 `_JEXEC` bootstrap 之前发现的任何可执行代码,都会被视为已确认且正在运行的入侵,而不是低置信度的启发式判断 - **核心文件校验和验证** —— 对于 `index.php`、`administrator/index.php`、`api/index.php`、`includes/app.php`、`includes/framework.php`、`robots.txt.dist`、`htaccess.txt` 和 `web.config.txt`,扫描器会检测您确切安装的 Joomla 版本,并将每个文件的 SHA-256 与官方 `joomla/joomla-cms` release 中捆绑的哈希值进行比较。不匹配是明确无误的、逐字节的篡改证明 —— 独立于上述所有基于模式检查的方法,且比它们更强大。目前涵盖 4.4 LTS、5.x 和 6.x 系列的最新补丁;未列出的版本将直接跳过此检查(回退到基于模式的检查),绝不会产生误报。 - `templates/`、`media/` 或 `images/` 内部以数字命名的文件夹(例如 `features/252692/`) —— 除非它们匹配标准的日期文件夹模式,否则将被标记 - 任何内容超过了 Joomla 单行访问防护的 `index.php`,且位于模板自身的根布局文件之外 - webroot 中任何位置的 `.shtml` 文件和备份/重复的 `configuration.php` 文件(Joomla 默认从不包含这些文件) - webroot 中几近空白的小型标记/标志 `.txt` 文件 —— 常见的 dropper-toolkit 产物 - 当在几分钟内在同一文件夹中出现 3 个或更多新项目时的“集群”提示 —— 自动化投放的强烈信号 - **已知安全排除项:** Google Search Console 验证文件(`google[a-f0-9]{16,}.html`)会被识别且绝不会被标记 ### 用户 - 用户名匹配已知攻击者模式或电子邮件域名以 `@secure.local` 结尾的 Super User 账户 ### 数据库 - `#__menu` 中匹配广泛的 Helix Ultimate mega-menu Stored XSS 特征码集的行 —— 不仅仅是一个已知的 payload 字符串,而是底层的攻击原语(内联 `