Partager via


/guard:ehcont (Activer les métadonnées de continuation EH)

Active la génération de métadonnées EH Continuation (EHCONT) par le compilateur.

Syntaxe

/guard:ehcont[-]

Notes

L’option /guard:ehcont entraîne la génération d’une liste triée des adresses virtuelles relatives (RVA) de toutes les cibles de continuation de gestion des exceptions valides pour un binaire. Il est utilisé pendant l’exécution pour la validation du pointeur d’instruction et SetThreadContext de NtContinue l’instruction. Par défaut, /guard:ehcont est désactivé et doit être activé explicitement. Pour désactiver explicitement cette option, utilisez /guard:ehcont-.

L’option /guard:ehcont est disponible dans Visual Studio 2019 version 16.7 et ultérieures. La fonctionnalité est prise en charge pour les processus 64 bits sur un système d’exploitation 64 bits.

La technologie d’application du flux de contrôle (CET) est une fonctionnalité de sécurité basée sur le matériel qui protège contre les attaques basées sur la programmation orientée retour (ROP). Il gère une « pile d’ombres » pour chaque pile d’appels afin d’appliquer l’intégrité du flux de contrôle.

Lorsque des piles d’ombres sont disponibles pour empêcher les attaques ROP, les attaquants passent à l’utilisation d’autres techniques d’exploitation. Une technique qu’ils peuvent utiliser consiste à endommager la valeur du pointeur d’instruction à l’intérieur de la structure CONTEXT . Cette structure est passée dans les appels système qui redirigent l’exécution d’un thread, tel que NtContinue, RtlRestoreContextet SetThreadContext. La CONTEXT structure est stockée en mémoire. L’endommagement du pointeur d’instruction qu’il contient peut entraîner le transfert d’appels système vers une adresse contrôlée par l’attaquant. Actuellement, NTContinue peut être appelé avec n’importe quel point de continuation. C’est pourquoi il est essentiel de valider le pointeur d’instruction lorsque les piles d’ombres sont activées.

RtlRestoreContext et NtContinue sont utilisés lors du déroulement de l’exception SEH (Structured Exception Handling) pour déroulage vers l’image cible qui contient le __except bloc. Le pointeur d’instruction du __except bloc n’est pas censé se trouver sur la pile d’ombres, car il échouerait la validation du pointeur d’instruction. Le /guard:ehcont commutateur du compilateur génère une « table de continuation EH ». Il contient une liste triée des RVA de toutes les cibles de continuation de gestion des exceptions valides dans le fichier binaire. NtContinue vérifie d’abord la pile d’ombres pour le pointeur d’instruction fourni par l’utilisateur et, si le pointeur d’instruction n’y figure pas, il continue de vérifier la table de continuation EH à partir du binaire qui contient le pointeur d’instruction. Si le fichier binaire conteneur n’a pas été compilé avec la table, la compatibilité avec les fichiers binaires hérités NtContinue est autorisée à continuer. Il est important de faire la distinction entre les fichiers binaires hérités qui n’ont pas de données EHCONT et les fichiers binaires contenant des données EHCONT, mais pas d’entrées de table. L’ancien autorise toutes les adresses à l’intérieur du fichier binaire en tant que cibles de continuation valides. Ces derniers n’autorisent aucune adresse à l’intérieur du fichier binaire en tant que cible de continuation valide.

L’option /guard:ehcont doit être transmise à la fois au compilateur et à l’éditeur de liens pour générer des RVA cibles de continuation EH pour un fichier binaire. Si votre fichier binaire est généré à l'aide d'une seule commande cl , le compilateur passe l'option à l'éditeur de liens. Le compilateur transmet également l’option /guard:cf à l’éditeur de liens. Si vous compilez et liez séparément, ces options doivent être définies à la fois sur les commandes du compilateur et de l’éditeur de liens.

Vous pouvez lier du code compilé à l’aide /guard:ehcont de bibliothèques et de fichiers objet compilés sans celui-ci. L’éditeur de liens retourne une erreur irrécupérable dans l’un des scénarios suivants :

  • Une section de code comporte un « déroulement local ». Pour plus d’informations, consultez l’arrêt anormal dans l’instruction try-finally.

  • Une section EH (xdata) contient des pointeurs vers une section de code, et elles ne sont pas destinées à SEH.

  • Les pointeurs sont destinés à SEH, mais le fichier objet n’a pas été compilé à l’aide de la liaison au niveau de la fonction (/Gy) pour produire des COMDAT.

L’éditeur de liens retourne une erreur irrécupérable, car il ne peut pas générer de métadonnées dans ces scénarios. Cela signifie que la levée d’une exception est susceptible d’entraîner un blocage au moment de l’exécution.

Pour les informations de section SEH trouvées dans les COMDATs, mais non compilées à l’aide /guard:ehcont, l’éditeur de liens émet un avertissement LNK4291. Dans ce cas, l’éditeur de liens génère des métadonnées correctes mais conservatrices pour la section. Pour ignorer cet avertissement, utilisez /IGNORE (Ignorer des avertissements spécifiques).

Si l’éditeur de liens ne parvient pas à générer des métadonnées, il émet l’une des erreurs suivantes :

  • LNK2046: module contains _local_unwind but was not compiled with /guard:ehcont

  • LNK2047: module contains C++ EH or complex EH metadata but was not compiled with /guard:ehcont.

Pour vérifier si un fichier binaire contient des données EHCONT, recherchez les éléments suivants lors du vidage de la configuration de chargement du binaire :

e:\>link /dump /loadconfig CETTest.exe
...
            10417500 Guard Flags
...
                       EH Continuation table present      // EHCONT guard flag present
...
    0000000180018640 Guard EH continuation table
                  37 Guard EH continuation count          // May be 0 if no exception handling is used in the binary. Still counts has having EHCONT data.
...
    Guard EH Continuation Table                           // List of RVAs

          Address
          --------
           0000000180002CF5
           0000000180002F03
           0000000180002F0A
...

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é du projet. Pour plus d’informations, consultez Définir le compilateur C++ et les propriétés de build dans Visual Studio.

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

  3. Sélectionnez la propriété Activer les métadonnées de continuation EH.

  4. Dans le contrôle de liste déroulante, choisissez Oui (/guard :ehcont) pour activer les métadonnées de continuation EH ou Non (/guard :ehcont-) pour le désactiver.

Voir aussi

/guard (Activer la protection du flux de contrôle)
Options du compilateur MSVC
Syntaxe de la ligne de commande du compilateur MSVC