4.1 KiB
4.1 KiB
WASM / Worker / postMessage 处理
本文件用于网页端 JS 补环境中遇到 Worker、WASM、iframe 或 postMessage 的情况。范围仍然限定在网页端 JS 运行链路,不扩展到 Native 逆向。
判断信号
- 目标 JS 调用
new Worker()、SharedWorker()。 - 入口函数返回 Promise,实际签名在异步消息中完成。
- trace 出现
postMessage、onmessage、MessageChannel。 - Network 中额外加载
.wasm或 worker chunk。 - 加密入口只负责封装消息,真正结果从回调返回。
处理顺序
- 记录主线程调用
postMessage的消息体。 - 收集 Worker JS、动态 chunk、WASM 文件和初始化参数。
- 确认 Worker 返回消息格式:成功、失败、初始化完成、签名结果。
- 如果只是消息转发,优先在 Node 中模拟消息通道,不要直接改算法。
- 如果 WASM 参与网页签名,只记录 JS 调用边界和导出函数名;不要扩大到 Native 工具链。
- 读取
webapi-env-detection-matrix.md,把 Worker / iframe / postMessage 放入 WebAPI 环境检测矩阵;不只验证 API 存在,还要验证浏览器行为。 - 用 fixtures 验证异步结果,不以 Promise resolved 为完成。
Worker / postMessage 必查行为
- Worker scope 必须有独立
performance、timeOrigin、performance.now()序列;不得无证据复用主线程 performance。 - Worker scope 的
self/globalThis必须指向 WorkerGlobalScope 自身;window、document、top、parent、frames、localStorage等 Window-only API 必须按浏览器 baseline 缺失。 - Worker 的 ECMAScript/WebAPI 构造器和对象实例不得直接复用主 Window Realm 的引用。应验证
Object、Function、Array、Promise、Event、EventTarget、URL、Blob、Headers、Request、Response、XMLHttpRequest、navigator、performance、crypto的 identity 与instanceof。 - Worker scope 的
setTimeout/clearTimeout必须绑定 Worker 私有状态;Worker.prototype.terminate()后 pending timer 和延迟postMessage必须清理或丢弃。 - 同一 turn 内调用
terminate()后,尚未入队与已经入队但未派发的 Worker message 都要按目标浏览器 baseline 处理;至少分别测试“立即 terminate”和“延迟 terminate”。 WorkerGlobalScope.self.postMessage()与MessagePort.prototype.postMessage()必须以后续 task 派发;不得同步触发对端 listener。MessagePort.start()、设置onmessage的隐式 start、close()的发送端/接收端组合、entangled peer 解绑和 transfer 后原端口失效必须分别检测。- sender 已 close、receiver 已 close、双方 close、消息已排队后 close、transfer 后再次 postMessage 都必须有浏览器 baseline;不能只检查 peer 是否 closed。
addEventListener/removeEventListener/dispatchEvent必须覆盖 listener object、capture、once、passive、stopImmediatePropagation 和handleEvent。MessagePort.prototype.postMessage(fn)、structuredClone(fn)的DataCloneErrorname / message / stack 不能暴露 JS fallback 源码。- iframe 参与消息链时,单独检查
contentWindow、contentDocument、defaultView、srcdoc、document.write/close、Window/IframeWindow ownKeys / ownNames。 - 如果真实浏览器进入 final writer,而 Node 停在 continuation / reload writer,必须把 Worker / performance / iframe / postMessage 时序列入 writer 分支 diff。
记录模板
## Worker/WASM 消息链
- 主线程文件:
- Worker 文件:
- WASM 文件:
- 初始化消息:
- 签名请求消息:
- 签名响应消息:
- 依赖的浏览器环境:
- Node 模拟策略:真实 Worker / vm 模拟 / 手动封装消息通道
- 任务队列语义:同步 / 后续 task / microtask / timer
- Worker performance baseline:
- terminate 后 timer / postMessage 行为:
- MessagePort sender/receiver close、start、transfer:
- Worker Realm 构造器与对象 identity:
- iframe realm / ownKeys 状态:
- WebAPI 环境检测矩阵:
- 阻塞点: