FFmpeg 보안 분석: 자율 에이전트가 발견한 21개의 제로데이 취약점
Depthfirst는 특수화된 자율 보안 에이전트를 사용하여 FFmpeg에서 21개의 제로데이 취약점을 식별했습니다. 이 발견에는 여러 중요한 메모리 손상 문제가 포함되어 있으며, 그 중 일부는 20년 이상 잠재된 상태였고, AV1 RTP 디패킷화기에서 입증된 원격 코드 실행(RCE) 익스플로잇 프리미티브도 포함됩니다.
AI 기반 취약점 탐지
Depthfirst의 보안 에이전트는 기능 구현에 초점을 맞춘 표준 코딩 에이전트와 달리 적대적 입력과 위협 모델링에 집중합니다. 시스템은 공격 표면을 매핑하고, 노출된 파서를 식별하며, 데이터 흐름을 취약한 싱크로 추적합니다. 이론적 분석과 달리, 에이전트는 도달 가능성과 악용 가능성을 확인하기 위해 구체적이고 재현 가능한 개념 증명(PoC) 입력을 생성합니다.
이 접근 방식은 매우 비용 효율적임이 입증되었으며, 약 $1,000(다른 고급 모델인 Anthropic의 Mythos를 사용한 유사 작업 비용의 약 10%)에 21개의 취약점을 발견했습니다.
발견된 취약점 요약
이 21개의 취약점은 TS 디멀티플렉서부터 VP9 디코더에 이르는 다양한 구성 요소에 걸쳐 있습니다. 8개는 CVE가 할당되었으며, 나머지는 Depthfirst 내부에서 추적되고 있습니다.
CVE 할당 취약점
| CVE | 유형 | 구성 요소 | 비고 |
|---|---|---|---|
| CVE-2026-39210 | 힙 버퍼 오버플로우 | TS 디멀티플렉서 | 길이 경계 검사가 없었으며 2010년에 도입되었습니다. |
| CVE-2026-39211 | 정수 오버플로우 | swscale | 크기 계수 공식에 상한이 없었으며 2010년에 도입되었습니다. |
| CVE-2026-39212 | 스택 오버플로우 | ffmpeg_opt.c |
깊이 제한 없이 재귀 옵션 파싱; 2025년 7월 회귀. |
| CVE-2026-39213 | 힙 버퍼 오버플로우 | yuv4mpegenc | 패킷 크기에 대한 차원 검증 누락; 2023년에 도입되었습니다. |
| CVE-2026-39214 | 스택 버퍼 오버플로우 | SDT 구현 | 남은 공간을 추적하지 못함; 2003년부터 잠재. |
| CVE-2026-39215 | 힙 버퍼 오버플로우 | update_mb_info() |
12바이트 오버플로우를 허용하는 논리 오류; 2012년에 도입되었습니다. |
| CVE-2026-39216 | 힙 버퍼 오버플로우 | img2enc.c |
차원에서 파생된 크기에 상한이 없음; 2012년에 도입되었습니다. |
| CVE-2026-39217 | 힙 버퍼 오버플로우 | VP9 디코더 | 타일 스레드 버퍼에서 재할당 누락; 2025년 3월 회귀. |
| CVE-2026-39218 | 힙 버퍼 오버플로우 | DASH 디멀티플렉서 | 음수 지속 시간 값을 거부하지 못함; 2017년에 도입되었습니다. |
기타 주목할 만한 발견
- DFVULN-127 (힙 버퍼 오버플로우): RTP AV1 디패킷화기에서 발견; RCE 프리미티브를 허용합니다.
- DFVULN-122 (힙 버퍼 오버플로우): RTP MPEG-4 디패킷화기에서 발견; 2005년부터 잠재.
- DFVULN-123 (정수 오버플로우): RTP LATM 디패킷화기에서 발견; 힙 버퍼를 약 1GB 초과해 읽을 수 있게 함.
- DFVULN-120 (정수 언더플로우): AVI 디멀티플렉서에서 발견; 약 2GB 할당을 트리거해 서비스 거부(DoS)를 유발할 수 있음.
심층 분석: AV1 RTP 디패킷화기에서의 RCE
가장 중요한 발견 중 하나는 libavformat/rtpdec_av1.c에서 발생한 힙 버퍼 오버플로우입니다. 이 취약점은 표준 RTSP 스트림 요청(ffmpeg -i rtsp://attacker/stream)을 통해 도달 가능하며, 스트림을 여는 것 외에 특별한 플래그나 사용자 상호작용이 필요하지 않습니다.
근본 원인
취약점은 Temporal Delimiter(TD) OBU를 처리하는 과정에 존재합니다. 디패킷화기는 TD 마커를 무시하고 제거하도록 설계되었습니다. 그러나 코드가 av_grow_packet을 통해 해당 메모리를 할당하지 않고, 공격자가 지정한 obu_size만큼 출력 커서(pktpos)를 전진시킵니다.
이로 인해 두 가지 중요한 실패가 발생합니다:
- 오염된 쓰기 커서:
pktpos가 앞으로 이동하지만, 기본 버퍼는 확대되지 않습니다. - 공격자 제어 콘텐츠: 입력 포인터(
buf_ptr)가 전진되지 않기 때문에, 다음 반복에서 TD 자체 바이트를 새로운 OBU로 다시 파싱하여, 공격자가 오염된 오프셋에 정확히 무엇을 쓸지 제어할 수 있습니다.
악용 경로
obu_size를 148로 정밀하게 조정하면, 공격자는 pkt->data[148]에서 쓰기를 시작할 수 있습니다. FFmpeg의 64바이트 정렬 때문에 AVBuffer 관리 구조체가 데이터 버퍼 바로 뒤에 위치합니다. AVBuffer.free 함수 포인터는 오프셋 152에 위치합니다.
특정 OBU 페이로드를 제작함으로써, 공격자는 free 포인터를 제어된 주소로 덮어쓸 수 있습니다. 버퍼가 이후에 해제될 때(재할당을 강제하는 세 번째 조작된 OBU에 의해 트리거), FFmpeg는 손상된 free 포인터를 호출하여 공격자가 명령 포인터(RIP)를 제어하게 됩니다.
커뮤니티 관점 및 보안 함의
이러한 취약점의 발견은 C에서 복잡한 미디어 포맷을 파싱하는 고유 위험성에 대한 논의를 촉발했습니다.
샌드박스 필요성
많은 커뮤니티 구성원은 신뢰할 수 없는 콘텐츠를 처리할 때 FFmpeg를 샌드박스 외부에서 실행해서는 안 된다고 강조합니다.
"Ffmpeg는 신뢰할 수 없거나 사용자가 제공한 콘텐츠를 다룰 때 절대로 샌드박스 밖에서 실행해서는 안 되는 프로그램입니다. 사람들이 그렇게 하는 것을 알고 있지만, 그들은 비합리적인 위험을 감수하고 있습니다." 전문가들은 미디어 코덱의 복잡성 때문에 완전한 보안이 거의 불가능하므로, 프로세스를 격리하기 위해 VM이나 gVisor와 같은 도구를 사용할 것을 제안합니다.
보안에서 AI의 역할
이러한 발견이 LLM의 힘을 보여주지만, 일부 비평가들은 업계가 보고에 지나치게 집중하고 수정에 충분히 투자하지 않는다며 비판합니다. AI 에이전트가 버그 보고서 제출을 넘어 직접 취약점을 수정하는 풀 리퀘스트(PR)를 생성해 오픈소스 유지보수자의 부담을 줄여야 한다는 요구가 있습니다.
메모리 안전성
이러한 발견에서 버퍼 오버플로우와 정수 언더플로우가 빈번하게 나타나는 것은 메모리 안전 언어에 대한 지속적인 논쟁을 강조합니다. 일부 기여자는 Rust나 Go와 같이 산술 오버플로우와 메모리 경계를 더 엄격히 처리하는 언어에서는 이러한 문제가 존재하지 않거나 쉽게 잡힌다고 지적했습니다.