From 2169c868c37aa799faac5a67fdfa682f11a7ff04 Mon Sep 17 00:00:00 2001 From: Cobra Date: Fri, 10 Apr 2026 15:05:19 -0400 Subject: [PATCH] =?UTF-8?q?Add=20bounds=20checks=20to=20netlink=20and=20DH?= =?UTF-8?q?CP=20parsers=20=E2=80=94=20prevent=20exception=20flood=20on=20m?= =?UTF-8?q?alformed=20packets?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- presence/presence_daemon.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/presence/presence_daemon.py b/presence/presence_daemon.py index 61c40d1..92e0204 100644 --- a/presence/presence_daemon.py +++ b/presence/presence_daemon.py @@ -412,6 +412,10 @@ def parse_netlink(data: bytes) -> None: if nlmsg_len < 16: break + # Verify complete message is available before extracting payload + if offset + nlmsg_len > len(data): + return + payload = data[offset + 16:offset + nlmsg_len] if nlmsg_type in (RTM_NEWNEIGH, RTM_DELNEIGH): @@ -439,6 +443,10 @@ def parse_ndmsg(data: bytes, msg_type: int) -> None: if rta_len < 4: break + # Verify complete RTA attribute is available before extracting + if offset + rta_len > len(data): + return + val = data[offset + 4:offset + rta_len] if rta_type == NDA_LLADDR and len(val) == 6: @@ -518,6 +526,8 @@ def parse_dhcp(data: bytes) -> None: return # MAC address (chaddr at offset 28, 6 bytes) + if len(dhcp) < 34: + return mac_bytes = dhcp[28:34] mac = ':'.join(f'{b:02x}' for b in mac_bytes) if mac in ('00:00:00:00:00:00', 'ff:ff:ff:ff:ff:ff'):