Clock-Skew/EndPointX
GitHub: Clock-Skew/EndPointX
一款仅限本地运行的 Firefox 扩展,帮助安全测试人员在授权范围内将当前页面可见的 URL 收集为脱敏、去重的结构化 endpoint 清单。
Stars: 1 | Forks: 1
# EndPointX
[](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions)
[](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/manifest.json)
[](PRIVACY.md)
[](PRIVACY.md)
[](LICENSE)

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)。
标签:多模态安全, 数据可视化, 自定义脚本