共计 2582 个字符,预计需要花费 7 分钟才能阅读完成。
Wireshark 抓包分析 Token 传输
用 Wireshark 捕获 Chrome 调试通信时,可以看到类似这样的 WebSocket 握手过程(示例为过滤 ws 协议的抓包结果):

GET /devtools/page/FAKE_TOKEN HTTP/1.1
Host: 127.0.0.1:9222
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Upgrade: websocket
关键点在于:
- Token 出现在 WebSocket 连接的 URL 路径中
- 默认通过未加密的 WS 协议传输(除非手动启用
--remote-debugging-ssl)
两种调试模式对比
1. --remote-debugging-port模式
- 生成方式:启动时随机生成 UUID 格式 Token
- 存储位置:内存中,进程退出后失效
- 示例命令:
chrome --remote-debugging-port=9222
2. --user-data-dir模式
- 生成方式:基于用户目录路径计算 HMAC-SHA256
- 存储位置:
User Data/DevToolsActivePort文件 - 示例命令:
chrome --user-data-dir=/tmp/chrome-debug
Python 模拟 CDP 认证
以下是模拟 DevTools 协议认证的 Python 代码(含 TLS 加密):
import websockets
import ssl
import asyncio
async def connect_with_token():
# 高亮安全配置
ssl_context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT)
ssl_context.verify_mode = ssl.CERT_REQUIRED
uri = "wss://localhost:9222/devtools/page/TOKEN"
async with websockets.connect(
uri,
ssl=ssl_context,
extra_headers={"Origin": "chrome://debugger"}
) as ws:
await ws.send('{"id": 1,"method":"Page.enable"}')
print(await ws.recv())
# 黄色标注关键安全参数
loop = asyncio.get_event_loop()
loop.run_until_complete(connect_with_token())
Chromium 源码解析
关键校验逻辑位于chrome/browser/devtools/devtools_http_handler.cc:
// 验证 Token 的 HMAC 签名
bool DevToolsHttpHandler::IsValidToken(
const std::string& token,
const std::string& user_data_dir) {
std::string computed_token;
computed_token = base::HMAC::SHA256(GetContentClient()->browser()->GetAcceptLangs(browser_context_),
user_data_dir);
return token == computed_token;
}
安全风险与防御
RCE 风险场景
- 攻击者获取调试 Token 后可以:
- 执行任意 JS 代码(通过
Runtime.evaluate) - 窃取 Cookie/ 本地存储(通过
Network.getAllCookies) - 截屏 / 录屏(通过
Page.captureScreenshot)
生产环境防护
-
绝对禁用项:
# 错误示范(切勿在生产环境使用)chrome --remote-debugging-port=9222 --no-sandbox -
建议方案:
- 使用
--remote-debugging-pipe替代 WebSocket - 配置防火墙只允许 localhost 访问调试端口
- 定期轮换 Token(参考下方 Node.js 脚本)
自动化 Token 管理
Node.js 实现 Token 轮换与 K8s 集成:
const crypto = require('crypto');
const {execSync} = require('child_process');
// 生成新 Token(HMAC-SHA256)function generateToken() {
const secret = process.env.SECRET || 'default-secret';
return crypto.createHmac('sha256', secret)
.update(Date.now().toString())
.digest('hex');
}
// 更新 Kubernetes Secret
function updateK8sSecret(token) {
const cmd = `kubectl create secret generic chrome-token \
--from-literal=token=${token} \
--dry-run=client -o yaml | \
kubectl apply -f -`;
execSync(cmd, { stdio: 'inherit'});
}
// 主流程
const newToken = generateToken();
updateK8sSecret(newToken);
思考题
- 安全远程调试方案建议:
- 使用 SSH 隧道转发调试端口
- 实现双向 TLS 证书认证
-
限制调试会话有效期(如 1 小时)
-
Chrome Token vs JWT:
| 特性 | Chrome Token | JWT |
|————-|——————–|——————-|
| 存储位置 | 内存 / 文件 | HTTP Header |
| 校验方式 | HMAC-SHA256 | 多种签名算法 |
| 失效机制 | 进程退出 / 文件删除 | 依赖过期时间 |
| 典型攻击 | 中间人劫持 | 密钥破解 |
总结
调试 Token 是 Chrome 开发者工具的强大功能,但也需要严格的安全管理。建议:
– 开发环境使用短时效 Token
– 生产环境彻底关闭调试端口
– 必要时采用 VPN+ 白名单的访问控制
通过源码分析和实战演示,我们既能充分利用调试能力,又能有效控制安全风险。
正文完
