Ich versuche, unsere Anfälligkeit für den Poodle SSL 3.0 Fallback- Angriff zu verringern . Unsere Administratoren haben bereits damit begonnen, SSL zugunsten von TLS für eingehende Verbindungen zu unseren Servern zu deaktivieren. Außerdem haben wir unserem Team empfohlen, SSL in den Webbrowsern zu deaktivieren. Ich betrachte jetzt unsere .NET-Codebasis, die HTTPS-Verbindungen mit verschiedenen Diensten über System.Net.HttpWebRequest initiiert . Ich glaube, dass diese Verbindungen für einen MITM-Angriff anfällig sein könnten, wenn sie einen Fallback von TLS auf SSL ermöglichen. Folgendes habe ich bisher festgestellt. Könnte jemand dies bitte noch einmal überprüfen, um zu überprüfen, ob ich Recht habe? Diese Sicherheitsanfälligkeit ist brandneu, daher habe ich noch keine Anleitung von Microsoft zur Minderung in .NET erhalten:
Die zulässigen Protokolle für die System.Net.Security.SslStream-Klasse, die die sichere Kommunikation in .NET unterstützt, werden für jede AppDomain global über die System.Net.ServicePointManager.SecurityProtocol- Eigenschaft festgelegt.
Der Standardwert dieser Eigenschaft in .NET 4.5 ist
Ssl3 | Tls
(obwohl ich keine Dokumentation zum Sichern finden kann). SecurityProtocolType ist eine Aufzählung mit dem Flags-Attribut, daher ist es ein bitweises ODER dieser beiden Werte. Sie können dies in Ihrer Umgebung mit folgender Codezeile überprüfen:Console.WriteLine (System.Net.ServicePointManager.SecurityProtocol.ToString ());
Dies sollte nur geändert werden
Tls
, oder vielleichtTls12
, bevor Sie irgendwelche Verbindungen in Ihrer Anwendung initiieren:System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls;
Wichtig: Da die Eigenschaft mehrere bitweise Flags unterstützt, gehe ich davon aus, dass der SslStream beim Handshake nicht automatisch auf andere nicht angegebene Protokolle zurückgreift . Was wäre sonst der Grund, mehrere Flags zu unterstützen?
Update auf TLS 1.0 vs 1.1 / 1.2:
Laut dem Google-Sicherheitsexperten Adam Langley wurde TLS 1.0 später als anfällig für POODLE eingestuft, wenn es nicht korrekt implementiert wurde. Daher sollten Sie in Betracht ziehen, ausschließlich auf TLS 1.2 umzusteigen .
Update für .NET Framework 4.7 und höher:
Wie von Prof. Von Lemongargle weiter unten angedeutet, muss dieser Hack ab Version 4.7 von .NET Framework nicht mehr verwendet werden, da das Betriebssystem mit der Standardeinstellung die sicherste TLS-Protokollversion auswählen kann. Siehe Transport Layer Security (TLS) Best Practices mit dem .NET Framework für weitere Informationen.
Antworten:
Wir machen das Gleiche. Um nur TLS 1.2 und keine SSL-Protokolle zu unterstützen, können Sie Folgendes tun:
SecurityProtocolType.Tls ist nur TLS 1.0, nicht alle TLS-Versionen.
Nebenbei: Wenn Sie überprüfen möchten, ob Ihre Site keine SSL-Verbindungen zulässt, können Sie dies hier tun (ich glaube nicht, dass dies durch die obige Einstellung beeinflusst wird. Wir mussten die Registrierung bearbeiten, um IIS zur Verwendung von TLS zu zwingen für eingehende Verbindungen): https://www.ssllabs.com/ssltest/index.html
Informationen zum Deaktivieren von SSL 2.0 und 3.0 in IIS finden Sie auf dieser Seite: https://www.sslshopper.com/article-how-to-disable-ssl-2.0-in-iis-7.html
quelle
SecurityProtocolType.Tls11
undSecurityProtocolType.Tls12
Aufzählungswerte sind nur in ASP.net 4.5 und höher verfügbar. Ich bin mir nicht sicher, was wir für ältere Codebasen unter 2.0 tun müssten, wenn TLS 1.0 auf der Strecke bleibt.Die Antwort von @Eddie Loeffen scheint die beliebteste Antwort auf diese Frage zu sein, hat aber einige schlechte Langzeiteffekte. Wenn Sie die Dokumentationsseite für System.Net.ServicePointManager.SecurityProtocol hier lesen , impliziert der Abschnitt "Bemerkungen", dass die Verhandlungsphase dies nur berücksichtigen sollte (und das Erzwingen des Protokolls ist eine schlechte Praxis, da TLS 1.2 in Zukunft ebenfalls gefährdet sein wird). Wir würden jedoch nicht nach dieser Antwort suchen, wenn dies der Fall wäre.
Nachforschungen zufolge scheint das ALPN-Verhandlungsprotokoll erforderlich zu sein, um in der Verhandlungsphase zu TLS1.2 zu gelangen. Wir haben dies als Ausgangspunkt genommen und neuere Versionen des .Net-Frameworks ausprobiert, um festzustellen, wo die Unterstützung beginnt. Wir haben festgestellt, dass .Net 4.5.2 die Aushandlung von TLS 1.2 nicht unterstützt, .Net 4.6 jedoch.
Obwohl das Erzwingen von TLS1.2 den Job jetzt erledigt, empfehle ich, stattdessen ein Upgrade auf .Net 4.6 durchzuführen. Da dies ein PCI-DSS-Problem für Juni 2016 ist, ist das Fenster kurz, aber das neue Framework ist eine bessere Antwort.
UPDATE: Ausgehend von den Kommentaren habe ich Folgendes erstellt:
Um das Konzept zu validieren, habe ich SSL3 und TLS1.2 zusammen ausgeführt und den Code für einen Server ausgeführt, der nur TLS 1.0 und TLS 1.2 unterstützt (1.1 ist deaktiviert). Mit den or'd-Protokollen scheint es eine gute Verbindung zu geben. Wenn ich zu SSL3 und TLS 1.1 wechsle, konnte keine Verbindung hergestellt werden. Meine Validierung verwendet HttpWebRequest von System.Net und ruft nur GetResponse () auf. Zum Beispiel habe ich dies versucht und bin gescheitert:
während dies funktionierte:
Dies hat gegenüber dem Erzwingen von TLS 1.2 den Vorteil, dass beim Aktualisieren des .NET-Frameworks, sodass mehr Einträge in der Aufzählung vorhanden sind, diese vom Code unverändert unterstützt werden. Es hat einen Nachteil gegenüber der Verwendung von .Net 4.6, da 4.6 ALPN verwendet und neue Protokolle unterstützen sollte, wenn keine Einschränkung angegeben ist.
Bearbeiten 29.04.2019 - Microsoft hat diesen Artikel im letzten Oktober veröffentlicht. Es enthält eine ziemlich gute Übersicht über die Empfehlungen, wie dies in den verschiedenen Versionen des .net-Frameworks erfolgen soll.
quelle
@ Watson
Auf Windows-Formularen ist es verfügbar, ganz oben in der Klasse setzen
Da Windows ein Single-Thread ist, ist es alles, was Sie brauchen. Für den Fall, dass es sich um einen Dienst handelt, müssen Sie ihn direkt über dem Aufruf des Dienstes platzieren (da nicht bekannt ist, auf welchem Thread Sie sich befinden).
wird auch benötigt.
quelle
Wenn Sie neugierig sind, welche Protokolle .NET unterstützt, können Sie HttpClient unter https://www.howsmyssl.com/ ausprobieren.
Das Ergebnis ist verdammt:
Wie Eddie oben erklärt, können Sie bessere Protokolle manuell aktivieren:
Ich weiß nicht, warum es schlechte Protokolle verwendet. Das scheint eine schlechte Wahl für das Setup zu sein, was einem großen Sicherheitsfehler gleichkommt (ich wette, viele Anwendungen ändern die Standardeinstellung nicht). Wie können wir es melden?
quelle
Ich musste das Integer-Äquivalent umwandeln, um die Tatsache zu umgehen, dass ich immer noch .NET 4.0 verwende
quelle
Ich fand, dass die einfachste Lösung darin besteht, zwei Registrierungseinträge wie folgt hinzuzufügen (führen Sie dies an einer Eingabeaufforderung mit Administratorrechten aus):
Diese Einträge scheinen sich darauf auszuwirken, wie die .NET CLR ein Protokoll auswählt, wenn eine sichere Verbindung als Client hergestellt wird.
Weitere Informationen zu diesem Registrierungseintrag finden Sie hier:
https://docs.microsoft.com/en-us/security-updates/SecurityAdvisories/2015/2960358#suggested-actions
Dies ist nicht nur einfacher, sondern unter der Annahme, dass es für Ihren Fall funktioniert, weitaus robuster als eine codebasierte Lösung, bei der Entwickler das Protokoll und die Entwicklung verfolgen und den gesamten relevanten Code aktualisieren müssen. Hoffentlich können ähnliche Umgebungsänderungen für TLS 1.3 und höher vorgenommen werden, solange .NET dumm genug bleibt, um nicht automatisch das höchste verfügbare Protokoll auszuwählen.
HINWEIS : Auch wenn dies gemäß dem obigen Artikel nur RC4 deaktivieren soll, und man würde nicht glauben, dass sich dadurch ändern würde, ob der .NET-Client TLS1.2 + verwenden darf oder nicht, aus irgendeinem Grund hat er dies bewirken.
HINWEIS : Wie von @Jordan Rieger in den Kommentaren erwähnt, ist dies keine Lösung für POODLE, da die älteren Protokolle nicht deaktiviert werden. A - Der Client kann lediglich mit neueren Protokollen arbeiten, z. B. wenn ein gepatchter Server die älteren deaktiviert hat Protokolle. Bei einem MITM-Angriff bietet ein kompromittierter Server dem Client jedoch offensichtlich ein älteres Protokoll an, das der Client dann gerne verwendet.
TODO : Versuchen Sie, die clientseitige Verwendung von TLS1.0 und TLS1.1 mit diesen Registrierungseinträgen zu deaktivieren. Ich weiß jedoch nicht, ob die .NET http-Clientbibliotheken diese Einstellungen berücksichtigen oder nicht:
https://docs.microsoft.com/en-us/windows-server/security/tls/tls-registry-settings#tls-10
https://docs.microsoft.com/en-us/windows-server/security/tls/tls-registry-settings#tls-11
quelle