Cache key injection has a 2020 name, four 2026 lab demonstrations, no CVE and no named victim
YesWeHack's 17 September write-up shows Nginx cache keys, built without separators, letting two different requests share one stored response. It cites no CVE and no victim, and the name dates from 2020, so this is a configuration question, not a new bug.
By Parminder Kumar Sharma · · 19 min read

2,234 days, four lab demonstrations and no CVE
James Kettle's paper on cache entanglement, published by PortSwigger on 5 August 2020, already had two sections headed Cache Key Injection, one on Akamai and one on Cloudflare. YesWeHack published its own write-up under that name on 17 September 2026, 2,234 days later (our count). The 2026 piece shows four demonstrations against Nginx caches in a controlled environment. It cites no CVE, names no vendor advisory and describes no victim. The Hacker News summarised it in its ThreatsDay bulletin on 1 October, 14 days after the write-up.
That count matters for what it does not establish. It does not show that any live site is vulnerable today. It does not show that anyone is using the technique: at 17:00 BST on Monday 5 October 2026 the CISA Known Exploited Vulnerabilities catalogue, version 2026.10.04, had no entry that names Nginx or cache key collisions. It does not say how many sites build cache keys without separators, because the write-up does not count them. And it does not call Nginx defective. It shows how keys written in Nginx configuration can collide, and says that even the common pattern of scheme, host and request URI can be vulnerable under certain conditions.
The briefing is still worth reading, for a reason that has nothing to do with news. A cache is a shared memory of responses, addressed by a string. The line that builds the string decides which users are given the same answer. Whoever owns that line is making an access control decision, whatever the change request calls it.
What the write-up claims, at the level a defender needs
A cache decides whether it already holds the answer to a request by computing a key from parts of the request. RFC 9111, the HTTP caching standard, says the key is "composed from, at a minimum, the request method and target URI", and that caches may add more. In Nginx the key is a string the administrator writes with variables. The documented default joins the scheme, the proxy host and the request URI, and Nginx names each cache file by applying MD5 to the key (Nginx documentation, read 5 October). YesWeHack notes that developers often add headers or cookies to the key so that login state or language changes the answer.
The claim is that when a key joins such fragments with no boundary between them, different splits of the same characters produce the same string. Move characters from one request field into the next, and two requests that look different to every other component produce one key. Hashing the string afterwards does not help, because equal strings give equal hashes. The write-up's own test for a shared cache is correspondingly small: split a harmless test value across two adjacent fields and see whether the second request is answered with the first one's cached response. It insists on a unique cache buster when testing a real environment, because otherwise the test request can poison an entry that real users receive.
Who receives the stored answer depends on which request filled the entry first. The write-up reports four demonstrations. Each was reproduced in a controlled environment, in its words, with Nginx as a caching proxy in front of a backend application, and Cloudflare in front of Nginx for the layered one.
The four demonstrations in the write-up, summarised without the requests. Source: YesWeHack, 17 September 2026.
- Demonstration
- Cache deception with no click
- What had to be true in the lab
- A global key that includes a request header, a rule limiting one path to the local address, the restricted page already cached, and a 30 second lifetime
- Effect it names
- A requester who is not allowed receives the cached restricted page
- Demonstration
- Cache-poisoned denial of service
- What had to be true in the lab
- The colliding request arrives before real users have cached the target page, and the origin answers it with a not-found error that is then cached
- Effect it names
- Later visitors receive the cached error until it expires
- Demonstration
- Stored cross-site scripting via scheme and host
- What had to be true in the lab
- Key starts with scheme then host, Nginx accepts an attacker-set Host header, the same content is served on ports 80 and 443 without a redirect, and the backend reflects the host into a script source on a cacheable page
- Effect it names
- Script from a domain the attacker controls runs when a victim loads the cached page
- Demonstration
- Edge bypass to an origin cache
- What had to be true in the lab
- Cloudflare in front of Nginx. An Authorization header makes Cloudflare bypass its cache, while Nginx does not apply the same rule unless configured to
- Effect it names
- The origin cache can be poisoned, and a later request may receive the entry once the edge copy is absent or expired
| Demonstration | What had to be true in the lab | Effect it names |
|---|---|---|
| Cache deception with no click | A global key that includes a request header, a rule limiting one path to the local address, the restricted page already cached, and a 30 second lifetime | A requester who is not allowed receives the cached restricted page |
| Cache-poisoned denial of service | The colliding request arrives before real users have cached the target page, and the origin answers it with a not-found error that is then cached | Later visitors receive the cached error until it expires |
| Stored cross-site scripting via scheme and host | Key starts with scheme then host, Nginx accepts an attacker-set Host header, the same content is served on ports 80 and 443 without a redirect, and the backend reflects the host into a script source on a cacheable page | Script from a domain the attacker controls runs when a victim loads the cached page |
| Edge bypass to an origin cache | Cloudflare in front of Nginx. An Authorization header makes Cloudflare bypass its cache, while Nginx does not apply the same rule unless configured to | The origin cache can be poisoned, and a later request may receive the entry once the edge copy is absent or expired |
Two phrases in the write-up deserve to be kept next to the table. On the stored script case it says each condition is "relatively common" but the exploit "requires all of them to exist together". On severity it lists four things it depends on: the affected endpoint, the cache lifetime, the number of users sharing the cache and whether the poisoned response propagates through edge or origin layers. It gives no score, no count of affected sites and no victim.
What is stated, and what is not
Match each verb to the evidence. This table sets the record next to the gaps in it.
Stated and not stated, from the YesWeHack write-up read in full on 5 October 2026, with KEV and nginx.org read the same afternoon.
- Question
- Is the technique real?
- Stated
- Two requests can share one key when fragments are joined without boundaries; four lab demonstrations
- Not stated
- How many deployed caches are built that way
- Question
- Which products?
- Stated
- Nginx caches in a lab; Cloudflare in front of Nginx for one demonstration
- Not stated
- Any named production site, customer or software version; any vendor acknowledgement
- Question
- Is there a CVE or advisory?
- Stated
- None cited in the write-up
- Not stated
- Whether the Nginx project treats the pattern as a flaw. Its advisory page mentions no cache issue (read 5 October)
- Question
- Is it exploited?
- Stated
- Examples reproduced in a controlled environment
- Not stated
- Any attack outside the lab. KEV 2026.10.04 has no entry naming Nginx or key collisions
- Question
- How severe?
- Stated
- Depends on endpoint, cache lifetime, users sharing the cache and propagation across layers
- Not stated
- A score, a count of affected sites, or a rating of any one demonstration
- Question
- What is the fix?
- Stated
- Keep each component's boundary and meaning before any hash is taken
- Not stated
- A tested change for any product, or whether any vendor documentation will change
- Question
- Is the idea new?
- Stated
- Called an underestimated technique; Kettle's 2020 paper is listed in its references
- Not stated
- That it is the first description of the idea, or what the 2020 paper found about key injection
- Question
- Did the lab backend send private or no-store?
- Stated
- The restricted page was cached under a 30 second lifetime in the lab configuration
- Not stated
- Whether the backend sent Cache-Control private or no-store, or why the page was cacheable
| Question | Stated | Not stated |
|---|---|---|
| Is the technique real? | Two requests can share one key when fragments are joined without boundaries; four lab demonstrations | How many deployed caches are built that way |
| Which products? | Nginx caches in a lab; Cloudflare in front of Nginx for one demonstration | Any named production site, customer or software version; any vendor acknowledgement |
| Is there a CVE or advisory? | None cited in the write-up | Whether the Nginx project treats the pattern as a flaw. Its advisory page mentions no cache issue (read 5 October) |
| Is it exploited? | Examples reproduced in a controlled environment | Any attack outside the lab. KEV 2026.10.04 has no entry naming Nginx or key collisions |
| How severe? | Depends on endpoint, cache lifetime, users sharing the cache and propagation across layers | A score, a count of affected sites, or a rating of any one demonstration |
| What is the fix? | Keep each component's boundary and meaning before any hash is taken | A tested change for any product, or whether any vendor documentation will change |
| Is the idea new? | Called an underestimated technique; Kettle's 2020 paper is listed in its references | That it is the first description of the idea, or what the 2020 paper found about key injection |
| Did the lab backend send private or no-store? | The restricted page was cached under a 30 second lifetime in the lab configuration | Whether the backend sent Cache-Control private or no-store, or why the page was cacheable |
The press coverage ran ahead of that record. GBHackers and Cybersecurity News, both dated 21 September, used headlines of the form "Lets Hackers" and "Hackers Can". Those describe a capability shown in a lab. The Hacker News bulletin of 1 October is more careful: it describes a technique and names no product, which also means it never says Nginx.
Class, product bug and exploitation are three separate questions
A research write-up can answer one of three questions. Is the pattern real? Is a particular product wrong and fixed? Is anyone using it? This one answers the first.
The class is older than the write-up. In his 2020 paper, Kettle describes Akamai bundling the components of a key into one string "without bothering to escape delimiters", shows two different requests that share a key, and says Akamai was working on a fix. For Cloudflare he reports that its security team said the documentation did appear to be wrong about the key, and that the company then patched the issue by escaping delimiters. The paper page is marked updated on 3 September 2025 and does not say whether Akamai's fix shipped. PortSwigger's Web Security Academy teaches the same idea under the heading Cache key injection, with a lab. The 2026 write-up differs in a way that is worth stating exactly: its Nginx keys have no delimiter between the variables, and it frames the problem as exploiting keyed fragments rather than unkeyed ones.
Both publishers sell something beside this research. YesWeHack runs a bug bounty and testing platform, and its page carries those product links. PortSwigger sells Burp Suite, and its Academy page ends with an invitation to try it. That is context, not a criticism of the research.
The product-bug record exists, but not for this write-up. The write-up cites no CVE, so we searched NVD for the same shape of bug. The keyword searches "cache key collision" and "cache key injection" returned 12 and 6 records on 5 October, and four of them describe cache keys that collide because they are built ambiguously, without enough uniqueness or without validation. None is cited by YesWeHack and none is an Nginx proxy cache. The list is a sample, not a census.
Cache key collision bugs with CVE numbers, found by our NVD search on 5 October 2026. Exploitation column is the CISA-ADP SSVC field as NVD shows it.
- Record and published
- CVE-2026-39972, 9 April 2026
- Product and fix
- Mercure, fixed in 0.22.0
- What the record says
- Key built by joining two names with an underscore. Both can contain underscores, so two different pairs give one key
- Exploitation (CISA-ADP)
- none, assessed 9 April 2026
- Record and published
- CVE-2026-25480, 9 February 2026
- Product and fix
- Litestar FileStore, fixed in 2.20.0
- What the record says
- Keys mapped to filenames without separators, so one URL can serve another's cached response
- Exploitation (CISA-ADP)
- none, assessed 10 February 2026
- Record and published
- CVE-2026-35039, 6 April 2026
- Product and fix
- fast-jwt, fixed in 6.2.0
- What the record says
- A custom key builder that does not make unique keys can return one user's claims for another token
- Exploitation (CISA-ADP)
- none, assessed 7 April 2026
- Record and published
- CVE-2020-13254, 3 June 2020
- Product and fix
- Django 2.2.13 and 3.0.7
- What the record says
- A memcached backend without key validation can collide keys, with potential data leakage
- Exploitation (CISA-ADP)
- no SSVC entry on the record
| Record and published | Product and fix | What the record says | Exploitation (CISA-ADP) |
|---|---|---|---|
| CVE-2026-39972, 9 April 2026 | Mercure, fixed in 0.22.0 | Key built by joining two names with an underscore. Both can contain underscores, so two different pairs give one key | none, assessed 9 April 2026 |
| CVE-2026-25480, 9 February 2026 | Litestar FileStore, fixed in 2.20.0 | Keys mapped to filenames without separators, so one URL can serve another's cached response | none, assessed 10 February 2026 |
| CVE-2026-35039, 6 April 2026 | fast-jwt, fixed in 6.2.0 | A custom key builder that does not make unique keys can return one user's claims for another token | none, assessed 7 April 2026 |
| CVE-2020-13254, 3 June 2020 | Django 2.2.13 and 3.0.7 | A memcached backend without key validation can collide keys, with potential data leakage | no SSVC entry on the record |
Two lessons sit in that table. First, where a maintainer treated a collision as a flaw, the record shows a CVE and a fixed version. Nothing like that exists on the record we read for the Nginx demonstrations. Second, the Mercure row shows that a separator is not a cure by itself. An underscore was used and still collided, because values could contain underscores. The scores also differ: GitHub's CNA scored fast-jwt 9.1 and Litestar 6.5 under CVSS 3.1 and Mercure 7.1 under CVSS 4.0, while NVD scored Django 5.9 under 3.1. The class has no single severity, which fits the write-up's own point that impact depends on the endpoint.
Nothing on the record says it is used. KEV 2026.10.04 contains no entry whose vendor, product, name or description mentions Nginx, key collision, cache poisoning or cache deception. The nearest are two entries from August 2022 for different bugs: CVE-2022-22536, HTTP request smuggling in SAP products that KEV says can poison intermediary web caches, and CVE-2022-27924, memcache command injection in Zimbra that overwrites cached entries. Neither is this technique. We found no statement from the Nginx project, F5, Cloudflare or Akamai on the write-up, and a missing statement is not evidence either way. The accurate verb for this research is demonstrated, not exploited.
A cache is not a performance layer
The friendly names do the damage. "Cache" and "CDN" read as speed. The NCSC's denial of service guidance, last reviewed on 25 March 2024, tells organisations to consider deploying a CDN and spends its warning on supplier trust and hiding the origin. It describes a CDN as serving static content and managing dynamic requests, and it does not mention how a CDN decides who shares an answer. We searched the page for the word cache and found none.
The standards say it more plainly than the labels do. RFC 9111 defines the cache key as the information a cache uses to choose a response, and its section 7.3 warns that deployment flaws "often led to by the misunderstanding of cache operation" can expose sensitive information to unauthorised parties. Its mechanism for varying a response by header, the Vary field, compares field by field: a stored response may be reused only if the nominated request header fields match those in the original request. RFC 9110 puts it as "Vary expands the cache key". On our reading, that wording leaves no room to blur a path into a header. The blurring happens in local key strings that a person writes, which is inference on our part, not something the RFCs say.
Application security standards have the same reading. OWASP's ASVS 5.0.0 asks, at level 2 in requirement 14.2.2, that applications stop sensitive data being cached in server components "such as load balancers and application caches", and, at level 3 in 14.2.5, that caching only covers responses that do not contain "sensitive, dynamic content". OWASP's Top 10:2025 puts broken access control first and says access control is only effective when implemented in trusted server-side code, where an attacker cannot modify the check. A cache that answers before the check runs sits outside that code, on our reading.
In the write-up's lab, the rule that said local requests only was written on one path. The cache key was global. A request that named a different path never met the rule, and the key it produced matched the stored page. That is what we mean by a component that decides which requests share an answer being part of the access control. The framing is ours. The write-up reports the bypass of the rule and does not use these words.
The same shape appeared in an earlier briefing on a WAF rule that blocked one spelling of a path while the application accepted another. A control that decides on a string is only as strong as the agreement between that string and what the next component does with it.
What is cached at all limits the exposure. Cloudflare's documentation says it caches by file extension rather than content type and does not cache HTML or JSON by default, does not cache a response marked private, no-store or no-cache, and respects the origin's cache headers unless an Edge Cache TTL rule overrides them. In Nginx, the source we read marks a response not cacheable when Cache-Control contains no-cache, no-store or private, unless X-Accel-Expires applies, and the documentation says proxy_ignore_headers can switch that processing off. So the headers an application sends on personalised pages, and whether each layer obeys them, matter as much as the key. The write-up does not say what the lab backend sent.
What the vendor documents say about how keys are joined
We read the current pages for five products to see what each says about key composition and delimiters. The table states only what we read, and says "not discussed" where a page is silent.
Vendor documentation read on 5 October 2026. Varnish source read on its GitHub master branch the same day.
- Product
- Nginx, proxy module (nginx.org)
- Key composition, as documented
- proxy_cache_key sets a string. Default is scheme, proxy host and request URI. The cache file name is an MD5 of the key
- Delimiters, as read
- Not discussed. The page's own example has a space before the cookie variable and none between host and URI
- Product
- NGINX Plus guide (docs.nginx.com)
- Key composition, as documented
- Same directive. Its example joins host, request URI and a cookie value
- Delimiters, as read
- Not discussed. The example has no separator between the three variables
- Product
- Cloudflare, Cache Keys
- Key composition, as documented
- Default key: scheme, host, URI with query, Origin header, some method-override and forwarded headers. Custom keys add headers, cookies, host and user
- Delimiters, as read
- Not discussed on the page. It recommends Normalize URLs to origin with custom keys, to prevent cache poisoning
- Product
- Fastly, vcl_hash and key guide
- Key composition, as documented
- Default: URL and Host, plus a generation value for purging. Listed keys are combined to make a single hash
- Delimiters, as read
- Not discussed. The guide says Vary is generally better than modifying the hash, for example for login state
- Product
- Akamai, Property Manager
- Key composition, as documented
- Hostname and path are required. Query string, headers, cookies and variables are optional
- Delimiters, as read
- Not discussed. Kettle's 2020 paper showed an internal key with double underscores between parts
- Product
- Varnish, reference and source
- Key composition, as documented
- hash_data adds an input to the hash. The built-in VCL adds host and URL
- Delimiters, as read
- Reference is silent. The source adds a field separator after each hash_data call, with a comment about making the hash harder to manipulate. Strings joined inside one call are not separated
| Product | Key composition, as documented | Delimiters, as read |
|---|---|---|
| Nginx, proxy module (nginx.org) | proxy_cache_key sets a string. Default is scheme, proxy host and request URI. The cache file name is an MD5 of the key | Not discussed. The page's own example has a space before the cookie variable and none between host and URI |
| NGINX Plus guide (docs.nginx.com) | Same directive. Its example joins host, request URI and a cookie value | Not discussed. The example has no separator between the three variables |
| Cloudflare, Cache Keys | Default key: scheme, host, URI with query, Origin header, some method-override and forwarded headers. Custom keys add headers, cookies, host and user | Not discussed on the page. It recommends Normalize URLs to origin with custom keys, to prevent cache poisoning |
| Fastly, vcl_hash and key guide | Default: URL and Host, plus a generation value for purging. Listed keys are combined to make a single hash | Not discussed. The guide says Vary is generally better than modifying the hash, for example for login state |
| Akamai, Property Manager | Hostname and path are required. Query string, headers, cookies and variables are optional | Not discussed. Kettle's 2020 paper showed an internal key with double underscores between parts |
| Varnish, reference and source | hash_data adds an input to the hash. The built-in VCL adds host and URL | Reference is silent. The source adds a field separator after each hash_data call, with a comment about making the hash harder to manipulate. Strings joined inside one call are not separated |
The pattern is plain. The documentation describes what goes into a key. In nothing we read does it say how the pieces are joined. The property that decides whether this bug class applies is the one the manuals leave out, and only the Varnish source states it, for one function. Documentary silence is not a vulnerability. It is a reason to test your own deployment, because you cannot read the answer from the manual. It is also worth noticing that the NGINX Plus guide's own example has the shape the write-up calls ambiguous: adjacent request-controlled values with nothing between them. Whether any given deployment of it is exploitable depends on what else is true, as the write-up's own conditions show.
Ambiguous: proxy_cache_key "$scheme$host$request_uri$http_accept";
Bounded: proxy_cache_key "$scheme|$host|$request_uri|$http_accept";
The UK reading: what the guidance covers and what it leaves to you
This matters most to UK organisations that put a CDN or a reverse proxy in front of authenticated or personalised content: banks, councils, retailers, NHS portals. We have no evidence that any of them is affected. They are the ones for whom a wrong sharing decision would mean one person's page reaching another.
NCSC. We searched ncsc.gov.uk with two queries on CDNs, caching and web cache poisoning and read three pages: the denial of service guidance (published 20 January 2019, reviewed 25 March 2024), Building and operating a secure online service (2 March 2022) and the Application development collection. None mentions cache keys or caching of personalised content. The first recommends considering a CDN and warns that the CDN hosts your users' sessions and holds your private keys or a certificate trusted as if it were yours. The second points to the OWASP Top 10. Nothing relevant to cache key construction was found; a page we did not find could exist.
Cyber Essentials. Version 3.3 of the requirements, effective 27 April 2026, says publicly available commercial web applications are in scope by default and that bespoke and custom components of web applications are out of scope. The text does not mention caches, CDNs or reverse proxies. On our reading, a Cyber Essentials certificate therefore tells you nothing about how your cache keys are built.
ICO and UK GDPR. Article 32(1) requires measures appropriate to the risk, including in 32(1)(d) "a process for regularly testing, assessing and evaluating the effectiveness" of them, and Article 32(2) names unauthorised disclosure of or access to personal data among the risks to assess. A cache that serves one person's page to another is that risk. The ICO's guide says the testing can use vulnerability scanning and penetration testing, that its scope should suit what you do and the data you process, and that results should be documented and acted on. It does not mention caches, and the page says the guidance is under review because of the Data (Use and Access) Act. What to do with a real exposure is a matter for your data protection officer and legal advice, not for this briefing.
The practical use of the research for a UK security lead is as a test case for those obligations: a scoped penetration test or bounty item that asks specifically about cached personalised content.
What to do, in the order worth doing. The order and the weights are our judgement, not a standard.
Take this with you
Checklist for a CDN or reverse proxy in front of personalised content
- Inventory every cache between the user and the application, at every layer: CDN, reverse proxy, framework or application cache, and any cache a supplier runs for you. Record who owns each configuration.
- List the authenticated and personalised responses and confirm each is sent with Cache-Control private or no-store. Then confirm each layer obeys it: Nginx can be told to ignore Cache-Control with proxy_ignore_headers, and a CDN rule can override the origin's headers.
- Read how each layer builds its key. Flag any custom key string in which two or more request-controlled values sit side by side with nothing between them, including strings copied from vendor examples.
- Where a key joins fields, use a boundary that no value can contain, or encode each field first. A bare separator is not enough if values can contain it. Prefer Vary to a custom key for language or login variants where the platform allows it.
- Test through a scoped bug bounty or penetration test item on a staging cache that mirrors production, with a unique cache buster on every request. No live poisoning of production caches: PortSwigger warns that testing a live site can serve your generated responses to real users.
- Monitor cache hit status on private endpoints. A hit on an authenticated path is a finding. Also watch for cached error responses on pages that normally succeed.
- Set short lifetimes on risky endpoints to limit how long a collision lasts. Treat the lifetime as a damper, not a fix: PortSwigger notes that an attacker can usually script re-poisoning.
PortSwigger's prevention advice adds a question that costs nothing to ask: if caching is only on "because it was switched on by default when you adopted a CDN", does it reflect what you need?
What we could not verify
The question this leaves
Which of your caches decides that two different requests may share one answer, and who last read the line that builds its key?
Key facts
Sources
- PrimaryCache key injection: Smuggling poison through the door, YesWeHack Lab, published 17 September 2026 (page metadata: published and modified 11:27 UTC that day). Read in full: the claims, the four demonstrations, the lab configurations, the stated conditions, the mitigation and the references.YesWeHackaccessed 2026-10-05
- PrimaryJames Kettle, Web Cache Entanglement: Novel Pathways to Poisoning, published 5 August 2020, updated 3 September 2025. Read for its Cache Key Injection sections on Akamai and Cloudflare and the baseline cache key vocabulary.PortSwigger Researchaccessed 2026-10-05
- PrimaryWeb cache poisoning topic page: what a cache key is, unkeyed inputs, the testing caution about live sites, and the prevention advice about default CDN caching.PortSwigger Web Security Academyaccessed 2026-10-05
- PrimaryExploiting cache implementation flaws: the Cache key injection section, which describes keyed components bundled into one string without escaping delimiters.PortSwigger Web Security Academyaccessed 2026-10-05
- PrimaryRFC 9111, HTTP Caching (June 2022): section 2 on the cache key, 3.5 on Authorization, 4.1 on Vary, 5.2.2.5 and 5.2.2.7 on no-store and private, 7.1 and 7.3 on poisoning and sensitive information.IETFaccessed 2026-10-05
- PrimaryRFC 9110, HTTP Semantics (June 2022): section 12.5.5 on the Vary header field.IETFaccessed 2026-10-05
- PrimaryNginx ngx_http_proxy_module documentation: proxy_cache_key and its default, MD5 of the key naming cache files, response headers that set caching, proxy_ignore_headers, proxy_no_cache and proxy_cache_bypass.nginx.orgaccessed 2026-10-05
- PrimaryNGINX Plus content caching guide: the example proxy_cache_key lines that join variables without separators.F5 NGINXaccessed 2026-10-05
- PrimaryNginx security advisories page, read for any advisory about caching or cache keys. None found on 5 October 2026.nginx.orgaccessed 2026-10-05
- PrimarySource of ngx_http_upstream_process_cache_control on the master branch, read 5 October 2026: a response is marked not cacheable when Cache-Control contains no-cache, no-store or private, unless X-Accel-Expires applies.nginx projectaccessed 2026-10-05
- PrimaryCloudflare Cache Keys documentation, marked last updated 29 September 2026: default key contents, custom keys, and the advice on Normalize URLs to origin.Cloudflareaccessed 2026-10-05
- PrimaryCloudflare default cache behaviour, marked last updated 14 September 2026: what is not cached by default and how origin cache headers are respected.Cloudflareaccessed 2026-10-05
- PrimaryCloudflare Origin Cache Control documentation, marked last updated 30 June 2026: the rule for requests carrying an Authorization header.Cloudflareaccessed 2026-10-05
- PrimaryFastly vcl_hash reference: the default hash of URL and Host, the generation value, and the statement that Vary is generally better than modifying the hash.Fastlyaccessed 2026-10-05
- PrimaryFastly guide to manipulating the cache key: listed keys are combined into one hash, and the risks of redefining the key.Fastlyaccessed 2026-10-05
- PrimaryAkamai Property Manager caching concepts: the elements of a cache key (hostname and path required; query, headers, cookies, variables optional).Akamaiaccessed 2026-10-05
- PrimaryAkamai Cache ID Modification behaviour documentation: which request elements can be added to or removed from the cache key.Akamaiaccessed 2026-10-05
- PrimaryVarnish source (master, read 5 October 2026): VRT_hashdata adds a field separator after each hash_data call, with a comment about making the hash harder to manipulate.Varnish Cache projectaccessed 2026-10-05
- PrimaryVarnish VCL reference source (master, read 5 October 2026): hash_data adds an input to the hash input and the built-in VCL calls it on host and URL; no statement about delimiters.Varnish Cache projectaccessed 2026-10-05
- PrimaryVarnish users guide on hashing: what goes into the hash by default and how hash_data adds to it; no statement about delimiters.Varnish Cacheaccessed 2026-10-05
- PrimaryKEV JSON feed, catalogue version 2026.10.04, released 2026-10-04T18:52:56Z, 1,734 entries, read at 17:00 BST on 5 October 2026: no entry names Nginx or cache key collisions; the nearest entries are CVE-2022-22536 and CVE-2022-27924.CISAaccessed 2026-10-05
- PrimaryNVD record for Mercure CVE-2026-39972 (key built with an underscore separator that values can contain; fixed in 0.22.0); the CISA-ADP SSVC exploitation field read as none at its 9 April 2026 timestamp.NVDaccessed 2026-10-05
- PrimaryNVD record for Litestar CVE-2026-25480 (FileStore keys mapped to filenames without separators; fixed in 2.20.0); SSVC exploitation none at 10 February 2026.NVDaccessed 2026-10-05
- PrimaryNVD record for fast-jwt CVE-2026-35039 (custom cacheKeyBuilder that does not make unique keys; fixed in 6.2.0); SSVC exploitation none at 7 April 2026.NVDaccessed 2026-10-05
- PrimaryNVD record for Django CVE-2020-13254 (memcached backend without key validation can collide keys; fixed in 2.2.13 and 3.0.7).NVDaccessed 2026-10-05
- PrimaryNCSC denial of service guidance, upstream defences, published 20 January 2019 and reviewed 25 March 2024: the CDN section, which does not mention caching of personalised content.NCSCaccessed 2026-10-05
- PrimaryNCSC, Building and operating a secure online service (2 March 2022): points to the OWASP Top 10 and does not mention caches.NCSCaccessed 2026-10-05
- PrimaryCyber Essentials resources page: version 3.3 of the requirements effective 27 April 2026; the v3.3 PDF was read for its scope statement on web applications.NCSCaccessed 2026-10-05
- PrimaryICO, A guide to data security: the testing and evaluation requirement, vulnerability scanning and penetration testing, and the note that the guidance is under review.ICOaccessed 2026-10-05
- PrimaryUK GDPR Article 32, Security of processing: paragraphs 1(d) and 2.legislation.gov.ukaccessed 2026-10-05
- PrimaryOWASP Top 10:2025, A01 Broken Access Control: the description of access control and where it is effective.OWASPaccessed 2026-10-05
- PrimaryOWASP ASVS 5.0.0 chapter V14 Data Protection: requirements 14.2.2 and 14.2.5 on caching of sensitive data in server components.OWASPaccessed 2026-10-05
- Reported byThreatsDay bulletin of 1 October 2026: the pointer to the YesWeHack research. It names no product and no CVE.The Hacker Newsaccessed 2026-10-05
- Reported byCoverage dated 21 September 2026 under a headline that says the technique lets hackers bypass access controls; used only for how the research was framed in the press.GBHackersaccessed 2026-10-05
- Reported byCoverage dated 21 September 2026 under a headline that says hackers can manipulate cache keys; used only for how the research was framed in the press.Cybersecurity Newsaccessed 2026-10-05


