Home › Security › SSRF and Cloud Metadata — Block Server-Side Forgery
Advanced 6 min · September 23, 2026

SSRF and Cloud Metadata — Block Server-Side Forgery

SSRF tricks your server into fetching attacker URLs, exposing cloud metadata.

N
Naren Founder & Principal Engineer

20+ years shipping production backend systems. Drawn from code that ran under real load.

Follow
✓ Production
production tested
September 26, 2026
last updated
2,085
articles · all by Naren
Before you start⏱ 20 min
  • ✓An app feature that fetches remote URLs (previews, imports, webhooks)
  • ✓Basic knowledge of cloud IAM roles and networking
  • ✓Access to instance and subnet configuration for hardening
 ● Production Incident 🔎 Debug Guide
⚡Quick Answer
  • SSRF happens when your server fetches a URL an attacker chose: webhooks, previews, file imports, and PDF renderers are classic entry points
  • Cloud metadata at 169.254.169.254 can hand out temporary credentials, so an SSRF hole on EC2 or GCE can become full account takeover
  • Allowlist the exact destination hosts your feature needs and reject everything else, including resolved IPs in private ranges
  • Layer egress controls: security groups, proxies, and DNS filtering that block instance-metadata access from application subnets
  • Require IMDSv2 with a low hop limit so stolen requests from containers can't reach the metadata service
✦ Definition~90s read
What is Server-Side Request Forgery (SSRF) and Cloud Metadata?

SSRF (Server-Side Request Forgery) is a vulnerability where an attacker makes your server perform HTTP requests to destinations they select. Any feature that fetches a remote resource can carry it: URL preview unfurling, avatar imports, document converters, PDF generators, webhook registrations, file-upload-by-URL, and even SVG or XML parsers that resolve external entities.

★
Imagine you ask a hotel concierge to pick up a package from an address you wrote on a card — and the concierge goes without checking where it is.

The attacker supplies a URL (or part of one), and your backend — which sits inside your network perimeter with its privileges — dutifully connects.

The cloud turns SSRF from reconnaissance into takeover through the instance metadata service. Cloud platforms expose internal data about each virtual machine at a fixed link-local address — 169.254.169.254 on AWS, Azure, and GCP (with platform-specific paths).

Among other things, it serves temporary security credentials for the role attached to the instance. Those credentials work from anywhere until they expire, so reading them through SSRF gives an attacker your instance's permissions: reading storage buckets, launching resources, or pivoting deeper.

First-generation metadata (IMDSv1 on AWS) answers simple GET requests, which is exactly what SSRF produces — hence the disaster pairing. IMDSv2 requires a PUT request to mint a session token first, which plain URL-fetching SSRF can't issue. A hop-limit setting adds a second barrier for containerized workloads.

No single control suffices: allowlist destinations in code, re-check DNS at fetch time, force metadata to v2-only, and deny metadata access from subnets that never need it. When a parser bug slips past validation, the firewall still stands.

Plain-English First

Imagine you ask a hotel concierge to pick up a package from an address you wrote on a card — and the concierge goes without checking where it is. An attacker slips in a card reading 'the hotel safe room' and the helpful concierge brings back the contents. That's SSRF: your server is the concierge, faithfully fetching whatever URL it's handed. In the cloud, one of those addresses is a special internal desk that hands out master keys, which turns a fetching trick into a building takeover.

Your app has a harmless feature: paste a URL, get a link preview. Or import a file from a URL. Or receive webhooks from a partner. Behind each of these sits server-side code that fetches an arbitrary address — and if any part of that address comes from user input, you've built an SSRF hole: Server-Side Request Forgery.

SSRF lets an outsider aim your server's network access at targets they choose. Scan internal ports. Hit admin panels that listen only on localhost. And in the cloud, query the instance metadata service — a special internal address that happily describes your infrastructure and, worst of all, dispenses temporary credentials for the instance's IAM role. A single crafted URL can escalate from 'fetch my avatar' to 'keys to the kingdom'.

What makes SSRF stubborn is that every fix teams try first is bypassable. Block the metadata IP and attackers use DNS rebinding, decimal IP encoding, or redirects to reach it anyway. Check the URL string but not the resolved address and redirects walk right past. This guide covers the entry points, the metadata service mechanics, and the layered defense — allowlists, egress controls, IMDSv2 — that actually holds when any single layer fails.

How a URL Field Becomes a Server-Side Request

SSRF starts with a feature that seems user-friendly: paste a link, get a preview card. Import your avatar from a URL instead of uploading. Register a webhook and we'll call you back. Each of these hands part of an outbound request to the user — the host, the path, sometimes headers — and the server executes it with the server's network position. Your backend can reach the internal admin panel on localhost:8080, the database on its private IP, and the metadata service. The attacker can't reach those directly, so they borrow your server's legs.

The entry points cluster in a few shapes. Fetchers (previews, imports, converters) take full URLs. Webhook registrations store a callback the server will later call, sometimes with secrets attached. Document pipelines (PDF renderers, SVG processors, XML parsers) resolve embedded external references during conversion — a file upload becomes a request engine. And open redirectors elsewhere in your app become accomplices, laundering attacker destinations through your own domain.

Map these features before you harden them. For each one, answer: which URL parts does the user control, does the fetcher follow redirects, and is DNS re-resolved at fetch time? The snippet below is the hardened fetch helper every one of these features should share — allowlisted hosts, DNS resolved and checked, private ranges rejected, redirects off. One choke point beats ten ad-hoc validators.

app/safe_fetch.pyPYTHON
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import ipaddress
import socket
from urllib.parse import urlparse

ALLOWED_HOSTS = {"avatars.example-cdn.com", "partner.example.org"}
BLOCKED_NETS = [ipaddress.ip_network(c) for c in
                ("10.0.0.0/8", "172.16.0.0/12", "192.168.0.0/16",
                 "169.254.0.0/16", "127.0.0.0/8", "::1/128", "fe80::/10")]

def _ip_blocked(ip: str) -> bool:
    addr = ipaddress.ip_address(ip)
    return any(addr in net for net in BLOCKED_NETS)

def safe_fetch(url: str, timeout: int = 5) -> bytes:
    host = urlparse(url).hostname or ""
    if host not in ALLOWED_HOSTS:  # allowlist first, no regexes
        raise ValueError(f"Host not allowlisted: {host}")
    for _, _, _, _, sockaddr in socket.getaddrinfo(host, 443):
        if _ip_blocked(sockaddr[0]):  # re-check AFTER resolution
            raise ValueError(f"Resolved to blocked range: {sockaddr[0]}")
    return http_get(url, timeout=timeout, allow_redirects=False)
📊 Production Insight
A preview service allowlisted domains but followed 5 redirects without re-checking. Attackers bounced a trusted domain to the metadata service in one hop. Allowlist every hop or follow none.
🎯 Key Takeaway
Route every attacker-influenced fetch through one hardened helper: allowlist hosts, verify resolved IPs, reject private ranges, and don't follow redirects blindly.

The Cloud Metadata Address and Why Attackers Love It

Every major cloud runs an instance metadata service at the link-local address 169.254.169.254 — reachable only from inside the instance, serving data about the machine itself. That data includes instance identity, network config, user-data scripts (which sometimes embed secrets), and IAM role credentials. The credentials are the prize: temporary, auto-rotating, and usable from anywhere on the internet until they expire. Read them once through SSRF and you wear the instance's permissions like a costume.

The shape is identical on every platform: query a well-known URL, get JSON back, extract the temporary credentials. Attackers automate the walk — role name first, credentials second — in seconds. From there the blast radius equals the role's permissions: storage buckets, queues, other instances, sometimes the whole account. The mining-fleet incident earlier is the standard monetization; data theft is the quieter one.

This is why metadata access deserves its own defensive layer regardless of application fixes. Application code changes weekly; the metadata service is forever. Enforce the hardened metadata version, restrict which network tiers can reach the address at all, and keep instance roles minimal so that even a successful read yields little. The fetcher fix stops the knock; the metadata hardening decides what's behind the door.

BASH
1
2
3
4
5
6
7
8
9
10
11
# Verify IMDSv2 enforcement: v1-style bare GETs must fail, token GETs work
# (non-sensitive path used; proves the PUT handshake is required)
if curl -s --max-time 3 http://169.254.169.254/latest/meta-data/ami-id; then
  echo 'WARN: metadata answers bare GETs — IMDSv1 still allowed'
else
  echo 'OK: bare GET refused'
fi
TOKEN=$(curl -s -X PUT http://169.254.169.254/latest/api/token \
  -H 'X-aws-ec2-metadata-token-ttl-seconds: 60' --max-time 3)
curl -s --max-time 3 -H "X-aws-ec2-metadata-token: $TOKEN" \
  http://169.254.169.254/latest/meta-data/ami-id && echo ' <- token path works'
📊 Production Insight
User-data scripts with embedded database passwords are served by the same metadata service. One team fixed credential theft but leaked DB passwords through the same hole they'd half-closed. Audit everything the metadata endpoint serves, not just IAM paths.
🎯 Key Takeaway
The metadata service turns SSRF into credential theft. Harden it independently of app code: version enforcement, network tiers, and minimal instance roles.

Allowlists and Egress Controls That Actually Hold

Denylists fail against SSRF because attacker input has infinite spellings: decimal IPs (2130706433 for localhost), octal variants, DNS rebinding that resolves safe-then-evil, and redirect chains that start trusted and end anywhere. Every denylist is a bet you've enumerated all evil; allowlists flip the bet to enumerating the small set of legitimate destinations, which for most features is a handful of hosts.

Build the allowlist at the right layer. In code, check the parsed hostname against an explicit set — never a regex on the raw string — then resolve DNS yourself and reject private, loopback, link-local, and metadata ranges on every resolved address. Handle redirects by re-running the full check on each hop or by refusing to follow them; most preview and import features work fine fetching only the first response. Set aggressive timeouts so attackers can't use your fetcher for slow port scans.

Then assume the code check has a bug and add network controls that don't depend on it. Egress proxy rules that permit only approved external hosts, security groups that deny the metadata address from application subnets, and DNS filtering that sinkholes metadata-looking queries all keep working when the parser slips. The YAML below shows the Kubernetes-flavored version: a NetworkPolicy that confines the app tier's egress so even a compromised pod can't wander the network freely.

k8s/app-egress-policy.yamlYAML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: app-tier-egress
  namespace: production
spec:
  podSelector:
    matchLabels:
      tier: app
  policyTypes: [Egress]
  egress:
    - to:
        - namespaceSelector: {}  # cluster DNS only
      ports:
        - port: 53
          protocol: UDP
    - to:
        - ipBlock:
            cidr: 0.0.0.0/0
            except: [169.254.169.254/32]  # never metadata
      ports:
        - port: 443
          protocol: TCP
📊 Production Insight
A team deployed perfect code-level checks but ran pre-production and production in one flat subnet. A staging SSRF hole reached production databases laterally. Segment tiers so a bug in one environment can't see the others.
🎯 Key Takeaway
Allowlist tiny destination sets in code, re-check after DNS resolution, and back it with egress rules that survive application bugs.

IMDSv2 and Hop Limits as Defense in Depth

IMDSv2 (Instance Metadata Service version 2) fixes the protocol mismatch that made SSRF so rewarding: v1 answers plain GETs, which is all SSRF can easily produce, while v2 demands a PUT to mint a session token before any data is served. URL fetchers, XML resolvers, and PDF renderers issue GETs — they can't complete the PUT handshake, so the metadata stays silent even when the request reaches it. Enforcing v2-only (HttpTokens=required) converts most SSRF from credential theft back into mere reconnaissance.

The hop limit (HttpPutResponseHopLimit) handles the container wrinkle. Responses from the metadata service carry a TTL that decrements per network hop; containers add hops between the pod and the host network, so defaults were historically raised to 2 for container hosts — which also lets SSRF payloads running in containers reach the service. Setting the limit to 1 on hosts that don't need container metadata access closes that path; where containers legitimately need it, prefer distinct task roles (like ECS task roles) over instance roles so stolen credentials carry less power.

Roll this out as infrastructure, not advice: set the requirement in launch templates and organization policies so new instances inherit it, then audit existing fleets region by region. The commands below show the verification habit — check what's actually enforced, don't trust the ticket that said it was done. Pair the rollout with a smoke test of every agent (monitoring, config management) that reads metadata legitimately, since v2-only breaks clients too old to send the PUT.

BASH
1
2
3
4
5
6
7
8
9
10
11
# Audit IMDS enforcement across a region (run per region)
aws ec2 describe-instances \
  --query 'Reservations[].Instances[].[InstanceId,MetadataOptions.HttpTokens,MetadataOptions.HttpPutResponseHopLimit]' \
  --output table

# Enforce v2-only with hop limit 1 on a launch template version
aws ec2 modify-instance-metadata-options \
  --instance-id i-0abc123def456 \
  --http-tokens required \
  --http-put-response-hop-limit 1 \
  --http-endpoint enabled
📊 Production Insight
A fleet was 'migrated to v2' except the autoscaling launch template, so every instance born after the project reverted to optional. Audit launch templates and scaling configs, not just running instances.
🎯 Key Takeaway
Require IMDSv2 everywhere, keep hop limit at 1 unless containers provably need more, and enforce it in templates so new instances inherit safety.

Validating and Sandboxing Outbound Fetches

Some features genuinely need the open web — a feed reader, a link preview for arbitrary sites, a migration importer. Allowlists can't cover 'any URL the user pastes,' so sandbox the fetch instead. Run retrievals in an isolated worker with no cloud credentials in its environment, no route to internal networks, and strict output limits: cap response size, cap time, strip active content from what you store. The fetcher becomes a disposable glove — useful, and safe to contaminate.

Design the sandbox in concentric rings. The worker runs with a dedicated minimal IAM role (or none), in a subnet whose route table has no path to internal tiers and an explicit deny for the metadata address. DNS goes through a resolver that refuses to answer private ranges. The fetched bytes are treated as hostile: images re-encoded, HTML parsed for text only, archives scanned before extraction. What returns to your main app is a sanitized artifact, never the raw response.

This architecture also simplifies incident response. When (not if) someone finds a bypass in your validation, the blast radius is a credential-less sandbox that can only talk to the public internet — annoying, not catastrophic. Log every fetch with source feature, target host, resolved IP, and redirect chain so the bypass announces itself in your telemetry instead of hiding in a generic HTTP client log.

🔥Sandbox what you can't allowlist
If a feature must fetch arbitrary user URLs, isolate the fetcher: no cloud credentials, no internal routes, metadata denied, outputs sanitized. Validation decides what's allowed; the sandbox decides what failure costs.
📊 Production Insight
A feed reader fetched arbitrary URLs with full production credentials in its environment. A parser bug turned it into a credential thief. Moving fetches to a credential-less sandbox cut the blast radius to zero useful secrets.
🎯 Key Takeaway
For open-ended fetching, isolate the worker: minimal role, no internal routes, metadata denied, and every byte treated as hostile until sanitized.

Detecting SSRF Probes in Logs Before They Succeed

SSRF campaigns have a recognizable shape in telemetry: bursts of requests to unusual internal-looking targets, sequential paths or ports from few accounts, and redirect chains that terminate at link-local addresses. Your fetch helper should log the full chain — original URL, each redirect hop, final resolved IP — so analysts see the laundering, not just the innocent first hop. Without chain logging, the attack looks like normal traffic to a trusted domain.

Correlate application logs with network and cloud telemetry. VPC flow logs showing app hosts connecting to the metadata address are a finding on their own — legitimate apps rarely need it per-request. CloudTrail showing role credentials used from unexpected networks means probing already succeeded and the response is now revocation plus rotation. Set the alert threshold on patterns (sequential sweeping, metadata paths, private-range targets), not just volume, since low-and-slow probing stays under volumetric radar.

Rehearse the response so detection converts to containment in minutes: feature-flag the fetcher off, revoke and rotate the exposed role's sessions, and scope with logs before announcing. The 11-hour mining bill in the earlier incident wasn't a detection failure of exotic kind — billing was simply the only alert watching. A metadata-access alert would have fired on the first credential read.

📊 Production Insight
One team logged only the user-supplied URL, so every attack appeared as requests to a benign redirector domain. Adding resolved-IP and hop logging exposed a month-long campaign hiding in plain sight.
🎯 Key Takeaway
Log full redirect chains and resolved IPs, alert on metadata and private-range targeting, and treat credential use from strange networks as a confirmed-success signal.
● Production incidentPOST-MORTEMseverity: high

A Link Preview Fetched Credentials and Cost $214,000 in 11 Hours

Symptom
At 1:14 AM, billing alerts flagged $214,000 in unexpected EC2 spend across 3 regions. The bill showed 640 GPU instances that nobody had launched, running for up to 11 hours. CloudTrail revealed the launches used temporary credentials for the web app's IAM role — credentials that should never have left the production instances. The app itself showed no intrusion: no new logins, no code changes, no errors. The only anomaly was a burst of 2,300 link-preview requests from 14 free-tier accounts created the previous evening, each preview URL slightly different from the last.
Assumption
The team believed their SSRF protection worked because the preview service blocked the literal metadata IP — a denylist entry for 169.254.169.254 added during a previous pentest. They assumed blocking that string closed the metadata path entirely. They also assumed the web role's permissions were harmless because 'it only reads the app bucket,' forgetting a broadly attached managed policy that also allowed ec2:RunInstances from an earlier debugging session nobody revoked.
Root cause
The unfurler validated the URL string but fetched whatever DNS resolved at request time, following up to 5 redirects. Attackers chained a redirector through decimal-encoded IP variants the string check didn't recognize, reaching the metadata service and reading IAM role credentials. IMDSv1 was still enabled, so plain GETs sufficed. The stolen credentials inherited an over-broad role, and automated scripts launched mining fleets in every region with GPU capacity. Detection took 11 hours because billing alerts were the only monitor watching spend.
Fix
Containment took 40 minutes: revoke the role's sessions, delete the rogue instances, and disable the preview feature flag. The permanent fix had four layers: strict allowlist of previewable hosts with DNS re-resolution and private-range rejection at fetch time; IMDSv2 enforced as required on all instances with hop limit 1; egress rules denying metadata access from application subnets; and the IAM role cut to least privilege with spend anomaly alerts at $500 increments. Preview accounts now require verified emails before the feature unlocks.
Key lesson
  • String denylists don't stop SSRF: redirects, DNS rebinding, and IP encoding walk past them. Allowlist destinations and re-validate after DNS resolution.
  • Over-broad IAM roles turn SSRF into account takeover. Least privilege on instance roles is the control that decides what stolen credentials are worth.
  • Billing alerts aren't intrusion detection. Alert on metadata access patterns and credential use from unexpected networks, not just on spend.
Production debug guideFive defensive checks, from mapping entry points to proving the metadata service is unreachable.5 entries
Symptom · 01
You need to know where SSRF can enter your app
→
Fix
Inventory every feature where a URL or hostname influences an outbound request: previews, imports, webhooks, converters, avatar fetches, and XML/SVG parsers. For each, test with a request-logging endpoint you control (a webhook inspector) and confirm which parts of the URL are attacker-controlled. Anything that follows redirects or resolves DNS without re-checking goes on the fix list first.
Symptom · 02
You want to prove the metadata service is reachable through a suspect feature
→
Fix
Only against systems you own: point the feature at your own instance and watch VPC flow logs or a local listener for the outbound connection. Never fetch the real metadata URL in testing — proving the request path with a collaborator address you control is sufficient evidence. If your server's request arrives, the feature performs attacker-directed fetches and needs allowlisting.
Symptom · 03
A feature must fetch remote URLs and can't simply be disabled
→
Fix
Wrap all outbound fetches in one hardened helper: parse the URL, check the host against an explicit allowlist, resolve DNS yourself, reject private, link-local, and metadata ranges on the resolved IPs, disable redirect-following (or re-validate every hop), and set short timeouts. Route the helper through an egress proxy that enforces the same policy as a second opinion.
Symptom · 04
You run on EC2 and need the metadata service locked down
→
Fix
Set IMDS to v2-only on every instance and launch template (HttpTokens=required), drop the hop limit to 1 so container traffic can't reach it, and audit with the metadata-options API across all regions. Add a subnet-level egress deny for the metadata address from application tiers as a backstop, then verify legitimate agents that need metadata still function before closing the change.
Symptom · 05
You need detection for SSRF probing in production
→
Fix
Alert on outbound requests to private ranges, link-local addresses, and cloud metadata paths from application hosts; log full redirect chains in your fetch helper; and watch for sequential preview requests sweeping ports or paths from single accounts. Correlate with CloudTrail for credential use from unexpected source networks — that's the signal that probing succeeded.
SSRF Defenses at a Glance
Root CauseHow to ConfirmFixPrevention
Attacker-controlled fetch destinationsPoint the feature at a logger you control and inspect what arrivesSingle hardened fetch helper with host allowlistOne choke point for all outbound fetches; no ad-hoc clients
String checks bypassed by encoding or redirectsReplay with decimal IPs, DNS rebinding, and redirect chainsRe-validate after DNS resolution; re-check every redirect hopFuzz validators with encoded and rebinding inputs in CI
Metadata service answering plain GETsAudit instance metadata options for HttpTokens=optionalRequire IMDSv2 with hop limit 1 across fleet and templatesOrganization policy plus per-region audits on a schedule
Over-broad instance roles and flat networksReview role policies and subnet routes for metadata reachabilityLeast-privilege roles; subnet egress denies for metadataIAM review on every role change; tiered subnets by default
⚙ Quick Reference
4 commands from this guide
FileCommand / CodePurpose
appsafe_fetch.pyfrom urllib.parse import urlparseHow a URL Field Becomes a Server-Side Request
if curl -s --max-time 3 http://169.254.169.254/latest/meta-data/ami-id; thenThe Cloud Metadata Address and Why Attackers Love It
k8sapp-egress-policy.yamlapiVersion: networking.k8s.io/v1Allowlists and Egress Controls That Actually Hold
aws ec2 describe-instances \IMDSv2 and Hop Limits as Defense in Depth

Key takeaways

1
SSRF aims your server's network position at attacker-chosen targets; audit every URL-influenced fetch.
2
Cloud metadata converts fetching bugs into credential theft
harden it independently of app code.
3
Allowlist destinations and re-validate after DNS resolution; denylists always miss a spelling.
4
Require IMDSv2 with hop limit 1 so plain-GET SSRF can't mint metadata sessions.
5
Sandbox open-ended fetchers with no credentials, no internal routes, and sanitized outputs.
6
Log redirect chains and resolved IPs; alert on metadata access, not just on billing.

Common mistakes to avoid

5 patterns
×

Blocking the metadata IP as a string and stopping there

Symptom
Decimal encoding, DNS rebinding, and redirect chains reach the metadata service past a check that only recognizes one spelling.
Fix
Allowlist destinations, resolve DNS at fetch time, and reject resolved IPs in private and link-local ranges.
×

Following redirects without re-validating each hop

Symptom
A trusted first hop launders the request to an internal target, and logs show only the innocent original URL.
Fix
Re-run the full validation on every redirect hop, or disable following and fetch first responses only.
×

Leaving IMDSv1 enabled 'until the migration is scheduled'

Symptom
Every SSRF hole in the fleet stays a credential-theft hole while the hardening ticket waits in the backlog.
Fix
Require v2 now on instances and templates; smoke-test metadata-dependent agents the same day.
×

Attaching over-broad IAM roles to web instances

Symptom
Stolen credentials inherit permissions (like launching instances) that the web app never legitimately needs.
Fix
Cut instance roles to least privilege and review managed-policy attachments on every change.
×

Putting fetchers in subnets with internal routes and full credentials

Symptom
A validation bypass becomes full network and credential compromise instead of a contained failure.
Fix
Isolate fetch workers: minimal role, no internal routes, metadata denied, outputs sanitized.
INTERVIEW PREP · PRACTICE MODE

Interview Questions on This Topic

Q01JUNIOR
What is SSRF and why is it worse in the cloud?
Q02SENIOR
Why doesn't blocking the string 169.254.169.254 stop metadata SSRF?
Q03SENIOR
How does IMDSv2 mitigate SSRF-based credential theft?
Q04SENIOR
Design a link-preview feature that can't be turned into SSRF.
Q05SENIOR
Your CloudTrail shows instance-role credentials used from an unknown ext...
Q01 of 05JUNIOR

What is SSRF and why is it worse in the cloud?

ANSWER
SSRF makes your server fetch attacker-chosen URLs. In the cloud it's worse because the instance metadata service at a fixed internal address dispenses temporary IAM credentials — so a fetching bug can become account takeover, not just internal scanning.
FAQ · 6 QUESTIONS

Frequently Asked Questions

01
Is SSRF only a cloud problem?
02
Can a WAF block SSRF reliably?
03
Do I need to disable redirects entirely in my HTTP client?
04
What hop limit should container hosts use?
05
How do I test for SSRF safely?
06
Should fetch workers have any IAM role at all?
N
Naren Founder & Principal Engineer

20+ years shipping production backend systems. Drawn from code that ran under real load.

Follow
✓ Verified
production tested
September 26, 2026
last updated
2,085
articles · all by Naren
🔥

That's Cloud. Mark it forged?

6 min read · try the examples if you haven't

←
Previous
Insecure Direct Object Reference (IDOR)
1 / 1 · Cloud
Next
Log4Shell: How JNDI Lookup Became Remote Code Execution
→