Chrome's hidden X-Browser-Validation header reverse engineered

https://news.ycombinator.com/rss Hits: 13
Summary

Chrome X-Browser-Validation Header Reverse Engineering & Generator Chrome recently added a few new headers: "x-browser-channel": "stable", "x-browser-copyright": "Copyright 2025 Google LLC. .", "x-browser-validation": "6h3XF8YcD8syi2FF2BbuE2KllQo=", "x-browser-year": "2025" Apart from one of them, there isn’t much that’s interesting. They’re just bits of client specific information. However, base64 decoding x-browser-validation yields what appears to be a hash whose purpose remains undocumented. Chrome almost certainly uses this header as an integrity signal. Verifying that the declared user agent matches the underlying platform, spotting user agent string spoofing attempts etc. Generator from xbv import generate_validation_header ua = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36" # You may supply an explicit api_key alongside the ua # if omitted, the function automatically selects the appropriate key based on the user agent api_key = "AIzaSyA2KlwBX3mkFo30om9LUFYQhpqLoa_BNhE" header_value = generate_validation_header ( ua ) print ( header_value ) How the Header Is Made Grab two strings A hard-coded, platform specific API key The browser’s full user agent string Concatenate DATA = API_KEY + USER_AGENT Hash DATA with SHA-1 and base64 encode it. Platform API Keys Platform Default Key (found in Chrome binaries) Windows AIzaSyA2KlwBX3mkFo30om9LUFYQhpqLoa_BNhE Linux AIzaSyBqJZh-7pA44blAaAkH6490hUFOwX0KCYM macOS AIzaSyDr2UxVnv_U85AbhhY8XSHSIavUW0DC-sY Opened chrome.dll in IDA. The master routine sub_1806C95B0 builds every X-Browser-* header (you can find this function by searching browser-validation etc): Data prep - grabs the first hard-coded API key for the OS and appends the full user agent. __int64 __fastcall sub_1806C95B0 ( __int64 a1 , __int64 a2 ) { // ... setup ... // Data Preparation // Retrieves credentials and combines the API key and user agent into a buffer. v7 = sub_1806C9B30 (); v9 = sub_183...

First seen: 2025-07-13 02:52

Last seen: 2025-07-13 14:55