1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
|
From a4be27fe28e6cd833fa3045cca10404472d6878d 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 <git@sambull.org>
CVE: CVE-2025-69225
Upstream-Status: Backport [https://github.com/aio-libs/aiohttp/commit/c7b7a044f88c71cefda95ec75cdcfaa4792b3b96]
Signed-off-by: Gyorgy Sarvari <skandigraun@gmail.com>
---
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 0bc69b7..6e09027 100644
--- a/aiohttp/web_request.py
+++ b/aiohttp/web_request.py
@@ -607,7 +607,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 e706e18..da80ca9 100644
--- a/tests/test_web_request.py
+++ b/tests/test_web_request.py
@@ -243,6 +243,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
|