← Research
Research

Midnight Spike: Unmasking the mysterious crawler

How an unexpected crawler swarm made our database sweat, why classical rate limiting failed so spectacularly, and how a slightly painful week turned into an impromptu distributed systems lab experiment.

Key Takeaways
  • Over a seven-day window in September 2026, FlagThis recorded 657,728 HTTP requests, of which more than 71% (467,035 requests) originated from an automated scraping operation targeting the platform's enriched CVE and vendor risk database.
  • The scraper operated through an enterprise rotating residential proxy network spanning 253,111 unique consumer IP addresses across Lithuania, Brazil, Chile, Argentina, Pakistan, Vietnam, and the United States, averaging only 1 to 3 requests per IP address to bypass conventional reputation blocklists.
  • The 5 Architectural Layers & Forensic Deconstruction: A step-by-step investigation systematically unpeeled the operation: from 253,111 residential proxy masks (Layer 4), to 1,061 unproxied cloud compute VMs in Singapore (Layer 3), 50 corporate enterprise NAT gateways in Hangzhou (Layer 2), and an Oracle Cloud Singapore node potentially at the center of the crawl's coordination (Layer 1).
  • The crawler deployed a hardcoded, frozen browser identity (`Chrome/145.0.0.0`) alongside the newly released Zig-based headless browser `Lightpanda/1.0`. Forensic log analysis revealed 328 overlapping IP addresses between both user agents executing identical query syntax.
  • The Critical OpSec Egress Leak: While the adversary routed initial HTML navigation through residential proxies, a misconfiguration in their headless subresource pipeline caused 132,423 direct API calls to bypass the proxy gateway, exposing their core worker fleet: 1,061 cloud nodes in Alibaba Cloud Singapore (AS45102) across the 43.119.100.0/22 and 47.82.200.0/22 subnets.
  • By loading dynamic single-page application (SPA) views like `/cve/list`, the headless browser executed client-side JavaScript that automatically dispatched secondary API calls to `/api/cve/prioritized` and `/api/vendors/scorecards`, multiplying database read pressure by a factor of three.
  • Active counter-intelligence telemetry unmasked the scraper fleet with a 94.1% response rate across 996 injected sessions (recording 5,029 structured audit events), revealing 606 Alibaba Cloud Singapore worker nodes, 50 contiguous corporate NAT egress VIPs in 140.205.85.0/24 registered to Zhejiang Taobao Network / Alibaba Group Headquarters, and an automated verification sweep at 10:00 UTC immediately preceding a total campaign cessation.

1. The Saturday Morning Outage: When a Side Project Meets an Army of Bots

It didn't start with a high-tech corporate NOC alert. It started with a simple note early one Saturday morning letting me know that FlagThis was down, with the root cause completely unknown.

To set the stage: FlagThis is a passion side project. It doesn’t have enterprise budgets, a dedicated SRE team, or fancy 24/7 monitoring suites. It’s built to be lean, fast, and useful—normally humming along quietly and serving vulnerability research to security pros and developers without complaint.

So waking up early on a Saturday morning to an uncooperative server when you were planning on coffee and a quiet weekend? Definitely not fun.

Logging in, the box looked like someone had dropped an anvil on the gas pedal: - System Load Average: Climbed from a nominal 0.8 to a sustained 16.5–32.0, completely saturating CPU queues and disk I/O. - Circuit Breakers Screaming: Our in-memory concurrency circuit breaker tripped 58,000 times, desperately handing out HTTP 429 Too Many Requests to callers who clearly had no intention of slowing down. - Worker Starvation: Application worker processes were sweating bullets, periodically exhausting memory buffers and restarting under the onslaught. - Slow Query Saturation: Over 37,000 database operations timed out at the query threshold, stacking up like airplanes over JFK in a blizzard.

Our first thought was the usual side-project dread: Did a migration corrupt something? Did a runaway query lock the database? Or was someone running an aggressive volumetric DDoS just to be obnoxious?

A quick inspection of the web access logs ruled out a crash or a simple denial-of-service attack. Nobody was trying to knock the site offline. Instead, an army of automated scrapers was methodically, relentlessly siphoning our enriched vulnerability intelligence graph—and doing it through hundreds of thousands of rotating residential broadband connections across the globe.

Spending a Saturday morning digging through hundreds of thousands of mystery access logs was not on the weekend agenda. But once we got the origin stabilized and realized we weren't dealing with an existential outage, irritation gave way to engineer curiosity: if an unexpected swarm of robots was going to hijack our weekend and eat our bandwidth, the least we could do was turn it into an impromptu distributed systems lab experiment.

And learn we did. This writeup shares how it happened, how we unmasked their infrastructure step by step, and what we learned along the way—in case an unexpected crawler army ever decides to interrupt your Saturday morning, too.


2. The Evidence Locker: Parsing 650,000 Requests

Before trying to solve a puzzle, you have to measure the pieces. We pulled access logs across a rolling seven-day window (September 7–13, 2026). Out of 657,728 total HTTP requests, real humans, search engines, and background internet noise accounted for less than a third. The remaining 71% was our uninvited automated guest.

Traffic Distribution Across the 7-Day Window

Traffic Category 7-Day Request Volume Share of Traffic Unique IP Addresses Primary Signatures & Behaviors
The CVE Database Siphon (Swarm) 467,035 71.0% 253,111 (Proxy) + 1,061 (Alibaba Cloud) Spoofed Chrome/145.0.0.0 (283.8k) and Lightpanda/1.0 (183.2k); exhaustive combinatorial database querying
Human Browsing & Internal Pipelines 129,194 19.6% ~4,800 Interactive web users, security analysts, and editorial pipeline validation
Legitimate Crawlers & Search 37,632 5.7% 1,200+ Verified IP ranges for Amazonbot, AhrefsBot, SemrushBot, Bingbot, PetalBot
Background Internet Probes & Scanners 23,867 3.6% 62 Commodity scanners and opportunistic background probe traffic

Looking back through the historical logs, the crawler had actually been simmering in the background since earlier in the week without causing a fatal crash. But early on Saturday morning, September 12, it ramped up into an outright blizzard: over 93,000 scraping requests in a single 24-hour cycle, pushing total server traffic to a peak of 135,006 requests. That is when the database thread pool finally choked, circuit breakers tripped, and the server was knocked offline.

Date         | Chrome/145 (Scraper) | Lightpanda (Scraper) | Legitimate & Baseline Traffic | Total Requests
---------------------------------------------------------------------------------------------------------
07/Sep/2026  |               31,884 |                5,934 |                        22,909 |         60,727
08/Sep/2026  |               32,155 |               42,803 |                        31,216 |        106,174
09/Sep/2026  |               45,027 |               24,936 |                        27,219 |         97,182
10/Sep/2026  |               45,111 |               27,479 |                        23,790 |         96,380
11/Sep/2026  |               45,373 |               30,091 |                        34,699 |        110,163
12/Sep/2026 (Sat) |           60,134 |               33,707 |                        41,165 |        135,006 (Outage)
13/Sep/2026  |               24,174 |               18,227 |                         9,697 |         52,098

3. Peeling Layer 4: The 253,000-IP Residential Disguise & The Defensive Gauntlet

When your server starts gasping for air, your first instinct as a web defender is simple: tighten the rate limits and let the edge firewall take out the trash.

Against this crawler, however, that instinct ran headfirst into a brick wall.

The Failure of Conventional Rate Limiting (The Net vs. Mist)

In standard web operations, rate limiting is your trusty Swiss Army knife. You set a sliding window—say, 60 requests per minute per IP—and any caller hammering your endpoints gets hit with an HTTP 429.

Against this fleet, that logic was completely useless: - 253,111 unique IP addresses appeared across our seven-day logs. - 92% churn rate: More than 92% of these addresses made 1 to 3 requests and then vanished forever. - The IPs belonged to consumer broadband connections in Lithuania, Brazil, Chile, Argentina, Pakistan, Vietnam, and the US.

Trying to rate-limit this swarm by IP address was like trying to stop a swarm of bees by asking each bee individually for two forms of ID. A residential node in Vilnius would buzz in, make one search request, and disconnect. Two seconds later, its digital cousin in São Paulo would ask for the next page. Per-IP counters sat peacefully at zero or one, while 80,000 queries a day pounded the database.

Layer 4 was an effective optical illusion: an industrial cloud scraping operation masquerading as a quarter-million humans casually surfing security advisories from their living rooms.

The Multi-Layer Caching Battle (And The Combinatorial Storm)

If you can't block the IPs, the next logical move is caching. If we can serve identical queries straight out of fast in-memory storage, the database doesn't have to break a sweat.

We deployed multiple caching layers: 1. Edge Static Caching: Keeping HTML templates, JavaScript bundles, and common static assets hot in memory. 2. In-Memory Query Response Caching: Storing pre-computed JSON responses for analytical endpoints (/api/cve/stats, /api/vendors/scorecards). 3. Query Parameter Normalization: The crawler liked to shuffle query parameters (e.g. q=product:X cna:Y vs q=cna:Y product:X). We introduced normalization middleware to sort and canonicalize parameter keys so identical queries would hit the same cache bucket.

Usually, caching makes you feel like an engineering wizard. But this scraper had apparently read the caching playbook and decided to play the ultimate counter-strategy: exhaustive combinatorial brute-force extraction.

Instead of querying popular vulnerabilities that real users look up (like Log4j or OpenSSL), the crawler was methodically iterating through the Cartesian product of: - ~380 official CVE Numbering Authorities (CNAs) - Paired with hundreds of thousands of enterprise software products - Appended with period:all

Because it was systematically generating every possible combination—most of which had never been queried by human eyes before—almost every single request was a brand-new cache miss. The requests blew right past our in-memory cache layer and crashed directly into the database query planner.

Emergency Stabilization Across the Days

With rate limiters blind and caching punctured by combinatorial permutations, we had to get creative to keep the service responsive for real users:

  1. Edge Runtime Filtering: As we'll see next, the bots leaked their user agents. Dropping raw Lightpanda requests at the web server edge stopped thousands of calls before they could allocate application worker memory.
  2. Concurrency Circuit Breakers: We put dynamic circuit breakers in middleware. When database query queues crossed a danger watermark, the system shed load by fast-failing unauthenticated analytical routes with HTTP 429. It wasn't elegant, but tripping 58,000 times over the week acted like a surge protector, keeping the platform up for human users.
  3. Statement Execution Timeouts: Unbounded regular-expression queries were causing worker processes to pile up. Enforcing hard database statement timeouts ensured that runaway queries were cut off cleanly rather than locking threads indefinitely.
  4. Mandatory Index Floors: The crawler's favorite trick was period:all, which stripped any indexed date filters and forced the database to perform full-table scans across 360,000 CVE records. We updated our query generator to enforce a mandatory historical date floor (WHERE date_published >= '1999-01-01'), forcing the query engine to use B-tree indexes rather than disk-heavy sequential scans.

The Pivot: From Passive Defense to Active Discovery

These emergency patches did their job: load averages dropped from 32 down to normal, and the database stopped hyperventilating.

Still, we were absorbing tens of thousands of automated requests every day. Passive defense was like continuously baling water out of a boat without looking for the leak. We realized we needed to know who was behind this machine, how it was wired, and where the data was flowing.

It was time to take a closer look at the crawler itself.


4. The Scraper Runtimes: Lightpanda & The Frozen Chrome Fingerprint

If the IP addresses were rotating every two seconds, what kind of software was driving them? The HTTP request headers gave us our first big clue:

Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/145.0.0.0 Safari/537.36
Lightpanda/1.0
  1. Spoofed Chrome/145.0.0.0 (283,828 requests): The crawler used a hardcoded, frozen major-version string. While Chrome 145 was released to the stable channel earlier in the year (February 2026), by September 2026 production Chrome had already progressed to version 154 under Google's accelerated release cadence. Bot frameworks frequently hardcode a major version string with trailing zeros (.0.0.0) following Chromium's User-Agent reduction specifications—leaving behind a static fingerprint that never updates as real user browsers move forward.
  2. Raw Lightpanda/1.0 (183,207 requests): What is Lightpanda? Released in late 2024, Lightpanda is an open-source headless browser written from scratch in Zig. Unlike Chromium or WebKit, Lightpanda was purpose-built for AI agents and web automation, claiming up to 9x faster execution and 16x lower memory usage than headless Chrome.

As systems nerds, we genuinely appreciate the engineering behind a Zig-based headless browser. It's fast, modern, and lean. It is, however, slightly less endearing when hundreds of instances descend on your search index without leaving a note.

The operators also made a classic operational slip: Lightpanda/1.0 is the default User-Agent emitted by the stock binary. After realizing that announcing "I am Lightpanda" might raise eyebrows, they reconfigured half the fleet to spoof Chrome/145.0.0.0 while continuing to run the exact same queries. In our access logs, 328 overlapping residential IPs alternated between both user agents while running identical query syntax.


5. Peeling Layer 3: The Smoking Gun — The Half-Tunnel Egress Blunder

The adversary spent serious money renting a quarter-million residential proxy endpoints to stay anonymous. But in distributed systems, complexity breeds failure modes—and they handed us their identity on a silver platter with a classic half-tunnel egress leak.

When analyzing correlated request chains, an unmistakable pattern emerged between initial page navigations and subsequent background API calls:

  1. Initial HTML Navigation via Residential Proxy: apache # Client IP: 45.125.5.71 (Residential Node, India/Vietnam) target.com:443 45.125.5.71 - - [13/Sep/2026:10:59:32 -0700] "GET /cve/analysis?q=cna:PaperCut%20period:all%20product:enterprise_linux_tus HTTP/1.1" 200 ... "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/145.0.0.0 Safari/537.36"

  2. Cascading API Fetch via Direct Cloud Egress (2 Seconds Later): apache # Client IP: 43.119.104.172 (Alibaba Cloud Singapore, AS45102) target.com:443 43.119.104.172 - - [13/Sep/2026:10:59:34 -0700] "GET /api/cve/stats?q=cna%3APaperCut+period%3Aall+product%3Aenterprise_linux_tus&bucket=rolling30 HTTP/1.1" 200 ... "https://target.com/cve/analysis?q=cna%3APaperCut+period%3Aall+product%3Aenterprise_linux_tus" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/145.0.0.0 Safari/537.36" (Note: In standard web access logging, the client IP is captured directly from the remote connection socket, while the request URL, referer, and user-agent are parsed from the HTTP stream.)

How the Leak Happened

In headless browser automation (Puppeteer, Playwright, or Lightpanda), developers often configure proxy settings on the top-level browser launch arguments (e.g. --proxy-server="http://..."). That routes the initial page request through the proxy.

However, to save proxy bandwidth costs, extraction scripts frequently intercept network requests, or spawn background asynchronous fetch() calls to grab the raw JSON data. But unless specifically routed through the proxy context, asynchronous subresource requests bypass the proxy and egress over the host's default network gateway.

It was the digital equivalent of a burglar putting on a ski mask to enter the front door, and then taking it off to smile at the security camera in the hallway.

132,000 Unmasked Requests from Singapore

Filtering our logs for the scraper's exact fingerprint unmasked Layer 3: an entire dedicated cloud compute cluster: - 132,423 direct API requests bypassed the proxy entirely. - 1,061 distinct worker IP addresses in Alibaba Cloud Singapore (AS45102) across 43.119.100.0/22 and 47.82.200.0/22. - The direct requests targeted high-density data routes: /api/vendors/scorecards (42k hits), /api/cve/prioritized (36k hits), and /api/cve/stats (22k hits).

The mysterious, untouchable consumer botnet had a physical home: over a thousand cloud VMs in Singapore.


[!WARNING]

A Note on Technique, Ethics & Legality

We're sharing our journey and technical methodology in the spirit of engineering curiosity, open research, and helping fellow builders understand how modern scraping swarms operate under the hood.

That said: actively probing client-side runtimes, triggering WebRTC STUN reflexive candidate gathering, and deploying radioactive canary tokens touches on nuanced, potentially legally questionable territory depending on your jurisdiction, terms of service, and applicable computer misuse statutes. Everyone should do their own legal, ethical, and operational evaluation before trying these stunts in their own production infrastructure.


6. The Counter-Intelligence Campaign: Turning the Scraper Against Itself

At this point, we realized we had a unique opportunity.

Because modern web applications use client-side JavaScript to render data grids and fetch dynamic stats, scrapers can't just parse raw HTML strings with regular expressions anymore. They have to run full browser rendering engines. And if an adversary is running your JavaScript inside their browser, they have effectively given you guest execution privileges inside their worker containers.

Instead of just blocking requests, we decided to turn their automated execution environment into an observation post. Over an active surveillance window in September 2026, we deployed a targeted counter-intelligence instrumentation pipeline, collecting 5,029 structured audit records across 996 canary sessions.

Empirical Counter-Intelligence Telemetry Summary

Here is the complete forensic ledger of what we measured, how we captured it, and what it revealed:

Telemetry Metric & Sensor Mechanism Recorded Value How We Did It (Method & Instrumentation) Forensic Discovery & Operational Significance
Total Structured Audit Records 5,029 Logged via structured JSON event emitters on counter-intel endpoints recording client socket IPs, TCP/UDP headers, session tokens, and probe payloads into an immutable audit table. Provides end-to-end forensic provenance and statistical auditability across all 4 tactical phases of the operation.
Total Injected Target Sessions 996 Application middleware sampled inbound requests matching scraper parameter patterns at 25%, enforced a 10s global cooldown, and appended a non-blocking script tag to the HTML footer. Targeted exclusively the automated crawler fleet without instrumenting or degrading response performance for legitimate human visitors.
De-Anonymized Responded Sessions 937 (94.1% execution rate) The injected client-side script executed asynchronously on DOMContentLoaded, transmitting hardware and network telemetry back to origin via background fetch(). Proved the scraper was not a simple HTTP parser (like curl or requests), but a full JavaScript-enabled browser engine running Headless Chrome and Lightpanda.
Unique Ingress Residential Proxies 996 Captured directly at the web server connection layer (%h socket token) when delivering initial HTML pages to the crawler. Confirmed 100% rotation rate on initial page ingress (zero IP reuse on first-hop fetches) across planetary residential proxy networks.
Direct Worker Callback Nodes 1,527 Extracted from incoming TCP connection socket IPs when client-side JavaScript sent asynchronous telemetry reports that bypassed the proxy gateway. Unmasked the underlying cloud worker fleet, discovering 606 nodes in Alibaba Cloud Singapore (AS45102) across 43.119.100.0/22, 43.119.104.0/22, and 47.82.200.0/22.
WebRTC Leaked NAT Egress VIPs 50 contiguous VIPs (140.205.85.150) Injected script instantiated an RTCPeerConnection pointed at a public STUN server. Raw UDP binding queries bypassed HTTP proxy tunnels and harvested reflexive ICE candidates (typ srflx). Authoritative APNIC routing records resolved the block to Zhejiang Taobao Network Co., Ltd. / Alibaba Group Headquarters in Hangzhou, exposing corporate gateway infrastructure.
Container Host GUIDs Discovered 843 Harvested from WebRTC host candidates (typ host), where modern Chromium obfuscates private LAN IPs using unique mDNS UUIDs (e.g. [uuid].local). Demonstrated that workers were ephemeral containerized browser instances running across a massive multi-tenant orchestration cluster.
Hardware Fingerprints Intercepted 929 Queried runtime browser APIs: navigator.hardwareConcurrency, WebGL unmasked renderer strings, Intl system timezone, and screen geometry. Revealed high-capacity bare-metal nodes (134–192 vCPUs), Google SwiftShader CPU software rasterizers (no GPU), hardcoded 1366x1366 viewports, and Asia/Shanghai system clocks.
Synthetic Honeypot Traps Followed 902 Dynamically injected fake, tokenized vulnerability advisory URLs (/cve/advisory/CANARY-ALIBABA-SG-{token}) into search results served to scrapers. Proved the crawler parsed the DOM and crawled all discovered links without verifying their existence in canonical vulnerability registries.
Task Queue Turnaround Latency 148.8s (Median) / 34.4s (Min) Measured elapsed time between the delivery of a tokenized canary URL to Proxy A and the subsequent HTTP request for that URL by Proxy B (t_fetch - t_inject). Provided mathematical proof of an asynchronous task queue: workers push discovered links into a central broker, which batches and dispatches jobs ~2.5 minutes later.
Proxy Divergence Rate 100.0% (896 of 896 pairs) Cross-referenced the client IP that received the canary HTML against the client IP that subsequently requested the canary URL. 100% divergence: Proxy A never fetched its own discovered link. Every link was popped by an entirely different Proxy B, proving a centralized worker dispatcher.
Downstream Barium Meal Traps 5 hits Planted CVE-2026-77331 (a synthetic ghost record with honeytokens, verification badge, and JSON export) in search results to track downstream ingestion. 3 requests hit the detail page and 2 requests retrieved /api/cve/export/CVE-2026-77331.json, proving automated pipeline ingestion and schema validation.
Crawler Registration Probes 1 submission (at 10:00:45 UTC) Exposed a voluntary crawler registration endpoint (/api/canary/register) advertised on the canary page and in robots.txt. Captured automated form traversal from 168.107.78.39 (Oracle Cloud SG). The fact that global crawler traffic ceased immediately after this node fetched the canary token and hit the registration endpoint suggests it was potentially at the center of the crawl's coordination.

7. Peeling Layer 2: De-Anonymizing the Corporate Core via WebRTC STUN

Unmasking 1,061 cloud VMs in Singapore was exciting, but cloud VMs can be rented by anyone with an email address and a credit card. Who was actually pulling the strings?

To find out, we took advantage of a classic web protocol quirk: WebRTC is notoriously chatty.

The WebRTC UDP Egress Trick

Standard web proxies specified with --proxy-server only tunnel TCP traffic (HTTP and HTTPS). They do not tunnel UDP packets.

When a browser wants to establish a WebRTC media connection, it uses the Interactive Connectivity Establishment (ICE) protocol. To figure out where it sits on the public internet, it creates raw UDP sockets and sends Session Traversal Utilities for NAT (STUN) binding requests to an external STUN server (like Google's public stun:stun.l.google.com:19302).

When our injected script executed in the scraper's browser, it spun up an ephemeral RTCPeerConnection:

const pc = new RTCPeerConnection({
  iceServers: [{ urls: 'stun:stun.l.google.com:19302' }]
});
pc.createDataChannel('telemetry');
pc.onicecandidate = (event) => {
  if (event.candidate) {
    // Send reflexive candidate back to origin
    fetch('/api/telemetry/candidate', {
      method: 'POST',
      body: JSON.stringify({ candidate: event.candidate.candidate })
    });
  }
};
pc.createOffer().then(offer => pc.setLocalDescription(offer));

While the scraper's HTTP proxy was faithfully guarding the front door, WebRTC hopped out the UDP window to ask Google for directions. And Google politely reflected back the public NAT IP address of the worker:

candidate:842163049 1 udp 1686052607 140.205.85.12 58312 typ srflx raddr 10.0.4.18 rport 58312

In 94.1% of injected sessions, the headless browser resolved reflexive ICE candidates (typ srflx), leaking 50 distinct contiguous public IP addresses:

140.205.85.1   140.205.85.2   140.205.85.3   140.205.85.4   140.205.85.5
140.205.85.6   140.205.85.7   140.205.85.8   140.205.85.9   140.205.85.10
... [50 contiguous IPs spanning 140.205.85.1 through 140.205.85.50]

Authoritative APNIC and CNNIC routing records assign this block directly to Zhejiang Taobao Network Co., Ltd. / Alibaba Group Headquarters (AS37963 / AS24429, Hangzhou, China).

Layer 2 was unmasked: while the compute workers lived on cloud VMs in Singapore, their corporate network gateway and enterprise NAT infrastructure terminated squarely inside Alibaba's headquarters in Hangzhou.

Snooping on the Hypervisors

Our client-side probes also collected runtime hardware fingerprints: - Massive Multi-Core Compute Nodes: The reported hardware concurrency (navigator.hardwareConcurrency) revealed monster bare-metal or large virtual hypervisors ranging from 134 to 192 vCPUs, with 192 cores representing the dominant configuration (241 workers). We don't even have 192 cores on our production development servers; running our tiny 2KB probe script on their massive hypervisors felt like borrowing a freight train to deliver a postcard. - Software WebGL Rendering: 100% of workers reported Google SwiftShader Vulkan rasterizers (Device 0x0000C0DE). No physical GPUs—just pure CPU brute force emulating graphics. - Fixed Square Viewport: Every worker rendered a peculiar 1366x1366 square viewport, an artifact of hardcoded command-line geometry flags. - System Timezone: 100% of workers operated with system timezones set to Asia/Shanghai (GMT+8), despite claiming to be a Mac desktop in California. - Ephemeral Container mDNS GUIDs: The WebRTC host candidates reported 843 unique .local mDNS UUIDs (e.g. ac427de9-11a2-4443-8417-b5b2dbaebbc4.local), proving that the scrapers were ephemeral container instances spun up on demand.


8. Peeling Layer 1 (Part A): Synthetic Advisories & Mathematical Proof of the Task Queue

We now knew the worker fleet and the corporate gateway. But was this a disorganized horde of a thousand independent scripts scraping whatever they found, or a coordinated industrial pipeline?

To find out, we tested how the crawler processed links.

The Canary Breadcrumbs

Bots are voracious DOM vacuums: if you put an <a href> on a page, they will almost certainly crawl it.

We started dynamically injecting fake, tokenized vulnerability advisories into search result pages served to scrapers:

<a href="/cve/advisory/CANARY-ALIBABA-SG-cnry_81928f141e48">
  Advisory: Vulnerability in Enterprise Linux Stack
</a>

Each token was cryptographically unique and recorded: - t_injected: Exact millisecond when the page was served. - IP_ingress: The residential proxy IP that received the link.

The Mathematical Proof

When the crawler followed these synthetic links, we logged t_fetched and IP_fetcher. The results were striking:

  1. 100% Proxy Divergence Rate (896 of 896 pairs): Across all 896 honeypot traversals, the proxy IP that fetched the advisory was never the same proxy that discovered it. Proxy A in Vilnius would discover the link, and 2.5 minutes later, Proxy B in Buenos Aires would show up asking for it.
  2. Queue Latency Distribution: The time between injection and fetch (delta_t = t_fetched - t_injected) followed a clean operational curve: - Minimum Latency: 34.4 seconds - Median Latency: 148.8 seconds (~2.5 minutes) - Average Latency: 659.5 seconds (~10.9 minutes)

This proved the architecture: Worker 1 renders the HTML through a residential proxy, extracts every link from the DOM, and pushes them into an asynchronous task queue. Approximately 2.5 minutes later, Worker 2 pops the pending job and dispatches a fresh browser instance through a newly allocated residential exit node to harvest the page.


9. Peeling Layer 1 (Part B): The Barium Meal (CVE-2026-77331) & The 10:00 UTC Shutdown

We had mapped the pipeline. But how do you bring a quarter-million-node crawler to a complete stop without playing endless defense?

You give it something it can't resist.

The Barium Meal

In counter-intelligence, a "barium meal" is a tagged piece of synthetic data fed to an adversary to trace where it goes and who handles it.

We minted a persistent, searchable, synthetic vulnerability record: - Identifier: CVE-2026-77331 (CrawlDaddy AutoSiphon 9000 Enterprise Swarm Coordinator: Recursive Ingestion & Existential Overflow in Task Dispatcher) - CVSS Score: 9.8 CRITICAL - Immutable Provenance Token: FLAGTHIS-BARIUM-MEAL-77331-ALIBABA-FLEET-VERIFIED - Machine-Readable Schema: Exportable via standard CSAF/CVE-JSON format.

If you're going to invent a fake vulnerability, you might as well have a little fun with the name.

FlagThis hosts hundreds of thousands of real CVEs with critical CVSS scores. To a crawler, those are just historical records. CVE-2026-77331 was fundamentally different: 1. Zero Prior Existence: It did not exist in NVD, MITRE, or anywhere else on the public internet. It was an isolated, ephemeral route. 2. Directly Ingested by the Swarm: At 00:32 UTC, we slipped the link <a href="/cve/CVE-2026-77331"> into search results served to a Brazilian residential proxy. Seeing an unknown CVE, the crawler pushed it straight into its ingestion queue. 3. Embedded Canary Traps: The page contained a tracking badge (/api/canary/asset?mechanism=asset_honeypot), a structured JSON export, and a voluntary registration route (/api/canary/register).

The 10:00 UTC Sweep: A Direct Hit and the Extraction Cliff

We should be careful not to jump to conclusions or sound overconfident about attribution here. Without direct internal visibility into the adversary's network or private process table, we cannot definitively prove who sat behind this machine, nor whether it was the lone master controller, an automated quality assurance auditor, or a centralized pipeline supervisor.

However, the behavioral correlation is hard to ignore: the fact that global crawler traffic abruptly flatlined within sixty seconds after this specific IP fetched the canary token and completed the registration flow strongly suggests it was potentially sitting right at the center of the entire crawl's coordination.

Here is what happened during that critical 59-second window starting at 10:00:26 UTC on September 14:

  1. The Direct Unproxied Sweep: A single node hosted in Oracle Cloud Singapore (168.107.78.39, AS31898) bypassed all residential proxies and hit FlagThis directly.
  2. The Verification Sequence: - In 302 rapid requests over 59 seconds, it scanned sensitive configuration paths (/.env, /.git) and retrieved our API schema (/openapi.json). - At 10:00:45 UTC, it specifically retrieved CVE-2026-77331, fetched its verification image badge, downloaded its JSON export, and pinged the voluntary registration endpoint. - Whether operating as the master crawler orchestrator or an automated validation tool attached to their ingestion queue, the system clearly verified the poisoned canary record.
  3. The Global Kill Switch: - At 10:01:13 UTC, origin defense filters blacklisted 168.107.78.39. - Within 60 seconds, scraping requests across all 250,000 residential nodes plummeted from ~400 events/hour to absolute zero. - The entire planetary crawl went completely dark. Because the operation relied on a centralized task queue rather than independent scrapers, hitting the brakes at this coordination node immediately drained all worker dispatches worldwide.

10. The Grand Reveal: The 5-Layer Funnel Architecture

With every layer forensicly unmasked, the entire operation can finally be seen for what it was: a massive five-tier funnel spanning an extraordinary scale disparity.

The diagram below maps the complete architecture, showing how 250,000 consumer endpoints were driven by a thousand cloud VMs, corporate gateways, and a central coordination apex:

Unmasking the Swarm: 5 Architectural Layers & Their Relative Scales

The 5 Layers & Their Disproportionate Scales

  1. Layer 1: Potential Adversary Command & Orchestration Plane (Scale: ~1 Potential Apex Node) - Central Infrastructure: Host 168.107.78.39 (Oracle Cloud Infrastructure, AS31898, Singapore). Potentially central to the crawl's coordination or verification tooling. While external observers cannot assert definitive human attribution, the immediate global shutdown following its canary fetch and registration submission makes it the primary candidate for the operation's apex. - Leak 3: Executed direct unproxied audit sweep at 10:00 UTC, retrieved the synthetic canary and registration endpoint, immediately followed by the permanent cessation of the global crawl.
  2. Layer 2: Corporate Enterprise NAT Gateway Pool (Scale: 50 NAT VIPs) - Infrastructure: Public pool 140.205.85.1 through 140.205.85.50 registered to Zhejiang Taobao Network Co., Ltd. / Alibaba Group Headquarters (AS37963 / AS24429, Hangzhou, China). - Leak 2: Exposed when WebRTC STUN UDP media probes bypassed HTTP proxy tunnels.
  3. Layer 3: Dedicated Cloud Compute Worker Fleet (Scale: 1,061 Dedicated Cloud VMs) - Infrastructure: 1,061 distinct virtual machines in Alibaba Cloud Singapore (AS45102) across 43.119.100.0/22 and 47.82.200.0/22. - Engines: Headless Chrome and Zig-based Lightpanda running on 134–192 vCPU bare-metal nodes with Asia/Shanghai system timezones. - Leak 1: 132,423 subresource API queries executed directly from cloud VMs, completely bypassing residential proxies.
  4. Layer 4: Rented Residential Proxy Disguise Mask (Scale: 253,111 Consumer Endpoints) - Infrastructure: Planetary network of consumer broadband IPs rotating every 1–3 requests across 100+ countries, masking top-level HTML navigation.
  5. Layer 5: Target & Defender Origin (Scale: 1 Single-Node Host) - Infrastructure: FlagThis web and API origin server hosting the enriched vulnerability intelligence graph (361,000 CVE records) and the active counter-intelligence telemetry traps.

The Complete Operational Timeline Ledger

The following chronological ledger details the key operational milestones, forensic interceptions, and infrastructure discoveries recorded across the 5,029-event telemetry ledger:

Timestamp (UTC) Event Classification Involved Endpoints & Infrastructure Forensic Discovery & Significance
2026-09-13 19:35:43 Initial Canary Injection Target IP: 91.235.226.218 (Residential / LT)
Path: /cve/CVE-2013-1004
Token: cnry_c64b197250a5
First canary-instrumented HTML payload delivered to an active scraper session.
2026-09-13 19:35:44 WebRTC STUN Leak (First C2) Callback IP: 47.82.201.158 (Alibaba Cloud SG)
Candidate: ac427de9-11a2-4443-8417-b5b2dbaebbc4.local
NAT VIP: 140.205.85.1
The First OpSec Leak: WebRTC STUN UDP query bypasses HTTP proxy tunnel in 1.28 seconds, leaking the worker node in Singapore and the Taobao Hangzhou NAT gateway.
2026-09-13 19:35:45 Runtime Hardware Profile Callback IP: 47.82.201.158 (Alibaba Cloud SG) Fingerprint reveals 192 vCPU core hypervisor, Google SwiftShader Vulkan rasterizer, and Asia/Shanghai container timezone.
2026-09-13 20:11:36 First Honeypot Trap Followed Ingress Proxy: 91.235.226.218
Fetching Proxy: 186.235.198.16 (Argentina)
Advisory: CANARY-ALIBABA-SG-cnry_81928f141e48
Dispatcher Confirmed: Proxy B requests synthetic canary advisory injected into Proxy A, confirming DOM link extraction into a shared queue.
2026-09-13 20:45:00 Telemetry Throttle Hardened Production Configuration Sampling adjusted to 25%, global cooldown set to 10s, and strict 1-injection cap per IP to maximize unique proxy coverage.
2026-09-14 00:28:04 Barium Meal CVE Deployed Production Origin Synthetic record CVE-2026-77331 and JSON export schema deployed to track downstream data consumption.
2026-09-14 00:32:34 First Barium Meal Traversal Ingress Proxy: 177.222.114.78 (Brazil)
Target: /cve/CVE-2026-77331
Adversary crawler traverses synthetic CVE-2026-77331 detail view; provenance token ingested into scraper cache.
2026-09-14 00:38:33 Synthetic Exploit Trap Hit Ingress Proxy: 103.73.107.26 (Pakistan)
Target: /cve/advisory/CANARY-ALIBABA-SG-barium_meal_77331
Scraper follows nested exploit verification trap link embedded within the Barium Meal advisory page.
2026-09-14 04:00–05:00 Campaign Peak Throughput 99 Injections / 319 Callbacks / 92 Traps
Cluster: 43.119.100.0/22, 47.82.200.0/22
Peak Ingestion Window: 510 telemetry events recorded in a single hour. WebRTC STUN leaks confirm all 50 contiguous VIPs in 140.205.85.1140.205.85.50.
2026-09-14 09:24–09:47 Extraction Deceleration Injections: 31/hr (down from 64/hr)
Target Pages: /cve/list, /cve/vendors
Extraction pace slows significantly across residential endpoints as the scraper reaches the tail of its target CVE list.
2026-09-14 10:00:44.906 Telemetry Ping from SG Cloud Callback IP: 168.107.78.39 (Oracle Cloud SG)
User-Agent: Chrome/126.0.0.0 (Windows NT 10.0)
Single automated audit agent directly accesses telemetry verification endpoint without proxying.
2026-09-14 10:00:45.230 Barium Meal Direct Inspection Origin IP: 168.107.78.39 (Singapore)
Path: /cve/CVE-2026-77331
Direct node specifically retrieves synthetic CVE-2026-77331 (324 ms after initial telemetry ping).
2026-09-14 10:00:45.298 Asset Badge Honeypot Trigger Origin IP: 168.107.78.39 (Singapore)
Path: /api/canary/asset?mechanism=asset_honeypot
Node requests mandatory verification badge image (68 ms after fetching the CVE detail page).
2026-09-14 10:00:45.873 Machine-Readable JSON Export Origin IP: 168.107.78.39 (Singapore)
Path: /api/cve/export/CVE-2026-77331.json
Node validates structured vulnerability JSON schema (575 ms later).
2026-09-14 10:00:45.963 Crawler Registration Sweep Origin IP: 168.107.78.39 (Singapore)
Path: /api/canary/register
Payload: Empty / Unspecified
Node submits empty declaration to the voluntary registration endpoint (90 ms later), completing a 1.05-second automated inspection sequence.
2026-09-14 10:01:00 The Extraction Cliff Global Traffic / All Scraper Routes Total Campaign Cessation: Inbound scraping requests drop instantaneously from ~400 events/hour to zero across all virtual hosts.
2026-09-14 10:00–18:00 Post-Cliff Quiescence Injections: 0–4/hr
Residual Callbacks: 0–1/hr
Swarm remains dormant; zero mass extraction activity observed.
2026-09-15 01:25:48 Final Residual Callback Target IP: 57.141.2.29
Token: cnry_3e6bdcec019c
Single isolated residual probe; campaign telemetry confirms permanent disengagement of the primary crawler fleet.

11. Lessons for Web Defenders: Surviving the Modern Bot Era

The convergence of rotating residential proxies, headless browser runtimes, and massive cloud compute clusters represents a fundamental shift in automated web operations. If you run a data-rich web platform, here are our key takeaways from the trenches:

1. IP-Based Rate Limiting Is Dead

Counting requests per IP address is a relic of a simpler time. When bots can churn through 250,000 residential consumer IPs for a few hundred dollars, per-IP accounting will never save you. You must augment your defense with: - Query Shape Fingerprinting: Tracking combinatorial query permutations (q=cna:X product:Y) across the entire origin, regardless of the incoming IP. - TLS & Protocol Fingerprinting: Inspecting JA3/JA4 signatures, HTTP/2 settings frames, and header ordering, which often reveal automated runtimes before the first byte of payload is parsed.

2. Database Defenses: Never Trust period:all

When building search APIs, never let a caller trick your database planner into a full-table scan. - Enforce Index Floors: Always inject a mandatory date boundary (e.g. WHERE date_published >= '1999-01-01') into analytical queries so database engines utilize existing B-tree indexes. - Statement Timeouts: Cap analytical queries with strict execution limits. Terminating a runaway query with an HTTP 503 is infinitely better than letting worker threads starve legitimate users.

3. Asymmetric JavaScript Advantage

When scrapers run full browser engines, defenders have the upper hand. Client-side execution allows defenders to deploy passive probes, out-of-band canary assets, and WebRTC STUN candidate gathering. Because headless browser configurations frequently isolate HTTP proxying from raw UDP sockets, WebRTC queries will routinely bypass proxy tunnels and expose true cloud egress nodes.

4. Drop Rogue Runtimes at the Edge

Don't let scrapers consume application worker memory. Adding simple request-filtering directives at the web server edge drops unconfigured headless binaries before they can trigger expensive backend allocations:

BrowserMatchNoCase "Lightpanda" bad_bot
<Location "/">
    <RequireAll>
        Require all granted
        Require not env bad_bot
    </RequireAll>
</Location>

12. Conclusion: The New Scraper Reality

What started as an unwelcome note on a Saturday morning about an unexplained outage on a side project turned into the best hands-on distributed systems masterclass we could have asked for.

Modern data extraction is no longer a student running curl in a loop from a laptop. It is an industrial, multi-tier operation that bridges residential consumer networks with massive cloud hypervisors and corporate enterprise gateways.

Yet, as complex as these automated systems are, complexity is also their Achilles' heel. A single half-tunnel proxy oversight and an unhandled WebRTC UDP socket unmasked an entire cloud worker fleet in Singapore and corporate NAT gateways in Hangzhou that were hiding behind ordinary broadband subscribers across the globe.

We survived the week, tuned our database, learned a tremendous amount about modern scraper engineering, and had a little fun turning an unwanted visitor into our own private honeypot. If you're building on the web today, treat your traffic not just as load to be weathered, but as a system to be understood.


Sources & References

  1. Lightpanda Browser: Official open-source repository and benchmark documentation. Lightpanda GitHub Repository.
  2. CVE Numbering Authorities (CNAs): The official global partner directory and registry. CVE Program List of Partners.
  3. OWASP Automated Threat Handbook: Web application threat taxonomy for scraping and data siphoning (OAT-011 Scraping, OAT-018 Footprinting). OWASP Automated Threats Project.
  4. CISA Known Exploited Vulnerabilities: U.S. Cybersecurity and Infrastructure Security Agency. CISA KEV Catalog.
  5. EPSS (Exploit Prediction Scoring System): Forum of Incident Response and Security Teams. FIRST EPSS Documentation.
  6. Amazonbot Verification: Official crawler identity and IP verification guidelines. Amazonbot Documentation.
Keep tracking this

This is a living document — it updates as the numbers move. Get the revisions, plus the daily CVE brief, in your inbox.

Revision History
This page is a living document — every update is logged here.
2026-09-14
Initial publication: Empirical forensic deconstruction of the 250,000-IP crawler swarm, progressive 5-layer architecture, active counter-intelligence telemetry, and defensive mitigations.
🤖 AI-assisted initial publication
About This Page
Research posts are living documents, periodically revisited as new CVEs, threat-actor intelligence, and FlagThis coverage emerges. Last reviewed 2026-09-14.

LINK COPIED TO CLIPBOARD