🇰🇷 한글 설명
PJSIP 2.16 이하 버전의 Opus 오디오 디코딩 경로에서 버퍼 크기 검증이 부족하여 힙 버퍼 오버플로우가 발생합니다. FEC 디코드 버퍼는 PCM 기반 공식으로 할당되어, 인코딩된 프레임이 이를 초과하면 입력 크기만큼 무검증으로 복사되어 메모리가 손상됩니다.
💡 쉬운 설명
음성 통신 프로그램이 특정 오디오 데이터를 처리할 때 메모리 공간을 넘어서 데이터를 쓰게 되는 문제입니다. 이를 악용하면 프로그램이 비정상 종료되거나 공격자가 임의의 코드를 실행할 수 있습니다.
🇺🇸 원문 (English)
PJSIP is a free and open source multimedia communication library written in C. In 2.16 and earlier, there is a buffer overflow when decoding Opus audio frames due to insufficient buffer size validation in the Opus codec decode path. The FEC decode buffers (dec_frame[].buf) were allocated based on a PCM-derived formula: (sample_rate/1000) * 60 * channel_cnt * 2. At 8 kHz mono this yields only 960 bytes, but codec_parse() can output encoded frames up to MAX_ENCODED_PACKET_SIZE (1280) bytes via opus_repacketizer_out_range(). The three pj_memcpy() calls in codec_decode() copied input->size bytes without bounds checking, causing a heap buffer overflow.
📍 영향받는 시스템
PJSIP 2.16 이하 버전을 사용하는 VoIP/SIP 애플리케이션 및 시스템
⚔️ 공격 벡터
악의적으로 조작된 Opus 인코딩 오디오 패킷을 SIP/RTP 통신을 통해 대상 시스템에 전송
🛡️ 대응 방법
PJSIP를 2.16보다 높은 패치 버전으로 업데이트하고 의존 애플리케이션을 재빌드하여 배포
🔧 검증 코드
출력된 버전이 2.16 이하이면 취약하며, 2.16보다 높은 버전이 표시되면 패치된 상태이고 버전 정보가 없으면 설치 경로를 수동으로 확인해야 합니다.
pkg-config --modversion libpjproject 2>/dev/null || (find / -name 'pjsip*' -o -name 'libpjproject*' 2>/dev/null | head -5)