Um problema menor e talvez um maior:
Há um parâmetro nonce obrigatório que não é mencionado na documentação:
def require_params
%i[public_key nonce scopes client_id application_name].each { |p| params.require(p) }
end
Agora o problema mais complicado. O Discourse chama o método public_encrypt sem argumentos:
Isso significa que o argumento padding tem como padrão PKCS1_PADDING. Da documentação Ruby:
Criptografa
stringcom a chave pública.paddingtem como padrãoPKCS1_PADDING, que é conhecido por ser inseguro, mas é mantido por compatibilidade retroativa.
Infelizmente, o Node v20.14.0 (o atual LTS) retorna um erro se você tentar chamar crypto.privateDecrypt com 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ão é mais suportado para descriptografia privada, isso pode ser revertido com --security-revert=CVE-2023-46809
Uma possível solução para aplicativos Node é executar o Node com a flag insegura:
node --security-revert=CVE-2023-46809
Uma correção no lado do Discourse seria fácil, mas suspeito que quebraria muitas integrações existentes:
public_key = OpenSSL::PKey::RSA.new(params[:public_key])
@payload = Base64.encode64(public_key.public_encrypt(@payload, OpenSSL::PKey::RSA::PKCS1_OAEP_PADDING))