Unveiling the Impact of User-Agent Reduction
and Client Hints:
A Measurement Study
To appear at WPES'23
This study examines recent changes in browser behavior related to user-agent string. Browsers including Chrome have reduced the identifying information in user-agent strings to enhance user privacy. However, Chrome has also introduced high-entropy user-agent client hints (UA-CH) and new JavaScript API to provide access to specific browser details. The study assesses the impact of these changes on the top 100,000 websites by using an instrumented crawler to measure access to high-entropy browser features via UA-CH HTTP headers and the JavaScript API. It also investigates whether tracking, advertising, and browser fingerprinting scripts have started using these new client hints and the JavaScript API.
Paper » Source code »📈 Highlights
- High-entropy UA-CHs are accessed
by one or more scripts on 59.2% of
the sites via the
getHighEntropyValues
method. The 93.8% of these calls were made by tracking and advertising-related scripts — primarily by those owned by Google. - On 91.6% of the sites where high-entropy client hints are accessed via the JavaScript API, the high-entropy hints are exfiltrated by a tracker script to a remote server.
- The use of UA-CH HTTP headers is very limited both for opt-in by first parties (1.3% of the sites), and delegation to 3rd parties (0.4% of the sites).
- Overall, the UA reduction efforts seems to have reduced the risk of passive fingerprinting, but tracking scripts continue to enjoy their ungated & unfettered access on Chromium-based browsers.
🔍 What is UA string and why is it important?
-
The UA HTTP header, introduced in 1992 for statistical purposes and the tracing of protocol
violations, initially contained one or
more tokens of software name and versions such as LII-Cello/1.0
libwww/2.5.
Today, it provides extensive browser, device, and platform details, used for analytics,
debugging, and compatibility checks.
However, it can also enable covert cross-site tracking through browser fingerprinting when
combined with device data like screen
size and fonts. Passive fingerprinting extracts data from network packets without client-side
code, including user-agent,
IP address, Accept headers, clock skew, and protocol quirks. This allows third-party trackers to
link user web visits without running
client-side code, evading detection.
🔄 What changed and how?
-
Google's UA Reduction initiative contains three key components:
- Reducing the detail of the UA string and freezing specific elements. For instance, in Chrome 101 (June 2022), minor version numbers were replaced with zeros, making a UA string like Chrome/101.3.2.1 become Chrome/101.0.0.0. Furthermore, CPU and platform-related details were simplified for desktop browsers in Chrome 107 (February 2023), and the Android version number was replaced with a fixed "10" in May 2023.
- Implementing user-agent client hint (UA-CH) HTTP headers, which offer a structured alternative to the UA string. These headers were enabled by default in Chrome 89, released in March 2021.
- Introducing a new JavaScript interface known as NavigatorUAData, containing properties and methods for scripted access to UA-CHs. This was introduced in Chrome 90, released in April 2021.
Access to User-Agent Client Hints via HTTP
Access to User-Agent Client Hints via the JavaScript API
getHighEntropyValues
, offering high-entropy UA
values.
// Log the full user-agent data
navigator
.userAgentData.getHighEntropyValues(
["architecture", "model", "bitness", "platformVersion",
"fullVersionList"])
.then(ua => { console.log(ua) });
// output
{
"architecture":"x86",
"bitness":"64",
"brands":[
{
"brand":" Not A;Brand",
"version":"99"
},
{
"brand":"Chromium",
"version":"98"
},
{
"brand":"Google Chrome",
"version":"98"
}
],
"fullVersionList":[
{
"brand":" Not A;Brand",
"version":"99.0.0.0"
},
{
"brand":"Chromium",
"version":"98.0.4738.0"
},
{
"brand":"Google Chrome",
"version":"98.0.4738.0"
}
],
"mobile":false,
"model":"",
"platformVersion":"12.0.1"
}
Delegating hints to third-parties
User-Agent Client Hint opt-in and delegation via HTML
🏁 Findings
getHighEntropyValues
calls and exfiltrations
getHighEntropyValues
calls and exfiltrations
getHighEntropyValues
method was called by one or more
third-party
scripts on 52,392 unique sites, representing 58.4% of the visited sites. Following table
provides details on the prevalence of these API calls on the analyzed websites. We found
that almost all calls (98.6%) are due
to third-party and tracking-related scripts.
All | Third party | Tracking related | |
---|---|---|---|
getHighEntropyValues calls | 53,148 | 52,392 | 51,630 |
Hi-ent. UA-CH exfiltrations | 48,355 | 47,691 | 47,285 |
Most common categories of third-party scripts that
call getHighEntropyValues
method
getHighEntropyValues
method
getHighEntropyValues
from the respective category.
Script Category | Num. Sites |
---|---|
Ad Motivated Tracking | 44,084 |
Advertising | 43,976 |
Audience Measurement | 40,901 |
Third-Party Analytics Marketing | 40,491 |
Analytics | 40,347 |
Action Pixels | 13,224 |
Embedded Content | 4,523 |
CDN | 4,342 |
Social - Share | 2,338 |
Ad Fraud | 1,339 |
Top tracker domains that call getHighEntropyValues
and exfiltrate
high-entropy
values
getHighEntropyValues
and exfiltrate
high-entropy
values
High Entropy API calls | High Entropy API exfiltrations | ||
---|---|---|---|
Tracker domain | Num. Sites | Tracker domain | Num. Sites |
googletagmanager.com | 28,929 | google-analytics.com | 22,517 |
googlesyndication.com | 6,843 | google.com | 9,325 |
doubleclick.net | 3,633 | doubleclick.net | 8,853 |
googletagservices.com | 1,414 | googlesyndication.com | 2,018 |
googleadservices.com | 673 | crwdcntrl.net | 985 |
quantserve.com | 437 | sharethis.com | 531 |
taboola.com | 330 | gemius.pl | 356 |
clarity.ms | 192 | taboola.com | 315 |
statcounter.com | 161 | id5-sync.com | 253 |
wpadmngr.com | 152 | tynt.com | 202 |
getHighEntropyValues
arguments sorted by the number of distinct
sites they were
observed on
getHighEntropyValues
arguments sorted by the number of distinct
sites they were
observed on
getHighEntropyValues
with
an mistyped argument, uaFulVersion, on seven distinct sites. Additionally, on 174 sites
the method is called with the argument None
by scripts served from the ampproject.org domain. In this case,
Chrome only returns low-entropy hints.
UA Client Hint Num. | Num. Sites |
Num. of Script Domains |
---|---|---|
model | 52,270 | 970 |
platformVersion | 52,214 | 1,052 |
platform | 51,529 | 746 |
fullVersionList | 51,321 | 792 |
architecture | 51,229 | 618 |
bitness | 50,874 | 554 |
uaFullVersion(deprecated) | 50,743 | 359 |
wow64 | 50,132 | 80 |
mobile | 7,615 | 283 |
brands | 5,208 | 462 |
None | 174 | 1 |
uaFulVersion | 7 | 1 |
The number of distinct sites where CH headers were
observed on requests
Ent | UA-CH Header | All | Third Party | Tracking Related |
---|---|---|---|---|
high | Sec-CH-UA-Platform-Version | 886 | 331 | 134 |
Sec-CH-UA-Model | 886 | 329 | 132 | |
Sec-CH-UA-Full-Version-List | 696 | 261 | 67 | |
Sec-CH-UA-Arch | 667 | 257 | 63 | |
Sec-CH-UA-Full-Version | 581 | 217 | 25 | |
Sec-CH-UA-Bitness | 491 | 217 | 25 | |
Sec-CH-UA-Wow64 | 401 | 210 | 21 | |
low | Sec-CH-UA | 89,141 | 78,476 | 67,560 |
Sec-CH-UA-Mobile | 89,141 | 78,476 | 67,560 | |
Sec-CH-UA-Platform | 89,141 | 78,478 | 67,560 |
The number of distinct sites where UA-CHs were
opted-in via the Accept-CH header
Ent | UA-CH Header | Num. Sites |
---|---|---|
high | Sec-CH-UA-Model | 1,046 |
Sec-CH-UA-Platform-Version | 870 | |
Sec-CH-UA-Full-Version-List | 824 | |
Sec-CH-UA-Arch | 799 | |
Sec-CH-UA-Full-Version | 538 | |
Sec-CH-UA-Bitness | 443 | |
Sec-CH-UA-Wow64 | 354 | |
low | Sec-CH-UA-Platform | 818 |
Sec-CH-UA | 434 | |
Sec-CH-UA-Mobile | 403 |
The number of distinct sites delegating high-entropy
UA-CHs via the Permissions Policy header
Ent | UA-CH Header | Allow All(*) | Total |
---|---|---|---|
high | ch-ua-platform-version | 312 | 338 |
ch-ua-model | 310 | 337 | |
ch-ua-full-version-list | 259 | 266 | |
ch-ua-arch | 261 | 266 | |
ch-ua-bitness | 221 | 225 | |
ch-ua-full-version | 225 | 225 | |
ch-ua-wow64 | 218 | 222 | |
low | ch-ua-platform | 218 | 225 |
ch-ua | 4 | 6 | |
ch-ua-mobile | 4 | 6 |
Reduction in high-entropy User-Agent
exposure
getHighEntropyValues
method and those actually using this privilege. Figure
4
indicates that out of the 41,229 distinct third-party domains encountered, 25,052 (61%)
serve active content categorized as "script" or "document". These domains could start
collecting
high-entropy UA-CHs by simply adding a call to the getHighEntropyValues
method. This
action could potentially triple the number of domains accessing high-entropy UA-CHs,
which currently stands at 9,095 (22%) distinct third-party domains.