Vulnerabilidad de division por cero en el demuxer VPK de FFmpeg

Fuentes: Integer Divide-by-Zero in vpk_read_packet (VPK Demuxer)

Un informe de seguridad detalla una vulnerabilidad de tipo denegacion de servicio en el demuxer VPK de FFmpeg, identificado como issue 24290. El fallo se origina en la funcion vpk_read_packet del archivo libavformat/vpk.c, linea 89, donde se divide vpk->last_block_size entre par->ch_layout.nb_channels sin verificar que el numero de canales sea distinto de cero. Un archivo o flujo .vpk malicioso de 21 bytes provoca una excepcion SIGFPE en cualquier aplicacion basada en FFmpeg que lo abra.

El problema afecta al demuxer de audio VPK de Sony PS2. Aunque vpk_read_header valida que nb_channels sea mayor que cero, la ruta personalizada de AVIO que emplea el fuzzer permite que, al llegar a vpk_read_packet, ese valor haya vuelto a cero mientras vpk->last_block_size y vpk->block_count conservan datos validos del probe inicial. Asi se alcanza la division por cero tanto en el calculo de size como en el de skip.

La entrada que reproduce el crash contiene la marca VPK en big-endian y los bytes 0x0e a 0x11 puestos a cero. El informe incluye volcado hexadecimal, backtrace de GDB, metadatos de la ejecucion de fuzzing y una evaluacion de explotabilidad: el bloqueo es determinista, poco profundo y no requiere precondiciones, pero no ofrece lectura ni escritura arbitraria. La severidad se califica como media.

Como solucion, el informe propone anadir una comprobacion al inicio de vpk_read_packet que rechace los flujos con cero canales mediante AVERROR_INVALIDDATA, alineandose con la validacion ya existente en vpk_read_header. Tambien adjunta un test de regresion con los 21 bytes exactos del crash.