바이브코딩으로 만든 퍼저가 FFmpeg의 0 나누기 버그를 발견

1 day ago 5

FFmpeg의 Sony PS2 VPK 디먹서에서 21바이트 입력으로 재현되는 0 나누기 버그가 발견돼, 악성 .vpk 파일이나 스트림을 여는 애플리케이션이 충돌할 수 있음 vpk_read_packet이 마지막 오디오 블록의 size와 skip을 계산할 때 채널 수가 0인지 검사하지 않아 SIGFPE가 발생함 vpk_read_header에 채널 수 검증이 있지만, 퍼저의 사용자 정의 AVIO 경로에서는 프로브·헤더 데이터와 패킷 데이터가 달라 검사를 통과한 뒤 채널 수가 다시 0이 될 수 있음 퍼저는 495,211회 실행, 10시간 43분 만에 결함을 찾았으며 충돌은 결정론적이지만 메모리 손상이나 임의 읽기·쓰기는 없어 Medium 등급의 서비스 거부(DoS) 문제로 평가됨 vpk_read_packet 진입 시 채널 수를 다시 검사해 AVERROR_INVALIDDATA를 반환하고, 회귀 테스트에서 av_read_frame의 반환값이 -22인지 확인할 수 있음 0 나누기가 발생하는 코드 결함은 Sony PS2 VPK 컨테이너의 오디오 블록을 처리하는 libavformat/vpk.c:89에 있음 vpk_read_packet은 스트림의 마지막 블록에서 다음 두 값을 채널 수로 나눔 size: vpk->last_block_size / par->ch_layout.nb_channels skip: (par->block_align - vpk->last_block_size) / par->ch_layout.nb_channels par->ch_layout.nb_channels가 0이면 CPU에서 정수 0 나누기 예외인 SIGFPE가 발생함 검사를 우회해 충돌에 도달하는 과정 vpk_probe가 빅엔디언 VPK 매직을 인식해 입력을 VPK 디먹서에 할당함 vpk_read_header는 24바이트 헤더를 파싱하며, 퍼징 입력은 0x0e–0x11 바이트의 nb_channels를 0으로 설정함 헤더 처리에는 nb_channels > 0 검증이 이미 있지만, 사용자 정의 AVIO 경로에서는 프로브·헤더 데이터와 이후 패킷 데이터가 달라질 수 있음 vpk->last_block_size와 vpk->block_count는 유효한 채널 수가 있는 프로브 데이터로 계산됨 vpk_read_packet 실행 시 원래 퍼징 스트림에서 가져온 par->ch_layout.nb_channels가 다시 0이 ...

Read Entire Article