Skip to content
Snippets Groups Projects
  1. Oct 11, 2022
  2. Oct 04, 2022
  3. Sep 11, 2022
  4. Sep 06, 2022
  5. Sep 05, 2022
    • Gregory P. Smith's avatar
      [3.8] gh-95778: CVE-2020-10735: Prevent DoS by very large int() (#96503) · b5e331fd
      Gregory P. Smith authored
      
      * 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: default avatarGregory P. Smith [Google LLC] <greg@krypto.org>
      Co-authored-by: default avatarChristian Heimes <christian@python.org>
      Co-authored-by: default avatarMark Dickinson <dickinsm@gmail.com>
      b5e331fd
  6. Jul 28, 2022
  7. Jul 27, 2022
  8. Jul 05, 2022
  9. Jul 01, 2022
  10. Jun 22, 2022
  11. Jun 06, 2022
  12. May 24, 2022
  13. May 16, 2022
  14. May 12, 2022
  15. May 10, 2022
  16. May 09, 2022
  17. Apr 08, 2022
  18. Mar 16, 2022
  19. Mar 15, 2022
  20. Mar 08, 2022
Loading