
إثبات المفهوم لـ CVE-2025-65945 (التحقق غير السليم من التوقيع التشفيري في node-jws)
هذا دليل على مفهوم لتجاوز التحقق من التوقيع في مكتبة node-jws. يسمح الخلل للمهاجمين بتزوير رموز JWT صالحة عندما يستمد الخادم أسرار HMAC من بيانات يتحكم فيها المستخدم.
لا تتحقق الدالة jws.createVerify() من أن السر قد تم توفيره فعليًا عند استخدام خوارزميات HMAC. إذا كان تطبيقك يبحث عن الأسرار بناءً على شيء في JWT (مثل رأس kid) وفشل البحث، فقد ينتهي بك الأمر بالتحقق مقابل سر فارغ.
يمكن للمهاجم استغلال ذلك عن طريق:
undefined، والذي يتم تحويله إلى سلسلة فارغةيمكن للمهاجم الآن انتحال شخصية أي شخص أو منح نفسه صلاحيات المسؤول.
قم بالترقية إلى 3.2.3+ أو 4.0.1+ لإصلاح ذلك.
تأكد من تثبيت Bun، ثم:
# Install the vulnerable version
bun install [email protected]
# Run the exploit
bun run exploit.js
يجب أن ترى مخرجات تظهر رمز مسؤول مزور يتم قبوله كصالح.
يحاكي دليل الإثبات خادمًا:
kid (معرف المفتاح) الخاص بـ JWTcreateVerify() مع واجهة البثيقوم المهاجم بإنشاء JWT بـ kid: "non-existent-key" ويوقعه بسر فارغ. عندما يحاول الخادم البحث عن هذا المفتاح، يحصل على undefined، يكتب سلسلة فارغة إلى تدفق التحقق، ويمر الرمز المزور بالتحقق.
# Upgrade to patched version
bun install [email protected]
# Run again - should fail now
bun run exploit.js
مع الإصدار المصحح، سترى خطأ: secret must be a string or buffer or a KeyObject. يتحقق الإصلاح من أن عمليات HMAC لها سر مناسب قبل المتابعة.
إذا كان الكود الخاص بك يشبه هذا، فقد تكون متأثرًا:
const decoded = jws.decode(token);
const secret = lookupSecret(decoded.header.kid); // might return undefined!
const verifier = jws.createVerify({
algorithm: "HS256",
signature: token,
});
verifier.secret.write(secret); // oops
verifier.secret.end();