
Prova di concetto per CVE-2022-38725 contro syslog-ng
CVE-2022-38725 è una vulnerabilità di Denial of Service non autenticata in syslog-ng precedente alla versione 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

La versione 3.38.1 rimanda a https://github.com/syslog-ng/syslog-ng/pull/4110, che include test unitari e diverse validazioni per prevenire varianti simili di questo bug.
La segnalazione originale include utili attività di debugging che hanno identificato la causa principale.
L'advisory GitHub afferma che la vulnerabilità deriva da un parsing improprio di RFC3164, il tradizionale formato syslog BSD. L'advisory spiega che può verificarsi un underflow intero e che non si ritiene possibile alcun impatto al di fuori della disponibilità.
La pull request che corregge la vulnerabilità aggiunge test unitari sia al parser dei timestamp RFC3164 che a quello RFC5424 (formato syslog più recente).
Da notare che la specifica RFC3164 definisce il timestamp secondo il formato Oct 11 22:14:15, mentre RFC5424 usa il formato ISO, 1985-04-12T19:20:50.52-04:00. I casi di test indicano che il codice di syslog-ng tenta di interpretare entrambi i formati. L'advisory GitHub afferma che la vulnerabilità si verifica durante il parsing dei messaggi RFC3164, il che non è del tutto accurato. I messaggi RFC5424 sono responsabili del timestamp a lunghezza variabile. Poiché il protocollo syslog non dichiara esplicitamente un tipo di messaggio, il progetto syslog-ng ha tentato di interpretare entrambi i timestamp. Questo consente anche a un messaggio RFC3164 con un timestamp malformato di innescare la vulnerabilità:
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
La sorgente syslog usa il conteggio degli ottetti come descritto da RFC6587, che antepone al messaggio syslog il numero di byte inviati nei messaggi TCP.
La vulnerabilità può essere innescata inviando una dimensione del messaggio che non tiene pienamente conto del timestamp ISO. Il codice di syslog-ng scorre il timestamp e sottrae il numero di cifre dalla lunghezza specificata. Questa discrepanza permette una condizione di underflow in cui la lunghezza di lettura diventa negativa mentre ci sono ancora dati da leggere dal messaggio.
Il processo entra in un ciclo while in cui rimane bloccato cercando di leggere caratteri dal messaggio. Questo problema causa un utilizzo della CPU del 100% per il processo interessato. Un attaccante può inviare più payload per consumare ulteriori risorse di sistema.
Syslog non usa il conteggio degli ottetti su UDP, quindi il payload precedente non ha effetti anomali. Il riavvio del container/processo syslog-ng azzera l'utilizzo della CPU.
Uno dei maintainer di syslog-ng ha indicato che potrebbe essere possibile innescare questa vulnerabilità tramite un TCP RST nel mezzo di un messaggio. È stato osservato che il messaggio dovrebbe inviare un timestamp parziale prima del TCP RST. Questo potrebbe consentire di aggirare il conteggio degli ottetti.