🇰🇷 한글 설명
SnailJob 1.7.0의 FuryUtil.deserialize 헬퍼에는 서비스 거부 취약점이 존재합니다. 인증된 공격자가 Zstandard 프레임 헤더의 frame_content_size 값을 과도하게 부풀린 조작된 페이로드를 재시도 작업 인자로 저장하면, 작업 디스패치 시 JVM이 무제한 배열 할당을 시도하여 복구 불가능한 OutOfMemoryError가 발생해 서버가 중단됩니다.
💡 쉬운 설명
로그인한 사용자가 악의적으로 조작된 압축 데이터를 작업 기록에 넣으면 서버의 메모리가 고갈되어 서비스가 멈출 수 있습니다. 공격에는 정상적인 계정 권한이 필요하지만 한 번의 요청으로 서버 전체가 중단될 수 있습니다.
🇺🇸 원문 (English)
SnailJob 1.7.0 contains a denial of service vulnerability in the FuryUtil.deserialize helper that allows authenticated attackers to crash the server by supplying a crafted Zstandard-compressed payload with an inflated frame_content_size field in the frame header. Attackers can store a base64-encoded Zstandard payload declaring an arbitrarily large decompressed size in a retry task argument, causing the JVM to attempt an unbounded array allocation and triggering an unrecoverable java.lang.OutOfMemoryError when the task is dispatched through the retry-task pipeline.
📍 영향받는 시스템
SnailJob 1.7.0 (재시도 작업 파이프라인을 사용하는 환경)
⚔️ 공격 벡터
인증된 사용자가 frame_content_size를 부풀린 base64 인코딩 Zstandard 페이로드를 재시도 작업 인자로 저장하여 작업 실행 시 OOM을 유발
🛡️ 대응 방법
SnailJob을 최신 패치 버전으로 업그레이드하고, 업그레이드 전까지 재시도 작업 생성 권한을 신뢰된 사용자로 제한하며 JVM 힙 한도와 모니터링을 설정
🔧 검증 코드
출력된 JAR 경로와 MANIFEST의 Implementation-Version 또는 Specification-Version 값이 1.7.0이면 취약하며, 해당 버전이 아니거나 명령 결과가 없으면 영향받지 않는 것으로 판단합니다.
find / -name '*snail*job*.jar' 2>/dev/null | head -n 5 | xargs -I{} sh -c 'echo {}; unzip -p {} META-INF/MANIFEST.MF 2>/dev/null | grep -i version'