Clock-Skew/EndPointX

GitHub: Clock-Skew/EndPointX

一款仅限本地运行的 Firefox 扩展,帮助安全测试人员在授权范围内将当前页面可见的 URL 收集为脱敏、去重的结构化 endpoint 清单。

Stars: 1 | Forks: 1

# EndPointX [![Firefox WebExtension](https://img.shields.io/badge/Firefox-WebExtension-FF7139?style=for-the-badge&logo=firefoxbrowser&logoColor=white)](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions) [![Manifest V3](https://img.shields.io/badge/Manifest-V3-4f46e5?style=for-the-badge)](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/manifest.json) [![隐私:仅限本地](https://img.shields.io/badge/Privacy-Local_Only-16a34a?style=for-the-badge)](PRIVACY.md) [![无遥测](https://img.shields.io/badge/Telemetry-None-111827?style=for-the-badge)](PRIVACY.md) [![许可证:MIT](https://img.shields.io/badge/License-MIT-f59e0b?style=for-the-badge)](LICENSE) ![EndPointX](https://static.pigsec.cn/wp-content/uploads/repos/cas/34/3448af09c5c821a63ec2c18a6f7e7b589c4b44b46fa3969dfe7ae346a8e6dddb.png) EndPointX 帮助安全测试人员、Bug Bounty 研究人员、 开发者和防御者快速将当前打开的页面转换为紧凑的 endpoint 清单。它从可见页面结构和浏览器 resource timing 元数据中收集 URL,对 query 值进行脱敏,对 endpoint 进行去重,并 导出本地 JSON 产物。 它特意被设计为不是代理、爬虫、fuzzer、扫描器、exploit 工具或 请求重放器。 ## 状态 原型:`0.1.0` 首次发布的是一个未打包的 Firefox 扩展,用于本地开发和 审查。GitHub releases 附带了一个开发版 zip。它尚未在 Mozilla Add-ons 上架。 ## 仅限合法使用 仅在您拥有、管理、具有明确的 Bug Bounty 授权范围、书面客户授权范围或本地实验室目标的系统上使用此工具。 本项目专为以下用途设计: - 授权的应用安全测试 - 防御性 endpoint 清单 - Bug Bounty 笔记准备 - 本地实验室学习 - 开发者在发布前进行自查 本项目并非为未经授权的侦察或对第三方系统的自动化 探测而设计。 ## 安全警告 仅在您拥有或获得明确测试授权的系统及内容上使用。 未经授权的使用可能违反政策、法律,或两者皆有。 ## 免责声明 在法律允许的最大范围内,本软件“按原样”提供, 不提供任何形式的保证。作者和贡献者不对 误用、未经授权的使用,或因使用 本软件造成的任何损失或损害负责。 ## 收集内容 仅在用户点击扩展弹窗中的 **Collect Current Tab** 后才会进行收集。 收集器会记录: - 来自 `a[href]`、`area[href]` 和 `link[href]` 的链接 - 表单 action URL、表单方法和表单字段名称 - script、image、frame、media、embed、object 和 source URL - `srcset` 图像候选 - 内联 CSS `url(...)` 和 `@import` 引用 - 来自选定 `meta[content]` 值的元数据 URL - 浏览器暴露的 `PerformanceResourceTiming` 元数据 - 同源与跨源分类 - query 参数名(query 值已脱敏) 最新捕获的数据存储在 Firefox 扩展存储中,因此可以关闭并重新打开弹窗而不会丢失当前映射。 ## 不收集的内容 - 无请求主体。 - 无响应主体。 - 无 cookie 值。 - 无凭据值。 - 无浏览器历史记录。 - 无击键记录。 - 无 localStorage 或 sessionStorage 值。 - 无来自非活动标签页的数据。 - 无后台爬取。 - 无远程上传。 - 无遥测。 - 无请求修改。 ## 为什么会有这个工具 大多数安全工作流最终都需要一个清晰的列表,包含观察到的路由、 资产、表单和类似 API 的 URL。浏览器开发者工具可以显示这些,但 输出分散在 Elements、Network、Sources 和手动笔记中。 EndPointX 做出了一个狭窄的承诺: 1. 询问活动标签页有哪些可见的类似 endpoint 的 URL。 2. 对高风险的 URL 值进行脱敏。 3. 对结果进行去重。 4. 保持本地化。 5. 导出用于笔记和报告的有用产物。 ## 功能 - **点击收集**:无持久的内容脚本,无持续 收集。 - **仅限活动标签页**:使用 `activeTab` 和 `scripting`,而不是宽泛的 host 权限。 - **Endpoint 去重**:对跨 DOM、表单、CSS 和 timing 来源的重复 URL 进行分组。 - **Query 脱敏**:保留 query 键,但将值替换为 ``。 - **来源分组**:标记同源和跨源 endpoint。 - **本地持久化**:在 `browser.storage.local` 中保留最新捕获。 - **JSON 导出**:从弹窗下载结构化的证据文件。 - **URL 复制**:将脱敏后的 endpoint 列表复制到剪贴板。 - **无依赖运行时**:纯 HTML、CSS 和 JavaScript。 ## 权限 该扩展遵循 Mozilla 的 WebExtension 权限模型,并保持 较小的权限集。 | 权限 | 使用原因 | 边界 | | --- | --- | --- | | `activeTab` | 在用户操作后授予对当前标签页的临时访问权限。 | 仅限当前活动标签页。 | | `scripting` | 按需注入收集器脚本。 | 从弹窗进行一次性执行。 | | `storage` | 在本地保存最新捕获。 | 仅限 Firefox 扩展存储。 | 特意未请求的权限: - `` - `cookies` - `downloads` - `history` - `tabs` - `webRequest` - `webRequestBlocking` 清单还将 Firefox 的 `data_collection_permissions.required` 声明为 `["none"]`。该扩展不会将收集的数据传输到本地 浏览器之外。 ## 安装说明 ### 临时安装 Firefox 扩展 1. 打开 Firefox。 2. 访问 `about:debugging`。 3. 选择 **This Firefox**。 4. 选择 **Load Temporary Add-on**。 5. 从此文件夹中选择 `manifest.json`。 Firefox 会保留临时安装的扩展,直到浏览器重启。 ### 使用 web-ext 进行开发 Mozilla 官方的 `web-ext` 工作流可以对扩展进行 lint 并运行: ``` npm run lint npm run start ``` 脚本使用 `npx --yes web-ext ...`,因此不需要已提交的依赖 文件夹。 ## 使用方法 1. 导航到授权的目标页面。 2. 点击 EndPointX 工具栏图标。 3. 点击 **Collect Current Tab**。 4. 查看 endpoint 列表和来源标签。 5. 使用过滤框缩小列表范围。 6. 点击 **Copy URLs** 复制当前可见的 endpoint,或点击 **Export JSON** 保存完整捕获。 要进行本地冒烟测试,请临时加载扩展并从 Seedboard 收集 endpoint: ``` http://127.0.0.1:8787/ ``` 冒烟测试仅在本地进行,并将收集流程保持在浏览器内。 ## 输出格式 导出示例: ``` { "version": 1, "collectedAt": "2026-05-08T20:30:00.000Z", "page": { "url": "https://example.test/app?view=", "origin": "https://example.test", "host": "example.test", "title": "Example App" }, "counts": { "endpoints": 3, "sameOrigin": 2, "crossOrigin": 1 }, "endpoints": [ { "url": "https://example.test/api/users?page=", "origin": "https://example.test", "host": "example.test", "path": "/api/users", "queryKeys": ["page"], "sameOrigin": true, "sources": ["performance"], "kinds": ["fetch"], "methods": [], "count": 1, "details": [ { "initiatorType": "fetch", "durationMs": 42, "transferSize": 2048, "nextHopProtocol": "h2" } ] } ], "warnings": [] } ``` ## 安全与隐私模型 EndPointX 围绕狭窄的收集面构建: - 用户操作控制收集 - 活动标签页控制访问 - URL query 值在存储前进行脱敏 - 收集的数据保留在 Firefox 扩展存储中,除非导出 - 运行时代码不包含 `fetch`、`XMLHttpRequest` 或 `sendBeacon` 调用 - 运行时代码不访问 `document.cookie` - 运行时代码不从目标页面读取 web storage 值 请参阅 [PRIVACY.md](PRIVACY.md) 和 [SECURITY.md](SECURITY.md) 了解完整政策。 ## 验证 运行本地静态验证器: 从仓库根目录: ``` npm run verify ``` 验证器会检查: - manifest JSON 有效性 - 预期的最小权限 - 不存在被禁止的权限 - Firefox 的 no-data-collection 声明 - 引用的图标和弹窗文件 - 运行时脚本中不存在网络 API 调用 - 运行时脚本中不存在 cookie 访问 - 不存在页面 web storage 值读取 - README 中的安全/隐私标记 当 `web-ext` 可用时,还可以运行: ``` npm run lint ``` Mozilla 建议在运行或提交扩展之前执行 `web-ext lint`。 ## 项目布局 ``` . ├── manifest.json ├── src/ │ ├── collector.js │ ├── popup.css │ ├── popup.html │ └── popup.js ├── icons/ │ ├── endpoint-48.svg │ └── endpoint-96.svg ├── scripts/ │ └── verify_extension.py ├── PRIVACY.md ├── SECURITY.md ├── CONTRIBUTING.md ├── LICENSE └── package.json ``` ## 设计选择 ### MVP 中不使用 webRequest `webRequest` 功能强大,但它扩展了权限范围,并可能使 小型的 endpoint 映射工具表现出类似代理的行为。MVP 依赖于 active-tab DOM 检查和浏览器 Performance API 元数据。 未来版本只有在 scope guard、 redaction 模型和权限解释变得更强之后,才可能添加可选的网络观察功能。 ### 无宽泛的 Host 权限 Mozilla 将 `activeTab` 记录为一种让扩展在显式用户交互后对当前 页面进行操作的方式,而无需请求宽泛的 host 访问权限。这 符合产品边界:仅在接到指令时进行收集。 ### 默认对 URL 进行脱敏 Endpoint 映射通常需要路径和参数名,而不是真实的机密 值。Query 值在显示、存储或 导出之前会被替换为 ``。 ## 许可证 MIT。详见 [LICENSE](LICENSE)。
标签:多模态安全, 数据可视化, 自定义脚本