/Qspectre

Belirli Spectre değişken 1 güvenlik açıklarını azaltmak için derleyici oluşturma yönergelerini belirtir.

Sözdizimi

/Qspectre

Açıklamalar

seçeneği /Qspectre , derleyicinin belirli Spectre güvenlik açıklarını azaltmak için yönergeler eklemesine neden olur. Bu güvenlik açıklarına kurgusal yürütme yan kanal saldırıları denir. Intel, AMD ve ARM işlemcileri dahil olmak üzere birçok işletim sistemini ve modern işlemciyi etkiler.

Bu /Qspectre seçenek Visual Studio 2017 sürüm 15.5.5 ve sonraki tüm sürümlerde kullanılabilir. Visual Studio 2015 Güncelleştirme 3 ile KB 4338871 arasında kullanılabilir.

Seçenek /Qspectre varsayılan olarak kapalıdır.

İlk sürümünde, /Qspectre seçenek yalnızca iyileştirilmiş kod üzerinde çalıştı. Visual Studio 2017 sürüm 15.7'den itibaren bu /Qspectre seçenek tüm iyileştirme düzeylerinde desteklenir.

Spectre azaltmaya sahip sürümlerde çeşitli Microsoft C++ kitaplıkları da mevcuttur. Visual Studio için Belirtimli azaltılmış kitaplıklar Visual Studio Yükleyicisi indirilebilir. Tek Tek Bileşenler sekmesinde Derleyiciler, derleme araçları ve çalışma zamanları altında bulunur ve adında "Spectre için Libs" bulunur. Visual C++ çalışma zamanlarının bir alt kümesi için hem DLL hem de azaltma etkinleştirilmiş statik çalışma zamanı kitaplıkları kullanılabilir: VC++ başlangıç kodu, vcruntime140, msvcp140, concrt140 ve vcamp140. DLL'ler yalnızca uygulama yerel dağıtımı için desteklenir. Visual C++ Çalışma Zamanı Kitaplıkları Yeniden Dağıtılabilir içeriği değiştirilmemiş.

Ayrıca MFC ve ATL için Spectre ile azaltılmış kitaplıkları da yükleyebilirsiniz. Bunlar Tek Tek Bileşenler sekmesinde SDK'lar, kitaplıklar ve çerçeveler altında bulunur.

Dekont

Evrensel Windows (UWP) uygulamaları veya bileşenleri için Spectre tarafından azaltılmış kitaplıkların sürümü yoktur. Bu tür kitaplıkların uygulama yerel dağıtımı mümkün değildir.

Uygulanabilirlik

Kodunuz güven sınırını aşan veriler üzerinde çalışırsa, bu sorunu en kısa sürede azaltmak için kodunuzu yeniden derleme ve yeniden dağıtma seçeneğini kullanmanızı /Qspectre öneririz. Bu tür kodlara örnek olarak, yürütmeyi etkileyebilecek güvenilmeyen girişleri yükleyen kodlar örnek olarak verilmiştir. Örneğin, uzaktan yordam çağrıları yapan, güvenilmeyen girişleri veya dosyaları ayrıştıran veya diğer yerel işlemler arası iletişim (IPC) arabirimlerini kullanan kod. Standart korumalı alan teknikleri yeterli olmayabilir. Kodunuzun bir güven sınırını aşmayeceğine karar vermeden önce korumalı alanlarınızı dikkatlice araştırın.

Kullanılabilirlik

Bu /Qspectre seçenek Visual Studio 2017 sürüm 15.5.5'den başlayarak ve 23 Ocak 2018 tarihinde veya sonrasında yapılan Tüm Microsoft C/C++ derleyicileri (MSVC) güncelleştirmelerinde kullanılabilir. Derleyiciyi güncelleştirmek ve Spectre ile azaltılmış kitaplıkları tek tek bileşenler olarak yüklemek için Visual Studio Yükleyicisi kullanın. Bu /Qspectre seçenek, bir düzeltme eki aracılığıyla Visual Studio 2015 Güncelleştirme 3'te de kullanılabilir. Daha fazla bilgi için bkz . KB 4338871.

Visual Studio 2017 sürüm 15.5'in tüm sürümleri ve Visual Studio 2017 sürüm 15.6'nın tüm Önizlemeleri. belgesiz bir seçenek ekleyin: /d2guardspecload. bu, öğesinin ilk davranışına eşdeğerdir /Qspectre. Derleyicinin bu sürümlerinde kodunuz için aynı azaltmaları uygulamak için kullanabilirsiniz /d2guardspecload . Derlemenizi seçeneği destekleyen derleyicilerde kullanılacak /Qspectre şekilde güncelleştirmenizi öneririz. seçeneği /Qspectre , derleyicinin sonraki sürümlerindeki yeni azaltmaları da destekleyemeyebilir.

Etki

seçenek Specter /Qspectre variant 1, Bounds Check Bypass, CVE-2017-5753'i azaltmak için kod çıkışı verir. Kurgusal bir kod yürütme engeli gibi davranan yönergeleri ekleyerek çalışır. İşlemci spekülasyonunu azaltmak için kullanılan belirli yönergeler, işlemciye ve mikro mimarisine bağlıdır ve derleyicinin gelecekteki sürümlerinde değişebilir.

Seçeneğini etkinleştirdiğinizde, derleyici tahmini yürütmenin /Qspectre sınır denetimlerini atladığı örnekleri belirlemeye çalışır. Orası, bariyer talimatlarını yerleştirdiği yerdir. Derleyicinin değişken 1 örneklerini tanımlamak için gerçekleştirebileceği analiz sınırlarının farkında olmak önemlidir. Bu nedenle, değişken 1'in tüm olası örneklerinin altında /Qspectreizlendiğinin garantisi yoktur.

Performans etkisi

Performansın /Qspectre etkisi, birkaç boyutlandırılabilir kod tabanında göz ardı edilebilir görünüyordu. Ancak, altında /Qspectre kodunuzun performansının etkilenmemesi garanti edilemez. Seçeneğinin performans üzerindeki etkisini belirlemek için kodunuzu karşılaştırmanız gerekir. Risk azaltmanın performans açısından kritik bir blokta veya döngüde gerekli olmadığını biliyorsanız, bir __declspec(spectre(nomitigation)) yönerge kullanarak azaltmayı seçmeli olarak devre dışı bırakabilirsiniz. Bu yönerge yalnızca seçeneği destekleyen /d2guardspecload derleyicilerde kullanılamaz.

Gerekli kitaplıklar

Derleyici /Qspectre seçeneği kendi kodunuzdaki sorunları azaltır. Daha fazla koruma için Spectre risk azaltmaları sağlamak için oluşturulmuş kitaplıkları da kullanmanızı kesinlikle öneririz. Spectre azaltmaları ile microsoft çalışma zamanı kitaplıklarından bazıları kullanılabilir.

Bu kitaplıklar, Visual Studio Yükleyicisi kullanılarak yüklenmesi gereken isteğe bağlı bileşenlerdir:

  • Spectre için MSVC sürüm version_numbers Libs [(x86 ve x64) | (ARM) | (ARM64)]
  • [(x86/x64) için Visual C++ ATL | ARM | ARM64] Spectre Risk Azaltmaları ile
  • [x86/x64 için Visual C++ MFC | ARM | ARM64] Spectre Risk Azaltmaları ile

Visual Studio IDE'deki varsayılan MSBuild tabanlı proje sistemi, projeleriniz için bir Spectre Risk Azaltma özelliği belirtmenize olanak tanır. Bu özellik derleyici seçeneğini ayarlar /Qspectre ve kitaplık yollarını Spectre tarafından azaltılmış çalışma zamanı kitaplıklarını bağlamak için değiştirir. Kodunuzu oluştururken bu kitaplıklar yüklü değilse, derleme sistemi uyarı MSB8040 bildirir. MFC veya ATL kodunuz derlenemiyorsa ve bağlayıcı "önemli hata LNK1104: 'oldnames.lib' dosyası açılamıyor" gibi bir hata bildiriyorsa, bunun nedeni bu eksik kitaplıklar olabilir.

Visual Studio IDE'deki varsayılan MSBuild tabanlı proje sistemi, projeleriniz için bir Spectre Risk Azaltma özelliği belirtmenize olanak tanır. Bu özellik derleyici seçeneğini ayarlar /Qspectre ve kitaplık yollarını Spectre tarafından azaltılmış çalışma zamanı kitaplıklarını bağlamak için değiştirir. Kodunuzu oluştururken bu kitaplıklar yüklü değilse, derleme sistemi şu uyarıyı MSB8038 bildirir: "Spectre azaltma etkinleştirildi ancak Spectre azaltılmış kitaplıklar bulunamadı." MFC veya ATL kodunuz derlenemiyorsa ve bağlayıcı "önemli hata LNK1104: 'oldnames.lib' dosyası açılamıyor" gibi bir hata bildiriyorsa, bunun nedeni bu eksik kitaplıklar olabilir.

Derleme komut satırına Spectre ile azaltılmış kitaplıkları belirtmenin birkaç yolu vardır. Bağlayıcı seçeneğini kullanarak /LIBPATH bunları varsayılan kitaplıklar haline getirerek Spectre azaltılmış kitaplıkların yolunu belirtebilirsiniz. Bağlayıcı seçeneğini kullanabilir /NODEFAULTLIB ve Belirtimli azaltılmış kitaplıkları açıkça bağlayabilirsiniz. Alternatif olarak ortam değişkenini LIBPATH hedef platformunuzun Spectre azaltılmış kitaplıklarının yolunu içerecek şekilde ayarlayabilirsiniz. Ortamda bu yolu ayarlamanın bir yolu, seçeneğini kullanarak ayarlanmış bir geliştirici komut istemi kullanmaktır spectre_mode . Daha fazla bilgi için bkz . Var olan bir komut penceresinde geliştirici araçlarını kullanma.

x86, x64 ve ARM platformları için belirtimli azaltılmış çalışma zamanı kitaplıkları, KB 4338871 aracılığıyla sağlanan düzeltme ekinin bir parçası olarak kullanılabilir. Varsayılan olarak, bu kitaplıklar aşağıdaki dizinlere yüklenir:

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

Derleme komut satırına Spectre ile azaltılmış kitaplıkları belirtmenin birkaç yolu vardır. Bağlayıcı seçeneğini kullanarak /LIBPATH bunları varsayılan kitaplıklar haline getirerek Spectre azaltılmış kitaplıkların yolunu belirtebilirsiniz. Bağlayıcı seçeneğini kullanabilir /NODEFAULTLIB ve Belirtimli azaltılmış kitaplıkları açıkça bağlayabilirsiniz. Alternatif olarak, ortam değişkenini LIBPATH hedef mimariniz için Spectre ile azaltılmış kitaplıkların yolunu içerecek şekilde ayarlayabilirsiniz. Daha fazla bilgi için bkz . Komut satırından Microsoft C++ araç takımını kullanma.

Ek bilgi

Daha fazla bilgi için bkz. Resmi Microsoft Güvenlik Danışmanlığı ADV180002, Kurgusal yürütme yan kanal güvenlik açıklarını azaltma kılavuzu. Yönergeler Intel, Tahmini Yürütme Tarafı Kanal Azaltmaları ve ARM, Önbellek Spekülasyonu Yan kanallarından da kullanılabilir.

Spectre ve Meltdown azaltmalarına Windows'a özgü bir genel bakış için bkz . Spectre ve Meltdown azaltmalarının Windows Sistemleri üzerindeki performans etkisini anlama.

MSVC risk azaltmaları tarafından giderilen Spectre güvenlik açıklarına genel bakış için C++ Ekip Blogu'ndaki MSVC'deki Spectre azaltmaları bölümüne bakın.

Bu derleyici seçeneğini Visual Studio geliştirme ortamında ayarlamak için

  1. Projenin Özellik Sayfaları iletişim kutusunu açın. Ayrıntılar için bkz . Visual Studio'da C++ derleyicisi ve derleme özelliklerini ayarlama.

  2. Yapılandırma Özellikleri>C/C++>Kod Oluşturma özellik sayfasını seçin.

  3. Spectre Risk Azaltma özelliği için yeni bir değer seçin. Değişikliği uygulamak için Tamam'ı seçin.

  1. Projenin Özellik Sayfaları iletişim kutusunu açın. Ayrıntılar için bkz . Visual Studio'da C++ derleyicisi ve derleme özelliklerini ayarlama.

  2. Yapılandırma Özellikleri>C/C++>Komut Satırı özellik sayfasını seçin.

  3. /Qspectre Ek Seçenekler kutusuna derleyici seçeneğini girin. Değişikliği uygulamak için Uygula'yı seçin.

  4. Yapılandırma Özellikleri>Bağlayıcısı>Genel özellik sayfasını seçin.

  5. Proje özelliklerinizdeki her Platform için Ek Kitaplık Dizinleri özelliğini düzenleyin. Hedef platform için Spectre tarafından azaltılmış çalışma zamanı kitaplığı dizinine giden yolu ayarlayın ve ardından değişikliği uygulamak için Uygula'yı seçin. İşiniz bittiğinde Tamam'ı seçin.

Bu derleyici seçeneğini program üzerinden ayarlamak için

Ayrıca bkz.

/Qspectre-jmp
/Qspectre-load
/Qspectre-load-cf
/Q seçenekler (Düşük düzeyli işlemler)
MSVC derleyici seçenekleri
MSVC derleyicisi komut satırı söz dizimi