Un problème mineur et peut-être un plus gros :
Il y a un paramètre nonce requis qui n’est pas mentionné dans la documentation :
def require_params
%i[public_key nonce scopes client_id application_name].each { |p| params.require(p) }
end
Maintenant, le problème le plus délicat. Discourse appelle la méthode public_encrypt sans arguments :
Cela signifie que l’argument padding prend par défaut PKCS1_PADDING. D’après la documentation Ruby :
Crypte
stringavec la clé publique.paddingprend par défautPKCS1_PADDING, qui est connu pour être non sécurisé mais est conservé pour des raisons de compatibilité ascendante.
Malheureusement, Node v20.14.0 (l’actuel LTS) renvoie une erreur si vous tentez d’appeler crypto.privateDecrypt avec 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 n’est plus pris en charge pour le déchiffrement privé, cela peut être rétabli avec --security-revert=CVE-2023-46809
Une solution possible pour les applications Node est d’exécuter Node avec le drapeau non sécurisé :
node --security-revert=CVE-2023-46809
Une correction du côté de Discourse serait facile, mais je soupçonne que cela casserait de nombreuses intégrations existantes :
public_key = OpenSSL::PKey::RSA.new(params[:public_key])
@payload = Base64.encode64(public_key.public_encrypt(@payload, OpenSSL::PKey::RSA::PKCS1_OAEP_PADDING))