Skip to content

Commit d6cbfec

Browse files
committed
Python: huge_tree tests were wrong
Nice spotted @jorgectf!
1 parent 3cd165d commit d6cbfec

File tree

2 files changed

+17
-7
lines changed

2 files changed

+17
-7
lines changed

python/ql/test/experimental/library-tests/frameworks/XML/lxml_etree.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,9 +45,9 @@
4545
parser = lxml.etree.XMLParser(huge_tree=True)
4646
lxml.etree.fromstring(x, parser=parser) # $ input=x vuln='Billion Laughs' vuln='Quadratic Blowup' vuln='XXE'
4747

48-
# Billion laughs, but not XXE
48+
# Safe for both Billion laughs and XXE
4949
parser = lxml.etree.XMLParser(resolve_entities=False, huge_tree=True)
50-
lxml.etree.fromstring(x, parser=parser) # $ input=x vuln='Billion Laughs' vuln='Quadratic Blowup'
50+
lxml.etree.fromstring(x, parser=parser) # $ input=x SPURIOUS: vuln='Billion Laughs' vuln='Quadratic Blowup'
5151

5252
# DTD retrival vuln (also XXE)
5353
parser = lxml.etree.XMLParser(load_dtd=True, no_network=False)

python/ql/test/experimental/library-tests/frameworks/XML/poc/PoC.py

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -318,11 +318,21 @@ def test_billion_laughs_manually_enabled():
318318
@expects_timeout
319319
def test_quadratic_blowup_manually_enabled():
320320
parser = lxml.etree.XMLParser(huge_tree=True)
321-
try:
322-
_root = lxml.etree.fromstring(quadratic_blowup, parser=parser)
323-
assert False
324-
except lxml.etree.XMLSyntaxError as e:
325-
assert "Detected an entity reference loop" in str(e)
321+
root = lxml.etree.fromstring(quadratic_blowup, parser=parser)
322+
323+
@staticmethod
324+
def test_billion_laughs_huge_tree_not_enough():
325+
parser = lxml.etree.XMLParser(huge_tree=True, resolve_entities=False)
326+
root = lxml.etree.fromstring(billion_laughs, parser=parser)
327+
assert root.tag == "lolz"
328+
assert root.text == None
329+
330+
@staticmethod
331+
def test_quadratic_blowup_huge_tree_not_enough():
332+
parser = lxml.etree.XMLParser(huge_tree=True, resolve_entities=False)
333+
root = lxml.etree.fromstring(quadratic_blowup, parser=parser)
334+
assert root.tag == "foo"
335+
assert root.text == None
326336

327337
@staticmethod
328338
def test_ok_xml():

0 commit comments

Comments
 (0)