
syslog-ng 대상 CVE-2022-38725 개념 증명
CVE-2022-38725는 3.38.1 이전 버전의 syslog-ng에서 발생하는 인증되지 않은 서비스 거부(Denial of Service) 취약점입니다.
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 권고는 이 취약점이 기존 BSD syslog 형식인 RFC3164의 잘못된 파싱으로 인해 발생한다고 주장합니다. 권고는 정수 언더플로(integer underflow)가 발생할 수 있으며 가용성(availability) 외의 영향은 없다고 설명합니다.
취약점을 수정하는 풀 리퀘스트는 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에 설명된 옥텟 카운팅(octet counting)을 사용하며, TCP 메시지에서 전송된 바이트 수를 syslog 메시지 앞에 접두사로 붙입니다.
이 취약점은 ISO 타임스탬프를 완전히 반영하지 않는 메시지 크기를 전송하여 트리거할 수 있습니다. syslog-ng 코드는 타임스탬프를 반복하면서 지정된 길이에서 숫자 개수를 뺍니다. 이러한 불일치로 인해 읽을 데이터가 아직 남아 있는데도 읽기 길이가 음수가 되는 언더플로 조건이 발생할 수 있습니다.
프로세스는 메시지에서 문자를 읽으려고 계속 시도하는 while 루프에 빠지게 됩니다. 이 문제는 해당 프로세스의 CPU 사용률을 100%로 만듭니다. 공격자는 여러 페이로드를 전송하여 추가 시스템 리소스를 소비할 수 있습니다.
Syslog는 UDP에서 옥텟 카운팅을 사용하지 않으므로 위 페이로드는 특별한 영향을 주지 않습니다. syslog-ng 컨테이너/프로세스를 다시 시작하면 CPU 사용률이 초기화됩니다.
syslog-ng 유지보수자 중 한 명은 메시지 전송 중간에 TCP RST를 통해 이 취약점을 트리거할 수 있다고 언급했습니다. TCP RST 이전에 메시지가 부분적인 타임스탬프를 전송해야 한다는 점이 지적되었습니다. 이로 인해 옥텟 카운팅을 우회할 수 있을 수 있습니다.