jumpy-lion 1.0.0-beta.4 → 1.0.0-beta.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/browser-plugin.d.ts.map +1 -1
- package/dist/browser-plugin.js +15 -5
- package/dist/browser-plugin.js.map +1 -1
- package/dist/browser-process/anti-detect-config.d.ts +47 -7
- package/dist/browser-process/anti-detect-config.d.ts.map +1 -1
- package/dist/browser-process/anti-detect-config.js +79 -48
- package/dist/browser-process/anti-detect-config.js.map +1 -1
- package/dist/browser-process/apple-silicon-devices.d.ts +96 -0
- package/dist/browser-process/apple-silicon-devices.d.ts.map +1 -0
- package/dist/browser-process/apple-silicon-devices.js +185 -0
- package/dist/browser-process/apple-silicon-devices.js.map +1 -0
- package/dist/browser-process/browser.d.ts.map +1 -1
- package/dist/browser-process/browser.js +121 -17
- package/dist/browser-process/browser.js.map +1 -1
- package/dist/browser-process/gpu-family-profiles.d.ts +3 -0
- package/dist/browser-process/gpu-family-profiles.d.ts.map +1 -1
- package/dist/browser-process/gpu-family-profiles.js +170 -88
- package/dist/browser-process/gpu-family-profiles.js.map +1 -1
- package/dist/browser-process/integrity-headers.d.ts +158 -0
- package/dist/browser-process/integrity-headers.d.ts.map +1 -0
- package/dist/browser-process/integrity-headers.js +228 -0
- package/dist/browser-process/integrity-headers.js.map +1 -0
- package/dist/browser-profiles/chrome/create.d.ts +2 -1
- package/dist/browser-profiles/chrome/create.d.ts.map +1 -1
- package/dist/browser-profiles/chrome/create.js +2 -2
- package/dist/browser-profiles/chrome/create.js.map +1 -1
- package/dist/browser-profiles/chrome/default.d.ts +7 -0
- package/dist/browser-profiles/chrome/default.d.ts.map +1 -1
- package/dist/browser-profiles/chrome/default.js +16 -0
- package/dist/browser-profiles/chrome/default.js.map +1 -1
- package/dist/browser-profiles/chrome/populate-profile.d.ts +2 -0
- package/dist/browser-profiles/chrome/populate-profile.d.ts.map +1 -1
- package/dist/browser-profiles/chrome/populate-profile.js +2 -2
- package/dist/browser-profiles/chrome/populate-profile.js.map +1 -1
- package/dist/fingerprinting/hardware-realism.d.ts +46 -0
- package/dist/fingerprinting/hardware-realism.d.ts.map +1 -1
- package/dist/fingerprinting/hardware-realism.js +104 -1
- package/dist/fingerprinting/hardware-realism.js.map +1 -1
- package/dist/fingerprinting/locale-resolver.d.ts +21 -0
- package/dist/fingerprinting/locale-resolver.d.ts.map +1 -1
- package/dist/fingerprinting/locale-resolver.js +43 -6
- package/dist/fingerprinting/locale-resolver.js.map +1 -1
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +16 -0
- package/dist/index.js.map +1 -1
- package/dist/launch-stealth-browser.d.ts +143 -0
- package/dist/launch-stealth-browser.d.ts.map +1 -0
- package/dist/launch-stealth-browser.js +133 -0
- package/dist/launch-stealth-browser.js.map +1 -0
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +2 -1
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The Google-only request-header integrity inputs.
|
|
3
|
+
*
|
|
4
|
+
* Real Chrome sends four headers to Google properties, gated by
|
|
5
|
+
* `google_util::IsGoogleAssociatedDomainUrl`:
|
|
6
|
+
*
|
|
7
|
+
* X-Browser-Channel: stable
|
|
8
|
+
* X-Browser-Year: 2026
|
|
9
|
+
* X-Browser-Copyright: Copyright 2026 Google LLC. All Rights Reserved.
|
|
10
|
+
* X-Browser-Validation: base64(sha1(kIntegritySeed + apiKey + userAgent))
|
|
11
|
+
*
|
|
12
|
+
* Only the last one needs data we do not have by default, and it needs two things
|
|
13
|
+
* an unbranded build gets wrong:
|
|
14
|
+
*
|
|
15
|
+
* - `kIntegritySeed` lives in a Google-internal DEPS submodule, so ours is "".
|
|
16
|
+
* It also ROTATES EVERY CHROME RELEASE, so it cannot be a compiled constant -
|
|
17
|
+
* it has to be supplied per session, matched to the version the session claims.
|
|
18
|
+
* - `google_apis::GetAPIKey()` returns OUR build's key, not the key Google bakes
|
|
19
|
+
* into a macOS Chrome. Per ADR 0004 the digest must use the key of the CLAIMED
|
|
20
|
+
* platform, so it is injected too.
|
|
21
|
+
*
|
|
22
|
+
* The user agent needs nothing: `embedder_support::GetUserAgent()` honours
|
|
23
|
+
* `--user-agent`, so the C++ side hashes exactly the string we advertise.
|
|
24
|
+
*
|
|
25
|
+
* Seeds are harvested from a real Chrome by `scripts/harvest-chrome-integrity.py`
|
|
26
|
+
* (see the harvest-chrome-integrity skill). A seed only enters this table once it
|
|
27
|
+
* has reproduced a real captured header byte for byte.
|
|
28
|
+
*/
|
|
29
|
+
import { isGreaseBrand } from '../fingerprinting/ua-ch-brands.js';
|
|
30
|
+
/** Platform-specific Google API keys, as compiled into real branded Chrome. */
|
|
31
|
+
export const CHROME_API_KEYS = {
|
|
32
|
+
macos: 'AIzaSyDr2UxVnv_U85AbhhY8XSHSIavUW0DC-sY',
|
|
33
|
+
windows: 'AIzaSyA2KlwBX3mkFo30om9LUFYQhpqLoa_BNhE',
|
|
34
|
+
linux: 'AIzaSyBqJZh-7pA44blAaAkH6490hUFOwX0KCYM',
|
|
35
|
+
};
|
|
36
|
+
/**
|
|
37
|
+
* Verified seeds, keyed by the full Chrome version they came from.
|
|
38
|
+
*
|
|
39
|
+
* ONLY ADD A ROW THAT HAS BEEN VERIFIED. The harvester reproduces a real captured
|
|
40
|
+
* (user agent, digest) pair before reporting a seed as confirmed, and an unverified
|
|
41
|
+
* value must never land here: a missing header set leaves us indistinguishable from
|
|
42
|
+
* every Chromium build in the world, while a header carrying a wrong digest is
|
|
43
|
+
* impossible-valued and unique.
|
|
44
|
+
*
|
|
45
|
+
* 151.0.7922.108 is verified:
|
|
46
|
+
* base64(sha1('59d2629a8246b372' + macosKey + reducedUA)) = YphvkVZHC4/QbFYqn/v4wI6lmx0=
|
|
47
|
+
* which is exactly the header captured from a real Chrome 151.0.7922.108 / macOS 26.5.2.
|
|
48
|
+
*
|
|
49
|
+
* 156.0.8078.80 is verified against real Chrome on macOS (2026-11-04):
|
|
50
|
+
* UA: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.0.0 Safari/537.36
|
|
51
|
+
* base64(sha1('25f19a0a21434856' + macosKey + UA)) = p0ryEJ6LCa7iMn63FawDjO0pVio=
|
|
52
|
+
* All 65 captured Google requests carried that digest.
|
|
53
|
+
*
|
|
54
|
+
* 157.0.8103.39 is verified against real Chrome on macOS (official dmg, 2026-11-04):
|
|
55
|
+
* UA: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/157.0.0.0 Safari/537.36
|
|
56
|
+
* base64(sha1('c7311ddf97a360ac' + macosKey + UA)) = GVcRH2YKULBIwBNheMTMHagkbO0=
|
|
57
|
+
* All 62 captured Google requests carried that digest.
|
|
58
|
+
*
|
|
59
|
+
* 157.0.8103.38 is verified against real Chrome on Linux (official deb, 2026-11-04):
|
|
60
|
+
* UA: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/157.0.0.0 Safari/537.36
|
|
61
|
+
* base64(sha1('ab4c254bf3136520' + linuxKey + UA)) = gY7B/hYIRXcXtzAlThaB5EzMNaw=
|
|
62
|
+
* All 65 captured Google requests carried that digest.
|
|
63
|
+
* Mac and Linux shipped different patch levels of 157, so each platform has its own row: a persona must claim
|
|
64
|
+
* the build its platform actually received.
|
|
65
|
+
*
|
|
66
|
+
* The other two were extracted by the same anchored method but have no capture yet,
|
|
67
|
+
* so they are recorded as unverified and are NOT eligible for use.
|
|
68
|
+
*/
|
|
69
|
+
export const VERIFIED_INTEGRITY_PROFILES = {
|
|
70
|
+
'157.0.8103.39': {
|
|
71
|
+
version: '157.0.8103.39',
|
|
72
|
+
seed: 'c7311ddf97a360ac',
|
|
73
|
+
year: '2026',
|
|
74
|
+
copyright: 'Copyright 2026 Google LLC. All Rights Reserved.',
|
|
75
|
+
},
|
|
76
|
+
'157.0.8103.38': {
|
|
77
|
+
version: '157.0.8103.38',
|
|
78
|
+
seed: 'ab4c254bf3136520',
|
|
79
|
+
year: '2026',
|
|
80
|
+
copyright: 'Copyright 2026 Google LLC. All Rights Reserved.',
|
|
81
|
+
},
|
|
82
|
+
'156.0.8078.80': {
|
|
83
|
+
version: '156.0.8078.80',
|
|
84
|
+
seed: '25f19a0a21434856',
|
|
85
|
+
year: '2026',
|
|
86
|
+
copyright: 'Copyright 2026 Google LLC. All Rights Reserved.',
|
|
87
|
+
},
|
|
88
|
+
'151.0.7922.108': {
|
|
89
|
+
version: '151.0.7922.108',
|
|
90
|
+
seed: '59d2629a8246b372',
|
|
91
|
+
year: '2026',
|
|
92
|
+
copyright: 'Copyright 2026 Google LLC. All Rights Reserved.',
|
|
93
|
+
},
|
|
94
|
+
};
|
|
95
|
+
/** Extracted but NOT verified against a real capture. Do not ship these. */
|
|
96
|
+
export const UNVERIFIED_SEEDS = {
|
|
97
|
+
'151.0.7922.110': '05d8c431b39bdc9f',
|
|
98
|
+
'151.0.7922.138': '669f97eb3c38549b',
|
|
99
|
+
};
|
|
100
|
+
/**
|
|
101
|
+
* The version we advertise when integrity headers are enabled.
|
|
102
|
+
*
|
|
103
|
+
* This is the crux of the coupling. The REDUCED user agent carries no patch level
|
|
104
|
+
* (`Chrome/156.0.0.0`), so it is identical across every 156.x build and the seed is
|
|
105
|
+
* the only version-specific input to the digest. But `sec-ch-ua-full-version` DOES
|
|
106
|
+
* carry the patch level, and Google can recompute the digest using the seed for
|
|
107
|
+
* whichever version we claim there.
|
|
108
|
+
*
|
|
109
|
+
* So the claimed full version and the seed must come from the same build.
|
|
110
|
+
* Our binary is 157.0.8103.39 (the macOS stable build), and its macOS seed is verified against a real capture.
|
|
111
|
+
* The advertised full version therefore matches both the binary and the seed.
|
|
112
|
+
*/
|
|
113
|
+
export const INTEGRITY_CLAIMED_VERSION = '157.0.8103.39';
|
|
114
|
+
/**
|
|
115
|
+
* Build the launch switches, or return an empty list when we cannot do it correctly.
|
|
116
|
+
*
|
|
117
|
+
* Returning nothing is a deliberate, safe outcome rather than a failure: the patched
|
|
118
|
+
* C++ side emits no headers at all when the switches are absent, which leaves us in
|
|
119
|
+
* the large crowd of Chromium builds that send none. Emitting a digest built from a
|
|
120
|
+
* mismatched seed, or the wrong platform's key, would be unique and therefore worse.
|
|
121
|
+
*/
|
|
122
|
+
export function buildIntegrityHeaderArgs(options) {
|
|
123
|
+
const profile = VERIFIED_INTEGRITY_PROFILES[options.claimedVersion];
|
|
124
|
+
if (!profile) {
|
|
125
|
+
const unverified = UNVERIFIED_SEEDS[options.claimedVersion];
|
|
126
|
+
return {
|
|
127
|
+
args: [],
|
|
128
|
+
skipped: unverified
|
|
129
|
+
? `a seed for ${options.claimedVersion} was extracted but never verified against a real capture`
|
|
130
|
+
: `no verified integrity seed for claimed version ${options.claimedVersion}`,
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
const apiKey = CHROME_API_KEYS[options.claimedPlatform];
|
|
134
|
+
if (!apiKey) {
|
|
135
|
+
return { args: [], skipped: `no Chrome API key known for claimed platform ${options.claimedPlatform}` };
|
|
136
|
+
}
|
|
137
|
+
return {
|
|
138
|
+
args: [
|
|
139
|
+
`--integrity-seed=${profile.seed}`,
|
|
140
|
+
`--integrity-api-key=${apiKey}`,
|
|
141
|
+
`--integrity-year=${profile.year}`,
|
|
142
|
+
`--integrity-copyright=${profile.copyright}`,
|
|
143
|
+
],
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Build the `integrity` block for the session's JSON config, and align the claimed
|
|
148
|
+
* full version to the seed we actually hold.
|
|
149
|
+
*
|
|
150
|
+
* THE COUPLING THIS RESOLVES. The reduced user agent carries no patch level
|
|
151
|
+
* (`Chrome/156.0.0.0`), so it is identical across every 156.x build. But
|
|
152
|
+
* `sec-ch-ua-full-version` and `fullVersionList` DO carry it, and Google can
|
|
153
|
+
* recompute the digest with the seed belonging to whichever version we advertise
|
|
154
|
+
* there. So the advertised full version and the seed must come from the same build.
|
|
155
|
+
*
|
|
156
|
+
* The default profile is the verified macOS capture for our 157.0.8103.39 binary.
|
|
157
|
+
* This keeps every advertised full-version field aligned with that profile,
|
|
158
|
+
* including when the input config still carries an older version.
|
|
159
|
+
*
|
|
160
|
+
* Mutates the config in place and returns whether it did anything, so the caller can
|
|
161
|
+
* log the decision rather than silently shipping a mismatch.
|
|
162
|
+
*/
|
|
163
|
+
export function applyIntegrityToConfig(config, claimedPlatform, version = INTEGRITY_CLAIMED_VERSION) {
|
|
164
|
+
const profile = VERIFIED_INTEGRITY_PROFILES[version];
|
|
165
|
+
if (!profile) {
|
|
166
|
+
return {
|
|
167
|
+
applied: false,
|
|
168
|
+
reason: UNVERIFIED_SEEDS[version]
|
|
169
|
+
? `seed for ${version} is extracted but unverified, so it must not ship`
|
|
170
|
+
: `no verified integrity seed for ${version}`,
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
const apiKey = CHROME_API_KEYS[claimedPlatform];
|
|
174
|
+
if (!apiKey) {
|
|
175
|
+
return { applied: false, reason: `no Chrome API key for claimed platform ${claimedPlatform}` };
|
|
176
|
+
}
|
|
177
|
+
config.integrity = {
|
|
178
|
+
seed: profile.seed,
|
|
179
|
+
apiKey,
|
|
180
|
+
year: profile.year,
|
|
181
|
+
copyright: profile.copyright,
|
|
182
|
+
};
|
|
183
|
+
// Align every place the patch level is advertised, not just uaFullVersion:
|
|
184
|
+
// fullVersionList is sent as sec-ch-ua-full-version-list and would otherwise
|
|
185
|
+
// disagree with it, which is its own contradiction.
|
|
186
|
+
//
|
|
187
|
+
// TWO BUGS FIXED HERE, both measured on the wire in 1.0.0-beta.5.
|
|
188
|
+
//
|
|
189
|
+
// 1. `full_version` was not rewritten. Each entry was spread from the
|
|
190
|
+
// binary-aligned brand list, which carries BOTH a `version` and a
|
|
191
|
+
// `full_version`, and only `version` was being replaced. The C++ config
|
|
192
|
+
// parse prefers `full_version` when present
|
|
193
|
+
// (blink_settings_config.cc, the fullVersionList mirror-by-name loop),
|
|
194
|
+
// so the old value won and every request went out with
|
|
195
|
+
// sec-ch-ua-full-version: "151.0.7922.108"
|
|
196
|
+
// sec-ch-ua-full-version-list: ..."Google Chrome";v="151.0.7922.72"
|
|
197
|
+
// Both fields are written now.
|
|
198
|
+
//
|
|
199
|
+
// 2. The GREASE entry was the ONLY entry the version regex rewrote. The
|
|
200
|
+
// test was `/^\d+\.0\.0\.0$/`, evidently meant to spare GREASE, but
|
|
201
|
+
// GREASE's version IS `99.0.0.0` and so it matched, while the real
|
|
202
|
+
// brands carry a four-part build number and did not. Real Chrome 151
|
|
203
|
+
// sends `"Not=A?Brand";v="99.0.0.0"`; rewriting it to `151.0.0.0` would
|
|
204
|
+
// have replaced one contradiction with a fresh one. Identified by brand
|
|
205
|
+
// shape now, not by version shape, which is what isGreaseBrand is for.
|
|
206
|
+
const uaData = config.navigator?.userAgentData;
|
|
207
|
+
if (uaData) {
|
|
208
|
+
uaData.uaFullVersion = profile.version;
|
|
209
|
+
if (Array.isArray(uaData.fullVersionList)) {
|
|
210
|
+
uaData.fullVersionList = uaData.fullVersionList.map((entry) => (isGreaseBrand(entry.brand)
|
|
211
|
+
? entry
|
|
212
|
+
: { ...entry, version: profile.version, full_version: profile.version }));
|
|
213
|
+
}
|
|
214
|
+
// `brands` is the array the C++ actually iterates; fullVersionList is
|
|
215
|
+
// only mirrored onto it by brand name. alignFingerprintConfigWithBinary
|
|
216
|
+
// assigns the SAME array object to both, so rebuilding fullVersionList
|
|
217
|
+
// above leaves `brands` pointing at the old one. Rewrite it too, and
|
|
218
|
+
// keep the major-version-only `version` field alone: that surface is
|
|
219
|
+
// sec-ch-ua, which carries no patch level in any Chrome.
|
|
220
|
+
if (Array.isArray(uaData.brands)) {
|
|
221
|
+
uaData.brands = uaData.brands.map((entry) => (isGreaseBrand(entry.brand)
|
|
222
|
+
? entry
|
|
223
|
+
: { ...entry, full_version: profile.version }));
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
return { applied: true };
|
|
227
|
+
}
|
|
228
|
+
//# sourceMappingURL=integrity-headers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"integrity-headers.js","sourceRoot":"","sources":["../../src/browser-process/integrity-headers.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
export declare const modifyChromeProfile: (profile: any, profileOptions?: any) => any;
|
|
2
2
|
export declare function createChromeProfile(profilePath: string, profileOptions?: {
|
|
3
|
-
locale
|
|
3
|
+
locale?: string;
|
|
4
|
+
acceptLanguages?: string;
|
|
4
5
|
}): Promise<void>;
|
|
5
6
|
//# sourceMappingURL=create.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../../src/browser-profiles/chrome/create.ts"],"names":[],"mappings":"AAQA,eAAO,MAAM,mBAAmB,YAAa,GAAG,mBAAkB,GAAG,QAMpE,CAAA;AACD,wBAAsB,mBAAmB,CAAC,WAAW,EAAE,MAAM,EAAE,cAAc,CAAC,EAAE;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../../src/browser-profiles/chrome/create.ts"],"names":[],"mappings":"AAQA,eAAO,MAAM,mBAAmB,YAAa,GAAG,mBAAkB,GAAG,QAMpE,CAAA;AACD,wBAAsB,mBAAmB,CAAC,WAAW,EAAE,MAAM,EAAE,cAAc,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,eAAe,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAY5I"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import fs from 'fs/promises';
|
|
2
2
|
import path from 'path';
|
|
3
|
-
import {
|
|
3
|
+
import { withAcceptLanguages } from './default.js';
|
|
4
4
|
// Preparation for modifying the browser profile based on options
|
|
5
5
|
// @TODO: Implement
|
|
6
6
|
export const modifyChromeProfile = (profile, profileOptions = {}) => {
|
|
@@ -16,7 +16,7 @@ export async function createChromeProfile(profilePath, profileOptions) {
|
|
|
16
16
|
// Create the Preferences file
|
|
17
17
|
const preferencesPath = path.join(profilePath, 'Default', 'Preferences');
|
|
18
18
|
await fs.mkdir(path.dirname(preferencesPath), { recursive: true });
|
|
19
|
-
const preferences =
|
|
19
|
+
const preferences = modifyChromeProfile(withAcceptLanguages(profileOptions?.acceptLanguages), profileOptions ?? {});
|
|
20
20
|
await fs.writeFile(preferencesPath, JSON.stringify(preferences, null, 2));
|
|
21
21
|
}
|
|
22
22
|
//# sourceMappingURL=create.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create.js","sourceRoot":"","sources":["../../../src/browser-profiles/chrome/create.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,aAAa,CAAC;AAC7B,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"create.js","sourceRoot":"","sources":["../../../src/browser-profiles/chrome/create.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,aAAa,CAAC;AAC7B,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAGnD,iEAAiE;AACjE,mBAAmB;AACnB,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,OAAY,EAAE,iBAAsB,EAAE,EAAE,EAAE;IAC1E,IAAI,cAAc,CAAC,MAAM,EAAE,CAAC;QACxB,OAAO,OAAO,CAAA;IAClB,CAAC;IACD,OAAO,OAAO,CAAA;AAElB,CAAC,CAAA;AACD,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,WAAmB,EAAE,cAA8D;IACzH,IAAG,CAAC,WAAW,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;IACpD,CAAC;IACD,8BAA8B;IAC9B,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,EAAE,aAAa,CAAC,CAAC;IACzE,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAEnE,MAAM,WAAW,GAAG,mBAAmB,CAAC,mBAAmB,CAAC,cAAc,EAAE,eAAe,CAAC,EAAE,cAAc,IAAI,EAAE,CAAC,CAAC;IAEpH,MAAM,EAAE,CAAC,SAAS,CAAC,eAAe,EAAE,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAE9E,CAAC"}
|
|
@@ -288,4 +288,11 @@ export declare const DEFAULT_PROFILE: {
|
|
|
288
288
|
url_keyed_anonymized_data_collection_enabled: boolean;
|
|
289
289
|
};
|
|
290
290
|
};
|
|
291
|
+
/**
|
|
292
|
+
* A copy of the default profile whose intl.accept_languages carries `acceptLanguages`
|
|
293
|
+
* (a q-less comma list such as "it-IT,it,en-US,en"). Chrome sends this pref as the
|
|
294
|
+
* Accept-Language header; --lang only seeds it when unset. Returns the shared default
|
|
295
|
+
* untouched (as a deep copy) when no list is given.
|
|
296
|
+
*/
|
|
297
|
+
export declare const withAcceptLanguages: (acceptLanguages?: string) => typeof DEFAULT_PROFILE;
|
|
291
298
|
//# sourceMappingURL=default.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"default.d.ts","sourceRoot":"","sources":["../../../src/browser-profiles/chrome/default.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuR3B,CAAA"}
|
|
1
|
+
{"version":3,"file":"default.d.ts","sourceRoot":"","sources":["../../../src/browser-profiles/chrome/default.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuR3B,CAAA;AAGD;;;;;GAKG;AACH,eAAO,MAAM,mBAAmB,qBAAsB,MAAM,KAAG,OAAO,eAQrE,CAAC"}
|
|
@@ -289,4 +289,20 @@ export const DEFAULT_PROFILE = {
|
|
|
289
289
|
"url_keyed_anonymized_data_collection_enabled": false,
|
|
290
290
|
},
|
|
291
291
|
};
|
|
292
|
+
/**
|
|
293
|
+
* A copy of the default profile whose intl.accept_languages carries `acceptLanguages`
|
|
294
|
+
* (a q-less comma list such as "it-IT,it,en-US,en"). Chrome sends this pref as the
|
|
295
|
+
* Accept-Language header; --lang only seeds it when unset. Returns the shared default
|
|
296
|
+
* untouched (as a deep copy) when no list is given.
|
|
297
|
+
*/
|
|
298
|
+
export const withAcceptLanguages = (acceptLanguages) => {
|
|
299
|
+
const profile = JSON.parse(JSON.stringify(DEFAULT_PROFILE));
|
|
300
|
+
if (acceptLanguages) {
|
|
301
|
+
profile.intl = { ...profile.intl, accept_languages: acceptLanguages };
|
|
302
|
+
// intl.selected_languages is absent from the default profile, so there is nothing to keep in sync.
|
|
303
|
+
if ('selected_languages' in profile.intl)
|
|
304
|
+
profile.intl.selected_languages = acceptLanguages;
|
|
305
|
+
}
|
|
306
|
+
return profile;
|
|
307
|
+
};
|
|
292
308
|
//# sourceMappingURL=default.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"default.js","sourceRoot":"","sources":["../../../src/browser-profiles/chrome/default.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"default.js","sourceRoot":"","sources":["../../../src/browser-profiles/chrome/default.ts"],"names":[],"mappings":"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"}
|
|
@@ -41,6 +41,8 @@ export interface PopulateProfileOptions {
|
|
|
41
41
|
addMediaEngagement?: boolean;
|
|
42
42
|
/** Custom sites for history/engagement */
|
|
43
43
|
customSites?: typeof COMMON_SITES;
|
|
44
|
+
/** q-less Accept-Language list written to intl.accept_languages (e.g. "it-IT,it,en-US,en") */
|
|
45
|
+
acceptLanguages?: string;
|
|
44
46
|
/** Days of history to simulate */
|
|
45
47
|
historyDays?: number;
|
|
46
48
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"populate-profile.d.ts","sourceRoot":"","sources":["../../../src/browser-profiles/chrome/populate-profile.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAOH;;GAEG;AACH,QAAA,MAAM,YAAY;;;;GAWjB,CAAC;AAoBF;;GAEG;AACH,eAAO,MAAM,kBAAkB,QAAO,MAqDrC,CAAC;AAiBF;;GAEG;AACH,eAAO,MAAM,sBAAsB,WAAW,OAAO,YAAY,KAAkB,MAmBlF,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,uBAAuB,QAAO,MAiB1C,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACnC,sCAAsC;IACtC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,+BAA+B;IAC/B,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,gCAAgC;IAChC,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,0CAA0C;IAC1C,WAAW,CAAC,EAAE,OAAO,YAAY,CAAC;IAClC,kCAAkC;IAClC,WAAW,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;GAEG;AACH,eAAO,MAAM,qBAAqB,gBACjB,MAAM,YACV,sBAAsB,KAChC,OAAO,CAAC,IAAI,CAkDd,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,0BAA0B,WAAY,MAAM,EAAE,KAAG,MAkC7D,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,4BAA4B,QAAO,MA0B/C,CAAC;AAEF;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,EAAE,QAAQ,GAAG,KAAK,GAAG,MAAM,CAAC;IACpC,OAAO,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,eAAO,MAAM,+BAA+B,WAAY,MAAM,KAAG,aAAa,EAoC7E,CAAC"}
|
|
1
|
+
{"version":3,"file":"populate-profile.d.ts","sourceRoot":"","sources":["../../../src/browser-profiles/chrome/populate-profile.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAOH;;GAEG;AACH,QAAA,MAAM,YAAY;;;;GAWjB,CAAC;AAoBF;;GAEG;AACH,eAAO,MAAM,kBAAkB,QAAO,MAqDrC,CAAC;AAiBF;;GAEG;AACH,eAAO,MAAM,sBAAsB,WAAW,OAAO,YAAY,KAAkB,MAmBlF,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,uBAAuB,QAAO,MAiB1C,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACnC,sCAAsC;IACtC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,+BAA+B;IAC/B,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,gCAAgC;IAChC,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,0CAA0C;IAC1C,WAAW,CAAC,EAAE,OAAO,YAAY,CAAC;IAClC,8FAA8F;IAC9F,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,kCAAkC;IAClC,WAAW,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;GAEG;AACH,eAAO,MAAM,qBAAqB,gBACjB,MAAM,YACV,sBAAsB,KAChC,OAAO,CAAC,IAAI,CAkDd,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,0BAA0B,WAAY,MAAM,EAAE,KAAG,MAkC7D,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,4BAA4B,QAAO,MA0B/C,CAAC;AAEF;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,EAAE,QAAQ,GAAG,KAAK,GAAG,MAAM,CAAC;IACpC,OAAO,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,eAAO,MAAM,+BAA+B,WAAY,MAAM,KAAG,aAAa,EAoC7E,CAAC"}
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
*/
|
|
12
12
|
import fs from 'fs/promises';
|
|
13
13
|
import path from 'path';
|
|
14
|
-
import {
|
|
14
|
+
import { withAcceptLanguages } from './default.js';
|
|
15
15
|
/**
|
|
16
16
|
* Popular sites for realistic browsing history
|
|
17
17
|
*/
|
|
@@ -172,7 +172,7 @@ export const populateChromeProfile = async (profilePath, options = {}) => {
|
|
|
172
172
|
// same keys DEFAULT_PROFILE already declares preserves key order, so the
|
|
173
173
|
// emitted bytes are identical to the historical two-write path.
|
|
174
174
|
const localState = generateLocalState();
|
|
175
|
-
const preferences =
|
|
175
|
+
const preferences = withAcceptLanguages(options.acceptLanguages);
|
|
176
176
|
// Add site engagement data
|
|
177
177
|
if (addEngagement) {
|
|
178
178
|
preferences.site_engagement = generateSiteEngagement(customSites);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"populate-profile.js","sourceRoot":"","sources":["../../../src/browser-profiles/chrome/populate-profile.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,MAAM,aAAa,CAAC;AAC7B,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"populate-profile.js","sourceRoot":"","sources":["../../../src/browser-profiles/chrome/populate-profile.ts"],"names":[],"mappings":"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"}
|
|
@@ -54,6 +54,52 @@ export declare function resolvePlatformVersion(platform: string | undefined, see
|
|
|
54
54
|
*/
|
|
55
55
|
export declare function deriveRealisticDeviceMemory(seed: number, rawFromFingerprint: number | undefined): number;
|
|
56
56
|
export declare function deriveStorageQuota(seed: number, deviceMemoryGB: number): number;
|
|
57
|
+
/**
|
|
58
|
+
* The frame clock a session claims: refresh rate, the panel's own deviation
|
|
59
|
+
* from its nominal rate, and how much each vsync wanders around the grid.
|
|
60
|
+
*
|
|
61
|
+
* All three exist because a container has no panel. Chromium then falls back to
|
|
62
|
+
* `BeginFrameArgs::DefaultInterval()`, which is `base::Seconds(1) / 60` and
|
|
63
|
+
* truncates on the microsecond field to 16666 us - 60.0024 Hz, delivered by a
|
|
64
|
+
* delay-based timer that snaps every tick back onto the same grid. Measured in
|
|
65
|
+
* the Apify Linux container: fitted period 16666 us exactly, and a median
|
|
66
|
+
* absolute deviation of the inter-frame deltas of exactly 0, stable across
|
|
67
|
+
* seven repetitions. The same probe on a real Mac reads a period of 8336 us
|
|
68
|
+
* (nominal ProMotion is 8333.33) with an MAD of 100 us.
|
|
69
|
+
*
|
|
70
|
+
* Zero deviation is the part that cannot be explained away. A slow container is
|
|
71
|
+
* innocent; a session claiming macOS whose display produces a mathematically
|
|
72
|
+
* perfect grid is claiming a panel that has never been manufactured. See #164.
|
|
73
|
+
*
|
|
74
|
+
* - `refreshRateHz` - 60 for every desktop profile. Deliberately NOT the 120 Hz
|
|
75
|
+
* of a ProMotion MacBook Pro even though the reference Mac has one: the
|
|
76
|
+
* compositor has to actually deliver the frames it claims, and a container
|
|
77
|
+
* that advertises 120 Hz while dropping half of them is more detectable than
|
|
78
|
+
* one that advertises the 60 Hz an Air, an iMac or any external display runs
|
|
79
|
+
* at. Left as a field so a host that can sustain it can say so.
|
|
80
|
+
* - `intervalSkewPpm` - the panel's constant error against its nominal rate.
|
|
81
|
+
* The reference Mac's 8336 us against a nominal 8333.33 is +320 ppm. Without
|
|
82
|
+
* this the fitted period lands on exactly 1e6/refreshRateHz, which is its own
|
|
83
|
+
* signature: a real crystal is never exact.
|
|
84
|
+
* - `vsyncJitterUs` - standard deviation of the per-frame wander, in
|
|
85
|
+
* microseconds. The binary applies it to the tick TARGET, so the frame is
|
|
86
|
+
* both scheduled and timestamped late-or-early together; jittering only the
|
|
87
|
+
* reported timestamp would leave `performance.now()` inside the callback on
|
|
88
|
+
* the honest grid and simply move the contradiction.
|
|
89
|
+
*/
|
|
90
|
+
export interface DisplayTimingProfile {
|
|
91
|
+
refreshRateHz: number;
|
|
92
|
+
intervalSkewPpm: number;
|
|
93
|
+
vsyncJitterUs: number;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* The frame clock for a session, deterministic in the seed so the same session
|
|
97
|
+
* replays the same panel on every host.
|
|
98
|
+
*
|
|
99
|
+
* Independent digits of the seed drive the two values so a profile cannot have
|
|
100
|
+
* its skew predict its jitter.
|
|
101
|
+
*/
|
|
102
|
+
export declare function deriveDisplayTiming(seed: number): DisplayTimingProfile;
|
|
57
103
|
/**
|
|
58
104
|
* Stable non-negative hash of a session key, for paths that hold a seed STRING
|
|
59
105
|
* (the JS injector's proxy session key) rather than the numeric seed the native
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hardware-realism.d.ts","sourceRoot":"","sources":["../../src/fingerprinting/hardware-realism.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AA0BH;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,2BAA2B,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC,CAInF,CAAC;AAKF;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAKzF;AAED;;;;;;;;GAQG;AACH,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,MAAM,EAAE,kBAAkB,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CASxG;AAwBD,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,MAAM,CAI/E;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAMxD;AAED;;;;;;;;;GASG;AACH,wBAAgB,wBAAwB,CACpC,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,YAAY,EAAE,MAAM,GAAG,SAAS,EAChC,IAAI,EAAE,MAAM,GACb,MAAM,CAOR"}
|
|
1
|
+
{"version":3,"file":"hardware-realism.d.ts","sourceRoot":"","sources":["../../src/fingerprinting/hardware-realism.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AA0BH;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,2BAA2B,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC,CAInF,CAAC;AAKF;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAKzF;AAED;;;;;;;;GAQG;AACH,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,MAAM,EAAE,kBAAkB,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CASxG;AAwBD,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,MAAM,CAI/E;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,MAAM,WAAW,oBAAoB;IACjC,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;CACzB;AAiCD;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,oBAAoB,CAiBtE;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAMxD;AAED;;;;;;;;;GASG;AACH,wBAAgB,wBAAwB,CACpC,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,YAAY,EAAE,MAAM,GAAG,SAAS,EAChC,IAAI,EAAE,MAAM,GACb,MAAM,CAOR"}
|
|
@@ -122,6 +122,57 @@ export function deriveStorageQuota(seed, deviceMemoryGB) {
|
|
|
122
122
|
void deviceMemoryGB;
|
|
123
123
|
return CHROME_STORAGE_QUOTA_BYTES;
|
|
124
124
|
}
|
|
125
|
+
/**
|
|
126
|
+
* Refresh rate claimed by every desktop profile. See DisplayTimingProfile for
|
|
127
|
+
* why this is 60 and not the reference Mac's 120.
|
|
128
|
+
*/
|
|
129
|
+
const DESKTOP_REFRESH_RATE_HZ = 60;
|
|
130
|
+
/**
|
|
131
|
+
* Bounds on the per-session panel error, in ppm. The magnitude is at least
|
|
132
|
+
* MIN so the fitted period never lands back on the nominal value, and at most
|
|
133
|
+
* MAX because a display that is 0.1% off its rated rate would be a warranty
|
|
134
|
+
* case. +320 ppm was measured on the reference Mac.
|
|
135
|
+
*/
|
|
136
|
+
const SKEW_PPM_MIN = 120;
|
|
137
|
+
const SKEW_PPM_MAX = 520;
|
|
138
|
+
/**
|
|
139
|
+
* Bounds on the per-vsync wander, as a standard deviation in microseconds.
|
|
140
|
+
*
|
|
141
|
+
* The upper bound matters for correctness, not only for realism: the binary
|
|
142
|
+
* caps the applied offset at 3 sigma, and Chromium's own double-tick guard in
|
|
143
|
+
* `DelayBasedTimeSource::PostNextTickTask` tolerates a tick arriving up to
|
|
144
|
+
* 500 us early. 3 x 160 = 480 us stays inside that, so an early frame is still
|
|
145
|
+
* recognised as the frame it is instead of being pushed a whole interval out.
|
|
146
|
+
*
|
|
147
|
+
* The range is also where the reference Mac sits: an MAD of 100 us, which is
|
|
148
|
+
* one quantum of the 100 us clamp `performance.now()` and the rAF timestamp are
|
|
149
|
+
* both rounded to, so the underlying deviation is of that order.
|
|
150
|
+
*/
|
|
151
|
+
const VSYNC_JITTER_US_MIN = 110;
|
|
152
|
+
const VSYNC_JITTER_US_MAX = 160;
|
|
153
|
+
/**
|
|
154
|
+
* The frame clock for a session, deterministic in the seed so the same session
|
|
155
|
+
* replays the same panel on every host.
|
|
156
|
+
*
|
|
157
|
+
* Independent digits of the seed drive the two values so a profile cannot have
|
|
158
|
+
* its skew predict its jitter.
|
|
159
|
+
*/
|
|
160
|
+
export function deriveDisplayTiming(seed) {
|
|
161
|
+
const base = Math.abs(Math.trunc(Number.isFinite(seed) ? seed : 0));
|
|
162
|
+
const skewPick = base % 1000;
|
|
163
|
+
const jitterPick = Math.trunc(base / 1000) % 1000;
|
|
164
|
+
const skewMagnitude = SKEW_PPM_MIN
|
|
165
|
+
+ Math.round((SKEW_PPM_MAX - SKEW_PPM_MIN) * (skewPick % 500) / 499);
|
|
166
|
+
// Panels run fast or slow with equal frequency; the sign is a separate draw
|
|
167
|
+
// so the magnitude distribution is not folded onto one side of nominal.
|
|
168
|
+
const sign = skewPick < 500 ? 1 : -1;
|
|
169
|
+
return {
|
|
170
|
+
refreshRateHz: DESKTOP_REFRESH_RATE_HZ,
|
|
171
|
+
intervalSkewPpm: sign * skewMagnitude,
|
|
172
|
+
vsyncJitterUs: VSYNC_JITTER_US_MIN
|
|
173
|
+
+ Math.round((VSYNC_JITTER_US_MAX - VSYNC_JITTER_US_MIN) * jitterPick / 999),
|
|
174
|
+
};
|
|
175
|
+
}
|
|
125
176
|
/**
|
|
126
177
|
* Stable non-negative hash of a session key, for paths that hold a seed STRING
|
|
127
178
|
* (the JS injector's proxy session key) rather than the numeric seed the native
|
|
@@ -148,8 +199,60 @@ export function normalizePlatformVersion(platform, profileValue, seed) {
|
|
|
148
199
|
if (platform === 'Linux x86_64') {
|
|
149
200
|
return '';
|
|
150
201
|
}
|
|
151
|
-
return
|
|
202
|
+
return isCurrentPlatformVersion(platform, profileValue)
|
|
152
203
|
? profileValue
|
|
153
204
|
: resolvePlatformVersion(platform, seed);
|
|
154
205
|
}
|
|
206
|
+
/** `[major, minor]` of a dotted version, or null when it does not parse. */
|
|
207
|
+
function parseVersionPair(value) {
|
|
208
|
+
const parts = value.split('.');
|
|
209
|
+
const major = Number(parts[0]);
|
|
210
|
+
const minor = parts.length > 1 ? Number(parts[1]) : 0;
|
|
211
|
+
if (!Number.isFinite(major) || !Number.isFinite(minor))
|
|
212
|
+
return null;
|
|
213
|
+
return [major, minor];
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Whether a profile's own `platformVersion` is still one a currently-shipping OS
|
|
217
|
+
* would report, judged against the oldest entry in that platform's candidate
|
|
218
|
+
* pool.
|
|
219
|
+
*
|
|
220
|
+
* WHY THE PROFILE VALUE IS NOT TRUSTED VERBATIM. It used to be, and the pool
|
|
221
|
+
* data is old enough that this made the population of identities
|
|
222
|
+
* distinguishable even though no single member was impossible. Measured across
|
|
223
|
+
* six sessions on the Apify platform under a constant Chrome 151 claim:
|
|
224
|
+
* 26.1.0, 15.1.0, 13.3.0, 13.4.0, 15.3.1, 26.3.0 - four of six advertising
|
|
225
|
+
* macOS 13 or an early 15 while running a browser released in 2026. Each value
|
|
226
|
+
* is a real macOS version, so there is nothing to detect one request at a time;
|
|
227
|
+
* the distribution is the tell.
|
|
228
|
+
*
|
|
229
|
+
* The floor is DERIVED FROM THE CANDIDATE POOL rather than written down
|
|
230
|
+
* separately, so refreshing the pool for a new macOS release also moves the
|
|
231
|
+
* floor and the two cannot drift apart. A profile value at or above the pool's
|
|
232
|
+
* oldest entry is kept - that preserves genuine variety, including versions the
|
|
233
|
+
* pool itself does not list - and anything older is resampled from the pool.
|
|
234
|
+
*/
|
|
235
|
+
function isCurrentPlatformVersion(platform, profileValue) {
|
|
236
|
+
if (!profileValue || profileValue.length === 0)
|
|
237
|
+
return false;
|
|
238
|
+
const candidates = PLATFORM_VERSION_CANDIDATES[platform ?? '']
|
|
239
|
+
?? PLATFORM_VERSION_CANDIDATES[PLATFORM_VERSION_FALLBACK_KEY];
|
|
240
|
+
const parsed = parseVersionPair(profileValue);
|
|
241
|
+
if (!parsed)
|
|
242
|
+
return false;
|
|
243
|
+
let floor = null;
|
|
244
|
+
for (const candidate of candidates) {
|
|
245
|
+
const pair = parseVersionPair(candidate);
|
|
246
|
+
if (!pair)
|
|
247
|
+
continue;
|
|
248
|
+
if (!floor || pair[0] < floor[0] || (pair[0] === floor[0] && pair[1] < floor[1])) {
|
|
249
|
+
floor = pair;
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
// No usable floor means the pool cannot judge the value, so leave it alone
|
|
253
|
+
// rather than resampling from a pool we could not read.
|
|
254
|
+
if (!floor)
|
|
255
|
+
return true;
|
|
256
|
+
return parsed[0] > floor[0] || (parsed[0] === floor[0] && parsed[1] >= floor[1]);
|
|
257
|
+
}
|
|
155
258
|
//# sourceMappingURL=hardware-realism.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hardware-realism.js","sourceRoot":"","sources":["../../src/fingerprinting/hardware-realism.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"hardware-realism.js","sourceRoot":"","sources":["../../src/fingerprinting/hardware-realism.ts"],"names":[],"mappings":"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"}
|