Applies To.NET

Σημείωση: Αναθεωρήθηκε στις 22 Ιουνίου 2023 για την ενημέρωση της επίλυσης και των λυσης

Σημείωση: Αναθεωρήθηκε στις 15 Ιουνίου 2023 για την ενημέρωση των επιλογών 4 και 5 

Φόντο

Στις 13 Ιουνίου 2023, η Microsoft κυκλοφόρησε μια ενημέρωση ασφαλείας για το .NET Framework και το .NET, η οποία επηρεάζει τον τρόπο εισαγωγής των πιστοποιητικών X.509 κατά το χρόνο εκτέλεσης. Αυτές οι αλλαγές μπορεί να προκαλέσουν την εισαγωγή πιστοποιητικού X.509 για την απόρριψη του CryptographicException σε σενάρια όπου η εισαγωγή θα είχε ολοκληρωθεί με επιτυχία πριν από την ενημέρωση.

Αυτό το έγγραφο περιγράφει τις αλλαγές και τις λύσεις που είναι διαθέσιμες για τις εφαρμογές που επηρεάζονται.

Επηρεαζόμενο λογισμικό

  • .NET Framework 2.0

  • .NET Framework 4.6.2, 4.7, 4.7.1, 4.7.2

  • .NET Framework 4.8

  • .NET Framework 4.8.1

  • .NET 6.0

  • .NET 7.0

API που επηρεάζονται

Περιγραφή αλλαγής

Πριν από τις 13 Ιουνίου 2023, η αλλαγή, όταν .NET Framework και το .NET παρουσιάζουν ένα αρχείο blob δυαδικού πιστοποιητικού για εισαγωγή, .NET Framework και το .NET συνήθως θα πληρούσε την επικύρωση και την εισαγωγή του blob στο υποκείμενο λειτουργικό σύστημα. Για παράδειγμα, στα Windows, το .NET Framework και το .NET συνήθως βασίζονται στο API PFXImportCertStore για επικύρωση και εισαγωγή.

Από τις 13 Ιουνίου 2023, η αλλαγή, όταν .NET Framework και το .NET παρουσιάζονται με ένα blob δυαδικού πιστοποιητικού για εισαγωγή, .NET Framework και το .NET σε ορισμένες περιπτώσεις θα εκτελέσει πρόσθετη επικύρωση πριν από την παράδοση του blob στο υποκείμενο λειτουργικό σύστημα. Αυτή η πρόσθετη επικύρωση εκτελεί μια σειρά από ευρετικούς ελέγχους για να προσδιορίσει εάν το εισερχόμενο πιστοποιητικό θα εξαντλούσε κακόβουλα τους πόρους κατά την εισαγωγή. Δεδομένου ότι πρόκειται για πρόσθετη επικύρωση πέρα από την κανονική εκτέλεση του υποκείμενου λειτουργικού συστήματος, μπορεί να αποκλείσει την αλλαγή των blobs πιστοποιητικών που θα εισάγονταν με επιτυχία πριν από τις 13 Ιουνίου 2023.

Γνωστές παλινδρομήσεις

  1. Εάν ένα πιστοποιητικό X.509 έχει εξαχθεί ως blob PFX χρησιμοποιώντας ένα ασυνήθιστα υψηλό πλήθος επαναλήψεις κωδικών πρόσβασης, αυτό το πιστοποιητικό μπορεί τώρα να αποτύχει στην εισαγωγή. Οι περισσότερες εγκαταστάσεις εξαγωγής πιστοποιητικών χρησιμοποιούν αριθμό επανάληψης κάπου μεταξύ 2.000 - 10.000. Μετά την εφαρμογή της ενημέρωσης ασφαλείας, η εισαγωγή θα αποτύχει για πιστοποιητικά που περιέχουν πλήθος επαναλήψεις μεγαλύτερο από 600.000.

  2. Εάν ένα πιστοποιητικό X.509 έχει εξαχθεί με κωδικό πρόσβασης null [π.χ., μέσωX509Certificate.Export(X509ContentType.Pfx, (string)null)ή χωρίς κωδικό πρόσβασηςX509Certificate.Export(X509ContentType.Pfx)], αυτό το πιστοποιητικό μπορεί τώρα να μην εισαχθεί.  

    Σημείωση: Η παραπάνω παλινδρόμηση αντιμετωπίστηκε στην ενημέρωση της 22ας Ιουνίου 2023 που συζητήθηκε στην ενημέρωση KB5028608.

  3. Εάν ένα πιστοποιητικό X.509 έχει εξαχθεί ως blob PFX χρησιμοποιώντας τη δυνατότητα των Windows για την προστασία του ιδιωτικού κλειδιού σε ένα SID, η εισαγωγή αυτού του πιστοποιητικού ενδέχεται τώρα να αποτύχει. Αυτό θα επηρεάσει τα blobs PFX που έχουν δημιουργηθεί με τους ακόλουθους τρόπους:

    • Μέσω του Οδηγού εξαγωγής πιστοποιητικού των Windows και καθορίζοντας στον οδηγό ότι το ιδιωτικό κλειδί πρέπει να προστατεύεται από ένα χρήστη τομέα. Ή

    • Μέσω του cmdlet Export-PfxCertificate του PowerShell όπου παρέχεται ένα ρητό όρισμα -ProtectTo . Ή

    • Μέσω του βοηθητικού προγράμματος certutil όπου παρέχεται ένα ρητό όρισμα -protectto . Ή

    • Μέσω του API PFXExportCertStoreEx όπου παρέχεται η σημαία PKCS12_PROTECT_TO_DOMAIN_SIDS.

Επίλυση & Λύσεις

Υπάρχουν διάφορες λύσεις, ανάλογα με το εάν θέλετε να κάνετε στοχευμένες αλλαγές σε μεμονωμένες τοποθεσίες κλήσεων εντός του κώδικα ή εάν θέλετε να αλλάξετε τη συμπεριφορά μιας μεμονωμένης εφαρμογής ή εάν θέλετε να κάνετε αλλαγές σε ολόκληρο τον υπολογιστή.

Επιλογή 1 (προτιμώμενη) - Εγκατάσταση ενημερωμένης ενημέρωσης κώδικα

Σημείωση: Αυτή είναι η προτιμώμενη επιλογή, καθώς επιλύει παλινδρομήσεις πελατών που αναφέρονται συχνά και δεν απαιτεί αλλαγές κώδικα στην εφαρμογή.

Καταλληλότητα: Αυτή η επιλογή ισχύει για όλες τις εκδόσεις των .NET Framework και .NET.

Αυτό το πρόβλημα έχει αντιμετωπιστεί στην Ενημέρωση της 22ας Ιουνίου 2023 που συζητήθηκε στην ενημέρωση KB5028608.

Η Microsoft συνιστά στους πελάτες που αντιμετωπίζουν παλινδρομήσεις που παρουσιάστηκαν στις 13 Ιουνίου 2023 να δοκιμάσουν την εγκατάσταση αυτής της ενημερωμένης ενημέρωσης κώδικα προτού επιχειρήσουν τις λύσεις που αναφέρονται παρακάτω σε αυτό το έγγραφο.

Επιλογή 2 - Τροποποίηση της τοποθεσίας κλήσης

Καταλληλότητα: Αυτή η επιλογή ισχύει για όλες τις εκδόσεις των .NET Framework και .NET.

Λάβετε υπόψη εάν η blob που εισάγετε είναι αξιόπιστη. Για παράδειγμα, το blob ανακτήθηκε από μια αξιόπιστη θέση, όπως μια βάση δεδομένων ή ένα αρχείο ρύθμισης παραμέτρων υπό τον έλεγχό σας, ή παρέχεται μέσω μιας αίτησης δικτύου που υποβλήθηκε από ένα πρόγραμμα-πελάτη χωρίς έλεγχο ταυτότητας ή χωρίς δικαιώματα;

Η Microsoft συνιστά ανεπιφύλακτα να μην εισαγάγετε blob PFX που παρέχονται σε εσάς από προγράμματα-πελάτες χωρίς έλεγχο ταυτότητας ή χωρίς έλεγχο ταυτότητας, καθώς αυτά τα blobs μπορεί να περιέχουν συμπεριφορές εξάντλησης κακόβουλων πόρων.

Εάν θέλετε να εισαγάγετε ένα blob πιστοποιητικού δημόσιου κλειδιού που σας έχει δοθεί από ένα μη αξιόπιστο μέρος, μπορείτε να χρησιμοποιήσετε τον παρακάτω κώδικα για να εισαγάγετε με ασφάλεια ένα τέτοιο blob. Αυτό το δείγμα κώδικα χρησιμοποιεί τη μέθοδο GetCertContentType για να καθορίσει ποιος είναι ο υποκείμενος τύπος του blob πιστοποιητικού και απορρίπτει τα blob PFX σε περιπτώσεις όπου σκοπεύετε να εισαγάγετε μόνο ένα blob πιστοποιητικού δημόσιου κλειδιού. Ο κατασκευαστήςX509Certificate2(byte[]) είναι ασφαλής για χρήση όταν του παρέχονται μη αξιόπιστα blobs που δεν είναι PFX.

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);
    }
} 

Εάν θέλετε να εισαγάγετε ένα blob ιδιωτικού πιστοποιητικού κλειδιού χωρίς κωδικό πρόσβασης και έχετε διαπιστώσει ότι το blob είναι αξιόπιστο, μπορείτε να αποκρύψετε τους πρόσθετους ελέγχους επικύρωσης που πραγματοποιήθηκαν από την έκδοση ασφαλείας της 13ης Ιουνίου 2023, καλώντας μια διαφορετική υπερφόρτωση κατασκευαστή. Για παράδειγμα, μπορείτε να καλέσετε την υπερφόρτωση της κατασκευής που δέχεται ένα όρισμα κωδικού πρόσβασης συμβολοσειράς και να μεταβιβάσετε την τιμή null για το όρισμα. 

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 - Τροποποίηση ή απόκρυψη της πρόσθετης επικύρωσης με χρήση μεταβλητής περιβάλλοντος

Καταλληλότητα: Αυτή η επιλογή ισχύει μόνο για όλες τις εκδόσεις του .NET Framework.  Δεν ισχύει για το .NET 6.0+.

Ενώ .NET Framework από προεπιλογή περιορίζουν τις λειτουργίες εισαγωγής ώστε να μην χρειάζονται περισσότερες από 600.000 επαναλήψεις ενός κωδικού πρόσβασης, αυτό το όριο μπορεί να ρυθμιστεί σε ολόκληρη την εφαρμογή ή σε ολόκληρο τον υπολογιστή χρησιμοποιώντας μια μεταβλητή περιβάλλοντος. Αυτό το νέο όριο θα ισχύει για όλες τις επικλήσεις των API που επηρεάζονται που αναφέρονται παραπάνω.

Για να αλλάξετε το όριο, ορίστε τη μεταβλητή περιβάλλοντοςCOMPlus_Pkcs12UnspecifiedPasswordIterationLimitστην τιμή του νέου ορίου. Για παράδειγμα, για να ορίσετε το όριο σε 1.000.000 (ένα εκατομμύριο) επαναλήψεις, ορίστε τη μεταβλητή περιβάλλοντος όπως φαίνεται παρακάτω.

  • Αυτός ο αριθμός ελέγχει το συνολικό όριο επανάληψης, το οποίο είναι το άθροισμα του πλήθους επαναλήψεις MAC, των κρυπτογραφημένων ασφαλών περιεχομένων και του πλήθους επανάληψης της τσάντας. Εάν έχετε εξαγάγει με μη αυτόματο τρόπο ένα PFX χρησιμοποιώντας ένα ρητό πλήθος επανάληψης <iter_count> (π.χ., μέσω openssl pkcs12 -export -iter <iter_count>) και θέλετε να εισαγάγετε αυτό το blob PFX, ορίστε αυτή τη μεταβλητή περιβάλλοντος σε μια τιμή τουλάχιστον τόσο μεγάλη όσο το άθροισμα όλων των αναμενόμενων επαναλήψεις. Στην πράξη, .NET Framework και το .NET μπορεί να επιτρέπουν στο συνολικό πλήθος επαναλήψεις να υπερβαίνει ελαφρώς οποιοδήποτε ρητό όριο που έχει ρυθμιστεί εδώ.

COMPlus_Pkcs12UnspecifiedPasswordIterationLimit=1000000

Για να αποκρύψετε εντελώς τους πρόσθετους ελέγχους, ορίστε τη μεταβλητή περιβάλλοντος στην ειδική τιμή -1, όπως φαίνεται παρακάτω.

  • ⚠️ Προειδοποίηση: Ορίστε τη μεταβλητή περιβάλλοντος σε -1 μόνο εάν είστε βέβαιοι ότι η εφαρμογή προορισμού δεν χειρίζεται μη αξιόπιστη εισαγωγή πιστοποιητικού.

COMPlus_Pkcs12UnspecifiedPasswordIterationLimit=-1

Επιλογή 4 - Τροποποίηση ή απόκρυψη της πρόσθετης επικύρωσης με χρήση του AppContext

Καταλληλότητα: Αυτή η επιλογή ισχύει μόνο για το .NET 6.0+.  Δεν ισχύει για .NET Framework

Ενώ το .NET περιορίζει από προεπιλογή τις λειτουργίες εισαγωγής ώστε να μην χρειάζονται περισσότερες από 600.000 επαναλήψεις ενός κωδικού πρόσβασης, αυτό το όριο μπορεί να ρυθμιστεί σε όλες τις εφαρμογές χρησιμοποιώντας το διακόπτη AppContext. Αυτό το νέο όριο θα ισχύει για όλες τις επικλήσεις των API που επηρεάζονται που αναφέρονται παραπάνω.

Για να αλλάξετε το όριο, ορίστε τον διακόπτη AppContext System.Security.Cryptography.Pkcs12UnspecifiedPasswordIterationLimit στην τιμή του νέου ορίου. Για παράδειγμα, για να ορίσετε το όριο σε 1.000.000 (ένα εκατομμύριο) επαναλήψεις, ορίστε το διακόπτη όπως φαίνεται παρακάτω.

  • Αυτός ο αριθμός ελέγχει το συνολικό όριο επανάληψης, το οποίο είναι το άθροισμα του πλήθους επαναλήψεις MAC, των κρυπτογραφημένων ασφαλών περιεχομένων και του πλήθους επανάληψης της τσάντας. Εάν έχετε εξαγάγει με μη αυτόματο τρόπο ένα PFX χρησιμοποιώντας ένα ρητό πλήθος επανάληψης <iter_count> (π.χ., μέσω openssl pkcs12 -export -iter <iter_count>) και θέλετε να εισαγάγετε αυτό το blob PFX, ορίστε αυτή τη μεταβλητή περιβάλλοντος σε μια τιμή τουλάχιστον τόσο μεγάλη όσο το άθροισμα όλων των αναμενόμενων επαναλήψεις. Στην πράξη, το .NET μπορεί να επιτρέψει στο συνολικό πλήθος επαναλήψεις να υπερβεί ελαφρώς οποιοδήποτε ρητό όριο έχει ρυθμιστεί εδώ.

Για να ορίσετε την αλλαγή στο αρχείο έργου της εφαρμογής σας (.csproj ή .vbproj):

<!--

  • This switch only works if the current project file represents an application. It has no effect if the current project file represents a shared library.

-->

<ItemGroup>

  • <RuntimeHostConfigurationOption Include="System.Security.Cryptography.Pkcs12UnspecifiedPasswordIterationLimit" Value="1000000" />

</ItemGroup>

Εναλλακτικά, μπορείτε να τοποθετήσετε ένα αρχείο με το όνομα runtimeconfig.template.json με τα ακόλουθα περιεχόμενα στον ίδιο κατάλογο, το οποίο περιέχει το αρχείο έργου της εφαρμογής σας:

{

     "configProperties": {

  • "System.Security.Cryptography.Pkcs12UnspecifiedPasswordIterationLimit": 1000000

      }

}

Για περισσότερες πληροφορίες σχετικά με την αλλαγή των ρυθμίσεων παραμέτρων χρόνου εκτέλεσης του .NET, ανατρέξτε στη σελίδα τεκμηρίωσης Ρυθμίσεις παραμέτρων χρόνου εκτέλεσης .NET.

Για να αποκρύψετε εντελώς τους πρόσθετους ελέγχους, ορίστε το διακόπτη ρύθμισης παραμέτρων για την ειδική τιμή -1, όπως φαίνεται παρακάτω.

⚠️ Προειδοποίηση: Ορίστε το διακόπτη AppContext σε -1 μόνο εάν είστε βέβαιοι ότι η εφαρμογή προορισμού δεν χειρίζεται μη αξιόπιστη εισαγωγή πιστοποιητικού.

Στο αρχείο έργου της εφαρμογής (.csproj ή .vbproj):

<!--

  • This switch only works if the current project file represents an application. It has no effect if the current project file represents a shared library.

-->

<ItemGroup>

  • <RuntimeHostConfigurationOption Include="System.Security.Cryptography.Pkcs12UnspecifiedPasswordIterationLimit" Value="-1" />

</ItemGroup>

Εναλλακτικά, μέσα στο αρχείο runtimeconfig.template.json:

{

  • "configProperties": { 
  •     "System.Security.Cryptography.Pkcs12UnspecifiedPasswordIterationLimit": -1

     }

}

Επιλογή 5 - Τροποποίηση ή απόκρυψη της πρόσθετης επικύρωσης σε ολόκληρο τον υπολογιστή μέσω του μητρώου (μόνο για Windows για .NET Framework)

Καταλληλότητα: Αυτή η επιλογή ισχύει μόνο για όλες τις εκδόσεις του .NET Framework.  Δεν ισχύει για το .NET 6.0+.

Ενώ .NET Framework από προεπιλογή περιορίζουν τις λειτουργίες εισαγωγής για να μην χρειάζονται περισσότερες από 600.000 επαναλήψεις ενός κωδικού πρόσβασης, αυτό το όριο μπορεί να ρυθμιστεί σε ολόκληρο τον υπολογιστή χρησιμοποιώντας το μητρώο HKLM. Αυτό το νέο όριο θα ισχύει για όλες τις επικλήσεις των API που επηρεάζονται που αναφέρονται παραπάνω.

Για να αλλάξετε το όριο, κάτω από το κλειδί μητρώουHKLM\Software\Microsoft\.NETFramework, ορίστε την τιμήPkcs12UnspecifiedPasswordIterationLimitστο νέο όριο. Για παράδειγμα, για να ορίσετε το όριο σε 1.000.000 (ένα εκατομμύριο) επαναλήψεις, εκτελέστε τις εντολές όπως φαίνεται παρακάτω από μια γραμμή εντολών με αναβαθμισμένο ύψος.

  • Αυτός ο αριθμός ελέγχει το συνολικό όριο επανάληψης, το οποίο είναι το άθροισμα του πλήθους επαναλήψεις MAC, των κρυπτογραφημένων ασφαλών περιεχομένων και του πλήθους επανάληψης της τσάντας. Εάν έχετε εξαγάγει με μη αυτόματο τρόπο ένα PFX χρησιμοποιώντας ένα πλήθος ρητών επαναλήψεις <iter_count> (π.χ., μέσω openssl pkcs12 -export -iter <iter_count>) και θέλετε να εισαγάγετε αυτό το blob PFX, ορίστε αυτή την τιμή μητρώου σε μια τιμή τουλάχιστον τόσο μεγάλη όσο το άθροισμα όλων των αναμενόμενων επαναλήψεις. Στην πράξη, .NET Framework μπορεί να επιτρέψει στο συνολικό πλήθος επαναλήψεις να υπερβεί ελαφρώς οποιοδήποτε ρητό όριο έχει ρυθμιστεί εδώ.

  • Η ρύθμιση μητρώου εξαρτάται από την αρχιτεκτονική. Για να βεβαιωθείτε ότι οι εφαρμογές παρατηρούν τη ρυθμισμένη τιμή ανεξάρτητα από την αρχιτεκτονική προορισμού τους, μην ξεχάσετε να τροποποιήσετε τα μητρώα 32 bit και 64 bit, όπως φαίνεται παρακάτω.

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

Για να αποκρύψετε εντελώς τους πρόσθετους ελέγχους, ορίστε την τιμή μητρώου σε -1 από μια γραμμή εντολών με αναβαθμισμένους ελέγχους, όπως φαίνεται παρακάτω.

  • ⚠️ Προειδοποίηση: Ορίστε την τιμή μητρώου σε -1 μόνο εάν είστε βέβαιοι ότι οι υπηρεσίες που εκτελούνται στον υπολογιστή προορισμού δεν χειρίζονται μη αξιόπιστα δεδομένα εισαγωγής πιστοποιητικών.

  • Για να ορίσετε τον τύπο -1, χρησιμοποιήστε τον τύπο REG_SZ αντί για τον τύπο REG_DWORD. Η ρύθμιση μητρώου εξαρτάται από την αρχιτεκτονική. Για να βεβαιωθείτε ότι οι εφαρμογές παρατηρούν τη ρυθμισμένη τιμή ανεξάρτητα από την αρχιτεκτονική προορισμού τους, μην ξεχάσετε να τροποποιήσετε τα μητρώα 32 bit και 64 bit, όπως φαίνεται παρακάτω.

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

Για να επαναφέρετε τις αλλαγές μητρώου, διαγράψτε την τιμή μητρώου Pkcs12UnspecifiedPasswordIterationLimit από μια γραμμή εντολών με αναβαθμισμένη δικαιώματα.

reg delete "HKLM\Software\Microsoft\.NETFramework" /v Pkcs12UnspecifiedPasswordIterationLimit /reg:32 reg delete "HKLM\Software\Microsoft\.NETFramework" /v Pkcs12UnspecifiedPasswordIterationLimit /reg:64

Σημειώσεις ειδικά για τα Windows

Στα Windows, .NET Framework πιστοποιητικά εισαγωγής μέσω της συνάρτησης PFXImportCertStore. Αυτή η συνάρτηση εκτελεί τη δική της επικύρωση, συμπεριλαμβανομένης της τοποθέτησης των δικών της ορίων στο μέγιστο επιτρεπόμενο πλήθος επαναλήψεις ενός blob PFX. Αυτοί οι έλεγχοι θα εξακολουθούν να πραγματοποιούνται κατά την εισαγωγή PFX. Teh. Οι μεταβλητές περιβάλλοντος και τα κλειδιά μητρώου που περιγράφονται παραπάνω στο NET δεν επηρεάζουν τον τρόπο με τον οποίο το PFXImportCertStore εκτελεί αυτούς τους ελέγχους.

Χρειάζεστε περισσότερη βοήθεια;

Θέλετε περισσότερες επιλογές;

Εξερευνήστε τα πλεονεκτήματα της συνδρομής, περιηγηθείτε σε εκπαιδευτικά σεμινάρια, μάθετε πώς μπορείτε να προστατεύσετε τη συσκευή σας και πολλά άλλα.

Οι κοινότητες σάς βοηθούν να κάνετε και να απαντάτε σε ερωτήσεις, να δίνετε σχόλια και να ακούτε από ειδικούς με πλούσια γνώση.