You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

56 lines
2.3 KiB

  1. From 391511ccaaf0050970dfbe95bf2df1bcf6c33440 Mon Sep 17 00:00:00 2001
  2. From: "Miss Islington (bot)"
  3. <31488909+miss-islington@users.noreply.github.com>
  4. Date: Wed, 17 Jul 2019 10:02:05 -0700
  5. Subject: [PATCH] bpo-37461: Fix infinite loop in parsing of specially crafted
  6. email headers (GH-14794)
  7. * bpo-37461: Fix infinite loop in parsing of specially crafted email headers.
  8. Some crafted email header would cause the get_parameter method to run in an
  9. infinite loop causing a DoS attack surface when parsing those headers. This
  10. patch fixes that by making sure the DQUOTE character is handled to prevent
  11. going into an infinite loop.
  12. (cherry picked from commit a4a994bd3e619cbaff97610a1cee8ffa87c672f5)
  13. Co-authored-by: Abhilash Raj <maxking@users.noreply.github.com>
  14. ---
  15. Lib/email/_header_value_parser.py | 3 +++
  16. Lib/test/test_email/test__header_value_parser.py | 7 +++++++
  17. .../next/Security/2019-07-16-08-11-00.bpo-37461.1Ahz7O.rst | 2 ++
  18. 3 files changed, 12 insertions(+)
  19. create mode 100644 Misc/NEWS.d/next/Security/2019-07-16-08-11-00.bpo-37461.1Ahz7O.rst
  20. --- a/Lib/email/_header_value_parser.py
  21. +++ b/Lib/email/_header_value_parser.py
  22. @@ -2387,6 +2387,9 @@ def get_parameter(value):
  23. while value:
  24. if value[0] in WSP:
  25. token, value = get_fws(value)
  26. + elif value[0] == '"':
  27. + token = ValueTerminal('"', 'DQUOTE')
  28. + value = value[1:]
  29. else:
  30. token, value = get_qcontent(value)
  31. v.append(token)
  32. --- a/Lib/test/test_email/test__header_value_parser.py
  33. +++ b/Lib/test/test_email/test__header_value_parser.py
  34. @@ -2621,6 +2621,13 @@ class Test_parse_mime_parameters(TestPar
  35. # Defects are apparent missing *0*, and two 'out of sequence'.
  36. [errors.InvalidHeaderDefect]*3),
  37. + # bpo-37461: Check that we don't go into an infinite loop.
  38. + 'extra_dquote': (
  39. + 'r*="\'a\'\\"',
  40. + ' r="\\""',
  41. + 'r*=\'a\'"',
  42. + [('r', '"')],
  43. + [errors.InvalidHeaderDefect]*2),
  44. }
  45. @parameterize
  46. --- /dev/null
  47. +++ b/Misc/NEWS.d/next/Security/2019-07-16-08-11-00.bpo-37461.1Ahz7O.rst
  48. @@ -0,0 +1,2 @@
  49. +Fix an inifite loop when parsing specially crafted email headers. Patch by
  50. +Abhilash Raj.