Yessineee/NullThreat

GitHub: Yessineee/NullThreat

一款浏览器扩展,通过 VirusTotal 的 90 多个威胁情报引擎对 PDF 下载进行自动扫描,并提供实时威胁评分和 React 仪表盘。

Stars: 0 | Forks: 0

# NullThreat ![Version](https://img.shields.io/badge/version-1.0.0-22c55e?style=flat-square) ![Manifest](https://img.shields.io/badge/Manifest-v3-22c55e?style=flat-square) ![React](https://img.shields.io/badge/React-18-22c55e?style=flat-square) ![License](https://img.shields.io/badge/license-MIT-22c55e?style=flat-square) ## 截图 | 弹出窗口 | 概览 | |-------|----------| | ![Popup](https://static.pigsec.cn/wp-content/uploads/repos/2026/06/18f7e71277102108.png) | ![Overview](https://static.pigsec.cn/wp-content/uploads/repos/2026/06/f999ec6917102116.png) | | 扫描历史 | 威胁详情 | |-------------|---------------| | ![History](https://static.pigsec.cn/wp-content/uploads/repos/2026/06/06a5bf829a102125.png) | ![Threat Detail](https://static.pigsec.cn/wp-content/uploads/repos/2026/06/2b13d35912102142.png) | | 设置 | |----------| | ![Settings](https://static.pigsec.cn/wp-content/uploads/repos/2026/06/4bd053892d102151.png) | ## 功能 - **自动 PDF 检测** — 监听浏览器下载事件,并在 PDF 文件下载完成的瞬间进行扫描,无需任何手动干预 - **实时威胁评分** — 基于所有 VirusTotal 引擎的检测率,计算 0–100 的综合威胁评分 - **完整的引擎分析** — 查看 90 多个防病毒引擎的单独判定结果,按严重程度排序(恶意 → 可疑 → 干净) - **扫描历史** — 将所有过去的扫描记录保存在持久的本地存储中,支持按状态搜索和过滤 - **导出** — 以 CSV 或 JSON 格式下载完整的扫描历史 - **智能通知** — 在扫描开始和完成时发送桌面通知,可配置为仅在检测到威胁时通知 - **暗色/亮色主题** — 跨会话持久化保存,并在弹出窗口和控制台之间同步 - **可折叠控制台** — 带有侧边栏导航的全标签页 React 控制台,可折叠为仅图标模式 - **API 密钥管理** — 将 VirusTotal API 密钥安全地存储在 `chrome.storage.sync` 中,支持掩码显示和连接测试 - **Rate limiting** — 内置请求队列,遵守 VirusTotal 免费版限制(4 次请求/分钟) ## 架构 NullThreat 遵循三层扩展架构: ``` ┌─────────────────────────────────────────────────────┐ │ Browser Layer │ │ Downloads API · Storage · Tabs API │ └──────────────────────┬──────────────────────────────┘ │ ┌──────────────────────▼──────────────────────────────┐ │ Extension Core │ │ │ │ ┌─────────────┐ ┌──────────┐ ┌───────────────┐ │ │ │ Service │ │ Popup UI │ │ Dashboard │ │ │ │ Worker │◄─►(React) │ │ (React SPA) │ │ │ │ │ │ │ │ │ │ │ │ · Download │ │ · Stats │ │ · Overview │ │ │ │ listener │ │ · Status │ │ · History │ │ │ │ · Scan queue│ │ · Toggle │ │ · Threat │ │ │ │ · Messages │ │ │ │ Detail │ │ │ └──────┬──────┘ └──────────┘ │ · Settings │ │ │ │ └───────────────┘ │ │ ┌──────▼──────┐ ┌──────────┐ │ │ │ VT Client │ │ Storage │ │ │ │ + Queue │ │ Manager │ │ │ └─────────────┘ └──────────┘ │ └──────────────────────┬──────────────────────────────┘ │ ┌──────────────────────▼──────────────────────────────┐ │ External Services │ │ VirusTotal API v3 │ │ /urls · /analyses · /files │ └─────────────────────────────────────────────────────┘ ``` **关键架构决策:** - **Manifest v3 service worker** — 临时后台脚本,使用 `Map` 缓存来关联 `onCreated` 和 `onChanged` 下载事件,避免了不可靠的 `chrome.downloads.search` 回调模式 - **基于 URL 的扫描** — 直接将下载 URL 提交给 VirusTotal,而不是重新获取文件,从而绕过扩展来源固有的 CORS 限制 - **无状态弹出窗口** — 弹出窗口每次打开时都会从 `chrome.storage` 读取数据,并监听来自 service worker 的 runtime 消息以获取实时扫描状态 - **无 React Router** — 控制台使用轻量级的 `useState` 路由,因为弹出窗口和控制台是独立的 HTML 入口点,而不是单个 SPA - **独立的入口点** — 弹出窗口和控制台都有各自的 `main.jsx` 和 HTML 文件,由 CRXJS 独立打包 ## 技术栈 | 层级 | 技术 | |-------|-----------| | 扩展打包器 | [CRXJS](https://crxjs.dev/vite-plugin) + Vite | | UI 框架 | React 18 | | 样式 | Tailwind CSS v3 + CSS 变量 | | 组件库 | shadcn/ui (Radix UI primitives) | | 图标 | Lucide React | | 字体 | Inter + JetBrains Mono | | 存储 | `chrome.storage.local` + `chrome.storage.sync` | | 威胁情报 | [VirusTotal API v3](https://developers.virustotal.com/reference/overview) | ## 安装说明 ### 前置条件 - Node.js 18 或更高版本 - 基于 Chromium 的浏览器(Chrome、Brave、Edge) - 一个免费的 [VirusTotal API 密钥](https://www.virustotal.com/gui/join-us) ### 设置 ``` # Clone the repository git clone https://github.com/Yessineee/NullThreat.git cd NullThreat # Install dependencies npm install # Add your VirusTotal API key echo "VITE_VT_API_KEY=your_api_key_here" > .env # Build the extension npm run build ``` ### 在浏览器中加载 1. 打开 `chrome://extensions`(或 `brave://extensions`) 2. 启用 **开发者模式**(右上角切换开关) 3. 点击 **加载已解压的扩展程序** 4. 选择 `dist/` 文件夹 ### 首次运行 1. 点击浏览器工具栏中的 NullThreat 图标 2. 在设置界面输入您的 VirusTotal API 密钥 3. 点击 **保存 API 密钥** 4. 下载任何 PDF — NullThreat 将自动对其进行扫描 ## 工作原理 ### 扫描流程 ``` PDF download starts │ ▼ chrome.downloads.onCreated → cache item in Map │ ▼ chrome.downloads.onChanged (state: complete) │ ▼ Retrieve item from cache → verify PDF by MIME type │ ▼ Submit URL to VirusTotal /urls endpoint │ ▼ Poll /analyses/{id} every 8s (up to 20 attempts) │ ▼ Calculate threat score: Math.round((malicious / total) * 100) │ ├── score = 0 → status: clean ✓ ├── score > 0 → status: threat ✗ └── no data → status: unknown ? │ ▼ Save to chrome.storage.local Send runtime message to popup/dashboard Show desktop notification ``` ### 威胁评分 威胁评分是一个 0–100 的整数,表示将文件标记为恶意的 VirusTotal 引擎的百分比: ``` threatScore = Math.round((maliciousEngines / totalEngines) * 100) ``` | 评分 | 状态 | 含义 | |-------|--------|---------| | 0 | 干净 ✓ | 没有引擎检测到威胁 | | 1–24 | 低威胁 | 少数引擎将其标记为恶意 | | 25–49 | 中等威胁 | 显著的检测率 | | 50–100 | 高威胁 | 大多数引擎将其标记为恶意 | | — | 未知 | 文件不在 VirusTotal 数据库中 | ## 已知限制 - **仅限 URL 扫描** — NullThreat 扫描的是下载 URL 而不是文件二进制数据。从经过身份验证或私有 URL(大学门户、企业内联网)下载的文件可能无法被 VirusTotal 扫描。 - **VirusTotal 免费版** — 限制为 4 次请求/分钟和 500 次请求/天。大量使用会耗尽每日配额。 - **扫描延迟** — VirusTotal 上的 URL 分析需要 30–90 秒。扩展程序将在此期间轮询结果。 - **仅限 PDF** — 目前仅限于通过 MIME 类型(`application/pdf`)或 URL 扩展名识别的 PDF 文件。 - **无法上传文件** — 由于扩展来源的 CORS 限制,无法将未知文件(不在 VT 的数据库中)上传进行全新扫描。 ## 路线图 - [ ] **后端代理** — 轻量级 Node.js 服务器,用于处理将文件上传至 VirusTotal 和 MetaDefender 的操作,绕过浏览器的 CORS 限制 - [ ] **集成 MetaDefender** — 使用 OPSWAT MetaDefender(免费版 5000 次请求/天)进行双引擎扫描,以获取综合威胁评分 - [ ] **Firefox 支持** — 使用 `webextension-polyfill` 进行跨浏览器构建 - [ ] **扩展文件类型** — 除了 PDF 外,还扫描 `.exe`、`.zip`、`.docx` 下载文件 - [ ] **拖放扫描** — 直接从控制台手动触发扫描,无需下载 - [ ] **威胁历史图表** — 每周/每月扫描活动可视化 ## 许可证 MIT © [Yessineee](https://github.com/Yessineee)
标签:Ask搜索, Manifest V3, React, Syscalls, VirusTotal, 威胁情报, 开发者工具, 搜索语句(dork), 文件扫描, 浏览器扩展, 自定义脚本