sngrep: patch CVE-2026-90558

Details:
https://nvd.nist.gov/vuln/detail/cve-2026-90558

Signed-off-by: Ankur Tyagi <ankur.tyagi85@gmail.com>
Signed-off-by: Anuj Mittal <anuj.mittal@oss.qualcomm.com>
This commit is contained in:
Ankur Tyagi authored and Anuj Mittal committed 2026-10-06 09:50:46 +05:30
1 parent b23291be83
commit 36ddee53b1
2 files changed
+87 -1

No files matched your search

@@ -0,0 +1,84 @@
From 399346a12ca3bcf7703734fa33b5b3427775b014 Mon Sep 17 00:00:00 2001
From: Kaian <kaian@irontec.com>
Date: Fri, 7 Aug 2026 08:45:42 +0200
Subject: [PATCH] fix: prevent stack buffer overflow in SIP attribute
formatting
call_get_attribute() formatted the Call-ID, X-Call-ID and Reason header
text with an unbounded sprintf("%s"). Call-ID/X-Call-ID can hold up to
MAX_CALLID_SIZE/MAX_XCALLID_SIZE (1023 bytes) and Reason text is copied
from the raw payload (up to MAX_SIP_PAYLOAD), while all callers pass a
255-byte SIP_ATTR_MAXLEN stack buffer (call list rendering, sort compare).
A SIP message with a long Call-ID, X-Call-ID or Reason header overflowed
the stack, triggerable via pcap, live capture or HEP/EEP remote capture.
Bound these writes with "%.*s" and SIP_ATTR_MAXLEN - 1. Also fix a
matching off-by-one in msg_get_attribute(), where the existing "%.*s"
used SIP_ATTR_MAXLEN as the precision and could write 256 bytes
(255 chars + NUL) into the 255-byte buffer.
Thanks to TristanInSec for reporting the issue.
(cherry picked from commit 1ff74ee3ab5ff280e8ba976aa8c744dca57eb35b)
CVE: CVE-2026-90558
Upstream-Status: Backport [https://github.com/irontec/sngrep/commit/1ff74ee3ab5ff280e8ba976aa8c744dca57eb35b]
SIP contract change was dropped during backport as it was introduced in
v1.8.4[1]
[1]https://github.com/irontec/sngrep/commit/c61a26d90c166f996e31aceefc9c2f8f831ccd86
Signed-off-by: Ankur Tyagi <ankur.tyagi85@gmail.com>
---
src/sip_call.c | 6 +++---
src/sip_msg.c | 6 +++---
2 files changed, 6 insertions(+), 6 deletions(-)
diff --git a/src/sip_call.c b/src/sip_call.c
index bea879a..68ecb50 100644
--- a/src/sip_call.c
+++ b/src/sip_call.c
@@ -257,10 +257,10 @@ call_get_attribute(sip_call_t *call, enum sip_attr_id id, char *value)
sprintf(value, "%d", call->index);
break;
case SIP_ATTR_CALLID:
- sprintf(value, "%s", call->callid);
+ sprintf(value, "%.*s", SIP_ATTR_MAXLEN - 1, call->callid);
break;
case SIP_ATTR_XCALLID:
- sprintf(value, "%s", call->xcallid);
+ sprintf(value, "%.*s", SIP_ATTR_MAXLEN - 1, call->xcallid);
break;
case SIP_ATTR_MSGCNT:
sprintf(value, "%d", vector_count(call->msgs));
@@ -282,7 +282,7 @@ call_get_attribute(sip_call_t *call, enum sip_attr_id id, char *value)
break;
case SIP_ATTR_REASON_TXT:
if (call->reasontxt)
- sprintf(value, "%s", call->reasontxt);
+ sprintf(value, "%.*s", SIP_ATTR_MAXLEN - 1, call->reasontxt);
break;
case SIP_ATTR_WARNING:
if (call->warning)
diff --git a/src/sip_msg.c b/src/sip_msg.c
index 379a40a..6762862 100644
--- a/src/sip_msg.c
+++ b/src/sip_msg.c
@@ -136,13 +136,13 @@ msg_get_attribute(sip_msg_t *msg, int id, char *value)
}
break;
case SIP_ATTR_METHOD:
- sprintf(value, "%.*s", SIP_ATTR_MAXLEN, sip_get_msg_reqresp_str(msg));
+ sprintf(value, "%.*s", SIP_ATTR_MAXLEN - 1, sip_get_msg_reqresp_str(msg));
break;
case SIP_ATTR_SIPFROM:
- sprintf(value, "%.*s", SIP_ATTR_MAXLEN, msg->sip_from);
+ sprintf(value, "%.*s", SIP_ATTR_MAXLEN - 1, msg->sip_from);
break;
case SIP_ATTR_SIPTO:
- sprintf(value, "%.*s", SIP_ATTR_MAXLEN, msg->sip_to);
+ sprintf(value, "%.*s", SIP_ATTR_MAXLEN - 1, msg->sip_to);
break;
case SIP_ATTR_SIPFROMUSER:
if (msg->sip_from && (ar = strchr(msg->sip_from, '@'))) {
@@ -15,7 +15,9 @@ DEPENDS = "\
ncurses \
"
SRC_URI = "git://github.com/irontec/sngrep.git;protocol=https;branch=master"
SRC_URI = "git://github.com/irontec/sngrep.git;protocol=https;branch=master \
file://CVE-2026-90558.patch \
"
SRCREV = "dad1033640f249fa4994f976cf6ee96826c15702"