/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.
Not
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 /Qspectre
izlendiğ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
Projenin Özellik Sayfaları iletişim kutusunu açın. Ayrıntılar için bkz . Visual Studio'da C++ derleyicisi ve derleme özelliklerini ayarlama.
Yapılandırma Özellikleri>C/C++>Kod Oluşturma özellik sayfasını seçin.
Spectre Risk Azaltma özelliği için yeni bir değer seçin. Değişikliği uygulamak için Tamam'ı seçin.
Projenin Özellik Sayfaları iletişim kutusunu açın. Ayrıntılar için bkz . Visual Studio'da C++ derleyicisi ve derleme özelliklerini ayarlama.
Yapılandırma Özellikleri>C/C++>Komut Satırı özellik sayfasını seçin.
/Qspectre
Ek Seçenekler kutusuna derleyici seçeneğini girin. Değişikliği uygulamak için Uygula'yı seçin.Yapılandırma Özellikleri>Bağlayıcısı>Genel özellik sayfasını seçin.
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
- Bkz. AdditionalOptions.
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