{"id":"GHSA-rg32-vgf9-927c","kind":"vulnerability","aliases":["GHSA-rg32-vgf9-927c"],"related":[],"title":"Duplicate Advisory: Quadratic CPU exhaustion in TreebankWordTokenizer.span_tokenize via list.pop(0) in quote-restore loop","description":"## Duplicate Advisory\n\nThis advisory has been withdrawn because it is a duplicate of GHSA-ffr9-mgrr-wcvr. This link is maintained to preserve external references.\n\n## Original Description\nNLTK from 3.2.5 before 3.10.4 contains an algorithmic complexity vulnerability in TreebankWordTokenizer.span_tokenize that allows remote attackers to cause quadratic CPU consumption through repeated list.pop(0) calls. Attackers can submit long runs of double-quote characters to services span-tokenizing untrusted text, exhausting a CPU core and degrading availability.","summary":"NLTK's TreebankWordTokenizer.span_tokenize uses repeated list.pop(0) calls, so long runs of double-quote characters make CPU use grow quadratically. An attacker who can submit text to a service that span-tokenizes it can exhaust a CPU core and degrade availability.","severity":"medium","cvss":5.3,"epss":null,"exploited":false,"exploited_at":null,"products":[{"name":"nltk","fixed":[],"affected":"< 3.10.4","ecosystem":"pypi"}],"ecosystems":["pypi"],"tags":["cwe-407","nlp","nltk","package","python"],"not_affected_if":["no-untrusted-tokenization","trusted-input-only"],"how_to_check":"- Check the installed NLTK version with `pip show nltk`\n- Search your code for calls to `span_tokenize` on untrusted input","fix":"- Move `nltk` to `3.10.4` or later (this advisory is withdrawn as a duplicate of GHSA-ffr9-mgrr-wcvr, which the sources do not detail)","status":"withdrawn","published_at":"2026-11-13T12:31:17+00:00","first_seen_at":"2026-11-13T21:09:39+00:00","triaged_at":"2026-11-13T21:10:52+00:00","updated_at":"2026-11-13T21:10:52+00:00","category":"package","confidence":0.6,"triage":{"at":"2026-11-13T21:10:52Z","model":"claude-haiku-5-5","output":{"fix":"- Move `nltk` to `3.10.4` or later (this advisory is withdrawn as a duplicate of GHSA-ffr9-mgrr-wcvr, which the sources do not detail)","reach":"network","title":"NLTK: crafted quote runs make tokenizing text burn CPU","impact":"low","summary":"NLTK's TreebankWordTokenizer.span_tokenize uses repeated list.pop(0) calls, so long runs of double-quote characters make CPU use grow quadratically. An attacker who can submit text to a service that span-tokenizes it can exhaust a CPU core and degrade availability.","audience":"developers","category":"package","nicknames":[],"who_cares":["python","nltk","nlp"],"confidence":0.6,"fix_status":"available","needs_auth":"no","worst_case":"CPU core exhausted by crafted input, degrading service availability","analyst_note":"Check the canonical duplicate GHSA-ffr9-mgrr-wcvr for the confirmed fixed version and details.","how_to_check":"- Check the installed NLTK version with `pip show nltk`\n- Search your code for calls to `span_tokenize` on untrusted input","plain_action":"","product_name":"","needs_analyst":true,"not_affected_if":["trusted-input-only","no-untrusted-tokenization"],"who_is_affected":"Services that run NLTK's Treebank word tokenizer on text submitted by outside users are exposed, because a single long quote run can tie up a CPU core. Applications that tokenize only trusted or internal text can skip it. The advisory is withdrawn as a duplicate, so the canonical record is GHSA-ffr9-mgrr-wcvr.","user_interaction":"no","product_ecosystem":"","needs_special_setup":"no","severity_if_unknown":"unknown"},"cost_usd":0.000781,"input_tokens":4725,"output_tokens":617,"severity_before":"medium"},"analyst_status":null,"analyst_note":null,"search":"'-407':29B '0':11A,41B,131C '3.10.4':110C '3.2.5':108C '927c':21A,26A 'advisori':2A,79C,81C 'algorithm':113C 'allow':120C 'attack':57B,122C,133C 'avail':77B,156C 'call':42B,132C 'caus':124C 'charact':50B,142C 'complex':114C 'consumpt':127C 'contain':111C 'core':74B,153C 'cpu':4A,52B,73B,126C,152C 'cwe':28B 'degrad':76B,155C 'descript':105C 'doubl':48B,140C 'double-quot':47B,139C 'duplic':1A,78C,89C 'exhaust':5A,71B,150C 'extern':102C 'ffr9':93C 'ghsa':18A,23A,92C 'ghsa-ffr9-mgrr-wcvr':91C 'ghsa-rg32-vgf9-927c':17A,22A 'grow':54B 'link':97C 'list.pop':10A,40B,130C 'long':44B,136C 'loop':16A 'maintain':99C 'make':51B 'mgrr':94C 'nlp':30B 'nltk':27A,31B,34B,106C 'origin':104C 'packag':32B 'preserv':101C 'python':33B 'quadrat':3A,55B,125C 'quot':14A,49B,141C 'quote-restor':13A 'refer':103C 'remot':121C 'repeat':39B,129C 'restor':15A 'rg32':19A,24A 'run':45B,137C 'servic':64B,144C 'span':67B,146C 'span-token':66B,145C 'submit':60B,135C 'text':61B,149C 'token':8A,37B,68B,118C,147C 'treebankwordtokenizer.span':7A,36B,117C 'untrust':148C 'use':38B,53B 'vgf9':20A,25A 'via':9A 'vulner':115C 'wcvr':95C 'withdrawn':84C","nicknames":[],"mitigations":[],"who_affected":"Services that run NLTK's Treebank word tokenizer on text submitted by outside users are exposed, because a single long quote run can tie up a CPU core. Applications that tokenize only trusted or internal text can skip it. The advisory is withdrawn as a duplicate, so the canonical record is GHSA-ffr9-mgrr-wcvr.","tier":"C","verified":{},"analyst_revisit_at":null,"fix_status":"available","audience":"developers","plain_action":null,"pkeys":["nltk"],"ptokens":["nltk"],"labels":["cwe407","medium","nlp","nltk","package","pypi","python"],"campaign_type":null,"search_a":"'0':11A '927c':21A,26A 'advisori':2A 'cpu':4A 'duplic':1A 'exhaust':5A 'ghsa':18A,23A 'ghsa-rg32-vgf9-927c':17A,22A 'list.pop':10A 'loop':16A 'nltk':27A 'quadrat':3A 'quot':14A 'quote-restor':13A 'restor':15A 'rg32':19A,24A 'token':8A 'treebankwordtokenizer.span':7A 'vgf9':20A,25A 'via':9A","search_b":"'-407':29B '0':41B 'attack':57B 'avail':77B 'call':42B 'charact':50B 'core':74B 'cpu':52B,73B 'cwe':28B 'degrad':76B 'doubl':48B 'double-quot':47B 'exhaust':71B 'grow':54B 'list.pop':40B 'long':44B 'make':51B 'nlp':30B 'nltk':31B,34B 'packag':32B 'python':33B 'quadrat':55B 'quot':49B 'repeat':39B 'run':45B 'servic':64B 'span':67B 'span-token':66B 'submit':60B 'text':61B 'token':37B,68B 'treebankwordtokenizer.span':36B 'use':38B,53B","search_c":"'0':131C '3.10.4':110C '3.2.5':108C 'advisori':79C,81C 'algorithm':113C 'allow':120C 'attack':122C,133C 'avail':156C 'call':132C 'caus':124C 'charact':142C 'complex':114C 'consumpt':127C 'contain':111C 'core':153C 'cpu':126C,152C 'degrad':155C 'descript':105C 'doubl':140C 'double-quot':139C 'duplic':78C,89C 'exhaust':150C 'extern':102C 'ffr9':93C 'ghsa':92C 'ghsa-ffr9-mgrr-wcvr':91C 'link':97C 'list.pop':130C 'long':136C 'maintain':99C 'mgrr':94C 'nltk':106C 'origin':104C 'preserv':101C 'quadrat':125C 'quot':141C 'refer':103C 'remot':121C 'repeat':129C 'run':137C 'servic':144C 'span':146C 'span-token':145C 'submit':135C 'text':149C 'token':118C,147C 'treebankwordtokenizer.span':117C 'untrust':148C 'vulner':115C 'wcvr':95C 'withdrawn':84C","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:L","cvss_by":"GitHub","poc_count":0,"sources":[{"source":"ghsa","external_id":"GHSA-rg32-vgf9-927c","url":"https://github.com/advisories/GHSA-rg32-vgf9-927c","severity":"medium","published_at":"2026-11-13T12:31:17+00:00","modified_at":"2026-11-13T21:07:40+00:00","first_seen_at":"2026-11-13T21:09:39+00:00","fetched_at":"2026-11-13T21:09:39+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"}