Skip to content

Use-After-Free in PyImport_ImportModuleLevelObject #134100

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 our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
Nico-Posada opened this issue May 16, 2025 · 1 comment
Closed

Use-After-Free in PyImport_ImportModuleLevelObject #134100

Nico-Posada opened this issue May 16, 2025 · 1 comment
Labels
interpreter-core (Objects, Python, Grammar, and Parser dirs) topic-importlib type-crash A hard crash of the interpreter, possibly with a core dump

Comments

@Nico-Posada
Copy link
Contributor

Nico-Posada commented May 16, 2025

Bug report

Bug description:

If you try to import something with a level >= 1 and it somehow fails to put it into sys.modules after importing, you'll get a nice error message letting you know.

cpython/Python/import.c

Lines 3857 to 3863 in d94b1e9

Py_DECREF(to_return);
if (final_mod == NULL) {
if (!_PyErr_Occurred(tstate)) {
_PyErr_Format(tstate, PyExc_KeyError,
"%R not in sys.modules as expected",
to_return);
}

However, this error message uses to_return which was freed a couple of lines before. Because it's used just after being freed, you can't do anything too malicious with it, but you can crash python by allocating a large enough string and having it be unmapped after being freed so that it's invalid memory when it's accessed.

(No crash but triggers ASAN with use-after-free)

import sys
sys.modules = {f"a.b.c": {}}
__import__(f"b.c", {"__package__": "a"}, level=1)

(Crash)

import sys

loooong = "".ljust(0x100000, "b")
sys.modules = {f"a.{loooong}.c": {}}
__import__(f"{loooong}.c", {"__package__": "a"}, level=1)

Fix is to have the decref after it makes the error message.

CPython versions tested on:

3.12, 3.13, 3.14

Operating systems tested on:

Windows, Linux

Linked PRs

@Nico-Posada Nico-Posada added the type-bug An unexpected behavior, bug, or error label May 16, 2025
@picnixz picnixz added interpreter-core (Objects, Python, Grammar, and Parser dirs) type-crash A hard crash of the interpreter, possibly with a core dump and removed type-bug An unexpected behavior, bug, or error labels May 16, 2025
@picnixz

This comment has been minimized.

miss-islington pushed a commit to miss-islington/cpython that referenced this issue May 18, 2025
miss-islington pushed a commit to miss-islington/cpython that referenced this issue May 18, 2025
kumaraditya303 pushed a commit that referenced this issue May 18, 2025
…ject` (GH-134117) (#134172)

gh-134100: Fix use-after-free in `PyImport_ImportModuleLevelObject` (GH-134117)
(cherry picked from commit 4e9005d)

Co-authored-by: Nico-Posada <[email protected]>
kumaraditya303 pushed a commit that referenced this issue May 18, 2025
…ject` (GH-134117) (#134171)

gh-134100: Fix use-after-free in `PyImport_ImportModuleLevelObject` (GH-134117)
(cherry picked from commit 4e9005d)

Co-authored-by: Nico-Posada <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
interpreter-core (Objects, Python, Grammar, and Parser dirs) topic-importlib type-crash A hard crash of the interpreter, possibly with a core dump
Projects
None yet
Development

No branches or pull requests

3 participants