{"id":"GHSA-4hvg-fv5c-9936","kind":"vulnerability","aliases":["GHSA-4hvg-fv5c-9936"],"related":[],"title":"Duplicate Advisory: Unbounded CPU consumption in NLTK SteppingRecursiveDescentParser.parse() with ambiguous or self-embedding grammars","description":"## Duplicate Advisory\n\nThis advisory has been withdrawn because it is a duplicate of GHSA-8fx7-8jr8-84rv. This link is maintained to preserve external references.\n\n## Original Description\nNLTK before 3.10.4 contains an uncontrolled resource consumption vulnerability in SteppingRecursiveDescentParser.parse() that lacks any max_time deadline or step limit. Attackers influencing the grammar can supply an ambiguous self-embedding grammar and short token input to force unbounded top-down search, pinning CPU cores and exhausting worker pools.","summary":"This advisory is withdrawn as a duplicate of GHSA-8fx7-8jr8-84rv, which covers the same NLTK parser flaw. The original text says an attacker who controls the grammar can supply an ambiguous self-embedding grammar and short input to make SteppingRecursiveDescentParser.parse() run without limit, pinning CPU cores.","severity":"high","cvss":7.5,"epss":null,"exploited":false,"exploited_at":null,"products":[{"name":"nltk","fixed":[],"affected":"<= 3.10.3","ecosystem":"pypi"}],"ecosystems":["pypi"],"tags":["cwe-400","nltk","package","python"],"not_affected_if":["no-stepping-parser","trusted-grammars-only"],"how_to_check":"- Check the installed NLTK version with `pip show nltk`.\n- Search code for `SteppingRecursiveDescentParser` and check whether grammars come from untrusted input.","fix":"- `nltk` before `3.10.4` per the original description; the fixed version in the product data is not stated.","status":"withdrawn","published_at":"2026-11-13T12:31:17+00:00","first_seen_at":"2026-11-13T20:59:21+00:00","triaged_at":"2026-11-13T21:00:18+00:00","updated_at":"2026-11-13T21:00:18+00:00","category":"package","confidence":0.6,"triage":{"at":"2026-11-13T21:00:18Z","model":"claude-haiku-5-5","output":{"fix":"- `nltk` before `3.10.4` per the original description; the fixed version in the product data is not stated.","reach":"unknown","title":"NLTK: parser can be fed grammars that pin CPU indefinitely","impact":"medium","summary":"This advisory is withdrawn as a duplicate of GHSA-8fx7-8jr8-84rv, which covers the same NLTK parser flaw. The original text says an attacker who controls the grammar can supply an ambiguous self-embedding grammar and short input to make SteppingRecursiveDescentParser.parse() run without limit, pinning CPU cores.","audience":"developers","category":"package","nicknames":[],"who_cares":["python","nltk"],"confidence":0.6,"fix_status":"unknown","needs_auth":"unknown","worst_case":"CPU cores pinned and worker pools exhausted by one request","analyst_note":"","how_to_check":"- Check the installed NLTK version with `pip show nltk`.\n- Search code for `SteppingRecursiveDescentParser` and check whether grammars come from untrusted input.","plain_action":"","product_name":"","needs_analyst":false,"not_affected_if":["trusted-grammars-only","no-stepping-parser"],"who_is_affected":"Applications that build NLTK grammars from untrusted input and parse them with SteppingRecursiveDescentParser. Projects that only parse fixed, trusted grammars are not exposed. Use GHSA-8fx7-8jr8-84rv as the live record.","user_interaction":"no","product_ecosystem":"","needs_special_setup":"unknown","severity_if_unknown":"unknown"},"cost_usd":0.000749,"input_tokens":4717,"output_tokens":554,"severity_before":"high"},"analyst_status":null,"analyst_note":null,"search":"'-400':28B '3.10.4':112C '4hvg':18A,23A '84rv':44B,99C '8fx7':42B,97C '8jr8':43B,98C '9936':20A,25A 'advisori':2A,33B,83C,85C 'ambigu':10A,65B,137C 'attack':57B,130C 'consumpt':5A,117C 'contain':113C 'control':59B 'core':81B,155C 'cover':46B 'cpu':4A,80B,154C 'cwe':27B 'deadlin':126C 'descript':109C 'duplic':1A,38B,82C,93C 'embed':14A,68B,140C 'exhaust':157C 'extern':106C 'flaw':51B 'forc':147C 'fv5c':19A,24A 'ghsa':17A,22A,41B,96C 'ghsa-4hvg-fv5c':16A,21A 'ghsa-8fx7-8jr8-84rv':40B,95C 'grammar':15A,61B,69B,133C,141C 'influenc':131C 'input':72B,145C 'lack':122C 'limit':78B,129C 'link':101C 'maintain':103C 'make':74B 'max':124C 'nltk':7A,26A,29B,49B,110C 'origin':53B,108C 'packag':30B 'parser':50B 'pin':79B,153C 'pool':159C 'preserv':105C 'python':31B 'refer':107C 'resourc':116C 'run':76B 'say':55B 'search':152C 'self':13A,67B,139C 'self-embed':12A,66B,138C 'short':71B,143C 'step':128C 'steppingrecursivedescentparser.parse':8A,75B,120C 'suppli':63B,135C 'text':54B 'time':125C 'token':144C 'top':150C 'top-down':149C 'unbound':3A,148C 'uncontrol':115C 'vulner':118C 'withdrawn':35B,88C 'without':77B 'worker':158C","nicknames":[],"mitigations":[],"who_affected":"Applications that build NLTK grammars from untrusted input and parse them with SteppingRecursiveDescentParser. Projects that only parse fixed, trusted grammars are not exposed. Use GHSA-8fx7-8jr8-84rv as the live record.","tier":"B","verified":{},"analyst_revisit_at":null,"fix_status":"unknown","audience":"developers","plain_action":null,"pkeys":["nltk"],"ptokens":["nltk"],"labels":["cwe400","high","nltk","package","pypi","python"],"campaign_type":null,"search_a":"'4hvg':18A,23A '9936':20A,25A 'advisori':2A 'ambigu':10A 'consumpt':5A 'cpu':4A 'duplic':1A 'embed':14A 'fv5c':19A,24A 'ghsa':17A,22A 'ghsa-4hvg-fv5c':16A,21A 'grammar':15A 'nltk':7A,26A 'self':13A 'self-embed':12A 'steppingrecursivedescentparser.parse':8A 'unbound':3A","search_b":"'-400':28B '84rv':44B '8fx7':42B '8jr8':43B 'advisori':33B 'ambigu':65B 'attack':57B 'control':59B 'core':81B 'cover':46B 'cpu':80B 'cwe':27B 'duplic':38B 'embed':68B 'flaw':51B 'ghsa':41B 'ghsa-8fx7-8jr8-84rv':40B 'grammar':61B,69B 'input':72B 'limit':78B 'make':74B 'nltk':29B,49B 'origin':53B 'packag':30B 'parser':50B 'pin':79B 'python':31B 'run':76B 'say':55B 'self':67B 'self-embed':66B 'short':71B 'steppingrecursivedescentparser.parse':75B 'suppli':63B 'text':54B 'withdrawn':35B 'without':77B","search_c":"'3.10.4':112C '84rv':99C '8fx7':97C '8jr8':98C 'advisori':83C,85C 'ambigu':137C 'attack':130C 'consumpt':117C 'contain':113C 'core':155C 'cpu':154C 'deadlin':126C 'descript':109C 'duplic':82C,93C 'embed':140C 'exhaust':157C 'extern':106C 'forc':147C 'ghsa':96C 'ghsa-8fx7-8jr8-84rv':95C 'grammar':133C,141C 'influenc':131C 'input':145C 'lack':122C 'limit':129C 'link':101C 'maintain':103C 'max':124C 'nltk':110C 'origin':108C 'pin':153C 'pool':159C 'preserv':105C 'refer':107C 'resourc':116C 'search':152C 'self':139C 'self-embed':138C 'short':143C 'step':128C 'steppingrecursivedescentparser.parse':120C 'suppli':135C 'time':125C 'token':144C 'top':150C 'top-down':149C 'unbound':148C 'uncontrol':115C 'vulner':118C 'withdrawn':88C 'worker':158C","cause_entry":null,"cause_path":null,"disclosures_checked_at":null,"first_public_at":"2026-11-13T12:31:17+00:00","kev":null,"cvss_vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H","cvss_by":"GitHub","poc_count":0,"sources":[{"source":"ghsa","external_id":"GHSA-4hvg-fv5c-9936","url":"https://github.com/advisories/GHSA-4hvg-fv5c-9936","severity":"high","published_at":"2026-11-13T12:31:17+00:00","modified_at":"2026-11-13T20:57:56+00:00","first_seen_at":"2026-11-13T20:59:21+00:00","fetched_at":"2026-11-13T21:04:31+00:00","note":null}],"documents":[],"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"}