Safeguard
Application Security•

Predis CVE-2026-84372: CRLF in a Key Becomes Extra Redis Commands

Predis 3.0.0 to 3.2.x reparses pipelines on cluster and replication connections, so CRLF in a key can run injected commands. Plus the Redis cluster bus and Valkey parser CVEs of September 2026.

Safeguard Security Team
4 min read

On 1 September 2026, NVD published CVE-2026-84372 for Predis, the PHP client for Redis and Valkey. It scores 9.8. If your application passes user input into keys or values inside pipeline() on a cluster or replication connection, a CRLF sequence in that input can be read as extra commands.

In the same weeks, the Redis and Valkey servers picked up memory safety CVEs in the cluster bus and slot migration code. Those are a different kind of exposure, and worth separating.

What's affected

Predis. Versions from 3.0.0-RC1 until 3.3.0. The fix is 3.3.0. Per the CVE text, AbstractAggregateConnection::write() reparses an already serialized RESP buffer by splitting on the CRLF string instead of honoring length prefixes. Injected commands on cluster connections are routed using a fake key, which the text says permits shard wide cache deletion, targeted data modification, data reads or node disruption. On replication connections the reparse can throw an uncaught exception and repeatedly terminate requests.

The reachable path is narrow: only pipeline() hits it. transaction() and MULTI are not affected, and the description concerns aggregate cluster and replication connections, not a single node connection.

Redis. CVE-2026-92925 (17 September, 7.1) is an out of bounds read in the cluster bus packet parser for PING, PONG and MEET packets, caused by missing null termination checks on string extensions. A remote attacker can read memory or cause a denial of service. The vector in NVD is adjacent network, so exposure is about who can reach your cluster bus ports. The NVD record does not state a fixed version. It references a Redis commit and pull request 15263, and Red Hat errata.

Valkey. CVE-2026-85522 (4 September, 5.5) is an out of bounds read in slot migration through the job name argument, and the record says it is fixed in 9.0.5 and 9.1.1. CVE-2026-86227 (6 September, 1.3) is an out of bounds read in kvstoreGetHashtable. NVD adds that exploitation needs cluster mode and an attacker controlled dump.rdb at startup, and that the maintainers said it did not meet their bar for a security disclosure.

Netty. CVE-2026-93572 says RedisArrayAggregator preallocates heap for nested RESP array headers, so an application that decodes untrusted RESP traffic can run out of memory. Servers and proxies built on Netty are the concern, not normal clients.

How to check if you're exposed

For Predis:

composer show predis/predis | grep versions
grep -rnE "->pipeline\(|'cluster'|'replication'" app src config

If you use Predis with aggregate connections and call pipeline() with values built from request data, treat yourself as exposed until 3.3.0. Test with a harmless key:

$client->pipeline(function ($pipe) { $pipe->set("probe\r\nPING", "x"); });

Run it only against a test cluster, never production, and watch the server's command log for an unexpected PING.

For servers, check versions and whether the cluster bus is exposed:

redis-cli INFO server | grep redis_version
valkey-cli INFO server | grep valkey_version
redis-cli CLUSTER INFO | head -3

The cluster bus listens on the data port plus 10000 by default. It should only be open between cluster nodes.

What to do now

  1. Upgrade predis/predis to 3.3.0 and replace pipeline() with transaction() where you cannot upgrade immediately and the data is untrusted.
  2. Reject or strip CR and LF in user supplied keys and values at the edge.
  3. Restrict the cluster bus port in network policy and security groups to node addresses.
  4. Move Valkey to 9.0.5 or 9.1.1 or later if you use slot migration. Take Redis fixes from your distributor's advisory, since NVD gives no fixed version.

Why it matters

Redis protocol injection is the Redis version of SQL injection, and it hides inside client libraries that people assume are safe. When a library builds wire bytes from strings, ask whether it ever re parses them.

The server bugs are the opposite shape. They are hard to reach if your cluster is isolated, which most are, and easy to reach if the bus port is routable.

Try it yourself

Reachability decides which of these matter. In the demo below, see how checking whether your code calls the vulnerable function changes the list.

Click through it at your own pace, or open it full screen.

Quick check

Your PHP app uses Predis with a single node and MULTI transactions. Is CVE-2026-84372 a problem?

Per the CVE text, the flaw is on aggregate cluster and replication connections and in pipeline() only. A single node with transaction() is not on the vulnerable path, but upgrading to 3.3.0 is still the clean fix.

Sources

Never miss an update

Weekly insights on software supply chain security, delivered to your inbox.

Self-healing security runs on Safeguard.

Your first fix PR is minutes away.

No sales call required, even your agent can complete the purchase over MCP.