هناك مشكلة بسيطة وربما مشكلة أكبر:
هناك معلمة nonce مطلوبة غير مذكورة في التوثيق:
def require_params
%i[public_key nonce scopes client_id application_name].each { |p| params.require(p) }
end
الآن المشكلة الأكثر تعقيدًا. تستدعي Discourse الدالة public_encrypt بدون وسائط:
هذا يعني أن وسيطة padding تأخذ القيمة الافتراضية PKCS1_PADDING. من توثيق Ruby:
تشفير
stringبالمفتاح العام. تأخذpaddingالقيمة الافتراضيةPKCS1_PADDING، والتي يُعرف أنها غير آمنة ولكنها تُحتفظ بها للتوافق مع الإصدارات السابقة.
للأسف، Node v20.14.0 (الإصدار الحالي المستقر) يُرجع خطأ إذا حاولت استدعاء crypto.privateDecrypt مع RSA_PKCS1_PADDING:
function decryptData(data: string, privateKey: string) {
const buffer = Buffer.from(data, "base64");
const decrypted = crypto.privateDecrypt(
{
key: privateKey,
padding: crypto.constants.RSA_PKCS1_PADDING,
},
buffer
);
return decrypted.toString("utf8");
}
TypeError: RSA_PKCS1_PADDING لم يعد مدعومًا لفك التشفير الخاص، يمكن التراجع عن هذا باستخدام --security-revert=CVE-2023-46809
حل محتمل لتطبيقات Node هو تشغيل Node باستخدام علامة عدم الأمان:
node --security-revert=CVE-2023-46809
حل في جانب Discourse سيكون سهلاً، ولكني أشك في أنه سيكسر العديد من التكاملات الحالية:
public_key = OpenSSL::PKey::RSA.new(params[:public_key])
@payload = Base64.encode64(public_key.public_encrypt(@payload, OpenSSL::PKey::RSA::PKCS1_OAEP_PADDING))