Repository navigation
Closed
Labels
3.12only security fixesonly security fixes3.13only security fixesonly security fixes3.14bugs and security fixesbugs and security fixesextension-modulesC modules in the Modules dirC modules in the Modules dirtopic-XMLtype-crashA hard crash of the interpreter, possibly with a core dumpA hard crash of the interpreter, possibly with a core dump
Description
Crash report
What happened?
A UAF in Element.remove was fixed in #68279 but one can mutate the child's list during .remove and cause an OOB crash:
import xml.etree.ElementTree as ET
class EvilElement(ET.Element):
def __eq__(self, other):
base.clear()
return False
base = ET.Element('a')
base.append(EvilElement('a'))
base.append(EvilElement('a'))
base.remove(ET.Element('b'))Attacked code:
cpython/Modules/_elementtree.c
Lines 1648 to 1656 in dc76a4a
| for (i = 0; i < self->extra->length; i++) { | |
| if (self->extra->children[i] == subelement) | |
| break; | |
| rc = PyObject_RichCompareBool(self->extra->children[i], subelement, Py_EQ); | |
| if (rc > 0) | |
| break; | |
| if (rc < 0) | |
| return NULL; | |
| } |
I think we need to introduce some state integer to check that there is no evil mutation (similar to what's being done for OrderedDict).
CPython versions tested on:
CPython main branch
Operating systems tested on:
No response
Output from running 'python -VV' on the command line:
No response
Linked PRs
- gh-126033: Fix crash in _elementtree.c where evil tags/elements occurs #126079
- gh-126033: fix a crash in
xml.etree.ElementTree.Element.removewhen concurrent mutations happen #126124 - [3.13] gh-126033: fix UAF in
xml.etree.ElementTree.Element.removewhen concurrent mutations happen (GH-126124) #131929 - [3.12] gh-126033: fix UAF in
xml.etree.ElementTree.Element.removewhen concurrent mutations happen (GH-126124) #131930
Metadata
Metadata
Assignees
Labels
3.12only security fixesonly security fixes3.13only security fixesonly security fixes3.14bugs and security fixesbugs and security fixesextension-modulesC modules in the Modules dirC modules in the Modules dirtopic-XMLtype-crashA hard crash of the interpreter, possibly with a core dumpA hard crash of the interpreter, possibly with a core dump
Activity
ZeroIntensity commentedon Oct 27, 2024
Hmm, there seem to be a lot of issues with
PyObject_RichCompareBooland custom__eq__'s, right? It might be worth trying to fix things more globally there rather than on a case-by-case basis like this.picnixz commentedon Oct 27, 2024
I've roughly skimmed through the other occurrences and couldn't find UAFs or bad OOB. And I'd prefer fixing them one by one because the patch is not always the same.
picnixz commentedon Oct 27, 2024
ZeroIntensity commentedon Oct 27, 2024
My main concern here is that while we can fix this as much as we want for the core, this looks like it's common enough that downstream is having this problem too.
sobolevn commentedon Oct 28, 2024
Basically, we need to protect
basefrom mutation during the iteration over it. An extra field maybe?picnixz commentedon Oct 28, 2024
See #126041 for that (the issue and PR may have passed under your radar :))
[-]Crash: `xml.etree.ElementTree.Element.remove` with an evil `Element.__eq__`[/-][+]Crash: `xml.etree.ElementTree.Element.remove` when concurrent mutations happen[/+][-]Crash: `xml.etree.ElementTree.Element.remove` when concurrent mutations happen[/-][+]UAF: `xml.etree.ElementTree.Element.remove` when concurrent mutations happen[/+]gh-126033: fix UAF in `xml.etree.ElementTree.Element.remove` when con…
pythongh-126033: fix UAF in `xml.etree.ElementTree.Element.remove` wh…
pythongh-126033: fix UAF in `xml.etree.ElementTree.Element.remove` wh…
[3.13] gh-126033: fix UAF in `xml.etree.ElementTree.Element.remove` w…
[3.12] gh-126033: fix UAF in `xml.etree.ElementTree.Element.remove` w…