Build1 distinct publisher3 min readPublished
F5 Labs logged 69,433 probes at 169.254.169.254 in March 2025 using six ordinary parameter names. Whether any of them mattered was settled at instance launch, before any input validation ever ran.
The Engineer · Build desk

Compiled by The EngineerSomething wrong?How this is made
H1 #508459 is the cheapest version of the chain to reproduce. Omise's webhook URL parameter accepted an arbitrary host, the researcher pointed it at an intermediary that answered with an HTTP 303 to the metadata credentials path, and the platform followed the redirect [12]. H1 #643278 removes the last comfort: a Dynatrace custom integration endpoint reached the same outcome blind, with no response body handed back to the attacker [13]. In both cases the validator saw only the first hop, and the first hop was a host the attacker owned.
That is why the metadata mode carries the severity rather than the code. IMDSv1 hands over AccessKeyId, SecretAccessKey and a Token valid for hours on one unauthenticated GET [7]. Getting the same object under v2 means first issuing a PUT with X-aws-ec2-metadata-token-ttl-seconds, then replaying the token it returns [8]. A server-side fetcher built to GET a user-supplied URL with fixed headers cannot do either step, which is the whole of v2's protection and also the shape of its limit: a gadget that lets the caller choose method and headers, such as a proxy endpoint or an HTTP client exposed through configuration, sits outside the token requirement's reach [8].
The probe count is a number about somebody else's telemetry. 69,433 across March 2025 averages about 2,240 a day [18], all of it attributed by F5 Labs to a single actor hitting one address [1]. No zero-day was involved, and every parameter name in the set ships in production APIs [2]. For that traffic to mean anything about your fleet, an endpoint has to accept a URL under one of those names or near it, the request has to egress to the link-local address, and the instance serving it has to still answer v1 [7][9]. The first two are code review questions. The third was answered at launch, because when AWS changed the default in November 2023 it changed it for new instances and left running ones alone [9]. The campaign sits roughly sixteen months downstream of that change [19].
The taxonomy in the write-up is looser than the headline count suggests. Six probe names appear, url, dest, file, redirect, target and uri [1], and six parameter categories are named [5], but they are not the same six: redirect and uri are mapped to no category, and renderers, avatar fetchers, link previewers and OAuth callback validators are listed with no parameter names attached [20]. Use it as a feature checklist, not a grep pattern. As a checklist it holds: an e-commerce API with payment webhooks, avatar uploads, link previews and one OAuth callback already covers four of the six categories before its first deploy [6], which is roughly why OWASP puts webhooks, callbacks and URL imports first in API7:2023 [4].
Two of the CVEs show that the parameter is often not yours to review. CVE-2021-21985 scored 9.8 because the vSAN Health Check plugin was enabled by default in vCenter 6.5, 6.7 and 7.0, exposed an unauthenticated API on 443, and took a URL parameter that reached RCE with the vCenter service account's privileges [16]. That parameter came from the plugin's default configuration, not from any operator. ProxyLogon, CVE-2021-26855, did it with a cookie: Exchange ECP accepted X-BEResource and routed requests to arbitrary internal backends without authentication, which chained with CVE-2021-26858 into OS-level RCE and was worked by Hafnium and multiple ransomware operations in Q1 2021, before patches reached most organisations [14]. The dev.to write-up argues that on cloud-hosted Exchange the same routing lands on 169.254.169.254 instead of an on-premise backend [15].
CVSS is the wrong ledger for this class. Adminer's 7.2 scores the fetch alone; the outcome that mattered was the role credentials it produced [10], and the write-up's own position is that cloud-hosted SSRF consistently outruns its score [17]. The figure that tracks the exposure is the count of running instances nobody has migrated off v1 [9].
Ranked by verification strength, evidence, and original report placement.
AWS disabled IMDSv1 by default for new instances in November 2023; existing instances continue running IMDSv1 unless explicitly migrated.
In March 2025 a single threat actor made 69,433 probes across servers using six parameter names (url, dest, file, redirect, target, uri), always targeting 169.254.169.254, in a campaign documented by F5 Labs.
No zero-day was involved in the campaign, and every parameter tested ships in production APIs today.
OWASP classifies webhooks, callbacks and URL imports as the primary SSRF vectors in modern APIs (API7:2023).
The six URL-accepting parameter categories named are webhook callbacks (url, dest), import-from-URL (file, target), PDF and screenshot renderers, avatar fetchers, link previewers, and OAuth callback validators.
IMDSv1 responds to a single unauthenticated GET to http://169.254.169.254/latest/meta-data/iam/security-credentials/<role> with a JSON object containing AccessKeyId, SecretAccessKey and Token valid for hours.
Distinct publishers with included, body-backed reporting in this cluster.
1 article · September 5, 2026
Follow any of these and your For You feed starts watching them — no settings page required.
build
AWS's SIRT traced one SSRF bug to Bedrock calls in a second Region1 distinct publisher
build
Why bounding the agent loop matters for a Well-Architected review1 distinct publisher
build
Attackers rode the Trivy compromise into Checkmarx's GitHub and out through its VS Code extensions1 distinct publisher
security
AWS and SANS move agent authorization out of the prompt and into the RBAC layer1 distinct publisher
Evidence-backed comparisons of source perspectives and observed adoption signals. Read the methodology
Which Builder, Operator, and Investor concerns the observed source mix emphasized—not a truth score.
Evidence, demonstrated adoption, hype gap, incentives, and confidence are assessed independently, each on its own current evidence. How these are measured.
Public advisories carrying one unlinked statistic
The mechanical spine is checkable by anyone, since the IMDSv1 credential path, the IMDSv2 token handshake, the OWASP category and four CVEs with their scores all live in documentation and advisories outside this post. The 69,433-probe figure is the exception: dev.to credits it to F5 Labs without a link or a date finer than the month, and the two HackerOne reports are paraphrased rather than quoted. That makes the piece's most quotable figure also its least verifiable one.
Unmeasured legacy exposure
Two dates bracket the exposure without measuring it. AWS changed the new-instance default in November 2023; sixteen months later an attacker was still sweeping six parameter names at the metadata address, and the Department of Defense report cited here found v1 answering inside government infrastructure. What share of running instances still returns credentials to one GET is the quantity the whole severity argument turns on, and no source in this story puts a number on it.
Precise on the credential path, loose on prevalence
The credential path is described with precision, down to parameter names and response codes, while the prevalence claims are estimates dressed up as counts. 'Virtually every production API' and 'four of the six types before the first deploy' have no survey behind them, the cloud-hosted Exchange variant is inferred rather than observed, and the taxonomy does not match its own opening evidence: redirect and uri were probed but belong to none of the six categories, while four categories arrive with no parameter names attached.
Vendor research upstream, unaffiliated authorship downstream
Both outside authorities in the chain are commercial security practices whose research doubles as marketing: F5 Labs publishes the probe telemetry, Mandiant supplies the UNC2903 attribution. The author names no employer, product or funding, and dev.to imposes no disclosure, so the only visible reward is the reputational return on a thorough explainer — which is also the incentive that makes an unchecked five-figure probe count worth putting in the first line.
Checkable core, single-author edges
Split the story and the two halves score differently. The IMDS mechanics and the CVE history are firmly established, resting on sources that would hold up under contradiction from any direction. The probe count, the ubiquity of the six categories and the hosted-Exchange variant rest on one author writing on a platform with no editorial check, and that gap is why this sits under halfway.