From 9ef3eb4a9f79c106b8a5518fc600412ad81dff5c Mon Sep 17 00:00:00 2001 From: "patchback[bot]" <45432694+patchback[bot]@users.noreply.github.com> Date: Sat, 3 Jan 2026 00:39:41 +0000 Subject: [PATCH] Reject non-ascii digits in Range header (#11903) **This is a backport of PR #11887 as merged into master (7a067d1905e1eeb921a50010dd0004990dbb3bf0).** Co-authored-by: Sam Bull CVE: CVE-2025-69225 Upstream-Status: Backport [https://github.com/aio-libs/aiohttp/commit/c7b7a044f88c71cefda95ec75cdcfaa4792b3b96] Signed-off-by: Gyorgy Sarvari --- aiohttp/web_request.py | 2 +- tests/test_web_request.py | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/aiohttp/web_request.py b/aiohttp/web_request.py index 4bc670a..d565557 100644 --- a/aiohttp/web_request.py +++ b/aiohttp/web_request.py @@ -598,7 +598,7 @@ class BaseRequest(MutableMapping[str, Any], HeadersMixin): if rng is not None: try: pattern = r"^bytes=(\d*)-(\d*)$" - start, end = re.findall(pattern, rng)[0] + start, end = re.findall(pattern, rng, re.ASCII)[0] except IndexError: # pattern was not found in header raise ValueError("range not in acceptable format") diff --git a/tests/test_web_request.py b/tests/test_web_request.py index c6398ac..704fc18 100644 --- a/tests/test_web_request.py +++ b/tests/test_web_request.py @@ -227,6 +227,13 @@ def test_range_to_slice_tail_stop() -> None: assert req.content[req.http_range] == payload[-500:] +def test_range_non_ascii() -> None: + # ५ = DEVANAGARI DIGIT FIVE + req = make_mocked_request("GET", "/", headers=CIMultiDict([("RANGE", "bytes=4-५")])) + with pytest.raises(ValueError, match="range not in acceptable format"): + req.http_range + + def test_non_keepalive_on_http10() -> None: req = make_mocked_request("GET", "/", version=HttpVersion(1, 0)) assert not req.keep_alive