Hacking Google with A.I. for $500,000 A security researcher and his collaborator collected over 60,000 Android APKs, decrypted Google iOS apps, and built a Chrome extension to intercept network traffic in order to harvest Google API keys. Using those keys to access Google's internal API discovery documents, the researcher then employed AI-powered fuzzing to automatically probe the APIs for vulnerabilities. The effort resulted in a $500,000 bug bounty payout from Google's Vulnerability Reward Program. After being invited to bugSWAT Mexico https://x.com/brutecat/status/1974906110579745274 in October 2025, I found myself drawn back to Google research. While I'd been focused on other projects for several months, the team's willingness to give researchers a peek into Google's source code reignited my interest in exploring Google's attack surface. Having spent the past year building small projects with Claude, I realized there was untapped potential in using AI to automatically fuzz Google's APIs at scale. The key to this approach? Google's discovery documents. For those unfamiliar, I'd recommend reading my other article /articles/decoding-google for a deep dive, but here's a quick refresher: Discovery documents are essentially Google's equivalent of Swagger docs - machine-readable API specifications that list all available endpoints, parameters, and methods. While they're publicly documented for APIs like the YouTube Data API https://developers.google.com/youtube/v3 , they also exist for Google's internal APIs like the Internal People API . Some discovery docs are publicly accessible https://people-pa.googleapis.com/$discovery/rest , while most require valid API keys https://protos.googleapis.com/$discovery/rest . Here's an example from the YouTube Data API's discovery document: ... "liveChatModerators": { "methods": { "insert": { "flatPath": "youtube/v3/liveChat/moderators", "description": "Inserts a new resource into this collection.", "httpMethod": "POST", "parameters": { "part": { "description": "The part parameter serves two purposes in this operation. It identifies the properties that the write operation will set as well as the properties that the API response returns. Set the parameter value to snippet.", "repeated": true, "required": true, "location": "query", "type": "string" } ... collecting-api-keys Collecting API Keys To access most discovery documents, you need a valid API key. API keys are embedded in virtually every Google app and service, but crucially, an API key found in one service will often have multiple other APIs enabled for its Google Cloud Platform GCP project. This means that collecting as many keys as possible would give us access to numerous Google APIs. For the key collection part, my friend Michael https://michaeldalton.au and I teamed up. We took an exhaustive approach. We scraped over 60,000 Android APKs https://www.apkmirror.com/apk/google-inc/ every version of every Google app ever released , unpacked them, and grepped for API keys. bash user@siege:/mnt/data/apks$ ls -1 | wc -l 61200 We built a Chrome extension using the Chrome Debugger API https://developer.chrome.com/docs/extensions/reference/api/debugger to intercept network traffic, then systematically visited all known Google web domains 2.8k+ and used every web app feature possible to capture keys from live requests. We also decrypted every Google IPA we could obtain and analyzed any Google binaries we could find. https://en.uptodown.com/developer/google-llc To keep things in scope for Google VRP and remove non-Google API keys keys from third-party GCP projects , I used an interesting endpoint I found in the Cloud Marketplace API. First, we need the project number associated with the key's GCP project, which is revealed in the error message returned when using the key with a Google API it doesn't have enabled. For instance, fetching https://protos.googleapis.com/$discovery/rest?key=AIzaSyDWUi9T78xEO-m10evQANR7TMSiB bjyNc https://protos.googleapis.com/$discovery/rest?key=AIzaSyDWUi9T78xEO-m10evQANR7TMSiB bjyNc returns the error: Protos API has not been used in project 244648151629 before , revealing the project number. The Cloud Marketplace endpoint takes this project number and returns information about the project: GET /v1test/infoSharing/test/test/1044708746243 HTTP/2 Host: cloudmarketplace.clients6.google.com Cookie: