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-126119: fix some crashes in code objects ifco_stacksize is absurdly large#126122

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

Open
picnixz wants to merge26 commits intopython:main
base:main
Choose a base branch
Loading
frompicnixz:fix/overflow-in-frame-sizeof-126119

Conversation

picnixz
Copy link
Member

@picnixzpicnixz commentedOct 29, 2024
edited by bedevere-appbot
Loading

@picnixz
Copy link
MemberAuthor

I found out that this won't be sufficient so converting it to a draft for now until I patch more attackable entrypoints.

@picnixzpicnixz marked this pull request as draftOctober 29, 2024 13:03
@markshannon
Copy link
Member

How about rejecting excessively largeco_stacksize when creating code objects?
It will be a much simpler fix.

ZeroIntensity reacted with thumbs up emoji

@picnixz
Copy link
MemberAuthor

picnixz commentedOct 29, 2024
edited
Loading

How about rejecting excessively large co_stacksize when creating code objects?

That's what I'm actually doing (or am I not?) [It's just that the expression to check is not the best one and I'm trying to see if I can make other place of the code overflow with:

if ((size_t)con->stacksize        >= (INT_MAX /sizeof(PyObject*))-FRAME_SPECIALS_SIZE-nlocalsplus)    {PyErr_SetString(PyExc_OverflowError,"code: co_stacksize is too large");return-1;    }

@picnixz
Copy link
MemberAuthor

picnixz commentedOct 29, 2024
edited
Loading

Ok, I found different issues. It's possible to bypass the check in the code object validator that I added when attacking generator's frames. I'll need a bit more time for that but I won't be coding anymore today.

The evil size that should be checked in code constructor is "((_testcapi.INT_MAX - 10) // sizeof(PyObject *))" but the following crashes:

ps=ctypes.sizeof(ctypes.c_void_p)# sizeof(PyObject *)smallest_evil_co_stacksize= (_testcapi.INT_MAX//ps)-10evil=f().gi_frame.f_code.__replace__(co_stacksize=smallest_evil_co_stacksize-1)# okevil_gi=types.FunctionType(evil, {})()# crashesself.assertRaises(OverflowError,evil_gi.__sizeof__)# crashes

Withsmallest_evil_co_stacksize,__replace__ would raise as expected but withsmallest_evil_co_stacksize - 1 it's FunctionType that is crashing.

@markshannon
Copy link
Member

markshannon commentedOct 29, 2024
edited
Loading

I meant choose a large value, rather than checking for overflow.
That way we won't need to check for overflow anywhere else.

Something likeco_nlocals + co_stacksize < INT_MAX/2/SIZEOF_VOID_Pco_nlocals + co_stacksize < INT_MAX/8

@picnixz
Copy link
MemberAuthor

picnixz commentedOct 29, 2024
edited
Loading

That way we won't need to check for overflow anywhere else.

Do you have a good value in mind? I'm not sure if it could affect recursion limit for instance or tracebacks if you change the stacksize (clearly not an expert here). I'm going offline now but we can continue this discussion tomorrow.


Also, maybe I could find a way to pass the check in the code object but make it crash when creating fake generators. So the choice ofco_nlocals + co_stacksize < INT_MAX / 8 may not be sufficient I think (or am I messing up my arithmetic?). I'm a bit tired so I'll check tomorrow.


EDIT (30th October): I'm not sure I'll be able to work on that today (I have some IRL stuff to do and won't be available today a lot).

@picnixz
Copy link
MemberAuthor

picnixz commentedOct 31, 2024
edited
Loading

The free-threaded build crashes (just with "Segmentation fault (core dumped)", no traceback) but I don't know why...@colesbury do you have some idea? The bad code is

importtypesdeff():yieldcode=f().gi_frame.f_codeevil_code=code.__replace__(co_stacksize=268435444)# OKevil_gi_func=types.FunctionType(evil_code, {})# OKevil_gi=evil_gi_func()# not ok!

@picnixzpicnixz marked this pull request as ready for reviewOctober 31, 2024 11:25
@picnixzpicnixz changed the titlegh-126119: fix an overflow onco_framesize ifco_stacksize is absurdely largegh-126119: fix some crashes in code objects ifco_stacksize is absurdely largeOct 31, 2024
@ZeroIntensity
Copy link
Member

I'll take a look at the feee-threaded failures.

picnixz reacted with heart emoji

@bedevere-app
Copy link

A Python core developer has requested some changes be made to your pull request before we can consider merging it. If you could please address their requests along with any other requests in other reviews from core developers that would be appreciated.

Once you have made the requested changes, please leave a comment on this pull request containing the phraseI have made the requested changes; please review again. I will then notify any core developers who have left a review that you're ready for them to take another look at this pull request.

@picnixz
Copy link
MemberAuthor

I've updated the comment and removed the un-necessary checks. Please tell me if the comment is still imprecise or if you have a preferred formulation.

I have made the requested changes; please review again.

@bedevere-app
Copy link

Thanks for making the requested changes!

@markshannon: please review the changes made to this pull request.

@picnixz
Copy link
MemberAuthor

Friendly ping@markshannon

@picnixz
Copy link
MemberAuthor

Friendly ping@markshannon (I don't really want to merge this without your explicit approval)

@gaogaotiantian
Copy link
Member

Hmm, I still think Mark should be the one that approves this PR before it's merged. I don't see obvious issues for the code change. However, is theINT_MAX / 16 a precise limit? Both our checks and tests are calculating very precisely for this number, the test even does +1/-1 level validation. Not saying it's bad, but is it necessary? We want to prevent an artificial code object that hasINT_MAX level locals?

Again, I'm not opposing the current code, that's just the first thought I saw it.

@picnixz
Copy link
MemberAuthor

Both our checks and tests are calculating very precisely for this number, the test even does +1/-1 level validation

The +1/-1 validation is simply to check that we didn't change the formula. We can take any bound we want instead of just INT_MAX / 16, as soon as it's a valid one. But the bound is not tight. Mark said that we could have a tighter bound (so no, it's not a precise limit, it can be a bit bigger in general), namely

We could increase the limit to something like$INT_MAX/8 - K$ where$K$ is roughly the base frame size, but I don't see any advantage to doing so and it would be more fragile.

want to prevent an artificial code object that has INT_MAX level locals?

We just want to prevent a value ofco_stacksize being too large because we're doing some arithmetic with ints behind and use it in a loop.

cc@markshannon

Copy link
Member

@markshannonmarkshannon left a comment

Choose a reason for hiding this comment

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

The code looks good.
A couple of quibbles about the test and news entry, otherwise good to merge.

@bedevere-app
Copy link

When you're done making the requested changes, leave the comment:I have made the requested changes; please review again.

@markshannon
Copy link
Member

Sorry for the delay in the review, and thanks for doing this.

@picnixz
Copy link
MemberAuthor

I have made the requested changes; please review again.

@bedevere-app
Copy link

Thanks for making the requested changes!

@markshannon: please review the changes made to this pull request.

Sign up for freeto join this conversation on GitHub. Already have an account?Sign in to comment
Reviewers

@rruuaanngrruuaanngrruuaanng left review comments

@ZeroIntensityZeroIntensityAwaiting requested review from ZeroIntensity

@gaogaotiantiangaogaotiantianAwaiting requested review from gaogaotiantian

@markshannonmarkshannonAwaiting requested review from markshannonmarkshannon is a code owner

Assignees
No one assigned
Projects
None yet
Milestone
No milestone
Development

Successfully merging this pull request may close these issues.

5 participants
@picnixz@markshannon@ZeroIntensity@gaogaotiantian@rruuaanng

[8]ページ先頭

©2009-2025 Movatter.jp