Partager via


/Qspectre

Spécifie la génération par le compilateur d’instructions pour atténuer certaines failles de sécurité Spectre Variant 1.

Syntaxe

/Qspectre

Notes

L’option /Qspectre amène le compilateur à insérer des instructions pour atténuer certaines vulnérabilités de sécurité Spectre. Ces vulnérabilités sont appelées attaques par canal secondaire d’exécution spéculative. Ils affectent de nombreux systèmes d’exploitation et processeurs modernes, y compris les processeurs d’Intel, AMD et ARM.

L’option /Qspectre est disponible à partir de Visual Studio 2017 version 15.5.5 et de toutes les versions ultérieures. Il est disponible dans Visual Studio 2015 Update 3 via kb 4338871.

L’option /Qspectre est désactivée par défaut.

Dans sa version initiale, l’option /Qspectre a uniquement fonctionné sur du code optimisé. À compter de Visual Studio 2017 version 15.7, l’option /Qspectre est prise en charge à tous les niveaux d’optimisation.

Plusieurs bibliothèques Microsoft C++ sont également disponibles dans les versions avec atténuation de Spectre. Les bibliothèques atténuées par Spectre pour Visual Studio peuvent être téléchargées dans visual Studio Installer. Ils se trouvent sous l’onglet Composants individuels sous Compilateurs, outils de génération et runtimes, et ont « Libs for Spectre » dans le nom. Les bibliothèques de runtimes DLL et statiques avec atténuation activée sont disponibles pour un sous-ensemble des runtimes Visual C++ : code de démarrage VC++, vcruntime140, msvcp140, concrt140 et vcamp140. Les DLL sont prises en charge uniquement pour le déploiement local d’application. Le contenu des bibliothèques runtime Visual C++ redistribuables n’est pas modifié.

Vous pouvez également installer des bibliothèques atténuées par Spectre pour MFC et ATL. Ils se trouvent sous l’onglet Composants individuels sous Kits de développement logiciel (SDK), bibliothèques et frameworks.

Remarque

Il n’existe aucune version des bibliothèques atténuées par Spectre pour les applications ou composants Windows universels (UWP). Le déploiement local d’applications de ces bibliothèques n’est pas possible.

Applicabilité

Si votre code fonctionne sur des données qui franchissent une limite d’approbation, nous vous recommandons d’utiliser l’option /Qspectre permettant de reconstruire et de redéployer votre code pour atténuer ce problème dès que possible. Un exemple de code de ce type est du code qui charge une entrée non approuvée qui peut affecter l’exécution. Par exemple, le code qui effectue des appels de procédure distante, analyse des entrées ou des fichiers non approuvés, ou utilise d’autres interfaces de communication interprocessus (IPC) locales. Les techniques de sandboxing standard peuvent ne pas suffire. Examinez attentivement vos bacs à sable avant de décider que votre code ne dépasse pas une limite d’approbation.

Disponibilité

L’option /Qspectre est disponible à partir de Visual Studio 2017 version 15.5.5, et dans toutes les mises à jour des compilateurs Microsoft C/C++ (MSVC) effectuées le 23 janvier 2018 ou après le 23 janvier 2018. Utilisez Visual Studio Installer pour mettre à jour le compilateur et installer les bibliothèques avec atténuation de Spectre en tant que composants individuels. L’option /Qspectre est également disponible dans Visual Studio 2015 Update 3 via un correctif. Pour plus d’informations, consultez l’article 4338871 de la Base de connaissances.

Toutes les versions de Visual Studio 2017 version 15.5 et toutes les préversions de Visual Studio 2017 version 15.6. incluez une option non documentée, /d2guardspecload. Il équivaut au comportement initial de /Qspectre. Vous pouvez utiliser /d2guardspecload pour appliquer les mêmes atténuations à votre code dans ces versions du compilateur. Nous vous recommandons de mettre à jour votre build à utiliser /Qspectre dans les compilateurs qui prennent en charge l’option. L’option /Qspectre peut également prendre en charge de nouvelles atténuations dans les versions ultérieures du compilateur.

Effet

L’option /Qspectre génère du code pour atténuer la variante De spectre 1, Bounds Check Bypass, CVE-2017-5753. Elle fonctionne par insertion d’instructions qui agissent comme un cloisonnement de l’exécution spéculative du code. Les instructions spécifiques utilisées pour atténuer la spéculation du processeur varient en fonction du processeur et de sa micro-architecture ; elles peuvent changer dans les futures versions du compilateur.

Lorsque vous activez l’option /Qspectre , le compilateur tente d’identifier les instances où l’exécution spéculative peut contourner les vérifications liées. C’est là qu’il insère les instructions de barrière. Il est important de connaître les limites de l’analyse qu’un compilateur peut faire pour identifier les instances de la variante 1. Par conséquent, il n’existe aucune garantie que toutes les instances possibles de la variante 1 sont instrumentées sous /Qspectre.

Impact sur les performances

L’effet des /Qspectre performances semblait négligeable dans plusieurs bases de code sizables. Toutefois, il n’existe aucune garantie que les performances de votre code ne /Qspectre sont pas affectées. Vous devez effectuer un test d’évaluation de votre code pour déterminer l’effet de l’option sur les performances. Si vous savez que l’atténuation n’est pas nécessaire dans un bloc ou une boucle critique pour les performances, vous pouvez désactiver sélectivement l’atténuation à l’aide d’une __declspec(spectre(nomitigation)) directive. Cette directive n’est pas disponible dans les compilateurs qui prennent uniquement en charge l’option /d2guardspecload .

Bibliothèques requises

L’option /Qspectre du compilateur atténue les problèmes dans votre propre code. Pour une plus grande protection, nous vous recommandons vivement d’utiliser également des bibliothèques conçues pour fournir des atténuations spectre. Plusieurs bibliothèques d’exécution Microsoft sont disponibles avec les atténuations de Spectre.

Ces bibliothèques sont des composants facultatifs qui doivent être installés à l’aide de Visual Studio Installer :

  • Version MSVC version_numbers Libs for Spectre [(x86 et x64) | (ARM) | (ARM64)]
  • Visual C++ ATL pour [(x86/x64) | ARM | ARM64] avec atténuations de Spectre
  • Visual C++ MFC pour [x86/x64 | ARM | ARM64] avec atténuations de Spectre

Le système de projet MSBuild par défaut dans l’IDE Visual Studio vous permet de spécifier une propriété Spectre Mitigation pour vos projets. Cette propriété définit l’option du /Qspectre compilateur et modifie les chemins d’accès de la bibliothèque pour lier les bibliothèques d’exécution atténuées par Spectre. Si ces bibliothèques ne sont pas installées lorsque vous générez votre code, le système de génération signale l’avertissement MSB8040. Si votre code MFC ou ATL ne parvient pas à générer et que l’éditeur de liens signale une erreur telle que « erreur irrécupérable LNK1104 : impossible d’ouvrir le fichier « oldnames.lib », ces bibliothèques manquantes peuvent être la cause.

Le système de projet MSBuild par défaut dans l’IDE Visual Studio vous permet de spécifier une propriété Spectre Mitigation pour vos projets. Cette propriété définit l’option du /Qspectre compilateur et modifie les chemins d’accès de la bibliothèque pour lier les bibliothèques d’exécution atténuées par Spectre. Si ces bibliothèques ne sont pas installées lorsque vous générez votre code, le système de génération signale l’avertissement MSB8038 : « L’atténuation de Spectre est activée, mais les bibliothèques atténuées de Spectre ne sont pas trouvées ». Si votre code MFC ou ATL ne parvient pas à générer et que l’éditeur de liens signale une erreur telle que « erreur irrécupérable LNK1104 : impossible d’ouvrir le fichier « oldnames.lib », ces bibliothèques manquantes peuvent être la cause.

Il existe plusieurs façons de spécifier les bibliothèques atténuées par Spectre sur la ligne de commande build. Vous pouvez spécifier le chemin d’accès aux bibliothèques atténuées par Spectre à l’aide de l’option /LIBPATH éditeur de liens pour les rendre les bibliothèques par défaut. Vous pouvez utiliser l’option /NODEFAULTLIB éditeur de liens et lier explicitement les bibliothèques atténuées par Spectre. Vous pouvez également définir la LIBPATH variable d’environnement pour inclure le chemin d’accès aux bibliothèques atténuées par Spectre pour votre plateforme cible. Une façon de définir ce chemin dans l’environnement consiste à utiliser une invite de commandes développeur configurée à l’aide de l’option spectre_mode . Pour plus d’informations, consultez Utiliser les outils de développement dans une fenêtre de commande existante.

Les bibliothèques d’exécution atténuées par Spectre pour les plateformes x86, x64 et ARM sont disponibles dans le cadre du correctif disponible via la base de connaissances 4338871. Par défaut, ces bibliothèques sont installées dans les répertoires suivants :

  • x86 : C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\lib\spectre
  • x64 : C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\lib\spectre\amd64
  • ARM : C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\lib\spectre\arm

Il existe plusieurs façons de spécifier les bibliothèques atténuées par Spectre sur la ligne de commande build. Vous pouvez spécifier le chemin d’accès aux bibliothèques atténuées par Spectre à l’aide de l’option /LIBPATH éditeur de liens pour les rendre les bibliothèques par défaut. Vous pouvez utiliser l’option /NODEFAULTLIB éditeur de liens et lier explicitement les bibliothèques atténuées par Spectre. Vous pouvez également définir la LIBPATH variable d’environnement pour inclure le chemin d’accès aux bibliothèques atténuées par Spectre pour votre architecture cible. Pour plus d’informations, consultez l’ensemble d’outils Microsoft C++ à partir de la ligne de commande.

Informations supplémentaires

Pour plus d’informations, consultez le ADV180002 de conseil de sécurité Microsoft officiel , conseils pour atténuer les vulnérabilités de canal côté exécution spéculative. Des conseils sont également disponibles auprès d’Intel, Speculative Execution Side Channel Mitigations (Atténuations par canal auxiliaire d’exécution spéculative), et d’ARM, Cache Speculation Side-channels (Mettre en cache les canaux auxiliaires de spéculation).

Pour obtenir une vue d’ensemble spécifique à Windows des atténuations spectre et meltdown, consultez Présentation de l’impact sur les performances des atténuations spectre et meltdown sur les systèmes Windows.

Pour obtenir une vue d’ensemble des vulnérabilités spectre traitées par les atténuations MSVC, consultez les atténuations de Spectre dans MSVC sur le blog de l’équipe C++.

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 une nouvelle valeur pour la propriété Spectre Mitigation . Choisissez OK pour appliquer le changement.

  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 Propriétés de configuration>C/C++>Ligne de commande.

  3. Entrez l’option du /Qspectre compilateur dans la zone Options supplémentaires. Choisissez Appliquer pour appliquer la modification.

  4. Sélectionnez la page de propriétés Général de l’Éditeur >de propriétés>de configuration.

  5. Pour chaque plateforme de vos propriétés de projet, modifiez la propriété Répertoires de bibliothèque supplémentaires . Définissez le chemin d’accès au répertoire de la bibliothèque runtime atténuée par Spectre pour la plateforme cible, puis choisissez Appliquer pour appliquer la modification. Lorsque vous avez terminé, choisissez OK.

Pour définir cette option du compilateur par programmation

Voir aussi

/Qspectre-jmp
/Qspectre-load
/Qspectre-load-cf
/Q options (opérations de bas niveau)
Options du compilateur MSVC
Syntaxe de ligne de commande du compilateur MSVC