Escritura fuera de límites en el extractor PEA de PeaZip permite la ejecución de código arbitrario mediante un archivo .pea manipulado
Descripción
Escritura fuera de los límites del buffer (CWE-787) en la rutina de extracción del formato PEA (pea.pas, unpea_procedure) del componente pea de primera parte en PeaZip 11.2.0 y versiones anteriores, que permite a un atacante que convence a una víctima de abrir o extraer un archivo .pea malicioso ejecutar código arbitrario con los privilegios del usuario que ejecuta PeaZip. Durante la descompresión de un flujo PCOMPRESS1, el campo de 32 bits que indica el tamaño del primer bloque comprimido (compsize) se lee directamente del archivo en pea.pas:3790 y se usa sin validación como longitud de un blockread hacia los búferes globales de tamaño fijo wbuf1/wbuf2 (1.114.112 bytes cada uno, declarados en pea.pas:462) y como límite del bucle de copia posterior. La comprobación existente if compsize > WBUFSIZE then internal_error(...) se aplica únicamente al tamaño de los bloques siguientes en pea.pas:3849, por lo que el primer bloque la elude por completo; el mismo valor sin validar se usa además para indexar wbuf1[compsize] en esa misma línea, produciendo una lectura fuera de límites en un desplazamiento elegido por el atacante. El bucle de copia en pea.pas:3815 copia además la longitud solicitada i en lugar del número de bytes realmente leídos (numread), y termina por igualdad (if addr = compsize+4) en lugar de por cota superior, de modo que un desbordamiento deja la condición permanentemente insatisfacible. Dado que el proyecto se compila sin comprobación de rango ({$R-} por defecto, confirmado por la ausencia de <RangeChecks> en project_pea.lpi) y no se requiere contraseña de archivo, etiqueta de integridad ni configuración especial para alcanzar la ruta vulnerable, el desbordamiento sobreescribe datos globales adyacentes de forma determinista. La ejecución de código fue demostrada de forma independiente por dos investigadores sobre los binarios oficiales Linux x86_64 y Windows x64; la escritura fuera de límites afecta a todas las plataformas (Windows, macOS, Linux, BSD).
Tipo de vulnerabilidad (CWE)
CWE-787: Escritura fuera de los límites del buffer
CWE-1284: Validación incorrecta de la cantidad especificada en la entrada
CWE-125: Lectura fuera de los límites del buffer
Versiones afectadas
Todas las versiones de PeaZip anteriores a 11.3.0. El código vulnerable es rastreable hasta el componente PEA original (pea 0.10, 15/09/2006). Estado por defecto: afectado.
Puntuación (CVSS 4.0)
Alto (8.4)
CVSS:4.0/AV:L/AC:L/AT:N/PR:N/UI:A/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N
Solución
Actualizar a PeaZip 11.3.0 o superior. La corrección valida el tamaño del primer bloque comprimido antes de usarlo como longitud de lectura, copia el número de bytes realmente leídos (numread) en lugar de la longitud solicitada, y detiene el bucle de lectura de bloques cuando el desplazamiento acumulado supera el valor esperado.
Parche
Commit 90ddbaee0945a4d8ffa4d972d43711bbfb9576ba
Créditos
- julichaan - finder
- c4sh3r - finder
- Darío Rivas Quero - analyst
- Secur0 CNA - coordinator
Fuente del descubrimiento: Externo
Registro oficial: CVE-2026-102514