/Qspectre

Настраивает создание компилятором инструкций для устранения некоторых уязвимостей Spectre варианта 1.

Синтаксис

/Qspectre

Замечания

Этот /Qspectre параметр приводит к тому, что компилятор вставляет инструкции для устранения определенных уязвимостей безопасности Spectre. Эти уязвимости называются спекулятивными атаками на стороне канала. Они влияют на многие операционные системы и современные процессоры, включая процессоры intel, AMD и ARM.

Этот /Qspectre параметр доступен начиная с Visual Studio 2017 версии 15.5.5 и всех более поздних версий. Она доступна в Visual Studio 2015 с обновлением 3 до КБ 4338871.

Параметр /Qspectre отключен по умолчанию.

В первоначальном выпуске /Qspectre параметр работал только над оптимизированным кодом. Начиная с Visual Studio 2017 версии 15.7, этот /Qspectre параметр поддерживается на всех уровнях оптимизации.

Несколько библиотек Microsoft C++ также доступны в версиях с устранением рисков Spectre. Библиотеки с устранением рисков Spectre для Visual Studio можно скачать в Visual Studio Installer. Они находятся на вкладке "Отдельные компоненты" в разделе "Компиляторы", средства сборки и среды выполнения и имеют "Libs for Spectre" в имени. Библиотеки DLL и статические библиотеки среды выполнения с поддержкой устранения рисков доступны для подмножества среды выполнения Visual C++: код запуска VC++, vcruntime140, msvcp140, concrt140 и vcamp140. Библиотеки DLL поддерживаются только для локального развертывания приложений. Содержимое распространяемых библиотек среды выполнения Visual C++ не изменено.

Вы также можете установить библиотеки с устранением рисков Spectre для MFC и ATL. Они находятся на вкладке "Отдельные компоненты" в разделе SDK, библиотеки и платформы.

Примечание.

Для приложений или компонентов универсальной платформы Windows (UWP) не существует версий библиотек, смягчаемых с помощью Spectre. Локальное развертывание таких библиотек приложений невозможно.

Применимость

Если код работает с данными, пересекающими границу доверия, рекомендуется использовать /Qspectre параметр для перестроения и повторного развертывания кода, чтобы устранить эту проблему как можно скорее. Примером такого кода является код, который загружает ненадежные входные данные, которые могут повлиять на выполнение. Например, код, который вызывает удаленные процедуры, анализирует ненадежные входные данные или файлы или использует другие локальные интерфейсы взаимодействия между процессами (IPC). Стандартных приемов организации песочницы может быть недостаточно. Тщательно изучите песочницы, прежде чем решить, что код не пересекает границу доверия.

Доступность

Этот /Qspectre параметр доступен начиная с Visual Studio 2017 версии 15.5.5, а также во всех обновлениях компиляторов Microsoft C/C++ (MSVC), сделанных 23 января 2018 г. или после 23 января 2018 г. Используйте Visual Studio Installer, чтобы обновить компилятор и установить библиотеки с устраненными уязвимостями Spectre как отдельные компоненты. Этот /Qspectre параметр также доступен в Visual Studio 2015 с обновлением 3 через исправление. Дополнительные сведения см. в статье базы знаний 4338871.

Все версии Visual Studio 2017 версии 15.5 и все предварительные версии Visual Studio 2017 версии 15.6. включите необязаченный параметр /d2guardspecload. Это эквивалентно первоначальному поведению /Qspectre. Вы можете применить /d2guardspecload те же способы устранения рисков к коду в этих версиях компилятора. Мы рекомендуем обновить сборку для использования /Qspectre в компиляторах, поддерживающих этот параметр. Этот /Qspectre параметр также может поддерживать новые способы устранения рисков в более поздних версиях компилятора.

Действие

Параметр /Qspectre выводит код для устранения ошибки Specter variant 1, Bounds Check Bypass, CVE-2017-5753. Для этого вставляются инструкции, которые препятствуют спекулятивному выполнению кода. Конкретные инструкции, препятствующие спекулятивному выполнению, зависят от процессора и его микроархитектуры. В будущих версиях компилятора они могут меняться.

При включении /Qspectre параметра компилятор пытается определить экземпляры, в которых спекулятивное выполнение может обойти границы проверка. Вот где он вставляет инструкции барьера. Важно учитывать ограничения для анализа, который может сделать компилятор для идентификации экземпляров варианта 1. Таким образом, не гарантируется, что все возможные экземпляры варианта 1 инструментируются в /Qspectreсоответствии с .

Влияние на производительность

Влияние на /Qspectre производительность, как представляется, является незначительным в нескольких разных базах кода. Однако нет никаких гарантий, что производительность кода /Qspectre остается небезопасной. Чтобы определить последствия, следует провести тесты производительности. Если вы знаете, что устранение рисков не требуется в критическом для производительности блоке или цикле, вы можете выборочно отключить устранение рисков с помощью директивы __declspec(spectre(nomitigation)) . Эта директива недоступна в компиляторах, поддерживающих /d2guardspecload только этот параметр.

Обязательные библиотеки

Параметр /Qspectre компилятора устраняет проблемы в собственном коде. Для повышения защиты настоятельно рекомендуется использовать библиотеки, созданные для устранения рисков Spectre. Некоторые библиотеки среды выполнения Майкрософт доступны с помощью средств устранения рисков Spectre.

Эти библиотеки представляют собой необязательные компоненты, которые необходимо установить с помощью Visual Studio Installer:

  • Версия MSVC version_numbers Libs для Spectre [(x86 и x64) | (ARM) | (ARM64)]
  • ATL Visual C++ для [(x86/x64) | ARM | ARM64] с устранением рисков Spectre
  • Visual C++ MFC для [x86/x64 | ARM | ARM64] с устранением рисков Spectre

Система проектов на основе MSBuild по умолчанию в интегрированной среде разработки Visual Studio позволяет указать свойство Spectre Mitigation для ваших проектов. Это свойство задает /Qspectre параметр компилятора и изменяет пути библиотек, чтобы связать библиотеки среды выполнения с поддержкой Spectre. Если эти библиотеки не установлены при сборке кода, предупреждение системы сборки MSB8040. Если не удается создать код MFC или ATL, а компоновщик сообщает об ошибке, например "неустранимая ошибка LNK1104: не удается открыть файл oldnames.lib", эти отсутствующие библиотеки могут быть причиной.

Система проектов на основе MSBuild по умолчанию в интегрированной среде разработки Visual Studio позволяет указать свойство Spectre Mitigation для ваших проектов. Это свойство задает /Qspectre параметр компилятора и изменяет пути библиотек, чтобы связать библиотеки среды выполнения с поддержкой Spectre. Если эти библиотеки не установлены при сборке кода, предупреждение системы сборки MSB8038: "Устранение рисков Spectre включено, но не найдены библиотеки с устранением рисков Spectre". Если не удается создать код MFC или ATL, а компоновщик сообщает об ошибке, например "неустранимая ошибка LNK1104: не удается открыть файл oldnames.lib", эти отсутствующие библиотеки могут быть причиной.

Существует несколько способов указать библиотеки с устранением рисков Spectre в командной строке сборки. Вы можете указать путь к библиотекам, смягчаемым Spectre, с помощью /LIBPATH параметра компоновщика, чтобы сделать их библиотеками по умолчанию. Вы можете использовать /NODEFAULTLIB параметр компоновщика и явным образом связать библиотеки с устранением рисков Spectre. Кроме того, можно задать LIBPATH переменную среды, чтобы включить путь к библиотекам, смягчаемых Spectre для целевой платформы. Один из способов задать этот путь в среде — использовать командную строку разработчика, настроенную с помощью spectre_mode параметра. Дополнительные сведения см. в разделе "Использование средств разработчика" в существующем командном окне.

Библиотеки среды выполнения с поддержкой spectre для платформ x86, x64 и ARM доступны в рамках исправления, доступного через КБ 4338871. По умолчанию эти библиотеки устанавливаются в следующих каталогах:

  • 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
  • РУКУ: C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\lib\spectre\arm

Существует несколько способов указать библиотеки с устранением рисков Spectre в командной строке сборки. Вы можете указать путь к библиотекам, смягчаемым Spectre, с помощью /LIBPATH параметра компоновщика, чтобы сделать их библиотеками по умолчанию. Вы можете использовать /NODEFAULTLIB параметр компоновщика и явным образом связать библиотеки с устранением рисков Spectre. Кроме того, вы можете задать LIBPATH переменную среды, чтобы включить путь к библиотекам с устранением рисков Spectre для целевой архитектуры. Дополнительные сведения см. в разделе "Использование набора инструментов Microsoft C++ из командной строки".

Дополнительная информация:

Дополнительные сведения см. в официальном руководстве по вопросам безопасности Майкрософт ADV180002. Руководство по устранению уязвимостей на стороне канала спекулятивного выполнения. Доступны также руководства от Intel: Speculative Execution Side Channel Mitigations (Устранение уязвимостей спекулятивного выполнения по сторонним каналам) и ARM: Cache Speculation Side-channels (Сторонние каналы спекулятивного кэширования).

Общие сведения о устранении рисков Spectre и Meltdown в Windows см. в статье "Общие сведения о влиянии на производительность параметров Spectre и Meltdown" в системах Windows.

Общие сведения об уязвимостях Spectre, направленных на устранение рисков MSVC, см. в разделе "Устранение рисков Spectre" в MSVC в блоге команды C++ .

Установка данного параметра компилятора в среде разработки Visual Studio

  1. Откройте диалоговое окно Страницы свойств проекта. Подробнее см. в статье Настройка компилятора C++ и свойства сборки в Visual Studio.

  2. Перейдите на страницу свойств Свойства конфигурации>C/C++>Создание кода.

  3. Выберите новое значение для свойства "Устранение рисков Spectre". Чтобы применить изменение, нажмите кнопку ОК.

  1. Откройте диалоговое окно Страницы свойств проекта. Подробнее см. в статье Настройка компилятора C++ и свойства сборки в Visual Studio.

  2. Перейдите на страницу свойств Свойства конфигурации>C/C++>Командная строка.

  3. Введите параметр компилятора /Qspectreв поле "Дополнительные параметры ". Нажмите кнопку "Применить" , чтобы применить изменение.

  4. Выберите страницу свойств>компоновщика>конфигурации "Общие свойства".

  5. Для каждой платформы в свойствах проекта измените свойство "Дополнительные каталоги библиотек". Задайте путь к каталогу библиотеки среды выполнения с устранением рисков Spectre для целевой платформы, а затем нажмите кнопку "Применить ", чтобы применить это изменение. По завершении нажмите кнопку "ОК".

Установка данного параметра компилятора программным способом

См. также

/Qspectre-jmp
/Qspectre-load
/Qspectre-load-cf
/Q параметры (низкоуровневые операции)
Параметры компилятора MSVC
Синтаксис командной строки компилятора MSVC