Debian Patches

Status for redis/5:8.0.2-3+deb13u3

Patch Description Author Forwarded Bugs Origin Last update
0021-Check-slotinfo-range-when-loading-RDB.patch Check slotinfo range when loading RDB (#1541)
Redis has a memory corruption bug in the RDB loader’s SLOT_INFO
handling. A malicious RDB can provide invalid slot metadata that makes
Redis use a slot id outside the normal cluster slot range while
preparing per-slot dictionaries during load.
With the right heap layout, that out-of-bounds slot lookup can be made
to land on attacker-controlled data that was also loaded from the RDB.
Redis then treats that data as a real dictionary structure

The attacker can uses this to build a fake dictionary and fake callback
table in memory, then reaches code execution as the Redis process. The
cluster-bus INTERNALSECRET issue is used to get an internal Redis
connection and make the target replicate from an attacker-controlled
fake master. The fake master then serves the malicious SLOT_INFO RDB.
The actual RCE primitive is the RDB-loader bug.
Source review shows the same SLOT_INFO loader pattern in Redis 7.4.x
through 8.8-m03; I verified full RCE on 8.6.2.

The issue is that Redis trusts SLOT_INFO metadata from the RDB too much.
During RDB load, Redis reads slot_id, slot_size, and expires_slot_size
from the file, then passes the slot id directly into kvstore dictionary
expansion.

Just check the slot_id is in range.

(cherry picked from commit e92a526973b660071f51078b81ee17aeab359f84)
(cherry picked from commit b1030a2f66311d5a03c58ebdeb5ade77daf74fe5)
Mincho Paskalev <minchopaskal@gmail.com> no 2026-07-21
0022-Fix-use-after-free-in-handleClientsBlockedOnKey.patch Fix use-after-free in handleClientsBlockedOnKey (#15594)
Fixes https://github.com/redis/redis/issues/15562.

handleClientsBlockedOnKey() used a list iterator while reprocessing clients
blocked on the same key. Reprocessing one client may trigger client eviction,
which can remove another blocked client and free the node cached by the
iterator, resulting in a use-after-free.

Replace the iterator with a bounded head-to-tail traversal. Before reprocessing
a client, move its node to the tail so the next waiter remains at the head while
preserving FIFO order. Since reprocessing may remove all blocked clients and
free the list, look up the list again before each iteration.

(cherry picked from commit a8edcfc98c50bb01c850e5dab3998ce57807144d)
(cherry picked from commit 009324be81f7105313ce6586ed4807f03c62c7fe)
Yuan Wang <yuan.wang@redis.com> no 2026-08-06
0023-Fix-HGETEX-out-of-bounds-read-when-FIELDS-lacks-numfields.patch Fix HGETEX out-of-bounds read when FIELDS option missing numfields argument

When the HGETEX command is used with the FIELDS option but without the required
numfields argument, the server would attempt to access an out-of-bounds argv index.

This PR adds a check to ensure numfields is present before accessing it,
returning an error if it is missing. Also includes a test case to cover this scenario.

(cherry picked from commit 9342dda5717738e050116d4093f1202d56cb2286)
sggeorgiev <s_ggeorgiev@yahoo.com> no 2025-08-24
0024-Fix-MurmurHash64A-overflow-in-HyperLogLog.patch Fix MurmurHash64A overflow in HyperLogLog with 2GB+ entries
The MurmurHash64A function in hyperloglog.c used an int parameter for length,
causing integer overflow when processing PFADD entries larger than 2GB.
This could lead to server crashes.

Changed the len parameter from int to size_t to properly handle
large inputs up to SIZE_MAX in HyperLogLog operations.
Refer to the implementation in facebook/mcrouter@2dbee3d/mcrouter/lib/fbi/hash.c#L54

(cherry picked from commit 53666e9884f0bd71ee43a005f69ac625377b752a)
"debing.sun" <debing.sun@redis.com> no 2025-08-13
debian-packaging/0001-Set-Debian-configuration-defaults.patch Set Debian configuration defaults Chris Lamb <lamby@debian.org> not-needed 2017-10-10
0001-Fix-FTBFS-on-kFreeBSD.patch Fix FTBFS on kFreeBSD Chris Lamb <lamby@debian.org> no 2015-10-30
0002-Add-CPPFLAGS-to-upstream-makefiles.patch Add CPPFLAGS and CXXFLAGS to upstream makefiles
.
Chris Lamb <lamby@debian.org> no 2015-10-30
0003-Use-get_current_dir_name-over-PATHMAX.patch Use get_current_dir_name over PATHMAX, etc. Chris Lamb <lamby@debian.org> no 2018-01-24
0004-Add-support-for-USE_SYSTEM_JEMALLOC-flag.patch Add support for USE_SYSTEM_JEMALLOC flag. Chris Lamb <lamby@debian.org> yes 2025-05-09
0005-CVE-2025-32023.patch Fix out of bounds write in hyperloglog commands (CVE-2025-32023) "debing.sun" <debing.sun@redis.com> no 2025-05-07
0006-CVE-2025-48367.patch Retry accept() even if accepted connection reports an error (CVE-2025-48367)

In case of accept4() returns an error, we should check errno value and decide if we should retry accept4() without waiting next event loop iteration.
Ozan Tezcan <ozantezcan@gmail.com> no 2025-05-14
0007-Add-Redis-ver.-REDIS_VERSION-to-LOLWUT-8-output-as-a.patch Add "Redis ver. $REDIS_VERSION" to LOLWUT 8 output as a some testsuites were relying on it.

eg. python-redis (https://github.com/redis/redis-py/blob/master/tests/test_commands.py#L1092)
Chris Lamb <lamby@debian.org> yes 2025-07-14
0008-CVE-2025-49844.patch Lua script may lead to remote code execution (CVE-2025-49844) Mincho Paskalev <minchopaskal@gmail.com> no 2025-06-23
0009-CVE-2025-46819.patch LUA out-of-bound read (CVE-2025-46819) Ozan Tezcan <ozantezcan@gmail.com> no 2025-06-23
0010-CVE-2025-46818.patch Lua script can be executed in the context of another user (CVE-2025-46818) Ozan Tezcan <ozantezcan@gmail.com> no 2025-06-23
0011-CVE-2025-46817.patch Lua script may lead to integer overflow and potential RCE (CVE-2025-46817) Ozan Tezcan <ozantezcan@gmail.com> no 2025-06-23
0012-CVE-2025-67733.patch Strip CRLF from error and simple string replies (#826)
Because in some cases, the client put \r\n in the command parameters.
When Redis returns these parameters to the client via an error reply, the presence of \r\n in the middle can cause the client to only parse the portion before the \r\n when handling the error reply. This disrupts the protocol parsing and ultimately causes the connection to become stuck.

[Backport from https://github.com/redis/redis/commit/6910256443c74057e0d83e08c61ea0021774fa6f]

[Adapted for redis-8.0.2:
- `addReplyErrorSdsSafe` already exists in redis-8.0.2 src/networking.c
and src/server.h, so the networking.c hunk only adds the new
`addReplyErrorSdsExSafe` and `addReplyStatusSafe` helpers and the
addReplyStatusFormat CRLF-stripping, and the server.h hunk only adds
declarations for the two new helpers (the existing
`addReplyErrorSdsSafe` declaration is left in place).
- Hunk offsets/context in src/functions.c, src/script_lua.c,
src/module.c, tests/modules/reply.c, tests/unit/functions.tcl,
tests/unit/moduleapi/reply.tcl and tests/unit/scripting.tcl adjusted
for redis-8.0.2 line numbering. Fix logic byte-identical to upstream.]
"debing.sun" <debing.sun@redis.com> no 2025-12-28
0013-CVE-2026-21863.patch Fix for [CVE-2026-21863] Remote DoS with malformed Valkey Cluster bus message


Backport from Valkey upstream commit:
https://github.com/valkey-io/valkey/commit/416939303d2550aefff73ac180f41b84c12ba6c0
Roshan Khatri <rvkhatri@amazon.com> no 2026-02-23
0014-CVE-2026-25243.patch Invalid Memory Access in Redis RESTORE Command (CVE-2026-25243)

(cherry picked from commit defbf45b9adbbfb21a394786b7092d064a8c9b49)
Sergei Georgiev <s_ggeorgiev@yahoo.com> no 2025-11-27
0015-CVE-2026-23631.patch Fix use-after-free when fullsync happens while replica is running a timed out script (CVE-2026-23631)

Fullsync triggers emptyData and scriptingReset which free the scripting/function engine. If a timed out script is still running on the replica, this causes a use-after-free. Delay fullsync processing in readSyncBulkPayload until the script finishes.

(cherry picked from commit 5b2a5044d4413113c5213c7a2d5f455186d7d75c)
Ozan Tezcan <ozantezcan@gmail.com> no 2026-04-14
0016-CVE-2026-23479.patch Fix use-after-free when evicting blocked client during unblock (CVE-2026-23479)

When re-executing a pending command after unblocking, check the return value
of `processCommandAndResetClient` and exit if needed.

(cherry picked from commit 252f4bd1370d25ee5627475a81ac8ba3c567be40)
"debing.sun" <debing.sun@redis.com> no 2025-12-29
0017-CVE-2026-66373.patch Reject corrupt stream RDB with shared NACK across consumers (#15081)

**Summary**

Detects and rejects corrupt stream RDB payloads where the same NACK
(pending entry) is referenced by more than one consumer, which violates
a stream data-structure.

**Changes**

- **`rdbLoadObject` (stream consumer PEL loading)**: Added a guard that
checks `nack->consumer != NULL` before assigning the consumer pointer.
When a second consumer's PEL references a NACK that was already claimed
by a prior consumer, the loader now reports a corrupt RDB error and
aborts instead of silently overwriting the pointer. Without this check,
two consumers share the same `streamNACK`, and freeing the first
consumer's PEL leaves the second with a dangling pointer.
- **`corrupt-dump.tcl`**: Added a regression test that crafts a stream
with two consumers (`consumerA`, `consumerB`) whose PELs both reference
the same entry (`1-0`). The `RESTORE` command is expected to fail with
`"Bad data format"`, and the server must remain responsive (`PING`
succeeds).

**Benefits**

- **Fail-fast on corrupt data**: The invariant violation is caught at
load time with a clear diagnostic message rather than manifesting as a
crash later during normal operation.
- **Regression coverage**: The crafted payload in the test ensures this
class of corruption is permanently guarded against.

(cherry picked from commit d8a624453db3ef39bf40f3e73c25aceee9fd8b76)
sggeorgiev <s_ggeorgiev@yahoo.com> no 2026-04-23
0018-CVE-2026-81934.patch Fix use-after-free in tlsProcessPendingData() pending-list iteration (#1391)

`tlsProcessPendingData()` iterates `pending_list` using a `listIter`, which pre-caches the `next` node pointer on every `listNext()` call. This cached pointer can dangle and be dereferenced after the node it points to has been freed, causing a use-after-free and a server crash (SIGSEGV).

The issue occurs because `tlsHandleEvent()` runs the connection's read handler, which can execute a command (e.g. `CLIENT KILL`) that closes a *different* pending TLS connection. That close path goes through `freeClient()` → `connClose()` → `connTLSClose()`, which calls `listDelNode()` and frees the victim connection's `pending_list` node. If the iterator's cached `next` pointer referenced that node, the following `listNext()` reads freed memory. The `listNext()` contract only permits removing the *current* node, not arbitrary other nodes.

Replace the `listIter`-based iteration with a detach-from-head, bounded drain so that no list node pointer is ever held across a handler call:

- Re-read `listFirst()` on each iteration instead of relying on a pre-cached `next` pointer
- Detach the head via `tlsPendingRemove()` *before* calling `tlsHandleEvent()`, so the loop always makes forward progress
- Semantics are preserved: in the common case each connection is handled exactly once per cycle, in order

(cherry picked from commit 98ff29b2828bf3245167b416ee23e6797f551a37)
(cherry picked from commit 0678e5663aa87ef0bbe62837219a4c85f6f5c93c)
Sergei Georgiev <s_ggeorgiev@yahoo.com> no 2026-06-09
0019-Fix-ACL-key-checks-for-SORT-GEORADIUS-XREAD.patch Fix ACL key checks for SORT, GEORADIUS/GEORADIUSBYMEMBER, and XREAD/XREADGROUP (#15478)

Several commands resolved ACL keys from a keyspec that didn't match the
key the command actually operates on, allowing a permission bypass:

- **`GEORADIUS`/`GEORADIUSBYMEMBER`**: the `STORE`/`STOREDIST` keyspec
matches the **first** occurrence of the keyword, but the command uses
**last-wins** semantics and writes to the **last** key. So `GEORADIUS
... STORE <permitted> STORE <forbidden>` passed ACL while writing to the
forbidden key (same for `STOREDIST` and both commands).

- **`SORT`**: `STORE` also uses last-wins semantics. The `STORE` keyspec
is already `unknown`, so ACL falls back to `sortGetKeys()` — but that
parser didn't skip the `STORE` argument. An earlier `STORE` value that
looks like an option keyword (`BY`/`GET`/`LIMIT`) derailed the scan, so
a permitted (or non-existent) first key masked a forbidden last key that
the write actually landed on.

- **`XREAD`/`XREADGROUP`**: the stream keys are the args after the
`STREAMS` keyword, whose position is found by a static keyspec. A
consumer/group named `STREAMS`, or options before `GROUP`/`STREAMS`,
could shift the real `STREAMS` token so ACL validated the wrong argument
and the read hit a forbidden key.

Make ACL resolve keys via each command's `getKeys` function, which
returns the effective keys with proper flags:

- **`GEORADIUS`/`GEORADIUSBYMEMBER`**: mark the `STORE`/`STOREDIST`
keyspecs `INCOMPLETE` so ACL falls back to `georadiusGetKeys()`, which
returns the last key (`RO|ACCESS` source, `OW|UPDATE` store).
- **`SORT`**: no keyspec change needed — the `STORE` keyspec is already
`unknown`, so ACL already delegates to `sortGetKeys()`. Fixed the parser
to skip the `STORE` argument (`i++`) so it isn't re-parsed as an option
keyword; the last `STORE` still wins.
- **`XREAD`/`XREADGROUP`**: mark the keyspecs `INCOMPLETE` and fall back
to `xreadGetKeys()`, which now skips option arguments (`COUNT`,
`MAXCOUNT`, `MAXSIZE`, `CLAIM`, `GROUP`, …) to locate the real `STREAMS`
token and tags the resolved keys `RO|ACCESS`.

Adds `acl-v2` tests for duplicate `STORE`/`STOREDIST`
(`GEORADIUS`/`GEORADIUSBYMEMBER`, `SORT`) and for the
`XREAD`/`XREADGROUP` `STREAMS`-keyword confusion.

(cherry picked from commit ce2f04c3fd72978ab7c841a8074621363c11eee0)
(cherry picked from commit 00ae4906c2c079c351bd63fd3fd42bd0c4b2c8d0)
Sergei Georgiev <s_ggeorgiev@yahoo.com> no 2026-07-18
0020-Fix-ACL-OOB-for-wrong-arity-KEYNUM-commands.patch Fix ACL OOB for wrong-arity KEYNUM commands (#14847)
`luaRedisAclCheckCmdPermissionsCommand` and
`RM_ACLCheckCommandPermissions` now call `commandCheckArity()` to check
command arity before calling `ACLCheckAllUserCommandPerm`, matching the
behavior of `processCommand`, `scriptCall`, and `RM_Call`. Without this,
KEYNUM keyspec commands like EVAL with wrong arity cause out-of-bounds
argv access during key extraction.

Also fix KEYNUM index calculation (`first + keynumidx`) and add a bounds
check in genericGetKeys().

Add scripting and module ACL tests for wrong-arity `EVAL` to lock in the
non-crashing behavior.

Fixes #14843

(cherry picked from commit c4d74587b55383354f53a5c61bd313ccf7867f4b)
(cherry picked from commit 1812c6d02038d2dc7bdb9b2ed5e5f1ed1b1838cf)
(cherry picked from commit a8eec43d9a6b5512e248c9c2b481ca485e56d19d)
Zijie Zhao <zzjas98@gmail.com> no 2026-03-18

All known versions for source package 'redis'

Links