cpython/Include/internal
Gregory P. Smith b5e331fdb3
[3.8] gh-95778: CVE-2020-10735: Prevent DoS by very large int() (#96503)
* Correctly pre-check for int-to-str conversion

Converting a large enough `int` to a decimal string raises `ValueError` as expected. However, the raise comes _after_ the quadratic-time base-conversion algorithm has run to completion. For effective DOS prevention, we need some kind of check before entering the quadratic-time loop. Oops! =)

The quick fix: essentially we catch _most_ values that exceed the threshold up front. Those that slip through will still be on the small side (read: sufficiently fast), and will get caught by the existing check so that the limit remains exact.

The justification for the current check. The C code check is:
```c
max_str_digits / (3 * PyLong_SHIFT) <= (size_a - 11) / 10
```

In GitHub markdown math-speak, writing $M$ for `max_str_digits`, $L$ for `PyLong_SHIFT` and $s$ for `size_a`, that check is:
$$\left\lfloor\frac{M}{3L}\right\rfloor \le \left\lfloor\frac{s - 11}{10}\right\rfloor$$

From this it follows that
$$\frac{M}{3L} < \frac{s-1}{10}$$
hence that
$$\frac{L(s-1)}{M} > \frac{10}{3} > \log_2(10).$$
So
$$2^{L(s-1)} > 10^M.$$
But our input integer $a$ satisfies $|a| \ge 2^{L(s-1)}$, so $|a|$ is larger than $10^M$. This shows that we don't accidentally capture anything _below_ the intended limit in the check.

<!-- gh-issue-number: gh-95778 -->
* Issue: gh-95778
<!-- /gh-issue-number -->

Co-authored-by: Gregory P. Smith [Google LLC] <greg@krypto.org>
Co-authored-by: Christian Heimes <christian@python.org>
Co-authored-by: Mark Dickinson <dickinsm@gmail.com>
2022-09-05 22:26:09 +02:00
..
pycore_accu.h bpo-36635: Change pyport.h for Py_BUILD_CORE_MODULE define (GH-12853) 2019-04-17 23:02:26 +02:00
pycore_atomic.h bpo-33608: Normalize atomic macros so that they all expect an atomic struct (GH-12877) 2019-04-22 11:13:11 -07:00
pycore_ceval.h Revert "bpo-33608: Factor out a private, per-interpreter _Py_AddPendingCall(). (gh-13714)" (GH-13780) 2019-06-03 18:14:24 +02:00
pycore_code.h bpo-26219: per opcode cache for LOAD_GLOBAL (GH-12884) 2019-06-03 21:30:58 +09:00
pycore_condvar.h bpo-36635: Change pyport.h for Py_BUILD_CORE_MODULE define (GH-12853) 2019-04-17 23:02:26 +02:00
pycore_context.h bpo-36635: Change pyport.h for Py_BUILD_CORE_MODULE define (GH-12853) 2019-04-17 23:02:26 +02:00
pycore_fileutils.h bpo-36301: Error if decoding pybuilddir.txt fails (GH-12422) 2019-03-19 01:46:25 +01:00
pycore_getopt.h bpo-36763: Cleanup precmdline in _PyCoreConfig_Read() (GH-13371) 2019-05-17 03:15:12 +02:00
pycore_gil.h bpo-36635: Change pyport.h for Py_BUILD_CORE_MODULE define (GH-12853) 2019-04-17 23:02:26 +02:00
pycore_hamt.h [3.8] gh-93065: Fix HAMT to iterate correctly over 7-level deep trees (GH-93066) (#93148) 2022-05-24 11:26:25 +02:00
pycore_initconfig.h [3.8] gh-95778: CVE-2020-10735: Prevent DoS by very large int() (#96503) 2022-09-05 22:26:09 +02:00
pycore_long.h [3.8] gh-95778: CVE-2020-10735: Prevent DoS by very large int() (#96503) 2022-09-05 22:26:09 +02:00
pycore_object.h bpo-38376: Fix _PyUnicode_CheckConsistency() definition (GH-16623) 2019-10-07 21:12:05 +02:00
pycore_pathconfig.h [3.8] bpo-38234: Backport init path config changes from master (GH-16423) 2019-09-26 16:17:34 +02:00
pycore_pyerrors.h bpo-36710: Add tstate parameter in ceval.c (GH-13547) 2019-05-24 17:01:38 +02:00
pycore_pyhash.h bpo-36635: Change pyport.h for Py_BUILD_CORE_MODULE define (GH-12853) 2019-04-17 23:02:26 +02:00
pycore_pylifecycle.h bpo-41686: Always create the SIGINT event on Windows (GH-23344) (GH-23347) (GH-23349) 2020-11-17 22:23:18 +01:00
pycore_pymem.h [3.8] bpo-36389: Backport debug enhancements from master (GH-16796) 2019-10-15 03:06:16 +02:00
pycore_pystate.h [3.8] gh-95778: CVE-2020-10735: Prevent DoS by very large int() (#96503) 2022-09-05 22:26:09 +02:00
pycore_traceback.h bpo-36829: PyErr_WriteUnraisable() normalizes exception (GH-13507) 2019-05-23 01:00:58 +02:00
pycore_tupleobject.h bpo-36635: Change pyport.h for Py_BUILD_CORE_MODULE define (GH-12853) 2019-04-17 23:02:26 +02:00
pycore_warnings.h bpo-36635: Change pyport.h for Py_BUILD_CORE_MODULE define (GH-12853) 2019-04-17 23:02:26 +02:00