Partager via


/guard (Activer Control Flow Guard)

Active la génération par le compilateur de vérifications de sécurité de la protection du flux de contrôle.

Syntaxe

/guard:cf
/guard:cf-

Notes

L’option /guard:cf amène le compilateur à analyser le flux de contrôle pour les cibles d’appel indirects au moment de la compilation, puis à insérer du code pour vérifier les cibles au moment de l’exécution. Par défaut, /guard:cf est désactivé et doit être activé explicitement. Pour désactiver explicitement cette option, utilisez /guard:cf-.

Visual Studio 2017 et versions ultérieures : cette option ajoute des gardes pour switch les instructions qui génèrent des tables de rebond.

Lorsque l’option /guard:cf Control Flow Guard (CFG) est spécifiée, le compilateur et l’éditeur de liens insèrent des vérifications de sécurité d’exécution supplémentaires pour détecter les tentatives de compromission de votre code. Pendant les phases de compilation et de liaison, tous les appels indirects dans votre code sont analysés pour identifier chaque emplacement auquel le code peut accéder quand il s'exécute correctement. Ces informations sont stockées dans des structures supplémentaires dans les en-têtes de vos fichiers binaires. Le compilateur injecte également une vérification avant chaque appel indirect dans votre code pour garantir que la cible fait partie des emplacements vérifiés. Si la vérification échoue à l'exécution sur un système d'exploitation utilisant la protection du flux de contrôle, le système d'exploitation ferme le programme.

Une attaque courante sur les logiciels exploite certains bogues dans la gestion des valeurs extrêmes ou inattendues. Une valeur judicieusement ajoutée à l'application peut remplacer un emplacement qui contient un pointeur vers le code exécutable. Cette technique peut être utilisée pour rediriger le flux de contrôle vers le code contrôlé par l’attaquant. Les vérifications du runtime CFG ne corrigent pas les bogues d’altération des données dans votre exécutable. En fait, elles rendent plus difficile pour un attaquant d'exploiter ces bogues pour exécuter du code arbitraire. La protection du flux de contrôle est un outil qui contribue à empêcher les appels ciblant des emplacements autres que les points d'entrée de fonction dans votre code. Il est similaire à la façon dont la prévention de l’exécution des données (DEP), les vérifications de pile /GS et /DYNAMICBASE /HIGHENTROPYVA la randomisation de l’espace d’adressage (ASLR) réduit les chances que votre code devienne un vecteur d’exploitation.

L’option /guard:cf doit être transmise à la fois au compilateur et à l’éditeur de liens pour générer du code qui utilise la technique d’atténuation des attaques CFG. Si votre fichier binaire est généré à l'aide d'une seule commande cl , le compilateur passe l'option à l'éditeur de liens. Si vous effectuez la compilation et la liaison séparément, l'option doit être spécifiée dans les commandes du compilateur et de l'éditeur de liens. L'option /DYNAMICBASE de l'éditeur de liens doit également être spécifiée. Pour vérifier si votre fichier binaire contient des données de protection du flux de contrôle, utilisez la commande dumpbin /headers /loadconfig . Quand les fichiers binaires sont définis avec une protection du flux de contrôle, Guard figure dans la liste des caractéristiques EXE ou DLL, et les indicateurs de protection Guard CF Instrumented et FID table present.

L’option /guard:cf n’est pas compatible avec /ZI (Modifier et continuer les informations de débogage) ou /clr (Compilation Common Language Runtime).

Le code compilé à l’aide de l’utilisation /guard:cf peut être lié aux bibliothèques et aux fichiers objet qui ne sont pas compilés à l’aide de l’option. Seul ce code, lorsqu’il est également lié à l’aide de l’option /guard:cf et s’exécute sur un système d’exploitation prenant en charge CFG, dispose d’une protection CFG. Étant donné que le code compilé sans l’option n’arrête pas d’attaque, nous vous recommandons d’utiliser l’option sur tout le code que vous compilez. Il existe un petit coût d’exécution pour les vérifications CFG, mais l’analyse du compilateur tente d’optimiser les vérifications sur les sauts indirects qui peuvent être prouvés comme sûrs.

Pour définir cette option du compilateur dans l'environnement de développement Visual Studio

  1. Ouvrez la boîte de dialogue Pages de propriétés du projet. Pour plus d’informations, consultez Définir les propriétés du compilateur et de la génération.

  2. Sélectionnez la page de propriétés De configuration>C/C++>Génération de code.

  3. Sélectionnez la propriété Protection du flux de contrôle .

  4. Dans la liste déroulante, choisissez Oui pour activer la protection du flux de contrôle ou Non pour la désactiver.

Voir aussi

Options du compilateur MSVC
Syntaxe de ligne de commande du compilateur MSVC