{"id":"GHSA-6665-2vj3-h76r","kind":"vulnerability","aliases":["GHSA-6665-2vj3-h76r"],"related":[],"title":"Duplicate Advisory: Quadratic-time CPU denial of service in Tree.chomsky_normal_form right-factor binarization via list.pop(0)","description":"## Duplicate Advisory\n\nThis advisory has been withdrawn because it is a duplicate of GHSA-r53h-rw34-8h97. This link is maintained to preserve external references.\n\n## Original Description\nNLTK before 3.10.4 contains a denial of service vulnerability in Tree.chomsky_normal_form that allows remote attackers to exhaust CPU through quadratic-time right-factor binarization using list.pop(0). Attackers can supply a wide flat treebank tree parsed by Tree.fromstring to force tens of seconds of single-threaded CPU consumption, blocking the processing thread.","summary":"NLTK before 3.10.4 has a quadratic-time loop in Tree.chomsky_normal_form that uses list.pop(0) during right-factor binarization. An remote attacker who supplies a wide, flat treebank tree to Tree.fromstring can tie up a thread for tens of seconds.","severity":"high","cvss":7.5,"epss":null,"exploited":false,"exploited_at":null,"products":[{"name":"nltk","fixed":[],"affected":"< 3.10.4","ecosystem":"pypi"}],"ecosystems":["pypi"],"tags":["cwe-400","nlp","nltk","package","python"],"not_affected_if":["method-not-used","trusted-input-only"],"how_to_check":"- Check the installed NLTK version with `pip show nltk`\n- Look for code that calls `Tree.fromstring` on untrusted input followed by `chomsky_normal_form`","fix":"- `nltk` `3.10.4` or later, per the affected range in the advisory data\n- The advisory is withdrawn as a duplicate; the fix is tracked under GHSA-r53h-rw34-8h97","status":"withdrawn","published_at":"2026-11-13T12:31:16+00:00","first_seen_at":"2026-11-14T00:08:54+00:00","triaged_at":"2026-11-14T00:10:24+00:00","updated_at":"2026-11-14T00:10:24+00:00","category":"package","confidence":0.6,"triage":{"at":"2026-11-14T00:10:24Z","model":"claude-haiku-5-5","output":{"fix":"- `nltk` `3.10.4` or later, per the affected range in the advisory data\n- The advisory is withdrawn as a duplicate; the fix is tracked under GHSA-r53h-rw34-8h97","reach":"network","title":"NLTK: crafted tree input exhausts CPU in chomsky_normal_form","impact":"low","summary":"NLTK before 3.10.4 has a quadratic-time loop in Tree.chomsky_normal_form that uses list.pop(0) during right-factor binarization. An remote attacker who supplies a wide, flat treebank tree to Tree.fromstring can tie up a thread for tens of seconds.","audience":"developers","category":"package","nicknames":[],"who_cares":["python","nltk","nlp"],"confidence":0.6,"fix_status":"available","needs_auth":"no","worst_case":"Service thread blocked for tens of seconds by CPU exhaustion","analyst_note":"Advisory is withdrawn as a duplicate; the canonical entry GHSA-r53h-rw34-8h97 should carry the full detail.","how_to_check":"- Check the installed NLTK version with `pip show nltk`\n- Look for code that calls `Tree.fromstring` on untrusted input followed by `chomsky_normal_form`","plain_action":"","product_name":"","needs_analyst":false,"not_affected_if":["trusted-input-only","method-not-used"],"who_is_affected":"Applications that parse untrusted treebank input with NLTK's Tree.fromstring and then call chomsky_normal_form are exposed. Projects that only parse their own trusted trees or do not use this method can skip it.","user_interaction":"no","product_ecosystem":"","needs_special_setup":"no","severity_if_unknown":"unknown"},"cost_usd":0.000772,"input_tokens":4713,"output_tokens":601,"severity_before":"high"},"analyst_status":null,"analyst_note":null,"search":"'-2':23A,29A '-400':35B '-6665':22A,28A '0':20A,56B,141C '3.10.4':42B,113C '8h97':100C 'advisori':2A,84C,86C 'allow':125C 'attack':64B,127C,142C 'binar':17A,61B,138C 'block':164C 'consumpt':163C 'contain':114C 'cpu':6A,130C,162C 'cwe':34B 'denial':7A,116C 'descript':110C 'duplic':1A,83C,94C 'exhaust':129C 'extern':107C 'factor':16A,60B,137C 'flat':69B,147C 'forc':154C 'form':13A,52B,123C 'ghsa':21A,27A,97C 'ghsa-r53h-rw34-8h97':96C 'h76r':26A,32A 'link':102C 'list.pop':19A,55B,140C 'loop':48B 'maintain':104C 'nlp':36B 'nltk':33A,37B,40B,111C 'normal':12A,51B,122C 'origin':109C 'packag':38B 'pars':150C 'preserv':106C 'process':166C 'python':39B 'quadrat':4A,46B,133C 'quadratic-tim':3A,45B,132C 'r53h':98C 'refer':108C 'remot':63B,126C 'right':15A,59B,136C 'right-factor':14A,58B,135C 'rw34':99C 'second':82B,157C 'servic':9A,118C 'singl':160C 'single-thread':159C 'suppli':66B,144C 'ten':80B,155C 'thread':78B,161C,167C 'tie':75B 'time':5A,47B,134C 'tree':71B,149C 'tree.chomsky':11A,50B,121C 'tree.fromstring':73B,152C 'treebank':70B,148C 'use':54B,139C 'via':18A 'vj3':25A,31A 'vj3-h76r':24A,30A 'vulner':119C 'wide':68B,146C 'withdrawn':89C","nicknames":[],"mitigations":[],"who_affected":"Applications that parse untrusted treebank input with NLTK's Tree.fromstring and then call chomsky_normal_form are exposed. Projects that only parse their own trusted trees or do not use this method can skip it.","tier":"B","verified":{},"analyst_revisit_at":null,"fix_status":"available","audience":"developers","plain_action":null,"pkeys":["nltk"],"ptokens":["nltk"],"labels":["cwe400","high","nlp","nltk","package","pypi","python"],"campaign_type":null,"search_a":"'-2':23A,29A '-6665':22A,28A '0':20A 'advisori':2A 'binar':17A 'cpu':6A 'denial':7A 'duplic':1A 'factor':16A 'form':13A 'ghsa':21A,27A 'h76r':26A,32A 'list.pop':19A 'nltk':33A 'normal':12A 'quadrat':4A 'quadratic-tim':3A 'right':15A 'right-factor':14A 'servic':9A 'time':5A 'tree.chomsky':11A 'via':18A 'vj3':25A,31A 'vj3-h76r':24A,30A","search_b":"'-400':35B '0':56B '3.10.4':42B 'attack':64B 'binar':61B 'cwe':34B 'factor':60B 'flat':69B 'form':52B 'list.pop':55B 'loop':48B 'nlp':36B 'nltk':37B,40B 'normal':51B 'packag':38B 'python':39B 'quadrat':46B 'quadratic-tim':45B 'remot':63B 'right':59B 'right-factor':58B 'second':82B 'suppli':66B 'ten':80B 'thread':78B 'tie':75B 'time':47B 'tree':71B 'tree.chomsky':50B 'tree.fromstring':73B 'treebank':70B 'use':54B 'wide':68B","search_c":"'0':141C '3.10.4':113C '8h97':100C 'advisori':84C,86C 'allow':125C 'attack':127C,142C 'binar':138C 'block':164C 'consumpt':163C 'contain':114C 'cpu':130C,162C 'denial':116C 'descript':110C 'duplic':83C,94C 'exhaust':129C 'extern':107C 'factor':137C 'flat':147C 'forc':154C 'form':123C 'ghsa':97C 'ghsa-r53h-rw34-8h97':96C 'link':102C 'list.pop':140C 'maintain':104C 'nltk':111C 'normal':122C 'origin':109C 'pars':150C 'preserv':106C 'process':166C 'quadrat':133C 'quadratic-tim':132C 'r53h':98C 'refer':108C 'remot':126C 'right':136C 'right-factor':135C 'rw34':99C 'second':157C 'servic':118C 'singl':160C 'single-thread':159C 'suppli':144C 'ten':155C 'thread':161C,167C 'time':134C 'tree':149C 'tree.chomsky':121C 'tree.fromstring':152C 'treebank':148C 'use':139C 'vulner':119C 'wide':146C 'withdrawn':89C","cause_entry":null,"cause_path":null,"disclosures_checked_at":null,"first_public_at":"2026-11-13T12:31:16+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-6665-2vj3-h76r","url":"https://github.com/advisories/GHSA-6665-2vj3-h76r","severity":"high","published_at":"2026-11-13T12:31:16+00:00","modified_at":"2026-11-14T00:06:58+00:00","first_seen_at":"2026-11-14T00:08:54+00:00","fetched_at":"2026-11-14T00:08:54+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"}