Files

150 lines
7.7 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Camoufox / camoufox-reverse-mcp 取证参考
本文件只在用户选择或询问 Camoufox / camoufox-reverse-mcp 时读取。Camoufox 用于前置取证、采样、网络捕获、源码定位与日志收集,不得进入最终 `result/` 交付代码。
## 来源与定位
- Camoufox:<https://github.com/daijro/camoufox>,官方文档:<https://camoufox.com/python/installation/>、<https://camoufox.com/python/usage/>。
- camoufox-reverse-mcp:<https://github.com/WhiteNightShadow/camoufox-reverse-mcp>。
Camoufox 官方流程要求先安装 Python 包,再下载浏览器本体:
```bash
python -m pip install -U "camoufox[geoip]"
python -m camoufox fetch
python -m camoufox version
python -m camoufox path
```
`geoip` 在代理场景强烈建议安装,因为它用于根据出口 IP 计算经纬度、时区、国家和 locale。只安装 Python 包但没有执行 `python -m camoufox fetch`,不能视为可用于正式取证。
## 取证模式
| 模式 | 使用条件 | 阻塞条件 |
|---|---|---|
| Camoufox + camoufox-reverse-mcp | 需要 MCP 网络捕获、脚本搜索、Hook、请求 initiator、Cookie / Storage 或可选属性访问追踪 | Camoufox 或 MCP 任一不可用时暂停,不得静默降级 |
| 仅 Camoufox | 只需要用 Camoufox 官方 Python API 打开页面、轻量采样或手工导出材料 | Camoufox 包不存在或浏览器本体未 fetch 时暂停 |
如果用户选择 MCP,但未检测到 MCP:要求用户提供项目目录 / Python 环境,或确认安装;只有用户明确回复“降级为仅 Camoufox”才可以不用 MCP 继续。
## 安装检测
每次启动浏览器前先运行检测脚本:
```bash
node scripts/check_external_tools.js --python python --require-camoufox --markdown
node scripts/check_external_tools.js --python python --require-camoufox --camoufox-install-dir <camoufox-cache-dir> --markdown
node scripts/check_external_tools.js --python python --require-camoufox --require-camoufox-mcp --camoufox-mcp-project-dir <camoufox-reverse-mcp-dir> --json
```
检测通过标准:
- `camoufox` Python 包可导入。
- `from camoufox.sync_api import Camoufox` 可导入。
- `python -m camoufox path` 返回的路径存在,或在用户提供 / 默认缓存目录检测到浏览器本体。
- 选择 MCP 时,`camoufox_reverse_mcp` 可导入,或用户提供的项目目录可通过 `src/` 导入。
## 安装引导
如果用户确认未安装 Camoufox,先让用户提供 Python / venv 和下载缓存目录;如果用户不提供目录,说明将使用 Camoufox 默认缓存目录,然后执行:
```bash
python -m pip install -U "camoufox[geoip]"
python -m camoufox fetch
python -m camoufox version
python -m camoufox path
```
如果用户确认未安装 camoufox-reverse-mcp,先让用户提供克隆目录;如果用户不提供,使用当前项目外的用户确认目录或系统临时下载目录,不要把安装仓库混入最终 case 产物:
```bash
git clone https://github.com/WhiteNightShadow/camoufox-reverse-mcp.git <install-dir>
cd <install-dir>
python -m pip install -e .
python -c "import camoufox_reverse_mcp; print('ok')"
```
MCP 客户端配置示例:
```json
{
"mcpServers": {
"camoufox-reverse": {
"command": "python",
"args": ["-m", "camoufox_reverse_mcp"]
}
}
}
```
带代理且用户授权时,可在 MCP 参数中加入 `--proxy`、`--geoip`、`--humanize`、`--block-webrtc`。不要修改 AiMaMi 或其他本地代理配置;只输出用户可自行应用的配置建议。
## 启动硬约束
从第一次打开目标站开始就使用 Camoufox,不得先使用普通 Playwright、Puppeteer、Selenium、系统 Firefox 或系统 Chrome 试探。
必选约束:
- 默认有头:`headless=False`。Linux 无显示环境且用户确认时才使用官方 `headless="virtual"`。
- 默认拟人:`humanize=True`。
- 代理场景按授权启用 `geoip=True`,必要时 `block_webrtc=True`。
- 不固定窗口、字体、WebGL、locale 等指纹,除非已有真实样本或用户明确要求。
- 登录态场景使用持久上下文时,把 profile 放入 case 临时目录并标记为敏感材料。
- 点击、输入、滚动、拖拽使用 Camoufox / Playwright 原生输入路径或 MCP 官方交互能力;不要使用 `page.evaluate(() => dispatchEvent(...))` 作为高风控交互主路径。
Python API 取证示例:
```python
from camoufox.sync_api import Camoufox
with Camoufox(headless=False, humanize=True, geoip=True, block_webrtc=True) as browser:
page = browser.new_page()
page.goto("https://example.com")
```
该示例只能用于前置取证,不得复制到最终 `result/`。
## isTrusted 与可信输入
Camoufox 可以降低自动化和指纹检测风险,但前置取证仍应避免普通 JS 合成事件。鼠标、键盘、拖拽、滚动优先使用 Camoufox 官方 API 的原生输入路径;如果某个流程只能通过 `page.evaluate` 合成事件完成,应先标记 `isTrusted=false` 风险并暂停,让用户选择手动操作、切换到 ruyiPage 的 native BiDi / `ruyi: true`,或在授权范围内接受该风险。
## MCP 取证流程
1. `check_environment`:确认 MCP、Camoufox、浏览器状态。
2. `launch_browser(headless=false, humanize=true, geoip=true, block_webrtc=true)`:启动时即启用反检测约束。
3. `network_capture(action="start")`:在 `navigate` 前开始捕获。
4. `navigate(url="目标页面")`:打开页面;需要登录时暂停并让用户手动登录。
5. 用户回复“已经登录成功”后,再继续触发最小必要业务动作。
6. `list_network_requests`:按 URL、方法、资源类型筛选目标接口。
7. `get_network_request`:保存请求头、query、body、响应摘要;敏感字段做脱敏记录。
8. `get_request_initiator`:定位请求发起栈。
9. `scripts(action="list|get|save")` 和 `search_code`:收集相关 JS 文件和关键字命中。
10. `inject_hook_preset("xhr"/"fetch"/"cookie"/"crypto")` 或 `hook_function`:最小必要 Hook;阶段结束后 `reset_browser_state`。
11. 可选 `trace_property_access(duration=0, mode="summary", collect_values=True)`:当需要浏览器环境访问日志辅助补环境时使用,结果复制到 case 的 `evidence/` 或 `notes/`,并在阶段结束后清理缓存中的无关大文件。
## 登录处理
不要索要账号、密码、验证码或 MFA。需要登录时:
1. 暂停自动动作。
2. 让用户在当前 Camoufox / MCP 打开的页面中手动登录。
3. 用户回复“已经登录成功”后,复述将继续的取证动作并再次确认。
4. 只采集授权分析所需的最小请求、Cookie / Storage 摘要和 JS 证据。
## 与补环境的关系
Camoufox 采集到的 Network、Initiator、脚本源码、Hook 日志、环境访问日志只作为补环境输入。进入 Node.js 补环境后仍然要遵守本 Skill 的 addon-first、属性描述符、原型链、toString 保护、指纹值回放和 fixture 验证规则。
如果同时存在 RuyiTrace NDJSON,且用户选择了 ruyiPage + RuyiTrace,则补环境优先依据 RuyiTrace NDJSON;Camoufox 的属性访问追踪只作为补充证据。
## 最终交付禁入
最终 `result/` 目录不得包含:
- `Camoufox`、`AsyncCamoufox`、`camoufox_reverse_mcp`。
- `launch_browser`、`network_capture`、`navigate`、`page.goto`、`browser.new_page`。
- Playwright / Puppeteer / Selenium / CDP / WebDriver 启动代码。
- Camoufox profile、trace 缓存、截图、HAR、Hook 临时代码或无关大文件。
最终验证必须由 Node.js / Python TLS 指纹兼容请求客户端发起少量授权模拟请求,或按用户确认只输出本地参数。