Ein kleines und vielleicht ein größeres Problem:
Es gibt einen erforderlichen nonce-Parameter, der in der Dokumentation nicht erwähnt wird:
def require_params
%i[public_key nonce scopes client_id application_name].each { |p| params.require(p) }
end
Nun zum kniffligeren Problem. Discourse ruft die Methode public_encrypt ohne Argumente auf:
Das bedeutet, dass das padding-Argument standardmäßig auf PKCS1_PADDING gesetzt wird. Laut der Ruby-Dokumentation:
Verschlüsselt
stringmit dem öffentlichen Schlüssel.paddingist standardmäßigPKCS1_PADDING, der als unsicher gilt, aber aus Gründen der Abwärtskompatibilität beibehalten wird.
Leider gibt Node v20.14.0 (die aktuelle LTS) einen Fehler zurück, wenn versucht wird, crypto.privateDecrypt mit RSA_PKCS1_PADDING aufzurufen:
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 is no longer supported for private decryption, this can be reverted with --security-revert=CVE-2023-46809
Eine mögliche Lösung für Node-Apps ist, Node mit dem unsicheren Flag auszuführen:
node --security-revert=CVE-2023-46809
Eine Behebung auf der Discourse-Seite wäre einfach, aber ich vermute, sie würde viele bestehende Integrationen unterbrechen:
public_key = OpenSSL::PKey::RSA.new(params[:public_key])
@payload = Base64.encode64(public_key.public_encrypt(@payload, OpenSSL::PKey::RSA::PKCS1_OAEP_PADDING))