Files
8fa38032bb Merge commit from fork
* Fix format-string injection via TURN USERNAME/REALM into Redis (GHSA-4g7c-p5wg-j4hp)

send_message_to_redis() built rm.format by embedding the Redis key — which
contains attacker-controlled STUN USERNAME/REALM values — and passed it as the
format-string argument to redisAsyncCommand(), supplying only a single variadic
argument. is_secure_string() does not block '%', so an authenticated TURN user
could inject printf-style specifiers (e.g. "user%s%x") that hiredis'
redisvFormatCommand interprets, reading past the end of the argument list:
undefined behaviour leading to a crash (DoS for all active relay sessions) or
stack memory disclosure into Redis (CWE-134).

Pass command, key, and the formatted value as data arguments to a constant
"%s %s %s" format string so '%' in the key can never be interpreted. The
on-wire Redis command is unchanged: hiredis tokenises on literal spaces in the
format string, and %s-interpolated content stays a single argument. Drop the
now-unused redis_message.format field.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* Add regression tests for Redis format-string injection (GHSA-4g7c-p5wg-j4hp)

tests/test_redis_format.c compiles the real hiredis_libevent2.c with a
capturing redisAsyncCommand() stub and asserts the security invariant of the
fix: command/key/value are passed as data arguments to a constant "%s %s %s"
format string, so '%' specifiers embedded in an attacker-controlled TURN
USERNAME/REALM never enter the Redis command format string.

Coverage:
- USERNAME containing %s/%x/%n reaches Redis as a single verbatim key argument;
  the format string contains no attacker bytes.
- Same for a malicious REALM.
- Benign key/value passthrough and the empty-value ("del") call site are
  unchanged.
- NULL handle is a no-op.

Each test also asserts that the number of %s specifiers in the captured format
equals the number of supplied arguments — the exact property whose violation
caused the va_list over-read. Against the pre-fix code the harness reproduces
that over-read and crashes (SIGSEGV), so the tests fail as required.

The target builds only when the hiredis and libevent headers are present
(the hiredis library itself is stubbed), mirroring the existing DB-driver
interface tests.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* 1

---------

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-09 23:02:29 -07:00
..
2026-06-09 23:02:29 -07:00
2026-04-27 08:34:38 -07:00
2026-06-05 22:12:10 -07:00
2026-05-24 09:56:03 -07:00
2026-05-24 09:56:03 -07:00
2026-05-24 09:56:03 -07:00
2026-05-24 09:56:03 -07:00
2026-05-24 09:56:03 -07:00
2026-05-24 09:56:03 -07:00
2026-06-09 23:02:29 -07:00
2026-05-24 09:56:03 -07:00
2026-05-24 09:56:03 -07:00
2026-05-24 09:56:03 -07:00