Aller au contenu

Insecure TLS Certificate Validation

Validation de Certificat TLS Non Sécurisée

Description

La validation non sécurisée des certificats TLS est une vulnérabilité lors de l'établissement de connexions sécurisées entre un client et un serveur. TLS (Transport Layer Security) est un protocole cryptographique qui fournit des communications sécurisées sur Internet. Lorsqu'un client se connecte à un serveur via TLS, il vérifie le certificat numérique du serveur pour vérifier son identité et s'assurer que la connexion est sécurisée.

La validation non sécurisée des certificats TLS se produit lorsque le client ne parvient pas à valider correctement le certificat du serveur, permettant à un attaquant d'usurper l'identité du serveur et d'intercepter ou de modifier la communication entre le client et le serveur. Cela peut entraîner le vol, la modification ou l'exposition d'informations sensibles.

Voici quelques faiblesses courantes de la validation des certificats TLS :

  • Certificats Expirés : Un certificat expiré n'est plus considéré comme valide. Cependant, un client qui ne vérifie pas la date d'expiration du certificat peut accepter un certificat expiré, qui pourrait avoir été révoqué ou compromis.

  • Certificats Auto-Signés : Un certificat auto-signé est un certificat qui a été signé par la même entité qui l'a émis. Puisqu'il n'y a pas de tiers indépendant pour vérifier l'authenticité du certificat, un client qui fait confiance à un certificat auto-signé pourrait être vulnérable à une attaque de type "man-in-the-middle".

  • Certificats à Hôte Incorrect : Un certificat est émis pour un nom de domaine ou une adresse IP spécifique. Si un client se connecte à un serveur avec un certificat qui ne correspond pas au nom d'hôte ou à l'adresse IP, le client pourrait être vulnérable à une attaque "man-in-the-middle".

  • Certificats Racines Non Approuvés : Un certificat racine est le certificat de niveau supérieur dans une chaîne de certificats, et il est utilisé pour valider l'authenticité de tous les certificats de la chaîne. Si un client ne fait pas confiance au certificat racine utilisé par le serveur, il peut accepter un certificat frauduleux qu'un autre certificat racine non approuvé a signé.

  • Certificats Révoqués : Un certificat peut être révoqué s'il a été compromis ou s'il n'est plus considéré comme digne de confiance. Un client qui ne vérifie pas le statut de révocation du certificat pourrait accepter un certificat révoqué, ce qui pourrait être utilisé pour effectuer une attaque "man-in-the-middle".

import java.net.HttpURLConnection;
import java.net.URL;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import java.security.cert.X509Certificate;
import java.security.SecureRandom;

public class HttpsRequestWithoutTlsVerification {
    public static void main(String[] args) throws Exception {
        // Disable SSL/TLS verification
        TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() {
            public X509Certificate[] getAcceptedIssuers() { return null; }
            public void checkClientTrusted(X509Certificate[] certs, String authType) {}
            public void checkServerTrusted(X509Certificate[] certs, String authType) {}
        }};
        SSLContext sslContext = SSLContext.getInstance("TLS");
        sslContext.init(null, trustAllCerts, new SecureRandom());

        // Create connection and set SSL context
        URL url = new URL("https://example.com");
        HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
        conn.setSSLSocketFactory(sslContext.getSocketFactory());

        // Send HTTP request
        conn.setRequestMethod("GET");
        int responseCode = conn.getResponseCode();
        System.out.println("Response code: " + responseCode);
    }
}
import 'dart:io';

void main() async {
  var client = HttpClient();

  // Disable SSL certificate validation
  client.badCertificateCallback = (X509Certificate cert, String host, int port) => true;

  // Make HTTP request
  var request = await client.getUrl(Uri.parse('https://example.com'));
  var response = await request.close();
  print('Response code: ${response.statusCode}');
  client.close();
}

Recommandation

Pour atténuer le risque de validation de certificat TLS non sécurisée, il est recommandé que l'application implémente des mécanismes de validation de certificat sécurisés à la fois sur le client et le serveur. Cela inclut :

  • Vérifier la validité du certificat du serveur pour s'assurer qu'il n'a pas expiré, n'a pas été révoqué et est émis par une autorité de certification de confiance.
  • Configurer la vérification du nom d'hôte pour s'assurer que le certificat correspond au nom de domaine du serveur afin d'éviter d'accepter des certificats avec des noms d'hôte non valides.
  • Utiliser des autorités de certification de confiance et éviter les certificats auto-signés ou les certificats racines non approuvés.

De plus, il est important de maintenir l'application et les bibliothèques ou frameworks utilisés à jour avec les derniers correctifs de sécurité et de tester régulièrement la posture de sécurité de l'application pour identifier d'éventuelles vulnérabilités.

Liens

Normes

  • PCI_STANDARDS:
    • REQ_2_2
    • REQ_4_2
    • REQ_6_2
    • REQ_6_3
    • REQ_6_4
    • REQ_11_3
  • SOC2_CONTROLS:
    • CC_2_1
    • CC_4_1
    • CC_6_7
    • CC_7_1
    • CC_7_2
    • CC_7_4
    • CC_7_5