{"id":"CVE-2026-125105","kind":"vulnerability","aliases":["CVE-2026-125105","GHSA-92hv-j533-69wc"],"related":[],"title":"Wagtail: Identification of documents by SHA1 hash","description":"### Impact\nBy passing specific HTTP headers to the document serve URL endpoint, an attacker was able to determine whether a document with a given ID matched a specified SHA1 hash, regardless of any permission restrictions on the document or knowing its filename. This could allow an attacker to determine whether a document with a specific known hash is present in the Wagtail document library.\n\nThis vulnerability does not expose the document's contents or any metadata beyond the already known SHA1 hash, and does not expose information about any documents for which the attacker does not know the SHA1 hash.\n\n### Patches\nPatched versions have been released as Wagtail 7.0.9, 7.3.4, 7.4.3 and 8.0rc2.\n\n### Workarounds\nSite owners who are unable to upgrade can strip `If-Match` and `If-None-Match` from anonymous requests to `/documents/` at the reverse proxy, or use a custom document model without a `file_hash` attribute.\n\n### Acknowledgements\nMany thanks to Anand Himanshu for reporting this issue.\n\n### For more information\nIf you have any questions or comments about this advisory:\n\n* Visit Wagtail's [support channels](https://docs.wagtail.org/en/stable/support.html)\n* Email us at [security@wagtail.org](mailto:security@wagtail.org) (view our [security policy](https://github.com/wagtail/wagtail/security/policy) for more information).","summary":"Passing specific HTTP headers to Wagtail's document serve URL let an attacker check whether a document with a given ID matches a SHA1 hash they already know, without permission checks. The attacker learns only that match result, not the document contents or metadata.","severity":"low","cvss":3.7,"epss":null,"exploited":false,"exploited_at":null,"products":[{"name":"wagtail","fixed":["7.0.9"],"affected":"< 7.0.9","ecosystem":"pypi"},{"name":"wagtail","fixed":["7.3.4"],"affected":">= 7.1, < 7.3.4","ecosystem":"pypi"},{"name":"wagtail","fixed":["7.4.3"],"affected":">= 7.4, < 7.4.3","ecosystem":"pypi"},{"name":"wagtail","fixed":["8.0rc2"],"affected":"= 8.0rc1","ecosystem":"pypi"}],"ecosystems":["pypi"],"tags":["cwe-280","package","python","self-hosted","wagtail"],"not_affected_if":["auth-required","custom-document-model","patched-version"],"how_to_check":"- Check the installed version with `pip show wagtail`\n- Look for `file_hash` on your document model and whether requests to `/documents/` pass `If-Match` or `If-None-Match` headers from anonymous users\n- Affected ranges: below `7.0.9`, `>= 7.1` and below `7.3.4`, `>= 7.4` and below `7.4.3`, and `8.0rc1`","fix":"- Wagtail `7.0.9` for the 7.0 line\n- Wagtail `7.3.4` for the 7.3 line\n- Wagtail `7.4.3` for the 7.4 line\n- Wagtail `8.0rc2` for the 8.0 pre-release line","status":"open","published_at":"2026-08-20T18:45:09+00:00","first_seen_at":"2026-11-09T21:29:57+00:00","triaged_at":"2026-11-09T21:31:19+00:00","updated_at":"2026-11-09T21:31:19+00:00","category":"package","confidence":0.8,"triage":{"at":"2026-11-09T21:31:19Z","model":"claude-haiku-5-5","output":{"fix":"- Wagtail `7.0.9` for the 7.0 line\n- Wagtail `7.3.4` for the 7.3 line\n- Wagtail `7.4.3` for the 7.4 line\n- Wagtail `8.0rc2` for the 8.0 pre-release line","reach":"internet","title":"Wagtail: document serve endpoint lets attackers confirm documents by SHA1 hash","impact":"low","summary":"Passing specific HTTP headers to Wagtail's document serve URL let an attacker check whether a document with a given ID matches a SHA1 hash they already know, without permission checks. The attacker learns only that match result, not the document contents or metadata.","audience":"developers","category":"package","nicknames":[],"who_cares":["wagtail","python","self-hosted"],"confidence":0.8,"fix_status":"available","needs_auth":"no","worst_case":"Attacker confirms whether known-hash documents exist in the library","analyst_note":"","how_to_check":"- Check the installed version with `pip show wagtail`\n- Look for `file_hash` on your document model and whether requests to `/documents/` pass `If-Match` or `If-None-Match` headers from anonymous users\n- Affected ranges: below `7.0.9`, `>= 7.1` and below `7.3.4`, `>= 7.4` and below `7.4.3`, and `8.0rc1`","plain_action":"","product_name":"","needs_analyst":false,"not_affected_if":["patched-version","custom-document-model","auth-required"],"who_is_affected":"Sites running Wagtail document libraries are exposed when the document serve endpoint is reachable anonymously and the app uses the default document model with a file_hash attribute. Sites on patched versions, or using a custom document model without file_hash, can skip it. The advisory suggests an interim workaround of stripping If-Match and If-None-Match from anonymous requests to /documents/ at the reverse proxy.","user_interaction":"no","product_ecosystem":"","needs_special_setup":"no","severity_if_unknown":"unknown"},"cost_usd":0.000864,"input_tokens":5079,"output_tokens":713,"severity_before":"low"},"analyst_status":null,"analyst_note":null,"search":"'-125105':10A,18A '-2026':9A,17A '-280':24B '/documents':211C '/en/stable/support.html)':257C '/wagtail/wagtail/security/policy)':270C '69wc':15A '7.0.9':183C '7.3.4':184C '7.4.3':185C '8.0':187C '92hv':13A 'abl':90C 'acknowledg':227C 'advisori':249C 'allow':119C 'alreadi':57B,153C 'anand':231C 'anonym':208C 'attack':43B,63B,88C,121C,168C 'attribut':226C 'beyond':151C 'channel':254C 'check':44B,61B 'comment':246C 'content':72B,147C 'could':118C 'custom':219C 'cve':8A,16A 'cwe':23B 'determin':92C,123C 'docs.wagtail.org':256C 'docs.wagtail.org/en/stable/support.html)':255C 'document':4A,38B,47B,71B,83C,95C,112C,126C,137C,145C,164C,220C 'email':258C 'endpoint':86C 'expos':143C,160C 'file':224C 'filenam':116C 'ghsa':12A 'ghsa-92hv-j533-69wc':11A 'github.com':269C 'github.com/wagtail/wagtail/security/policy)':268C 'given':50B,98C 'hash':7A,55B,104C,131C,156C,174C,225C 'header':34B,80C 'himanshu':232C 'host':29B 'http':33B,79C 'id':51B,99C 'identif':2A 'if-match':199C 'if-none-match':203C 'impact':75C 'inform':161C,239C,273C 'issu':236C 'j533':14A 'know':58B,114C,171C 'known':130C,154C 'learn':64B 'let':41B 'librari':138C 'mailto':262C 'mani':228C 'match':52B,67B,100C,201C,206C 'metadata':74B,150C 'model':221C 'none':205C 'owner':191C 'packag':25B 'pass':31B,77C 'patch':175C,176C 'permiss':60B,108C 'polici':267C 'present':133C 'proxi':215C 'python':26B 'question':244C 'rc2':188C 'regardless':105C 'releas':180C 'report':234C 'request':209C 'restrict':109C 'result':68B 'revers':214C 'secur':266C 'security@wagtail.org':261C,263C 'self':28B 'self-host':27B 'serv':39B,84C 'sha1':6A,54B,103C,155C,173C 'site':190C 'specif':32B,78C,129C 'specifi':102C 'strip':198C 'support':253C 'thank':229C 'unabl':194C 'upgrad':196C 'url':40B,85C 'us':259C 'use':217C 'version':177C 'view':264C 'visit':250C 'vulner':140C 'wagtail':1A,19A,20A,21A,22A,30B,36B,136C,182C,251C 'whether':45B,93C,124C 'without':59B,222C 'workaround':189C","nicknames":[],"mitigations":[],"who_affected":"Sites running Wagtail document libraries are exposed when the document serve endpoint is reachable anonymously and the app uses the default document model with a file_hash attribute. Sites on patched versions, or using a custom document model without file_hash, can skip it. The advisory suggests an interim workaround of stripping If-Match and If-None-Match from anonymous requests to /documents/ at the reverse proxy.","tier":"C","verified":{},"analyst_revisit_at":null,"fix_status":"available","audience":"developers","plain_action":null,"pkeys":["wagtail"],"ptokens":["wagtail"],"labels":["cwe280","low","package","pypi","python","selfhosted","wagtail"],"campaign_type":null,"search_a":"'-125105':10A,18A '-2026':9A,17A '69wc':15A '92hv':13A 'cve':8A,16A 'document':4A 'ghsa':12A 'ghsa-92hv-j533-69wc':11A 'hash':7A 'identif':2A 'j533':14A 'sha1':6A 'wagtail':1A,19A,20A,21A,22A","search_b":"'-280':24B 'alreadi':57B 'attack':43B,63B 'check':44B,61B 'content':72B 'cwe':23B 'document':38B,47B,71B 'given':50B 'hash':55B 'header':34B 'host':29B 'http':33B 'id':51B 'know':58B 'learn':64B 'let':41B 'match':52B,67B 'metadata':74B 'packag':25B 'pass':31B 'permiss':60B 'python':26B 'result':68B 'self':28B 'self-host':27B 'serv':39B 'sha1':54B 'specif':32B 'url':40B 'wagtail':30B,36B 'whether':45B 'without':59B","search_c":"'/documents':211C '/en/stable/support.html)':257C '/wagtail/wagtail/security/policy)':270C '7.0.9':183C '7.3.4':184C '7.4.3':185C '8.0':187C 'abl':90C 'acknowledg':227C 'advisori':249C 'allow':119C 'alreadi':153C 'anand':231C 'anonym':208C 'attack':88C,121C,168C 'attribut':226C 'beyond':151C 'channel':254C 'comment':246C 'content':147C 'could':118C 'custom':219C 'determin':92C,123C 'docs.wagtail.org':256C 'docs.wagtail.org/en/stable/support.html)':255C 'document':83C,95C,112C,126C,137C,145C,164C,220C 'email':258C 'endpoint':86C 'expos':143C,160C 'file':224C 'filenam':116C 'github.com':269C 'github.com/wagtail/wagtail/security/policy)':268C 'given':98C 'hash':104C,131C,156C,174C,225C 'header':80C 'himanshu':232C 'http':79C 'id':99C 'if-match':199C 'if-none-match':203C 'impact':75C 'inform':161C,239C,273C 'issu':236C 'know':114C,171C 'known':130C,154C 'librari':138C 'mailto':262C 'mani':228C 'match':100C,201C,206C 'metadata':150C 'model':221C 'none':205C 'owner':191C 'pass':77C 'patch':175C,176C 'permiss':108C 'polici':267C 'present':133C 'proxi':215C 'question':244C 'rc2':188C 'regardless':105C 'releas':180C 'report':234C 'request':209C 'restrict':109C 'revers':214C 'secur':266C 'security@wagtail.org':261C,263C 'serv':84C 'sha1':103C,155C,173C 'site':190C 'specif':78C,129C 'specifi':102C 'strip':198C 'support':253C 'thank':229C 'unabl':194C 'upgrad':196C 'url':85C 'us':259C 'use':217C 'version':177C 'view':264C 'visit':250C 'vulner':140C 'wagtail':136C,182C,251C 'whether':93C,124C 'without':222C 'workaround':189C","cause_entry":null,"cause_path":null,"disclosures_checked_at":null,"first_public_at":"2026-08-20T18:45:09+00:00","kev":null,"cvss_vector":"CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:L/I:N/A:N","cvss_by":"GitHub","poc_count":0,"sources":[{"source":"ghsa","external_id":"GHSA-92hv-j533-69wc","url":"https://github.com/advisories/GHSA-92hv-j533-69wc","severity":"low","published_at":"2026-08-20T18:45:09+00:00","modified_at":"2026-11-09T21:25:54+00:00","first_seen_at":"2026-11-09T21:29:57+00:00","fetched_at":"2026-11-09T21:42:25+00:00","note":null}],"documents":[{"id":110118,"url":"https://api.github.com/repos/wagtail/wagtail/security-advisories/GHSA-92hv-j533-69wc","title":"Maintainer's advisory: api.github.com","kind":"vendor","source":"ghsa","publisher":"vendor","text":null,"published_at":null,"relation":"advisory","confidence":null,"note":"Maintainer's advisory: api.github.com"},{"id":110119,"url":"https://github.com/wagtail/wagtail/security/advisories/GHSA-92hv-j533-69wc","title":"Maintainer's advisory: github.com","kind":"vendor","source":"ghsa","publisher":"vendor","text":null,"published_at":null,"relation":"advisory","confidence":null,"note":"Maintainer's advisory: github.com"}],"disclosures":[],"exploit_sources":[],"notice":"Free to read, with fair use of about 60 pages a minute. For higher limits or API access: sales@infrastack.ai"}