
Доказательство концепции для CVE-2022-38725 против syslog-ng
CVE-2022-38725 — это уязвимость типа «Отказ в обслуживании» без аутентификации в syslog-ng версий до 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

Релиз 3.38.1 ссылается на https://github.com/syslog-ng/syslog-ng/pull/4110, который включает модульные тесты и несколько проверок для предотвращения аналогичных вариантов этой ошибки.
Исходная проблема содержит полезную отладку, которая выявила первопричину.
Уведомление GitHub утверждает, что уязвимость возникает из-за некорректного разбора RFC3164 — традиционного формата системных журналов BSD. В уведомлении объясняется, что может произойти целочисленное переполнение (integer underflow) и что влияние, помимо доступности, считается невозможным.
Запрос на исправление уязвимости добавляет модульные тесты как для парсера временных меток RFC3164, так и для RFC5424 (более новый формат syslog).
Обратите внимание, что спецификация RFC3164 определяет временную метку в формате Oct 11 22:14:15, тогда как RFC5424 использует формат ISO: 1985-04-12T19:20:50.52-04:00. Модульные тесты показывают, что код syslog-ng пытается разобрать любой формат. Уведомление GitHub утверждает, что уязвимость возникает при разборе сообщений RFC3164, что не совсем точно. Сообщения RFC5424 отвечают за временную метку переменной длины. Поскольку протокол syslog явно не указывает тип сообщения, проект syslog-ng пытался разобрать обе временные метки. Это позволяет также запустить уязвимость с помощью сообщения RFC3164 с неправильно сформированной временной меткой:
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
Источник syslog использует подсчёт октетов, описанный в RFC6587, который предваряет сообщение syslog количеством байт, отправляемых в TCP-сообщениях.
Уязвимость может быть вызвана отправкой размера сообщения, который не полностью учитывает временную метку ISO. Код syslog-ng перебирает временную метку и вычитает количество цифр из указанной длины. Это несоответствие приводит к условию переполнения (underflow), при котором длина чтения становится отрицательной, хотя в сообщении ещё есть данные для чтения.
Процесс переходит в цикл while, где застревает, пытаясь прочитать символы из сообщения. Это приводит к 100% загрузке ЦП для данного процесса. Злоумышленник может отправлять несколько полезных нагрузок для потребления дополнительных системных ресурсов.
Syslog не использует подсчёт октетов через UDP, поэтому указанная выше полезная нагрузка не имеет необычного эффекта. Перезапуск контейнера/процесса syslog-ng сбрасывает загрузку ЦП.
Один из мейнтейнеров syslog-ng указал, что возможно вызвать это через TCP RST в середине сообщения. Было отмечено, что сообщение должно отправить частичную временную метку до TCP RST. Это может позволить обойти подсчёт октетов.