Opomba: Posodobljeno 22. junija 2023 za posodobitev ločljivosti in nadomestnih rešitev
Opomba: Posodobljeno 15. junija 2023 za posodobitev nadomestne rešitve možnosti 4 in 5
Ozadje
Microsoft je 13. junija 2023 izdal varnostno posodobitev za ogrodje .NET Framework in .NET, ki vpliva na način, kako izvajalnik uvozi potrdila X.509. Zaradi teh sprememb lahko uvoz potrdila X.509 vrne CryptographicException v scenarijih, kjer bi bil uvoz uspešen pred posodobitvijo.
V tem dokumentu so opisane spremembe in rešitve, ki so na voljo za prizadete aplikacije.
Programska oprema, na katero to vpliva.
- ogrodje .NET Framework 2.0
- ogrodje .NET Framework 4.6.2, 4.7, 4.7.1 in 4.7.2
- ogrodje .NET Framework 4.8
- ogrodje .NET Framework 4.8.1
- .NET 6.0
- .NET 7.0
API-ji, na katere to vpliva
- new X509Certificate(bajt[])
- X509Certificate.Import(byte[])
- novi X509Certificate2(bajt[])
- X509Certificate2.Import(bajt[])
- X509Certificate2Collection.Import(byte[])
Opis spremembe
Pred spremembo 13. junija 2023, ko je ogrodje .NET Framework in .NET predstavljeno z zbirko dvojiških podatkov potrdila za uvoz, ogrodje .NET Framework in .NET običajno delegira preverjanje veljavnosti in uvoz zbirke dvojiških podatkov v temeljni operacijski sistem. V sistemu Windows se ogrodje .NET Framework in .NET za preverjanje veljavnosti in uvoz običajno zanašata na API PFXImportCertStore.
Od 13. junija 2023, ko je ogrodje .NET Framework in .NET predstavljeno s zbirko dvojiških podatkov potrdila za uvoz, bosta ogrodje .NET Framework in .NET v nekaterih primerih izvedla dodatno preverjanje veljavnosti pred predajo zbirke dvojiških podatkov osnovnemu operacijskemu sistemu. To dodatno preverjanje izvaja niz hevrističnih preverjanj, da ugotovi, ali bi dohodno potrdilo ob uvozu zlonamerno izčrpalo vire. Ker gre za dodatno preverjanje, ki presega tistega, kar bi običajno izvajal osnovni operacijski sistem, lahko blokira zbirko dvojiških podatkov potrdila, ki bi bili uspešno uvoženi pred spremembo 13. junija 2023.
Znane regresije
Če je bilo potrdilo X.509 izvoženo kot zbirka dvojiških podatkov PFX z neobičajno visokim številom ponovitev gesel, potrdila morda ne bo mogoče uvoziti. Večina zmogljivosti izvoza potrdil uporablja število ponovitev nekje med 2.000 in 10.000. Po uporabi varnostne posodobitve bo uvoz neuspešen za potrdila, ki vsebujejo število ponovitev, večje od 600.000.
Če je bilo potrdilo X.509 izvoženo z ničelnim geslom [npr. prek
X509Certificate.Export(X509ContentType.Pfx, (string)null)ali brezX509Certificate.Export(X509ContentType.Pfx)]gesla, potrdila morda ne bo mogoče uvoziti.
Opomba
Zgornja regresija je bila odpravljena v posodobitvi z dne 22. junija 2023, o kateri smo razpravljali v KB5028608.
Če je bilo potrdilo X.509 izvoženo kot zbirka dvojiških podatkov PFX z zmogljivostjo sistema Windows, da zaščiti zasebni ključ za SID, potrdila morda ne bo mogoče uvoziti. To bo vplivalo na zbirko dvojiških podatkov PFX, ki so ustvarjeni na te načine:
- prek čarovnika sistema Windows za izvoz potrdil in v čarovniku določite, da mora biti zasebni ključ zaščiten za uporabnika domene; ali
- prek ukaza cmdlet » Export-PfxCertificate « lupine PowerShell, kjer je naveden eksplicitni
-ProtectToargument; ali - prek pripomočka certutil , kjer je naveden eksplicitni
-protecttoargument; ali - Prek API-ja PFXExportCertStoreEx , kjer je navedena zastavica PKCS12_PROTECT_TO_DOMAIN_SIDS.
Rešitev & rešitve
Na voljo so različne rešitve, odvisno od tega, ali želite v kodi opraviti ciljno usmerjene spremembe na posameznih mestih klica, spremeniti delovanje posamezne aplikacije ali pa opraviti spremembe v celotnem računalniku.
1. možnost (zaželeno) – namestitev posodobljenega popravka
Opomba
To je priporočena možnost, saj naslavlja pogosto poročane regresije strank in ne zahteva spreminjanja kode v aplikaciji.
Primernost: Ta možnost velja za vse različice ogrodje .NET Framework in .NET.
Ta težava je bila odpravljena v posodobitvi z dne 22. junija 2023, o kateri smo razpravljali v KB5028608.
Microsoft priporoča, da stranke, pri katerih se dogajajo regresije, uvedene do izdaje 13. junija 2023, poskusijo namestiti ta posodobljeni popravek, preden poskusijo odpraviti rešitve, navedene v nadaljevanju tega dokumenta.
2. možnost – Spreminjanje mesta klica
Primernost: Ta možnost velja za vse različice ogrodje .NET Framework in .NET.
Razmislite, ali je zbirka dvojiških podatkov, ki jo uvažate, vredna zaupanja. Ali je bil na primer blob pridobljen z zaupanja vrednega mesta, kot je zbirka podatkov ali konfiguracijska datoteka pod vašim nadzorom, ali pa je bil posredovan prek omrežne zahteve nepreverjenega ali neprednostnega odjemalca?
Microsoft priporoča, da ne uvozite zbirke dvojiških podatkov PFX, ki vam jih posredujejo nepreverjeni ali neprednostni odjemalci, saj lahko ti zbirki dvojiških podatkov vsebujejo zlonamerno vedenje izčrpanja sredstev.
Če morate uvoziti zbirko dvojiških podatkov potrdila javnega ključa , ki vam jo je poslala oseba, ki ni vredna zaupanja, lahko s to kodo varno uvozite tak blob. Ta vzorčna koda uporablja metodo GetCertContentType za določanje, katera je temeljna vrsta zbirke dvojiških podatkov potrdila, in zavrne zbirko dvojiških podatkov PFX v primerih, ko pričakujete le uvoz zbirke dvojiških podatkov potrdila javnega ključa. Konstruktor X509Certificate2(byte[]) je varen za uporabo, ko so dani zbirki dvojiških podatkov, ki niso PFX vredni zaupanja.
using System.Security.Cryptography.X509Certificates;
public static X509Certificate2 ImportPublicCertificateBlob(byte[] blob)
{
if (X509Certificate2.GetCertContentType(blob) == X509ContentType.Pfx)
{
throw new Exception("PFX blobs are disallowed.");
}
else
{
// Import only after we have confirmed it's not a PFX.
return new X509Certificate2(blob);
}
}
Če morate uvoziti zbirko dvojiških podatkov zasebnega ključa brez gesla in ste ugotovili, da je zbirka dvojiških podatkov zaupanja vredna, lahko preprečite dodatna preverjanja veljavnosti, ki se izvajajo do varnostne izdaje z dne 13. junija 2023, tako da pokličete drugo preobremenitev konstruktorja. Prikličete lahko na primer preobremenitev konstruktorja, ki sprejme argument niza gesla in poda vrednost nič za vrednost argumenta.
byte[] blobToImport = GetBlobToImport(); // fetch this from a database, config, etc.
// REGRESSION - byte[] ctor performs additional security checks X509Certificate2 certA = new X509Certificate2(blobToImport);
// RECOMMENDED WORKAROUND - different ctor overload suppresses additional security checks X509Certificate2 certB = new X509Certificate2(blobToImport, (string)null);
3. možnost – spreminjanje ali preprečevanje dodatnega preverjanja veljavnosti s spremenljivko okolja
Uporabnost: ta možnost velja le za vse različice ogrodje .NET Framework. Ne velja za .NET 6.0+.
Medtem ko ogrodje .NET Framework privzeto omejuje postopke uvoza tako, da ne zahtevajo več kot 600.000 ponovitev gesla, je to omejitev mogoče konfigurirati za celotno aplikacijo ali računalnik s spremenljivko okolja. Ta nova omejitev bo veljala za vse pozive prizadetih API-jev, navedenih zgoraj.
Če želite spremeniti omejitev, nastavite spremenljivko COMPlus_Pkcs12UnspecifiedPasswordIterationLimit okolja na vrednost, kakšna naj bo nova omejitev. Če želite na primer nastaviti omejitev na 1.000.000 (milijon) ponovitev, nastavite spremenljivko okolja, kot je prikazano spodaj.
- Ta številka nadzira skupno omejitev iteracij, ki je vsota števila iteracij MAC, šifrirane varne vsebine in števila ponovitev zavita vrečka. Če ste ročno izvozili PFX z uporabo eksplicitnega iter_count> števila <ponovitev (npr. prek openssl pkcs12 -export -iter <iter_count>) in želite uvoziti ta velik binarni predmet PFX, nastavite to spremenljivko okolja na vrednost, ki je vsaj tako velika kot vsota vseh pričakovanih ponovitev. V praksi lahko ogrodje .NET Framework in .NET dovolita, da skupno število ponovitev nekoliko preseže katero koli izrecno omejitev, konfigurirano tukaj.
COMPlus_Pkcs12UnspecifiedPasswordIterationLimit=1000000
Če želite v celoti onemogočiti dodatna preverjanja, nastavite spremenljivko okolja na vrednost posebnega čuvaja -1, kot je prikazano spodaj.
- ⚠ ️ Opozorilo: vrednost spremenljivke okolja nastavite na -1, če ste prepričani, da ciljna aplikacija ne obravnava vnosa potrdila, ki ni vredno zaupanja.
COMPlus_Pkcs12UnspecifiedPasswordIterationLimit=-1
4. možnost – spreminjanje ali preprečevanje dodatnega preverjanja veljavnosti z uporabo AppContext
Primernost: ta možnost velja le za .NET 6.0+. Ne veljajo za ogrodje .NET Framework
Medtem ko .NET privzeto omeji postopke uvoza tako, da ne zahtevajo več kot 600.000 ponovitev gesla, je to omejitev mogoče konfigurirati v celotni aplikaciji s stikalom AppContext. Ta nova omejitev bo veljala za vse pozive prizadetih API-jev, navedenih zgoraj.
Če želite spremeniti omejitev, nastavite stikalo AppContext System.Security.Cryptography.Pkcs12UnspecifiedPasswordIterationLimit na vrednost, ki bi morala biti nova omejitev. Če želite na primer nastaviti omejitev na 1.000.000 (milijon) ponovitev, nastavite stikalo, kot je prikazano spodaj.
- Ta številka nadzira skupno omejitev iteracij, ki je vsota števila iteracij MAC, šifrirane varne vsebine in števila ponovitev zavita vrečka. Če ste ročno izvozili PFX z uporabo eksplicitnega iter_count> števila <ponovitev (npr. prek openssl pkcs12 -export -iter <iter_count>) in želite uvoziti ta velik binarni predmet PFX, nastavite to spremenljivko okolja na vrednost, ki je vsaj tako velika kot vsota vseh pričakovanih ponovitev. V praksi lahko .NET dovoli, da skupno število ponovitev nekoliko preseže kakršno koli eksplicitno omejitev, konfigurirano tukaj.
Če želite nastaviti stikalo v datoteki projekta programa (.csproj ali .vbproj):
<!--
- To stikalo deluje le, če trenutna datoteka projekta predstavlja aplikacijo. Če trenutna datoteka projekta predstavlja knjižnico v skupni rabi, to nima učinka.
-->
<ItemGroup>
- <RuntimeHostConfigurationOption include="System.Security.Cryptography.Pkcs12UnspecifiedPasswordIterationLimit" value="1000000" />
</ItemGroup>
Lahko pa datoteko z imenom runtimeconfig.template.json s to vsebino shranite v isti imenik, ki vsebuje datoteko projekta programa:
{
"configProperties": {
- "System.Security.Cryptography.Pkcs12UnspecifiedPasswordIterationLimit": 1000000
}
}
Če želite več informacij o spreminjanju nastavitev konfiguracije izvajalnika .NET, glejte stran z dokumentacijo nastavitev konfiguracije izvajalnika .NET.
Če želite v celoti onemogočiti dodatna preverjanja, nastavite konfiguracijsko stikalo na posebno vrednost čuvaja -1, kot je prikazano spodaj.
⚠ ️ Opozorilo: stikalo AppContext nastavite na -1 le, če ste prepričani, da ciljna aplikacija ne obravnava vnosa potrdila, ki ni vredno zaupanja.
V datoteki projekta aplikacije (.csproj ali .vbproj):
<!--
- To stikalo deluje le, če trenutna datoteka projekta predstavlja aplikacijo. Če trenutna datoteka projekta predstavlja knjižnico v skupni rabi, to nima učinka.
-->
<ItemGroup>
- <RuntimeHostConfigurationOption include="System.Security.Cryptography.Pkcs12UnspecifiedPasswordIterationLimit" value="-1" />
</ItemGroup>
Ali pa v datoteki runtimeconfig.template.json:
{
- "configProperties": {
- "System.Security.Cryptography.Pkcs12UnspecifiedPasswordIterationLimit": -1
}
}
5. možnost – spreminjanje ali onemogočanje dodatnega preverjanja veljavnosti v celotnem računalniku prek registra (samo za ogrodje .NET Framework)
Uporabnost: ta možnost velja le za vse različice ogrodje .NET Framework. Ne velja za .NET 6.0+.
Medtem ko ogrodje .NET Framework privzeto omejuje postopke uvoza tako, da ne zahtevajo več kot 600.000 ponovitev gesla, je to omejitev mogoče konfigurirati v celotnem računalniku z registrom HKLM. Ta nova omejitev bo veljala za vse pozive prizadetih API-jev, navedenih zgoraj.
Če želite spremeniti omejitev, pod registrskim ključem HKLM\Software\Microsoft\.NETFrameworknastavite novo vrednost Pkcs12UnspecifiedPasswordIterationLimit omejitve. Če želite na primer nastaviti omejitev na 1.000.000 (milijon) ponovitev, zaženite ukaze, kot je prikazano spodaj, v ukaznem pozivu na skrbniški ravni.
- Ta številka nadzira skupno omejitev iteracij, ki je vsota števila iteracij MAC, šifrirane varne vsebine in števila ponovitev zavita vrečka. Če ste ročno izvozili PFX z uporabo eksplicitnega iter_count> števila <ponovitev (npr. prek openssl pkcs12 -export -iter <iter_count>) in želite uvoziti ta velik binarni predmet PFX, nastavite to vrednost registra na vrednost, ki je vsaj tako velika kot vsota vseh pričakovanih ponovitev. V praksi lahko ogrodje .NET Framework dovoli, da skupno število ponovitev nekoliko preseže kakršno koli izrecno omejitev, konfigurirano tukaj.
- Nastavitev registra je odvisna od arhitekture. Če želite zagotoviti, da aplikacije upoštevajo konfigurirano vrednost, ne glede na njihovo ciljno arhitekturo , ne pozabite spremeniti tako 32-bitnega kot tudi 64-bitnega registra, kot je prikazano spodaj.
reg add "HKLM\Software\Microsoft\.NETFramework" /v Pkcs12UnspecifiedPasswordIterationLimit /t REG_DWORD /d 1000000 /reg:32
reg add "HKLM\Software\Microsoft\.NETFramework" /v Pkcs12UnspecifiedPasswordIterationLimit /t REG_DWORD /d 1000000 /reg:64
Če želite v celoti onemogočiti dodatna preverjanja, nastavite vrednost registra v ukaznem pozivu na skrbniški ravni na -1, kot je prikazano spodaj.
- ⚠️ Opozorilo: Vrednost registra nastavite na -1 le, če ste prepričani, da storitve, ki se izvajajo v ciljnem računalniku, ne obravnavajo vnosa potrdila, ki ni vredno zaupanja.
- Če želite nastaviti čuvaja -1, uporabite vrsto REG_SZ namesto vrste REG_DWORD. Nastavitev registra je odvisna od arhitekture. Če želite zagotoviti, da aplikacije upoštevajo konfigurirano vrednost, ne glede na njihovo ciljno arhitekturo , ne pozabite spremeniti tako 32-bitnega kot tudi 64-bitnega registra, kot je prikazano spodaj.
reg add "HKLM\Software\Microsoft\.NETFramework" /v Pkcs12UnspecifiedPasswordIterationLimit /t REG_SZ /d -1 /reg:32
reg add "HKLM\Software\Microsoft\.NETFramework" /v Pkcs12UnspecifiedPasswordIterationLimit /t REG_SZ /d -1 /reg:64
Če želite povrniti spremembe v registru, izbrišite vrednost registra Pkcs12UnspecifiedPasswordIterationLimit iz ukaznega poziva na skrbniški ravni.
reg delete "HKLM\Software\Microsoft\.NETFramework" /v Pkcs12UnspecifiedPasswordIterationLimit /reg:32
reg delete "HKLM\Software\Microsoft\.NETFramework" /v Pkcs12UnspecifiedPasswordIterationLimit /reg:64
Opombe, specifične za Windows
V sistemu Windows ogrodje .NET Framework uvaža potrdila s funkcijo PFXImportCertStore. Ta funkcija izvaja lastno preverjanje veljavnosti, vključno z določanjem lastnih omejitev za največje dovoljeno število ponovitev zbirke dvojiških podatkov PFX. Ti pregledi bodo še vedno potekali ob uvozu PFX. Datoteka . Spremenljivke okolja, specifične za NET, in zgoraj opisani registrski ključi ne vplivajo na to, kako PFXImportCertStore izvaja ta preverjanja.