5.6 KiB
5.6 KiB
高强度环境检测与浏览器行为 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/交付代码。
推荐流程
- 根据 RuyiTrace / Hook / Node trace 生成环境 API 清单。
- 在用户确认的真实浏览器取证模式中运行最小行为 probe,生成
case/fixtures/browser-env-baseline.json。 - 在 Node 补环境中运行同一组 probe,生成
case/tmp/node-env-audit.json。 - 输出
case/notes/high-intensity-env-diff.md,逐项记录一致 / 不一致 / 未涉及 / 未采样。 - 按差异修复 env,并把修复内容写入
case/notes/代码变更记忆.md和阶段报告。 - 交付前把覆盖矩阵写入
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.postMessageDataCloneError 改写的版本,避免错误信息暴露 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 多版本回归,以及回归样本数量。