正文
苹果CMS是一套基于PHP和MySQL开发、免费开源的专业影视内容管理系统,主要用于快速搭建与管理各类视频站点,如电影站、电视剧站或动漫资源站等。
凭借其便捷的采集功能与灵活的模板系统,该系统自发布以来一直深受中小型影视站长的欢迎,广泛应用于个人及小规模商业视频平台建设中。
最初官方维护的版本(原官网为maccms.com)已于2019年前后停止更新。
此后,一个被称为“maccms.la”的社区版本开始提供更新与支持,目前在GitHub上的相关项目已积累超过2700个星标,体现出较为活跃的社区生态与用户认可度。
然而,正是这样一个被广泛使用的项目,却已卷入一场供应链安全事件。
我们已掌握明确证据表明,maccms.la 的官方升级通道被用于下发恶意 PHP 后门代码,该后门在服务器侧执行后,会进一步植入恶意 JavaScript 脚本,对前端页面实施劫持与流量操控。
恶意脚本的技术特征与 FUNNULL团伙在多起历史攻击活动中使用的手法高度一致,印证了业内近期流传的判断:maccms.la 已实际被 FUNNULL 团伙控制,或已被其收购并作为攻击基础设施的一部分持续运营。
Ox1: 升级通道投毒
maccms github 源码application\admin\view_new\index\index.html中有一段ajax代码将maccms,php,thinkphp的版本信息上报给远程服务器(update.maccms.la),检查是否需要升级。

源码{static|static_new}/js/admin_conmon.js存在另外一段混淆的代码

混淆之后核心部分如下所示,可以看出它的功能同样也是将本地信息上报给远程服务器。
这些代码一切看似正常,但是在实际中我们发现MACCMS完成安装后第一次登录管理后台时,远程服务器会通过这个所谓的升级通道会发下发恶意JS代码,用于窃取敏感数据,下载PHP恶意载荷。
post:向远程服务器上报Cookie,管理后台地址等敏感信息
iframe:通过的隐蔽iframe触发MACCMS的下载机制,拉取恶意载荷

当网页中的iframe加载其src属性指向的地址ADMIN_PATH/admin/update/step1.html?file=laupdc00ecc82ab4b6d060da64d886e97b2c4时,浏览器会向该URL发起请求。该请求经由后端路由解析,最终会调用位于application/admin/controller/Update.php中的step1()函数。该函数的核心功能是:接收file参数,为其追加.zip扩展名并结合时间戳生成一个完整的资源标识,随后程序会基于这个标识向指定的远程服务器发起请求,尝试获取对应的资源文件。

从实际流量分析可见,laupdc00ecc82ab4b6d060da64d886e97b2c4.zip这一资源名可拆分为"laupd"前缀和一段32位MD5字符串,构成典型的伪装命名。服务器响应头中Date与Last-Modified时间戳完全一致,且设置了仅3分钟的有效期(max-age=180),表明该文件并非预先存储,而是针对请求即时动态生成的恶意payload。这种短时效设计使文件在下载窗口过后即无法访问(返回"access denied"),有效规避了事后取证。

laupdc00ecc82ab4b6d060da64d886e97b2c4.zip在解压后会释放 application/extra/active.php 文件。此外,我们在野还发现了另一个恶意 PHP 载荷 addons.php。
| MD5 | PATH |
| b06b9f13505eb49d6b3f4bddd64b12ce | application/extra/active.php |
| eb03db7ac9f10af66a1e2b16185fcadc | application/extra/addons.php |
这两个PHP恶意载荷都没有使用代码混淆技术,分析难度较低。它们的核心功能都是向网站植入恶意JavaScript代码,但采用了不同的攻击策略实现网页篡改,主要区别在于注入方式和目标对象:
addons.php采用动态注入方式,在页面渲染过程中将恶意JS代码插入到HTML文件的标签之前。
active.php 则采用动静结合的双重注入策略:一方面动态地将恶意代码插入到HTML文件的标签之前;另一方面还会静态地修改系统JS模板文件,直接向文件尾部写入恶意代码。
以active.php为例,该恶意载荷在ThinkPHP框架中注册了一个view_filter钩子,使得所有需要渲染的页面在加载时都会自动触发其感染流程,实现了对网站访问流量的全面监控和实时攻击。

为了降低的暴露的风险,它还实现了一个精密的访问条件筛选机制:只有当用户使用手机设备、通过外部链接访问网站前台页面、且为非Ajax请求时才会触发恶意代码,同时通过会话控制确保每个用户最多每10小时只被攻击一次。

条件满足时,进行对HTML和JS篡改的流程。先看对HTML的修改,它的逻辑核心其实就是用str_replace函数将网页中的$template_marker替换为$template_token.$template_marker。

$template_token和$template_marker 它们使用8进制编码,gzip压缩,没有PHP环境的读者可以使用在线的PHP Sandbox查看它们的内容。template_token是恶意JS代码,相信读者一定会觉得眼熟,它正是前面章节已分析过的JS Loader代码,而template_marker正是标签。

再来看对JS的修改,它的核心逻辑是使用file_put_contents函数对原始JS文件进行覆写,恶意JS代码以及/*system_optimization_signature*/格式的标签将被添加到JS文件尾部,system_optimization_signature是JS文件是否被感染的标识,它是恶意JS代码的MD5值的前12字节,即138ae887806f。

在Google搜索138ae887806f,可以看到不少用户讨论这一感染情况。用户的清理工作往往停留在清除已被感染的JavaScript文件这一表面症状。而更深层的PHP恶意载荷以及,作为持续攻击源的maccms.la官方投毒通道,并未被发现和根除,这导致了网站不断被重新植入恶意代码,陷入“清理-再感染”的循环。
