
Proof of Concept für CVE-2022-38725 gegen syslog-ng
CVE-2022-38725 ist eine nicht authentifizierte Denial-of-Service-Schwachstelle in syslog-ng-Versionen vor 3.38.1.
https://github.com/syslog-ng/syslog-ng/security/advisories/GHSA-7932-4fc6-pvmc
https://nvd.nist.gov/vuln/detail/CVE-2022-38725
docker pull linuxserver/syslog-ng:3.36.1
docker run -p 514:5514/udp -p 601:6601/tcp --rm -it linuxserver/syslog-ng:3.36.1
echo '27 <182>2022-08-17T05:02:28.217 mymachine su: 'su root' failed for lonvick on /dev/pts/8' | nc 127.0.0.1 601 -w 1

Das 3.38.1-Release verlinkt https://github.com/syslog-ng/syslog-ng/pull/4110, das Unit-Tests und mehrere Validierungen enthält, um ähnliche Varianten dieses Bugs zu verhindern.
Das ursprüngliche Issue enthält hilfreiches Debugging, das die Grundursache identifiziert hat.
Das GitHub-Advisory behauptet, dass die Schwachstelle durch unsachgemäßes Parsen von RFC3164 entsteht, dem traditionellen BSD-syslog-Format. Das Advisory erklärt, dass ein Integer-Unterlauf auftreten kann und dass keine anderen Auswirkungen als die Verfügbarkeit (Availability) für möglich gehalten werden.
Der Pull-Request zur Behebung der Schwachstelle fügt Unit-Tests sowohl für die RFC3164- als auch für die RFC5424-Timestamp-Parser (neueres syslog-Format) hinzu.
Beachte, dass die RFC3164-Spezifikation den Timestamp im Format Oct 11 22:14:15 definiert, während RFC5424 das ISO-Format 1985-04-12T19:20:50.52-04:00 verwendet. Die Unit-Fälle zeigen, dass der syslog-ng-Code versucht, beide Formate zu parsen. Das GitHub-Advisory behauptet, dass die Schwachstelle beim Parsen von RFC3164-Nachrichten auftritt, was nicht ganz korrekt ist. RFC5424-Nachrichten sind für den Timestamp mit variabler Länge verantwortlich. Da das syslog-Protokoll keinen Nachrichtentyp explizit angibt, hat das syslog-ng-Projekt versucht, beide Timestamps zu parsen. Dies ermöglicht es, dass auch eine RFC3164-Nachricht mit einem fehlerhaften Timestamp die Schwachstelle auslöst:
echo '21 <182>Oct 11 22:14:15.123 mymachine su: 'su root' failed for lonvick on /dev/pts/8' | nc 127.0.0.1 601 -w 1
Die syslog-Quelle verwendet die Oktettzählung gemäß RFC6587, die der syslog-Nachricht die Anzahl der in TCP-Nachrichten gesendeten Bytes voranstellt.
Die Schwachstelle kann ausgelöst werden, indem eine Nachrichtengröße gesendet wird, die den ISO-Timestamp nicht vollständig berücksichtigt. Der syslog-ng-Code iteriert über den Timestamp und subtrahiert die Anzahl der Ziffern von der angegebenen Länge. Diese Diskrepanz ermöglicht eine Unterlaufbedingung (Underflow), bei der die Leselänge negativ wird, während noch Daten aus der Nachricht zu lesen sind.
Der Prozess läuft in eine While-Schleife, in der er festhängt und versucht, Zeichen aus der Nachricht zu lesen. Dieses Problem führt zu 100 % CPU-Auslastung für den jeweiligen Prozess. Ein Angreifer kann mehrere Payloads senden, um zusätzliche Systemressourcen zu verbrauchen.
Syslog verwendet über UDP keine Oktettzählung, daher hat die obige Payload keine ungewöhnliche Wirkung. Ein Neustart des syslog-ng-Containers/-Prozesses setzt die CPU-Auslastung zurück.
Einer der syslog-ng-Maintainer wies darauf hin, dass es möglich sein könnte, dies über ein TCP RST mitten in einer Nachricht auszulösen. Es wurde angemerkt, dass die Nachricht vor dem TCP RST einen Teil-Timestamp senden müsste. Dies könnte es ermöglichen, die Oktettzählung zu umgehen.