hyj28/mvx-audit

GitHub: hyj28/mvx-audit

一款零运行时依赖的 Chrome 扩展安全审计工具包,提供 MV2/MV3 静态分析、迁移对比、可复现威胁情报以及隔离的动态分析能力。

Stars: 2 | Forks: 0

# MVX Audit:Chrome Manifest V2 与 V3 安全性分析 [![CI](https://static.pigsec.cn/wp-content/uploads/repos/cas/ad/ad5834178f7599af9fdda11629d49cae07f2997beec49821b2920eff5bfd50e7.svg)](https://github.com/hyj28/mvx-audit/actions/workflows/ci.yml) [![License: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE) [![Node.js 20+](https://img.shields.io/badge/node-%3E%3D20-339933.svg)](package.json) MVX Audit 是一款确定性的、无依赖的 Chrome 扩展安全研究工具包。 它集成了静态审计、MV2/MV3 能力对比、可复现的真实世界威胁情报、哈希校验的隔离机制、 真实样本筛选基准测试,以及可选的无网络动态 canary 实验室。 该仓库包含一个精心整理的语料库,涵盖 **17 个威胁场景和 34 对 MV2/MV3 固件**, 并提供了一个可复现的真实世界情报快照,涵盖 **4,716 个唯一的扩展 ID** 和 **504 个已索引的非空 CRX 构件**。 常规命令永远不会打包或获取在线软件包。 ## 本项目存在的原因 Manifest V3 改进了重要的平台边界:扩展 Service Worker 替代了持久化的 background pages, 禁止了远程托管代码,并且大多数扩展使用声明式网络规则,而不是通过阻塞 `webRequest` 来处理。 但这**并不**意味着所有被授予的权限都是安全的。诸如 Cookie 访问、宽泛的 content scripts、 debugger 访问、history、proxy 和 native messaging 等能力仍然需要审查。 Chrome 138 是最后一个提供有限 MV2 支持的 Chrome 版本;Chrome 139 移除了该支持, 其余的 MV2 Web Store 条目计划于 2026 年 8 月 31 日被移除。 请参阅官方的 [MV2 支持时间表](https://developer.chrome.com/docs/extensions/develop/migrate/mv2-deprecation-timeline) 以及 [MV3 概述](https://developer.chrome.com/docs/extensions/develop/migrate/what-is-mv3)。 ## 快速开始 环境要求:Node.js 20 或更高版本。没有运行时依赖,也不需要下载浏览器。 ``` git clone https://github.com/hyj28/mvx-audit.git cd mvx-audit npm ci # 审计已解压的 extension 目录 node bin/mvx.js audit /path/to/extension # 当存在 high- 或 critical-severity finding 时使 CI 失败 node bin/mvx.js audit /path/to/extension --format sarif \ --output results.sarif --fail-on high # 比较一个 migration node bin/mvx.js compare /path/to/mv2 /path/to/mv3 \ --format markdown --output migration-review.md # 探索并验证内置的 research corpus node bin/mvx.js corpus list npm run corpus:validate # 无需下载 malware 即可查询 real-world threat intelligence node bin/mvx.js intel stats node bin/mvx.js intel lookup npm run intel:validate # 检查 live-artifact plan;这不会下载任何内容 node bin/mvx.js sample plan node bin/mvx.js sample plan-many --label behavior-confirmed-malicious --limit 100 # 明确 opt-in 下载到被 Git 忽略的 quarantine node bin/mvx.js sample fetch --acknowledge-risk node bin/mvx.js sample fetch-many --acknowledge-risk \ --label behavior-confirmed-malicious --limit 100 --max-total-bytes 250000000 # 用于 static analysis 的有界 CRX2/CRX3 提取 node bin/mvx.js sample unpack quarantine//.crx --acknowledge-risk node bin/mvx.js audit quarantine//unpacked/ # 对已 quarantine 的真实样本进行 benchmark 且不执行 extension code node bin/mvx.js benchmark static quarantine --acknowledge-risk \ --label behavior-confirmed-malicious --threshold high --format json ``` 如果你想在本地开发期间使用等效的 `mvx` 命令,请使用 `npm link`。 ## 审计包含的内容 - Manifest 版本和迁移兼容性检查。 - 宽泛的 host、content-script、外部 messaging 和 web-resource 暴露情况。 - 敏感权限审查,包括诸如 `cookies` + `` 等能力链。 - 针对 `webRequest` 阻塞和 MV3 `declarativeNetRequest` header 规则的网络控制审查。 - 用于动态评估、HTML 注入、通配符 messaging、击键记录、Cookie 枚举、不安全传输、 下载、剪贴板读取以及未经验证的特权消息桥接的源指标。 - 基于远程 iframe 的扩展 UI 以及向被嵌入的 origin 委派敏感能力的情况。 - 稳定的证据位置、风险摘要、明确的假设,以及适用于 GitHub code scanning 的 SARIF 2.1.0 报告。 - 对所有打包源代码(包括 vendored 目录)的有界扫描,拒绝符号链接的根目录, 跳过嵌套的符号链接,并在达到文件或字节限制时安全关闭。 请参阅完整的 [规则参考](docs/rule-reference.md) 和 [方法论](docs/methodology.md)。 ## 合成语料库与真实世界情报 旧版本的代码库混合了复制的概念验证扩展、真实的公共 endpoint、 不同的浏览器版本以及数百个重复的 CSV 文件。这些构件无法支撑科学的 MV2/MV3 结论,并带来了不可接受的安全风险。它们在 2.0 版本中被移除。 替代的[合成语料库](corpus/README.md) 通过单一的机器验证注册表, 涵盖了 17 种不同的能力和实现模式。每个条目都包含成对的 manifest、 明确的 MV3 影响分类、预期的分析器发现,以及指向 Chrome 官方文档的链接。 生成的[能力矩阵](docs/research-report.md) 可从当前源码中复现。 独立的[真实世界情报目录](intel/README.md) 将三个锁定的开源数据去重为 4,716 个扩展 ID。它保留了来源、标签类型、验证级别、商店状态、威胁类别、 SHA-256 值以及外部构件的可用性。“Reported(已报告)”、“policy violation(策略违规)” 和“confirmed malware(已确认的恶意软件)”仍然是不同的状态。 请参阅[数据源与真实基准方法论](docs/data-sources.md)。 对于已索引的构件,`sample plan` 会显示不可变的源版本、大小、 Git blob 身份以及任何提供商报告的 SHA-256。 `sample fetch` 是一个明确的自愿参与(opt-in)操作,它仅接受白名单中的 HTTPS host, 强制执行大小上限,验证 Git 内容哈希,计算实际的 SHA-256, 并将文件存储在 `quarantine/` 下。它永远不会解包、导入或执行 CRX。 `sample unpack` 是一个独立的显式操作。内置的提取器会拒绝路径遍历、链接、 加密、不受支持的方法、重复路径、CRC 校验失败、过度扩展以及归档炸弹, 然后才会将解包后的目录暴露给静态审计器。它仍然不能保证执行活跃的恶意软件是安全的。 `sample plan-many` 和 `sample fetch-many` 添加了确定性优先级排序、 数量限制、单构件限制、总字节预算以及隔离的失败报告。 `benchmark static` 会安全地解包被隔离的 CRX,对它们进行审计, 并报告**审查触发率**。它故意不将该数值称为恶意软件分类准确率, 因为扩展 ID 标签可能跨越多个版本。 ## 结果语义 风险分数是一个有界的审查优先级分数,而不是概率或可利用性度量。 一项发现意味着“审查此能力或模式”,而不是“此扩展是恶意的”。 反之,没有任何静态分析器能够证明一个扩展是绝对安全的。 可选的[动态 canary 实验室](docs/dynamic-analysis.md) 仅在具有 `--network none` 的 只读、非 root Docker container 中运行。它通过 Chrome DevTools Protocol 提供一个虚拟的 HTTPS canary 页面,阻塞并记录外部请求,拒绝下载, 并将确切的 canary 泄漏或受保护状态更改归类为 `confirmed_attack`。 普通的 CI 测试会运行事件预言机,但永远不会执行活跃的扩展。 `no_trigger_observed` 并不是一个良性的判定。 ## 开发 ``` npm test # unit and integration tests npm run test:coverage # built-in Node coverage npm run lint # syntax and repository hygiene checks npm run docs:generate # regenerate the corpus report npm run intel:validate # validate real-world intelligence offline npm run intel:check # reproduce it from pinned upstream sources npm run lab:build # build the optional isolated Chromium image npm run lab:smoke -- --acknowledge-risk # real Docker/Chromium smoke test npm run check # all required checks npm audit --omit=dev # expected: zero dependencies, zero advisories ``` 公共 API: ``` import { auditExtension, compareExtensions } from 'mvx-audit'; const audit = await auditExtension('/path/to/unpacked-extension'); const comparison = await compareExtensions('/path/to/mv2', '/path/to/mv3'); ``` ## 安全与负责地使用 仅分析您被授权检查的扩展。将未知的扩展包视为不受信任的输入, 并且不要将它们加载到您的日常浏览器中。 MVX Audit 不执行扩展文件。在报告敏感问题之前,请阅读 [SECURITY.md](SECURITY.md); 在添加新场景之前,请阅读 [CONTRIBUTING.md](CONTRIBUTING.md)。 基于 [MIT License](LICENSE) 授权。
标签:GNU通用公共许可证, MITM代理, Node.js, 云安全监控, 威胁情报, 开发者工具, 数据泄露, 知识库安全, 自定义脚本, 请求拦截, 静态分析