Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

gh-133009: fix UAF inxml.etree.ElementTree.Element.__deepcopy__#133010

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to ourterms of service andprivacy statement. We’ll occasionally send you account related emails.

Already on GitHub?Sign in to your account

Merged
picnixz merged 8 commits intopython:mainfrompicnixz:fix/xml/uaf-deepcopy-133009
May 10, 2025

Conversation

picnixz
Copy link
Member

@picnixzpicnixz commentedApr 26, 2025
edited by bedevere-appbot
Loading

Copy link
Member

@serhiy-storchakaserhiy-storchaka left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others.Learn more.

This is not enough. "tag", "text" and "tail" can be set to different value during deepcopying. If it was the last reference, thedeepcopy() argument can be destroyed, and the reference can became handling.

The safe way is to increase the reference count of thedeepcopy() argument before calling any code that can release the GIL.

@picnixz
Copy link
MemberAuthor

I actually tried to do something with tag etc, but I wasn't able to crash the interpreter.

@serhiy-storchaka
Copy link
Member

String literals are interned and saved in the constants list. You need to use something having a single reference. Try'tag'.upper().

@picnixz
Copy link
MemberAuthor

picnixz commentedApr 26, 2025
edited
Loading

The safe way is to increase the reference count of the deepcopy() argument before calling any code that can release the GIL.

I've actually removed this code because I thought it wasn't needed, but I'll check with an evil non-interned string tomorrow.

@picnixz
Copy link
MemberAuthor

I'll try to add more tests later as well.

@@ -899,6 +905,8 @@ deepcopy(elementtreestate *st, PyObject *object, PyObject *memo)

if (Py_REFCNT(object) == 1) {
if (PyDict_CheckExact(object)) {
// Exact dictionaries do not execute arbitrary code as it's
Copy link
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others.Learn more.

@serhiy-storchaka is this assumption correct? namely, here I don't need to increfobject temporarily right?

serhiy-storchaka reacted with thumbs up emoji

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others.Learn more.

PyDict_Next() does not use__iter__, so this comment is redundant.PyDict_Next() does not call any user code.

picnixz reacted with thumbs up emoji
@picnixzpicnixz added the needs backport to 3.14bugs and security fixes labelMay 7, 2025
@@ -899,6 +905,8 @@ deepcopy(elementtreestate *st, PyObject *object, PyObject *memo)

if (Py_REFCNT(object) == 1) {
if (PyDict_CheckExact(object)) {
// Exact dictionaries do not execute arbitrary code as it's

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others.Learn more.

PyDict_Next() does not use__iter__, so this comment is redundant.PyDict_Next() does not call any user code.

picnixz reacted with thumbs up emoji
@picnixz
Copy link
MemberAuthor

Actually, it's much more tricky than what I thought. Even with the INCREF/DECREF and the additional checks, the following still crashes, but not duringdeepcopy() but during de-allocation:

classEvil(ET.Element):def__deepcopy__(self,memo):root.append(ET.Element('y'))root.append(ET.Element('z'))returnselfY=Evil('y')root=ET.Element('a')root.extend([Evil('x'),ET.Element('t'),Y])c=deepcopy(root)print(list(c))print("ok")assert0

So I'll need a bit more work.

@serhiy-storchaka
Copy link
Member

#133010 (comment) should help. It is good that you already have a reproducer.

@serhiy-storchaka
Copy link
Member

Ah, you have a different issue -- growing children, not attributes. The solution should be the same -- either ignore new items or resize the array in process.

@picnixz
Copy link
MemberAuthor

picnixz commentedMay 9, 2025
edited
Loading

The solution should be the same -- either ignore new items or resize the array in process.

Yes, actually I found a way to fix it in the meantime (but the same can be said)

Copy link
Member

@serhiy-storchakaserhiy-storchaka left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others.Learn more.

LGTM. 👍

root = ET.Element('a')
evil = X('x')
root.extend([evil, ET.Element('y')])
if is_python_implementation():

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others.Learn more.

We could also make the C implementation raising RuntimeError. It is fine either way.

Copy link
MemberAuthor

@picnixzpicnixzMay 10, 2025
edited
Loading

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others.Learn more.

I'll postpone this for a future PR as I want to backport this one to 3.13 and 3.14 first.

@picnixzpicnixz merged commit116a9f9 intopython:mainMay 10, 2025
39 checks passed
@miss-islington-app
Copy link

Thanks@picnixz for the PR 🌮🎉.. I'm working now to backport this PR to: 3.13, 3.14.
🐍🍒⛏🤖

@picnixzpicnixz deleted the fix/xml/uaf-deepcopy-133009 branchMay 10, 2025 07:32
miss-islington pushed a commit to miss-islington/cpython that referenced this pull requestMay 10, 2025
…__` (pythonGH-133010)(cherry picked from commit116a9f9)Co-authored-by: Bénédikt Tran <10796600+picnixz@users.noreply.github.com>
miss-islington pushed a commit to miss-islington/cpython that referenced this pull requestMay 10, 2025
…__` (pythonGH-133010)(cherry picked from commit116a9f9)Co-authored-by: Bénédikt Tran <10796600+picnixz@users.noreply.github.com>
@bedevere-app
Copy link

GH-133805 is a backport of this pull request to the3.14 branch.

@bedevere-appbedevere-appbot removed the needs backport to 3.14bugs and security fixes labelMay 10, 2025
@bedevere-app
Copy link

GH-133806 is a backport of this pull request to the3.13 branch.

@bedevere-appbedevere-appbot removed the needs backport to 3.13bugs and security fixes labelMay 10, 2025
picnixz added a commit that referenced this pull requestMay 10, 2025
…y__` (GH-133010) (#133806)gh-133009: fix UAF in `xml.etree.ElementTree.Element.__deepcopy__` (GH-133010)(cherry picked from commit116a9f9)Co-authored-by: Bénédikt Tran <10796600+picnixz@users.noreply.github.com>
picnixz added a commit that referenced this pull requestMay 10, 2025
…y__` (GH-133010) (#133805)gh-133009: fix UAF in `xml.etree.ElementTree.Element.__deepcopy__` (GH-133010)(cherry picked from commit116a9f9)Co-authored-by: Bénédikt Tran <10796600+picnixz@users.noreply.github.com>
Sign up for freeto join this conversation on GitHub. Already have an account?Sign in to comment
Reviewers

@JelleZijlstraJelleZijlstraJelleZijlstra approved these changes

@serhiy-storchakaserhiy-storchakaserhiy-storchaka approved these changes

@vstinnervstinnerAwaiting requested review from vstinner

Assignees
No one assigned
Labels
Projects
None yet
Milestone
No milestone
Development

Successfully merging this pull request may close these issues.

3 participants
@picnixz@serhiy-storchaka@JelleZijlstra

[8]ページ先頭

©2009-2025 Movatter.jp