I dropped the credentials into the AWS CLI, ran get-caller-identity to confirm they were real, and unsurprisingly, they were. I didn't go further than that since the point was proving impact, not digging through their infrastructure. I reported it, and the fix was exactly what you'd expect once someone looks at the request path, an allowlist on outbound destinations, internal ranges and the metadata address blocked specifically, and a move to IMDSv2 which requires a token instead of answering anyone who asks. This was the same bug class behind the Capital One breach. SSRF gets treated as a checkbox medium severity item until you hit the hard realization that the server making that request is sitting inside someone's cloud account with real permissions attached
I need to start posting more on exploits I've discovered, I just realised that I have no posts or publications on past exploits.
So here's a sample of one of my more recent ones, I cannot disclose the name of the platform but here was the vulnerability.
From there it's just a matter of asking what else that server can reach that it shouldn't. Public apps like this usually sit inside a cloud environment, and cloud environments have a special internal address, 169.254.169.254, that only responds from inside the provider's own network, it's how an instance asks what permissions it has. I set the webhook to hit that instead. Their "test webhook" feature happened to show me the delivery response, presumably for debugging your own receiver, and that became the leak. So instead of blind SSRF I had the actual response sitting in the UI. It listed an IAM role name, one more request with that name appended and I had live access key, secret key, and session token.
Okay guys, today we're talking about cross-chain signature replay, a bug that only shows up once you're operating across multiple chains.
A signature is just proof someone with a private key approved a specific message but nothing about ECDSA inherently ties that signature to one chain. So if your contract doesn't explicitly bind the signature to a chain ID, the same signed message is valid everywhere.
Here's the chain, so a user signs a message on Chain A which authorizes a withdrawal, a permit, a meta-transaction, or whatever. The contract on Chain A checks the signature, sees it's valid, executes.
Now the exact same contract, or a compatible one, gets deployed on Chain B. An attacker takes the signature from Chain A and submits it to the Chain B contract. If the signed message doesn't include chain ID as part of what got signed, the signature verifies as valid there too. So we basically have the same signer and same message, on a different chain, replayed for free.
This isn't theoretical, It's the reason why EIP-155 added chain ID to transaction signing, and why EIP-712's domain separator exists, to bind a signature to a specific contract, chain, and context so it can't be lifted and replayed somewhere else it was never meant for.
Here's what actually sucks, there are multi-chain deployments of the same protocol, permit() signatures reused across L2s, meta-transaction relayers that don't check chain ID, and any signature-based auth that was written assuming single chain deployment then ported later without revisiting the signing scheme.
But I can't come here chatting problems without solutions, i got you, here's what you do, nake sure you always include chain ID (and contract address, and a nonce) inside the signed message itself via EIP-712 domain separation.
Don't rely on the transaction's chain context, since the signature is what's being reused, not the transaction.
I submitted this report to @ZyntaFinance Which could potentially drain their whole infrastructure btw Iโve been following up if itโs been validated I went back and they already made changes to it yโall should have replied me at least or given credit for the find.
One of my buddy @mylifechangefa1 recently submitted a immuenfi bug that was marked duplicate and he directly went to the team itself to confirm and to his discovery the bug wasnโt a duplicate but immuenfi flagged it which makes me question the integrity of bug bounty platforms