## CyberStrikeAI 浏览器扩展 **当前版本:0.3.10**(UI 为英文;中文说明见下文) Chrome / Edge(Chromium)DevTools 扩展:在开发者工具中捕获 **Network** 流量,发送到 CyberStrikeAI 进行 AI 辅助安全测试。能力与 Burp Suite 插件对齐,并按生产场景做了性能与体验优化。 --- ### 快速开始 1. `chrome://extensions/` → 开发者模式 → **加载已解压的扩展程序** 2. 选择目录:`plugins/browser-extension/cyberstrikeai-browser-extension/` 3. 打开目标页面 → **F12** → 顶部 Tab **CyberStrikeAI** 4. 填写 Host / Port / Password → **Validate**(首次会请求访问服务器地址权限) 5. 左侧选中捕获请求 → **Send** → 在 **Output** 查看 AI 结果 点击浏览器工具栏图标可查看 **只读连接状态**;完整配置与操作均在 DevTools 面板内完成。 --- ### 界面说明 ``` ┌─ 连接栏(Validate 成功后可收起)────────────────────────────┐ │ Logo │ https://host:port │ 连接设置 │ ● OK │ ├─ 操作栏 ────────────────────────────────────────────────────┤ │ Send │ Latest XHR │ Stop │ Copy │ Clear │ ●捕获中/○已暂停 │ │ XHR/Fetch only │ Debug │ Markdown │ ├──────────────┬──────────────────────────────────────────────┤ │ Test History │ Output │ Request │ Response │ │ Captured Req │ Progress + Final Response │ └──────────────┴──────────────────────────────────────────────┘ ``` | 区域 | 说明 | |------|------| | **连接栏** | Host、Port、HTTPS、Password、Validate;成功后收起为 `https://host:port` 摘要 | | **Test History** | 最多 50 次 Send 记录,可回看 Progress / Final | | **Captured Requests** | 当前 Tab 捕获列表,最多 200 条,支持搜索 | | **Output** | 默认 Tab:流式 Progress + Final Response | | **Request / Response** | 查看选中流量的 HTTP/1.1 格式原文 | --- ### 功能一览 #### 捕获 - **Background 中枢**:`devtools.js` 监听 Network → `service-worker` 队列 → Panel 订阅 - 默认 **XHR/Fetch only**(可关闭以捕获更多类型) - 静态资源 URL / MIME **预过滤**,命中前不读响应体 - **● 捕获中 / ○ 已暂停**:暂停后零开销,已有列表仍可 Send - 单条截断:请求体 **64KB**、响应 **4KB** #### HTTP 展示与 AI Prompt - **存储**:内存中保留原始 HAR(含 HTTP/2 伪首部 `:method` 等) - **展示 / Prompt**:归一化为 **HTTP/1.1**(与 Burp 插件一致) ```http GET /api/foo HTTP/1.1 Host: example.com Cookie: ... ``` #### 发送到 CyberStrikeAI - 弹窗选择:**项目 / 角色 / 对话模式**(动态 API)+ 测试指令 - 支持 **Eino Single**、**Deep**、**Plan-Execute**、**Supervisor** - **Latest XHR**:一键选中最近 API 请求并打开发送弹窗 - **Stop**:中止本地 SSE + 调用服务端 `/api/agent-loop/cancel` #### 流式输出 - Progress 日志上限 **512KB**(超出截断) - **Final Response 不截断**(当前进行中的测试) - 历史 run 切换后 Final 软截断 **100KB** - **Markdown**:流式阶段纯文本;结束后 `requestIdleCallback` 渲染;超 **100KB** 降级纯文本 - **Copy**:复制当前 Request / Response / Final #### 安全与权限 - Token 存 **chrome.storage.session**(关浏览器失效) - 登录后保存 **`expires_at`**,状态栏显示 **剩余时间**(如 `OK · 剩余 11h 30m`) - **不会自动续期**:过期后需重新 Validate(需 Password) - 本地过期检测(30s)+ 服务端 `/api/auth/validate` 探测(同周期;切回面板时立即探测) - 服务不可达时显示 **无法连接服务**;重启后 Token 失效显示 **服务已重启或 Token 已失效** - **401/403** 时自动清空 Token 并展开连接栏 - Send 前主动校验 Token 有效性 - **optional_host_permissions**:Validate 时按需授权 - 权限申请直接绑定 Validate 点击事件,仅申请当前 CyberStrikeAI 服务 origin;已授权地址不会重复弹窗 --- ### 按钮与选项 | 控件 | 作用 | |------|------| | **Validate** | 登录并校验 Token;进行中再次点击为 Cancel | | **连接设置 / 收起** | 展开或折叠 Host/Port/Password 表单 | | **Send** | 对选中捕获发起到 CyberStrikeAI | | **Latest XHR** | 选中最近 XHR/Fetch 并 Send | | **Stop** | 停止当前 AI 流(本地 + 服务端) | | **Clear Output** | 清空当前 run 的 Progress / Final | | **● 捕获中 / ○ 已暂停** | 启用或暂停 Network 捕获 | | **XHR/Fetch only** | 只捕获 API 类请求 | | **Debug events** | 在 Progress 显示更多 SSE 事件 | | **Markdown** | Final 完成后渲染富文本 | | **Clear All** | 清空 Test History | | **Clear** | 清空当前 Tab 捕获列表 | --- ### 数据与内存(不会无限增长) | 数据 | 上限 | 位置 | 清理时机 | |------|------|------|----------| | 捕获请求 | 200 条 / Tab | Background + Panel 内存 | 超出丢弃最旧;可手动 Clear | | Tab 捕获槽 | 20 个 Tab | Background 内存 | 超出丢弃非当前 Tab | | 测试历史 | 50 条 | Panel 内存 | 超出丢弃最旧;Clear All | | Progress | 512KB / run | Panel 内存 | 超出截断 | | Final(进行中) | 无硬上限 | Panel 内存 | — | | Final(历史) | 100KB 软截断 | Panel 内存 | 切换到其他 run 时 | | 配置 + Token | 极小 | chrome.storage | 手动改配置 | - 关闭 **DevTools** → Panel 内存清空 - 关闭 **浏览器** → Session Token 失效 - Service Worker 被回收 → Background 捕获队列清空 --- ### 性能说明 | 场景 | 影响 | |------|------| | 未开 DevTools | **无影响**(不监听 Network) | | DevTools 开 + 捕获暂停 | **几乎无影响** | | DevTools 开 + 捕获中 + XHR only | 仅匹配请求有轻微开销 | | 高流量 SPA | 建议保持 **XHR/Fetch only**,不需要时点 **已暂停** | 已做优化:过滤器内存缓存、静态资源不读 body、列表增量插入、搜索防抖、rAF 节流流式 UI。 --- ### 常见问题 **扩展更新后报错 `chrome.runtime.connect` undefined?** 扩展重载后旧 DevTools 面板上下文失效。请:**关闭 DevTools → 重新加载扩展 → 再开 F12**。 **Token 过期会自动刷新吗?** **不会自动续期**(无 refresh token)。插件会保存 `expires_at`、显示剩余时间;每 30s 向服务端校验,切回 DevTools 时立即校验。服务重启后 session 清空,会提示重新 Validate。 **重启服务后状态还显示 OK?** v0.3.7 起每 30s 探测 `/api/auth/validate`;不可达显示黄色警告,Token 失效则清空并展开连接栏。重载扩展后请关闭 DevTools 再开 F12。 **Request 里为什么曾经有 `:authority`、`:method`?** HTTP/2 伪首部。展示与 AI Prompt 已归一化为 HTTP/1.1;原始 HAR 仍保存在内存 entry 中。 **Console 里 localhost CORS 报错是插件造成的吗?** 不是。那是页面自身请求本机服务被浏览器拦截,与扩展无关。 **Validate 显示 `cross-origin request denied`?** 升级并重启 CyberStrikeAI 服务。新版服务会自动识别格式合法的 Chrome/Edge 扩展 Origin,无需复制插件 ID 或配置 CORS 白名单;插件首次 Validate 时仍会请求访问目标服务地址的浏览器权限。 **Validate 要求允许访问 CyberStrikeAI 服务?** 在浏览器弹出的权限框中允许访问当前服务地址。插件只按需申请所填写的服务 origin,不需要开启全站访问。如果未出现权限框,请在 `chrome://extensions/` 重新加载扩展,完全关闭 DevTools 后再打开并点击 Validate。 **HTTPS 显示无法连接,但 Burp 正常?** Burp 插件会信任自签名证书,浏览器扩展不能绕过 Chromium 的 TLS 校验。请先在浏览器中打开服务地址并信任证书;生产环境建议使用包含服务 IP/域名 SAN 的受信任证书。 **Test History 很多会挡住 Captured Requests 吗?** 不会。历史区最高占侧边栏 **42%**,超出部分区域内滚动;捕获区占剩余空间。 **会拖慢网页吗?** 日常浏览(不开 DevTools)无影响。调试时可用 **已暂停** 完全停止捕获。 --- ### Popup 与 DevTools 分工 | 位置 | 用途 | |------|------| | **DevTools 面板** | 连接、Validate、捕获、Send、Output(主工作区) | | **扩展 Popup** | 只读连接状态 + 版本号 + 打开 DevTools 引导 | 不在 Popup 中重复完整配置表单,避免与主流程脱节。 --- ### 打包发布 ```bash bash plugins/browser-extension/cyberstrikeai-browser-extension/package.sh # → dist/cyberstrikeai-browser-extension.zip ``` 图标从项目根 `images/logo.png` 生成: ```bash LOGO="images/logo.png" ICONS="plugins/browser-extension/cyberstrikeai-browser-extension/icons" for size in 16 48 128; do sips -z $size $size "$LOGO" --out "$ICONS/icon${size}.png" done ``` --- ### 限制 - Chrome **不提供** Network 面板右键菜单 API → 使用 **Latest XHR** + 自建列表 - Firefox 需 `about:debugging` 临时加载;`storage.session` 不可用时 Token 回退 `local` - 无法一键从 Popup 跳转到 DevTools 指定面板(Chrome API 限制) --- ### 目录结构 ```text manifest.json # MV3 清单 background/service-worker.js # 捕获队列、Panel Port、全局开关 devtools.js # Network 监听(最早过滤) devtools.html panel/ panel.html / panel.js / panel.css # 主 UI popup/ popup.html / popup.js / popup.css # 只读状态 lib/ auth-session.js # Token 过期检测与剩余时间提示 api.js # 登录、SSE、项目/角色 API storage.js # 配置 + session token + expires_at capture.js # HAR 摘要、静态过滤 http-normalize.js # HTTP/2 → HTTP/1.1 展示/Prompt formatter.js # toPrompt 组装 markdown.js # Final Markdown 渲染 catalog-cache.js # 项目/角色 5 分钟缓存 constants.js # 上限常量 icons/ # 16 / 48 / 128 package.sh ``` --- ### 与 Burp 插件对比 | 能力 | Burp 插件 | 浏览器扩展 | |------|-----------|------------| | 流量来源 | Proxy 历史 | DevTools Network | | 连接配置 | Tab 内 | Tab 内(可折叠) | | HTTP 格式 | HTTP/1.1 | 展示/Prompt 归一化为 HTTP/1.1 | | 项目/角色/模式 | Send 弹窗 | Send 弹窗 | | SSE 输出 | Progress + Final | Progress + Final | | 捕获开关 | — | ● 捕获中 / ○ 已暂停 |