작은 문제 하나와 더 큰 문제 하나가 있습니다:
문서에 언급되지 않은 필수 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(현재 LTS)에서는 RSA_PKCS1_PADDING으로 crypto.privateDecrypt를 호출하려고 하면 오류가 반환됩니다:
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
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))