Files

65 lines
5.6 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.

# 高强度环境检测与浏览器行为 diff
当目标出现 Shape / F5 / Akamai / DataDome / Kasada / reese84 / bx-* 等浏览器完整性检测、环境分数异常、302/403 风控跳转、环境 trace 很分散,或出现异常模式、toString、堆栈、属性枚举、原型链、MutationObserver、userAgentData、window.chrome、媒体能力、Client Hints 一致性等问题时读取本文件。
本文件只用于网页端 Node.js 补环境和授权样本验证;遇到 JSVMP / opcode / 字节码解释器时,仍遵循“不主动分析 JSVMP 源码”的边界,只记录其为高强度风控风险,并围绕环境调用、writer、行为 diff 与请求链路推进。
## 核心原则
- 真实浏览器是标准答案;补环境不是只追求“不报错”或“当前 sign 一致”,还要让关键环境行为与取证浏览器一致。
- RuyiTrace / Node trace 用于定位访问了哪些 API;行为是否一致必须通过浏览器基线采样与 Node 补环境输出 diff 验证。
- 高强度检测覆盖要写入阶段报告和最终总结,不能只在调试输出中口头说明。
- 所有 probe、Hook、trace、浏览器自动化脚本只允许出现在前置取证和 notes / tmp 中,不得进入最终 `result/` 交付代码。
## 推荐流程
1. 根据 RuyiTrace / Hook / Node trace 生成环境 API 清单。
2. 在用户确认的真实浏览器取证模式中运行最小行为 probe,生成 `case/fixtures/browser-env-baseline.json`。
3. 在 Node 补环境中运行同一组 probe,生成 `case/tmp/node-env-audit.json`。
4. 输出 `case/notes/high-intensity-env-diff.md`,逐项记录一致 / 不一致 / 未涉及 / 未采样。
5. 按差异修复 env,并把修复内容写入 `case/notes/代码变更记忆.md` 和阶段报告。
6. 交付前把覆盖矩阵写入 `case/result/最终项目总结.md`。
## 高强度检测类别
| 类别 | 需要对比的内容 | 典型证据 |
|---|---|---|
| 异常模式 | `error.name`、`constructor.name`、`message`、`String(error)`、stack 首行;循环 `__proto__`、incompatible receiver、非法 `call/apply` | browser baseline / Node audit |
| Node 泄露 | `process`、`process.env`、`NODE_DISABLE_COLORS`、`NO_COLOR`、`errno`、`error`、`Buffer`、`global`、`require`、`module`、本机路径、`node:internal` | Node 泄露检查 / stack probe |
| toString 多通道 | `fn.toString()`、`Function.prototype.toString.call(fn)`、保存旧 FTS 调用、`String(fn)`、`fn + ""`、`fn.toString.toString()` | addon / NativeProtect 自检 |
| DataCloneError | `structuredClone(fn)`、`MessagePort.prototype.postMessage(fn)` 的错误 message / stack 是否暴露 fallback 函数源码 | browser baseline / Node audit |
| 属性枚举与描述符 | `Object.getOwnPropertyDescriptor`、`__lookupGetter__`、`__lookupSetter__`、`Object.getOwnPropertyNames`、`Object.keys`、`Reflect.ownKeys`、`in`、`hasOwnProperty`、`propertyIsEnumerable`、`for...in` | descriptor baseline |
| 原型链与 brand check | `Object.getPrototypeOf` walk、`__proto__`、`constructor.name`、`Symbol.toStringTag`、`Object.prototype.toString.call`、`instanceof`、跨原型 `call/apply` | prototype baseline |
| DOM 行为 | `document.createElement(tag)` tag 映射、HTML 元素继承链、`MutationObserver.observe` 异步 records、`attributeFilter`、参数错误 | DOM probe |
| Chrome / Navigator | `navigator.userAgentData`、`getHighEntropyValues`、`window.chrome`、`chrome.csi`、`chrome.loadTimes`、`chrome.app`、`navigator.mediaSession` | browser baseline |
| 媒体能力 | `HTMLMediaElement.prototype.canPlayType` MIME 返回表、Audio / Video 构造链、mediaSession | media probe |
| 指纹终端 API | Canvas / WebGL / WebGPU / Audio / 字体 / DOM 几何真实采样值与调用参数 | fingerprint fixture |
| 网络一致性 | `User-Agent`、`sec-ch-ua`、`sec-ch-ua-platform`、`sec-fetch-*`、Referer、Origin、Cookie 顺序、Header 顺序、HTTP/2 pseudo-header 顺序 | HAR / echo 服务 / TLS 客户端配置 |
| 动态 JS 多版本 | 多次首访 / challenge / JS bundle 的 hash、seed、nonce、Set-Cookie、writer 是否稳定 | resource manifest / 多 fixture |
## toString 与 DataCloneError 要点
- addon / xbs native-first 创建的函数应作为首选;用户实测 addon 对多通道 toString 检测没有问题。
- NativeProtect 只是 fallback;如果使用 NativeProtect,必须采用带 `structuredClone` / `MessagePort.prototype.postMessage` DataCloneError 改写的版本,避免错误信息暴露 fallback 函数源码。
- 如果当前上下文不存在 `structuredClone` 或 `MessagePort`,记录“不涉及 / 宿主不可用”;不得为了测试而把宿主 Node 实现透传给目标 JS。
## API 与网络指纹一致性
补环境中的 JS 指纹值必须与最终请求头一致:
- `navigator.userAgent` 对齐 `User-Agent`。
- `navigator.userAgentData.brands/fullVersionList/platform/mobile` 对齐 `sec-ch-ua`、`sec-ch-ua-platform`、`sec-ch-ua-mobile`。
- `navigator.language/languages` 对齐 `Accept-Language`。
- `location.href/origin/referrer` 对齐 `Referer`、`Origin`、`sec-fetch-site`。
- TLS 客户端选择不能替代 Header / Client Hints / Fetch Metadata 一致性;两者都要记录。
## 输出要求
阶段报告和最终总结至少记录:
- 是否启用高强度环境行为 diff:是 / 否,原因。
- 浏览器基线文件和 Node audit 文件。
- 已覆盖类别、未涉及类别、未采样类别。
- 每个不一致项的修复状态、fallback 原因和遗留风险。
- 是否存在动态风控 JS 多版本回归,以及回归样本数量。