Crash (buffer overflow detected) in processFileDelete: unchecked m_Extensions[FD_Sid] length in memcpy
Dieses Issue hat noch niemand übernommen.
Bewertung
- Schwierigkeit
- 3/5
- Geschätzter Aufwand
- 1-2 Tage
- Anfängerfreundlichkeit
- 72/100
Rechercherichtung
Start with processFileDelete() in sysmonforlinux.c around line 707, where the issue identifies the unchecked FD_Sid copy; inspect how the received perf record and extension lengths are represented. Check whether other process* handlers make similar copies, as the report suggests. Done means invalid lengths are rejected safely so a malformed event cannot abort Sysmon; the issue does not name a test.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Beschreibung
Summary
sysmon aborts with *** buffer overflow detected *** (SIGABRT) in processFileDelete(). The length passed to memcpy comes straight from the event's m_Extensions[FD_Sid] and is not validated. In the core dump below, that length is 16,779,777 bytes (0x1000a01), while the destination is the 64 KiB stack buffer newData.
Environment
- SysmonForLinux 1.5.3, sysinternalsebpf 2.2.2 (Microsoft apt packages)
- Proxmox VE 9.2 (Debian 13 based), kernel 7.0.14-4-pve, x86_64
- ZFS root, with ZFS replication received regularly (
zfs recv, mass file deletions)
Frequency
The crash happened 6 times on one host over ~3 weeks. It never happened on two identical nodes with the same config. The affected node is the one that receives the most ZFS replication traffic, so the trigger looks related to heavy unlink activity.
Config
FileDelete was not logged at all. The config only had an empty group:
<RuleGroup name="" groupRelation="or">
<FileDelete onmatch="include"/>
</RuleGroup>
Even an empty include group activates the unlink/unlinkat tracing (SetSyscallActive), so processFileDelete() runs for every delete. Removing the FileDelete group completely works around the problem, because FileDelete has no rule default.
Backtrace (systemd-coredump + gdb)
#4 __fortify_fail () from libc.so.6
#5 __chk_fail () from libc.so.6
#6 memcpy (__len=16779777, __src=<optimized out>, __dest=0x7ffcc99d9b08) at /usr/include/x86_64-linux-gnu/bits/string_fortified.h:34
#7 processFileDelete (eventHdr=0x7ea31742a3ac) at /__w/1/s/SysmonForLinux/sysmonforlinux.c:707
#8 perf_buffer__process_record (e=<optimized out>, ctx=<optimized out>) at libbpf.c:13999
#9 perf_event_read_simple (mmap_mem=..., mmap_size=67108864, ...) at libbpf.c:13625
#10 perf_buffer__process_records (...) at libbpf.c:14021
#11 perf_buffer__poll (pb=..., timeout_ms=1000) at libbpf.c:14046
#12 telemetryStart (...) at /__w/1/s/sysinternalsEBPF/telemetryLoader.c:1586
#13 main (...) at /__w/1/s/SysmonForLinux/sysmonforlinux.c:1736
Line 707 in the 1.5.3 tag is:
memcpy(newPtr, ptr, event->m_Extensions[FD_Sid]);
Suggested fix
In processFileDelete(), check the extension lengths (FD_Sid, FD_FileName, FD_ImagePath) before copying:
- their sum must fit into
newDataminus the header and struct size; - it must not exceed the size of the received perf record.
If the check fails, drop the event and log it instead of aborting the whole service. The same pattern may be worth checking in the other process* handlers that copy extension data.
I can provide more details from the core dump if useful.
- Vorherrschende Sprache
- C
- Sterne
- 2.2k
- Forks
- 224
- Ø Merge
- 4 Std. 50 Min.
- Gemergte PRs (30 T.)
- 3
Entwicklungsumgebung
- Kein Dockerfile und keine Docker-Compose-Datei
- Keine Pull-Request-Vorlage
- Beitragsleitfaden lesen
Erste Schritte
- Lesen Sie das ganze Issue und danach den Beitragsleitfaden des Projekts.
- Schreiben Sie ins Issue, dass Sie es übernehmen — das erspart doppelte Arbeit.
- Forken Sie das Repository und arbeiten Sie in einem Branch.
- Öffnen Sie einen Pull Request, der die Issue-Nummer nennt.
Mehr aus microsoft/Sysmon-Linux
-
Schwierigkeit 3/5 1-2 Tage Anfängerfreundlichkeit 68/100
microsoft/Sysmon-Linux#253 ·
-
Schwierigkeit 3/5 1-2 Tage Anfängerfreundlichkeit 55/100
microsoft/Sysmon-Linux#247 ·
-
Schwierigkeit 1/5 Unter einer Stunde Anfängerfreundlichkeit 12/100
microsoft/Sysmon-Linux#246 · 3 Kommentare ·
-
Sysmon service executable remains `(deleted)` after restart, causing repeated needrestart restarts and systemd start-limit-hitEvtl. wieder frei @MarioHewardt hat das vor 31 Tagen übernommen, und es ist kein Pull Request offen. Offen
microsoft/Sysmon-Linux#244 · 1 zugewiesene Person ·
-
ProcessTerminate events intermittently report an unrelated user's UID instead of the terminating process's UIDEvtl. vergeben @MarioHewardt hat das vor 111 Tagen übernommen. Offen
microsoft/Sysmon-Linux#238 · 1 zugewiesene Person ·
Alle Issues in microsoft/Sysmon-Linux
Ähnliche Issues
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 65/100
ly05010419/MacNativeGames#2001 ·
Maintainer antworten meist innerhalb von 1 Tag
-
area/docdb kind/bug priority/medium status/awaiting-triage
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 78/100
yugabyte/yugabyte-db#37426 ·
Maintainer antworten meist innerhalb von 1 Tag
-
area/documentation
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 78/100
obsproject/obs-studio#14184 ·
Maintainer antworten meist innerhalb von 1 Tag
-
extension-modules type-bug
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 72/100
Maintainer antworten meist innerhalb von 1 Tag
-
30-minutes algorithm any-language beginner-friendly c community cpp csharp data-structures go good first issue hacktoberfest help wanted kotlin learning leetcode php ruby rust swift
Schwierigkeit 2/5 Unter einer Stunde Anfängerfreundlichkeit 85/100
Huerte/algo-solutions-python#211 ·
Maintainer antworten meist innerhalb von 1 Tag