Skip to content
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

[3.11] gh-95778: CVE-2020-10735: Prevent DoS by very large int() #96500

Merged
merged 11 commits into from Sep 2, 2022

Conversation

gpshead
Copy link
Member

@gpshead gpshead commented Sep 2, 2022

Integer to and from text conversions via CPython's bignum int type is not safe against denial of service attacks due to malicious input. Very large input strings with hundred thousands of digits can consume several CPU seconds.

This PR comes fresh from a pile of work done in our private PSRT security response team repo.

This backports #96499 aka 511ca94

Signed-off-by: Christian Heimes [Red Hat] christian@python.org
Tons-of-polishing-up-by: Gregory P. Smith [Google] greg@krypto.org
Reviews via the private PSRT repo via many others (see the NEWS entry in the PR).

I wrote up a one pager for the release managers.

gpshead and others added 8 commits September 1, 2022 09:40
Co-authored-by: Christian Heimes <christian@python.org>
Abigail does not like the fact that `PyInterpreterState` has changed
size and some fields have been moved around. Even placing
`int_max_str_digits` after `_initial_thread` does not make her happy.

Let's move the field out ouf the state and make the setting a
process-wide global. It's ugly, but better ugly than breaking somebody's
code.

```
  [C]'function void PyEval_AcquireThread(PyThreadState*)' at ceval.c:452:1 has some indirect sub-type changes:
    parameter 1 of type 'PyThreadState*' has sub-type changes:
      in pointed to type 'typedef PyThreadState' at pytypedefs.h:24:1:
        underlying type 'struct _ts' at pystate.h:82:1 changed:
          type size hasn't changed
          1 data member changes (2 filtered):
           type of 'PyInterpreterState* _ts::interp' changed:
             in pointed to type 'typedef PyInterpreterState' at pytypedefs.h:25:1:
               underlying type 'struct _is' at pycore_interp.h:78:1 changed:
                 type size changed from 861952 to 862016 (in bits)
                 1 data member insertion:
                   'int _is::int_max_str_digits', at offset 859072 (in bits) at pycore_interp.h:179:1
                 2 data member changes (3 filtered):
                  type of 'pyruntimestate* _is::runtime' changed:
                    in pointed to type 'struct pyruntimestate' at pycore_runtime.h:59:1:
                      type size changed from 1333440 to 1333504 (in bits)
                      1 data member changes (2 filtered):

                  'PyThreadState _is::_initial_thread' offset changed from 859072 to 859136 (in bits) (by +64 bits)
```
@tiran tiran added the 🔨 test-with-buildbots Test PR w/ buildbots; report in status section label Sep 2, 2022
@bedevere-bot
Copy link

🤖 New build scheduled with the buildbot fleet by @tiran for commit 282052f 🤖

If you want to schedule another build, you need to add the ":hammer: test-with-buildbots" label again.

@bedevere-bot bedevere-bot removed the 🔨 test-with-buildbots Test PR w/ buildbots; report in status section label Sep 2, 2022
@gpshead gpshead marked this pull request as ready for review September 2, 2022 05:56
Doc/library/stdtypes.rst Outdated Show resolved Hide resolved
@gpshead gpshead merged commit f8b71da into python:3.11 Sep 2, 2022
@gpshead
Copy link
Member Author

gpshead commented Sep 4, 2022

bugfix incoming #96537

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.

None yet

5 participants