Skip to content

Conversation

picnixz
Copy link
Member

@picnixz picnixz commented Sep 26, 2025

Expose the XML Expat 2.7.2 mitigation APIs to disallow use of disproportional amounts of dynamic memory from within an Expat parser (see CVE-2025-59375 for instance).

The exposed APIs are available on Expat parsers, that is, parsers created by xml.parsers.expat.ParserCreate(), as:

  • parser.SetAllocTrackerActivationThreshold(threshold), and
  • parser.SetAllocTrackerMaximumAmplification(max_factor).

(cherry picked from commits f04bea4 and 68a1778)


📚 Documentation preview 📚: https://cpython-previews--139359.org.readthedocs.build/

CVE-2025-59375) (pythonGH-139234)

Expose the XML Expat 2.7.2 mitigation APIs to disallow use of
disproportional amounts of dynamic memory from within an Expat
parser (see CVE-2025-59375 for instance).

The exposed APIs are available on Expat parsers, that is,
parsers created by `xml.parsers.expat.ParserCreate()`, as:

- `parser.SetAllocTrackerActivationThreshold(threshold)`, and
- `parser.SetAllocTrackerMaximumAmplification(max_factor)`.

(cherry picked from commit f04bea4)

Co-authored-by: Bénédikt Tran <[email protected]>
@picnixz picnixz force-pushed the backport-f04bea4-3.14 branch from f2030ab to 3c430ec Compare September 26, 2025 15:15
@picnixz
Copy link
Member Author

picnixz commented Sep 26, 2025

I'll wait until gh-139366 is merged to ease future backports

@picnixz picnixz marked this pull request as draft September 26, 2025 16:23
@picnixz

This comment was marked as resolved.

…on API (python#139366)

Fix some typos left in f04bea4,
and simplify some internal functions to ease maintenance of future
mitigation APIs.
@picnixz picnixz marked this pull request as ready for review September 28, 2025 11:25
@hartwork
Copy link
Contributor

I'll wait until gh-139366 is merged to ease future backports

@picnixz if I'm not mistaken, it's both merged and cherry-picked to this PR (as the third commit) by now. What would be the next steps for this pull request?

@picnixz
Copy link
Member Author

picnixz commented Sep 28, 2025

A core developer needs to review it, and the release manager needs to approve it because we're in RC3 phase. I really want at least two core devs to check this PR to be sure I didn't mess the backports. I didn't backport the docs changes that will be added in the next one (the one for billion laughs).

@picnixz picnixz requested a review from gpshead September 28, 2025 14:11
@hartwork
Copy link
Contributor

@picnixz so the plan is to first get review from Gregory and only then Hugo, I see 👍

@picnixz
Copy link
Member Author

picnixz commented Sep 28, 2025

I would be happy if you could also review it as you're an expert here as well :')

Copy link
Contributor

@hartwork hartwork left a comment

Choose a reason for hiding this comment

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

I would be happy if you could also review it as you're an expert here as well :')

@picnixz done, looks good 👍

My method of review has been comparing (1) the diff of #139234 against main with (2) the diff in here. What I found was no difference but:

  • Doc/whatsnew/3.15.rst on main side but not 3.14 (as expected)
  • @permit_long_* on main side but not 3.14 (as expected)

The tools I used for this were git rebase -i, git diff and Meld.

So if #139234 was alright (which I believe) then very likely this is, too 👍

@picnixz
Copy link
Member Author

picnixz commented Sep 28, 2025

Thank you for the review. I'll let Gregory have a look and then Hugo can hit merge I think (only he can merge during RC phase).

For the other branches, I would suggest you continue your branch for 3.13 with the latest stuff (or try to directly cherry-pick this specific PR with a new one). I think we should be able to backport this PR to 3.13 directly without too many conflicts (I hope).

@gpshead
Copy link
Member

gpshead commented Sep 29, 2025

FWIW when to merge this is up to the release manager (hugovk). As we're treating it as a security mitigation feature similar to past such things and adding it to older releases as well, that suggests letting this wait for 3.14.1 is fine.

@picnixz
Copy link
Member Author

picnixz commented Sep 30, 2025

Note for the RM: we have a UAF in all branches, independently of Expat version: See #139400. So I would prefer that this one is not backported until we fix it. On 3.14 we don't see the crash, but on 3.13 (and probably on older branches), we will also see it. I believe we are able not to crash by chance due to some magic in incremental GC.

@hartwork
Copy link
Contributor

hartwork commented Sep 30, 2025

Note for the RM: we have a UAF in all branches, independently of Expat version: See #139400.

…and a WIP candidate fix at #139403.

On 3.14 we don't see the crash, but on 3.13 (and probably on older branches), we will also see it. I believe we are able not to crash by chance due to some magic in incremental GC.

@picnixz In my tests on another notebook I saw two other branches affected directly and once we add del parent_parser all branches are. I'm with you that changes in the garbage collector could take part in 3.14 and main behaving slightly differently.

@picnixz
Copy link
Member Author

picnixz commented Oct 7, 2025

We will merge this one in 3.14.1 (3.14 is now ongoing its release process). To have a good synchronization, we'll also delay 3.10 to 3.13 backports for their next release cycle.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants