Un problema minore e forse uno più grande:
C’è un parametro nonce obbligatorio che non è menzionato nella documentazione:
def require_params
%i[public_key nonce scopes client_id application_name].each { |p| params.require(p) }
end
Ora il problema più complicato. Discourse chiama il metodo public_encrypt senza argomenti:
Ciò significa che l’argomento padding viene impostato di default su PKCS1_PADDING. Dalla documentazione Ruby:
Cifra
stringcon la chiave pubblica.paddingè di default suPKCS1_PADDING, che è noto per essere insicuro ma viene mantenuto per compatibilità con le versioni precedenti.
Sfortunatamente, Node v20.14.0 (l’attuale LTS) restituisce un errore se si tenta di chiamare crypto.privateDecrypt con 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 non è più supportato per la decrittazione privata, questo può essere ripristinato con --security-revert=CVE-2023-46809
Una possibile soluzione per le app Node è eseguire Node con il flag insicuro:
node --security-revert=CVE-2023-46809
Una soluzione lato Discourse sarebbe facile, ma sospetto che romperebbe molte integrazioni esistenti:
public_key = OpenSSL::PKey::RSA.new(params[:public_key])
@payload = Base64.encode64(public_key.public_encrypt(@payload, OpenSSL::PKey::RSA::PKCS1_OAEP_PADDING))