
Prueba de concepto para CVE-2022-38725 contra syslog-ng
CVE-2022-38725 es una vulnerabilidad de Denegación de Servicio no autenticada en versiones de syslog-ng anteriores a la 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

El lanzamiento 3.38.1 enlaza con https://github.com/syslog-ng/syslog-ng/pull/4110, que incluye pruebas unitarias y varias validaciones para prevenir variantes similares de este error.
El issue original incluye una depuración útil que identificó la causa raíz.
El aviso de GitHub afirma que la vulnerabilidad se produce por un análisis incorrecto de RFC3164, que es el formato BSD syslog tradicional. El aviso explica que puede ocurrir un underflow de enteros y que se cree que no hay impacto más allá de la disponibilidad.
La pull request para corregir la vulnerabilidad añade pruebas unitarias tanto al analizador de marcas de tiempo de RFC3164 como al de RFC5424 (formato syslog más reciente).
Tenga en cuenta que la especificación RFC3164 define que la marca de tiempo coincide con el formato Oct 11 22:14:15, mientras que RFC5424 utiliza el formato ISO, 1985-04-12T19:20:50.52-04:00. Los casos unitarios indican que el código de syslog-ng intenta analizar ambos formatos. El aviso de GitHub afirma que la vulnerabilidad ocurre al analizar mensajes RFC3164, lo cual no es del todo preciso. Los mensajes RFC5424 son los responsables de la marca de tiempo de longitud variable. Dado que el protocolo syslog no indica explícitamente un tipo de mensaje, el proyecto syslog-ng intentó analizar ambas marcas de tiempo. Esto permite que un mensaje RFC3164 con una marca de tiempo malformada también active la vulnerabilidad:
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 fuente de syslog utiliza el conteo de octetos descrito por RFC6587, que prefija el mensaje syslog con el número de bytes enviados en mensajes TCP.
La vulnerabilidad puede activarse enviando un tamaño de mensaje que no contabilice completamente la marca de tiempo ISO. El código de syslog-ng itera sobre la marca de tiempo y resta el número de dígitos de la longitud especificada. Esta discrepancia permite una condición de underflow en la que la longitud de lectura termina siendo negativa mientras aún hay datos que leer del mensaje.
El proceso fluye hacia un bucle while donde el proceso queda atascado intentando leer caracteres del mensaje. Este problema resulta en un uso del 100% de la CPU para el proceso dado. Un atacante puede enviar múltiples payloads para consumir recursos adicionales del sistema.
Syslog no utiliza conteo de octetos sobre UDP, por lo que el payload anterior no tiene un efecto inusual. Reiniciar el contenedor/proceso de syslog-ng restablece el uso de la CPU.
Uno de los mantenedores de syslog-ng indicó que podría ser posible activar esto mediante un TCP RST en medio de un mensaje. Se señaló que el mensaje tendría que enviar una marca de tiempo parcial antes del TCP RST. Esto podría permitir que se omita el conteo de octetos.