A webhook receiver does one job well when it is built correctly: it recomputes an HMAC over the raw body plus a timestamp and compares it in constant time. Standard Webhooks spells out the headers, the encoding and the signing string, so every provider does not reinvent it the Standard Webhooks site. The specification is explicit that it exists to make implementations secure, reliable and interoperable, and its security section names SSRF, spoofing and replay as the threats it addresses the Standard Webhooks spec.
Read that list again. Spoofing is about who sent it. Replay is about when it was sent. Neither is about the meaning of the content. A perfectly signed event from a real account can still contain a free-text field that a user controls: a display name, a memo line, a support message, a filename. The signature says the platform forwarded it faithfully. It says nothing about whether that text was written to give instructions to whatever reads it next.
An LLM wired to the receiver does not know the difference between data and instruction. That is the gap this article is about, and it is a design gap, not a crypto gap. Signatures cannot close it because the bytes really did come from the sender. The sender is not the threat model. The sender's users are.
The survey data backs up how narrow the signature gate actually is. When the ngrok team studied 100 webhook providers and integrated more than 50, they found HMAC is used by over two thirds of services, but only about 30 percent of webhooks had any control to mitigate replay attacks ngrok's field guide to webhook security. Even where the crypto is present, the surrounding controls are inconsistent, and none of them inspect what the text inside the payload says.



