TS-2026-008
Vulnerability from tailscale - Published: Mon, 13 Jul 2026 00:00:00 GMT
Description: A single malformed HTTP request to a node running Tailscale Serve or Funnel could pin a CPU core indefinitely, causing denial of service.
What happened?
Tailscale Serve and Tailscale Funnel proxy incoming HTTP requests to local backends by matching the request path against the configured mount points. When resolving the handler for a request, Tailscale walked the request path upward one directory at a time, expecting the walk to eventually terminate at the root path /.
For requests whose path did not begin with /, this walk never reached / and never matched a mount point, causing the loop to spin forever. As the server enforced no request timeout, nothing interrupted the spin, and the goroutine held one core at 100% for the life of the process.
Tailscale now terminates the path walk for non-absolute paths, returning no handler and closing the request.
This vulnerability is fixed in Tailscale version 1.98.9 or newer.
What was the impact?
An attacker could send a crafted HTTP request to permanently consume one CPU core on the target node.
For Tailscale Serve, the request could originate from any peer on the tailnet with access to the node. For Tailscale Funnel, the request could originate from any unauthenticated host on the internet.
Who was affected?
Nodes running Tailscale Serve or Tailscale Funnel on versions prior to 1.98.9.
What do I need to do?
If you run Tailscale Serve or Tailscale Funnel, upgrade to Tailscale version 1.98.9 or newer.
Credits
We would like to thank Anthropic and Ada Logics for reporting this issue.
Show details on source website{
"guidislink": false,
"id": "https://tailscale.com/security-bulletins/#ts-2026-008",
"link": "https://tailscale.com/security-bulletins/#ts-2026-008",
"links": [
{
"href": "https://tailscale.com/security-bulletins/#ts-2026-008",
"rel": "alternate",
"type": "text/html"
}
],
"published": "Mon, 13 Jul 2026 00:00:00 GMT",
"summary": "\u003cp\u003e\u003cstrong\u003e\u003cem\u003eDescription\u003c/em\u003e\u003c/strong\u003e: A single malformed HTTP request to a node running Tailscale Serve or Funnel could pin a CPU core indefinitely, causing denial of service.\u003c/p\u003e\n\u003ch4\u003eWhat happened?\u003c/h4\u003e\n\u003cp\u003e\u003ca href=\"https://tailscale.com/docs/features/tailscale-serve\"\u003eTailscale Serve\u003c/a\u003e and \u003ca href=\"https://tailscale.com/docs/features/tailscale-funnel\"\u003eTailscale Funnel\u003c/a\u003e proxy incoming HTTP requests to local backends by matching the request path against the configured mount points. When resolving the handler for a request, Tailscale walked the request path upward one directory at a time, expecting the walk to eventually terminate at the root path \u003ccode\u003e/\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eFor requests whose path did not begin with \u003ccode\u003e/\u003c/code\u003e, this walk never reached \u003ccode\u003e/\u003c/code\u003e and never matched a mount point, causing the loop to spin forever. As the server enforced no request timeout, nothing interrupted the spin, and the goroutine held one core at 100% for the life of the process.\u003c/p\u003e\n\u003cp\u003eTailscale now terminates the path walk for non-absolute paths, returning no handler and closing the request.\u003c/p\u003e\n\u003cp\u003eThis vulnerability is fixed in Tailscale version 1.98.9 or newer.\u003c/p\u003e\n\u003ch4\u003eWhat was the impact?\u003c/h4\u003e\n\u003cp\u003eAn attacker could send a crafted HTTP request to permanently consume one CPU core on the target node.\u003c/p\u003e\n\u003cp\u003eFor Tailscale Serve, the request could originate from any peer on the tailnet with access to the node. For Tailscale Funnel, the request could originate from any unauthenticated host on the internet.\u003c/p\u003e\n\u003ch4\u003eWho was affected?\u003c/h4\u003e\n\u003cp\u003eNodes running Tailscale Serve or Tailscale Funnel on versions prior to 1.98.9.\u003c/p\u003e\n\u003ch4\u003eWhat do I need to do?\u003c/h4\u003e\n\u003cp\u003eIf you run Tailscale Serve or Tailscale Funnel, upgrade to Tailscale version 1.98.9 or newer.\u003c/p\u003e\n\u003ch4\u003eCredits\u003c/h4\u003e\n\u003cp\u003eWe would like to thank Anthropic and Ada Logics for reporting this issue.\u003c/p\u003e",
"summary_detail": {
"base": "https://tailscale.com/security-bulletins/index.xml",
"language": null,
"type": "text/html",
"value": "\u003cp\u003e\u003cstrong\u003e\u003cem\u003eDescription\u003c/em\u003e\u003c/strong\u003e: A single malformed HTTP request to a node running Tailscale Serve or Funnel could pin a CPU core indefinitely, causing denial of service.\u003c/p\u003e\n\u003ch4\u003eWhat happened?\u003c/h4\u003e\n\u003cp\u003e\u003ca href=\"https://tailscale.com/docs/features/tailscale-serve\"\u003eTailscale Serve\u003c/a\u003e and \u003ca href=\"https://tailscale.com/docs/features/tailscale-funnel\"\u003eTailscale Funnel\u003c/a\u003e proxy incoming HTTP requests to local backends by matching the request path against the configured mount points. When resolving the handler for a request, Tailscale walked the request path upward one directory at a time, expecting the walk to eventually terminate at the root path \u003ccode\u003e/\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eFor requests whose path did not begin with \u003ccode\u003e/\u003c/code\u003e, this walk never reached \u003ccode\u003e/\u003c/code\u003e and never matched a mount point, causing the loop to spin forever. As the server enforced no request timeout, nothing interrupted the spin, and the goroutine held one core at 100% for the life of the process.\u003c/p\u003e\n\u003cp\u003eTailscale now terminates the path walk for non-absolute paths, returning no handler and closing the request.\u003c/p\u003e\n\u003cp\u003eThis vulnerability is fixed in Tailscale version 1.98.9 or newer.\u003c/p\u003e\n\u003ch4\u003eWhat was the impact?\u003c/h4\u003e\n\u003cp\u003eAn attacker could send a crafted HTTP request to permanently consume one CPU core on the target node.\u003c/p\u003e\n\u003cp\u003eFor Tailscale Serve, the request could originate from any peer on the tailnet with access to the node. For Tailscale Funnel, the request could originate from any unauthenticated host on the internet.\u003c/p\u003e\n\u003ch4\u003eWho was affected?\u003c/h4\u003e\n\u003cp\u003eNodes running Tailscale Serve or Tailscale Funnel on versions prior to 1.98.9.\u003c/p\u003e\n\u003ch4\u003eWhat do I need to do?\u003c/h4\u003e\n\u003cp\u003eIf you run Tailscale Serve or Tailscale Funnel, upgrade to Tailscale version 1.98.9 or newer.\u003c/p\u003e\n\u003ch4\u003eCredits\u003c/h4\u003e\n\u003cp\u003eWe would like to thank Anthropic and Ada Logics for reporting this issue.\u003c/p\u003e"
},
"title": "TS-2026-008",
"title_detail": {
"base": "https://tailscale.com/security-bulletins/index.xml",
"language": null,
"type": "text/plain",
"value": "TS-2026-008"
}
}
Sightings
| Author | Source | Type | Date | Other |
|---|
Nomenclature
- Seen: The vulnerability was mentioned, discussed, or observed by the user.
- Confirmed: The vulnerability has been validated from an analyst's perspective.
- Published Proof of Concept: A public proof of concept is available for this vulnerability.
- Exploited: The vulnerability was observed as exploited by the user who reported the sighting.
- Patched: The vulnerability was observed as successfully patched by the user who reported the sighting.
- Not exploited: The vulnerability was not observed as exploited by the user who reported the sighting.
- Not confirmed: The user expressed doubt about the validity of the vulnerability.
- Not patched: The vulnerability was not observed as successfully patched by the user who reported the sighting.