Meilleures pratiques de sécurité pour C++

Cet article contient des informations sur les outils et les pratiques de sécurité. Leur utilisation n'immunise pas les applications contre les attaques, mais réduit la probabilité que ces attaques réussissent.

Fonctionnalités de sécurité de Visual C++

Ces fonctionnalités de sécurité sont intégrées au compilateur Microsoft C++ et à l’éditeur de liens :

/guard (Activer Control Flow Guard)
Provoque l’analyse du flux de contrôle pour les cibles d’appel indirects au moment de la compilation, puis insère du code pour vérifier les cibles au moment de l’exécution.

/GS (Contrôle de sécurité de la mémoire tampon)
Indique au compilateur d'insérer du code de détection de débordement dans les fonctions qui courent le risque d'être exploitées. Quand un débordement est détecté, l'exécution est arrêtée. Cette option est activée par défaut.

/SAFESEH(L’image a des gestionnaires d’exceptions Coffre)
Indique à l'éditeur de liens d'inclure dans l'image de sortie une table contenant l'adresse de chaque gestionnaire d'exceptions. Au moment de l'exécution, le système d'exploitation utilise cette table pour s'assurer que seuls les gestionnaires d'exceptions légitimes sont exécutés. Cela contribue à empêcher l'exécution de gestionnaires d'exceptions introduits par une attaque malveillante au moment de l'exécution. Par défaut, cette option est désactivée.

/NXCOMPAT, /NXCOMPAT (Compatible avec la prévention de l’exécution des données) Ces options de compilateur et d’éditeur de liens activent la compatibilité de la prévention de l’exécution des données (DEP). PED protège l'UC contre l'exécution de pages ne contenant pas de code.

/analyze (Analyse du code)
Cette option du compilateur active l'analyse du code, qui signale les problèmes de sécurité potentiels, tels que le dépassement de la mémoire tampon, la mémoire non initialisée, le déréférencement de pointeur null et les fuites de mémoire. Par défaut, cette option est désactivée. Pour plus d’informations, consultez Vue d’ensemble de l’analyse du code pour C/C++.

/DYNAMICBASE (Utiliser la randomisation de la disposition de l’espace d’adressage)
Cette option de l'éditeur de liens permet de générer une image exécutable qui peut être chargée à différents emplacements dans la mémoire au début de l'exécution. Cette option rend également l'emplacement de la pile en mémoire beaucoup moins prévisible.

Sécurité CRT améliorée

La bibliothèque Runtime C (CRT) a été étendue afin d'inclure des versions sécurisées des fonctions qui présentent des risques de sécurité, par exemple, la fonction de copie de chaîne non contrôlée strcpy. Comme les versions plus anciennes et non sécurisées de ces fonctions sont déconseillées, elles entraînent des avertissements de compilation. Nous vous encourageons à utiliser les versions sécurisées de ces fonctions CRT plutôt que de supprimer les avertissements de compilation. Pour plus d’informations, consultez Fonctionnalités de sécurité dans le CRT.

Bibliothèque SafeInt

Coffre Int Library permet d’empêcher les dépassements d’entiers et d’autres erreurs exploitables qui peuvent se produire lorsque l’application effectue des opérations mathématiques. La SafeInt bibliothèque inclut la classe Coffre Int, la classe Coffre IntException et plusieurs fonctions Coffre Int.

La classe SafeInt protège contre les dépassements sur les entiers et les tentatives de division par zéro. Vous pouvez l'utiliser pour gérer les comparaisons entre des valeurs de types différents. Il fournit deux stratégies de gestion des erreurs. Dans la stratégie par défaut, la classe SafeInt lève une exception de classe SafeIntException pour signaler la raison pour laquelle une opération mathématique ne peut pas être exécutée. Dans la seconde stratégie, la classe SafeInt arrête l'exécution du programme. Vous pouvez également définir une stratégie personnalisée.

Chaque fonction SafeInt protège une opération mathématique d'une erreur exploitable. Vous pouvez utiliser deux types différents de paramètres sans les convertir en un même type. Pour protéger plusieurs opérations mathématiques, utilisez la classe SafeInt.

Checked Iterators

Un itérateur vérifié met en place des limites de conteneur. Par défaut, quand un itérateur vérifié est hors limites, il génère une exception et arrête l'exécution du programme. Un itérateur case activée fournit d’autres niveaux de réponse qui dépendent des valeurs affectées au préprocesseur définit comme _SECURE_SCL_THROWS et _ITERATOR_DEBUG_LEVEL. Par exemple, à _ITERATOR_DEBUG_LEVEL=2, un itérateur case activée fournit une exactitude complète case activée s en mode débogage, qui sont disponibles à l’aide d’assertions. Pour plus d’informations, consultez Itérateurs vérifiés et _ITERATOR_DEBUG_LEVEL.

Analyse du code managé

L'analyse du code managé, également appelée FxCop, vérifie la conformité des assemblys aux règles de conception du .NET Framework. FxCop analyse le code et les métadonnées de chaque assembly pour rechercher des défaillances dans les domaines suivants :

  • Conception des bibliothèques

  • Localisation

  • Conventions d'attribution d'un nom

  • Performances

  • Sécurité

Windows Application Verifier

Le vérificateur d’application (AppVerifier) peut vous aider à identifier les problèmes potentiels de compatibilité, de stabilité et de sécurité de l’application.

AppVerifier surveille la manière dont une application utilise le système d'exploitation. Il surveille le système de fichiers, le Registre, la mémoire et les API pendant l'exécution de l'application et recommande des correctifs du code source pour les problèmes qu'il découvre.

Vous pouvez utiliser AppVerifier pour :

  • Tester les erreurs potentielles de compatibilité des applications, provoquées par des erreurs de programmation courantes.

  • Rechercher dans une application des problèmes liés à la mémoire.

  • Identifier des problèmes potentiels de sécurité dans une application.

Comptes utilisateur Windows

L'utilisation de comptes utilisateur Windows qui appartiennent au groupe Administrateurs expose les développeurs et, par extension, les clients aux risques de sécurité. Pour plus d’informations, consultez Exécuter en tant que membre du groupe d’utilisateurs et comment le contrôle de compte d’utilisateur (UAC) affecte votre application.

Conseils pour les canaux côté exécution spéculative

Pour plus d’informations sur la façon de mettre en retrait et d’atténuer les vulnérabilités matérielles de canal côté exécution spéculative dans le logiciel C++, consultez conseils pour les développeurs C++ pour les canaux côté exécution spéculative.

Voir aussi

System.Security
Sécurité
Répercussions du contrôle de compte utilisateur sur votre application