/逆向分析
Facebook设备完整性链路分析

设备完整性链路
结论先说
这条链不是一个独立 API,而是 Tigon 发请求前自动补上的完整性头。
在 round2 里能看到:
request-builder-leave时,TigonRequest里还看不到它- 到
callback-enter onStarted时,headers里已经出现X-FB-Integrity-Machine-Id
这说明它更像是发送前注入,不是业务层手工拼到每个请求里的。
证据
主要看这几个位置:
- round2-dual-route-events-1783692914.jsonl
- X_FB_INTEGRITY_DISCOVERY.md
- X_FB_INTEGRITY_MACHINE_ID_ACTUAL_DATA.md
它怎么请求
它本身不单独发请求。
实际形态是:
- 业务先构造普通
TigonRequest - 进入
TigonHttpClientAdapterImpl.executeAsync - 发送前由框架层补上完整性头
- 真正发出去的是原业务请求,只是多带了这个头
典型请求类型在 round2 里有:
IMAGE / PREFETCHGRAPHQLOTHER
比如:
https://static-hkg1-2.xx.fbcdn.net/...webphttps://rupload.facebook.com/service_menu_uploads/...https://b-graph.facebook.com?...
带了什么参数
最核心的是:
X-FB-Integrity-Machine-Id: gf5QakE6ik837QH7a1OV2xLw
同时常见还会有:
x-fb-sim-hnix-fb-net-hnix-fb-rmdX-FB-HTTP-EngineX-FB-Connection-TypePriorityUser-Agent- 有些请求还有
X-ZERO-EH
注意:真正的业务参数不在这个完整性头里,而是在原请求自己的 URL / body / multipart 里。
它怎么构造
从日志看,构造分两层:
1. 业务请求层
业务层先生成普通 TigonRequest,里面有:
- method
- url
- category
- body / buffers
- 基础 headers
2. 框架注入层
在发送前,Tigon 相关链路把 X-FB-Integrity-Machine-Id 塞进 headers。
这点的关键证据是:
- builder 结束时还没看到这个头
onStarted时已经看到了
所以它不是每个业务点自己拼的,更像是统一注入。
这个值从哪来
当前日志里能确认的是:
- 值稳定,反复出现
- 24 个字符左右
- 在同一会话里多次复用
更像是本地缓存值,大概率和 auth/auth_machine_id 这类本地存储有关。
但要严谨一点说:
- 这两份 hook 没有直接打出读取点
- 所以“具体是 SharedPreferences 还是别的缓存层”仍是推断
请求后得到什么
请求返回的是原业务请求的响应,不是完整性头的独立回包。
回包会先进入:
TigonHttpClientAdapter.Callback.onResponseonBodyonEOM
然后再回到原来的发起方。
所以这里的传递关系是:
flowchart LR
A[业务层构造 TigonRequest] --> B[Tigon发送前注入完整性头]
B --> C[服务端收到请求并做完整性校验]
C --> D[普通HTTP响应]
D --> E[onResponse/onBody/onEOM]
E --> F[原始业务调用方 / callback / prefetch逻辑]
它传递给谁
分两边看:
发出去以后
X-FB-Integrity-Machine-Id 传给服务端,用于完整性/设备标识校验。
回来以后
回的是原请求的响应,传回:
TigonHttpClientAdapter.Callback- 再到具体业务调用方
在 round2 里能看到的就是:
- 图片预取请求收到
200 onBody拿到 WEBP / 二进制内容- 然后继续交给原来的预取链路
一句话总结
这条链的本质是:
普通业务请求 + 框架自动注入的设备完整性头 + 服务端校验 + 原请求响应回流到原调用方
不是单独打一条“完整性 API”。