/Qspectre
Menentukan pembuatan kompilator instruksi untuk mengurangi kerentanan keamanan varian Spectre tertentu 1.
Sintaks
/Qspectre
Keterangan
Opsi ini /Qspectre
menyebabkan pengkompilasi menyisipkan instruksi untuk mengurangi kerentanan keamanan Spectre tertentu. Kerentanan ini disebut serangan saluran samping eksekusi spekulatif. Mereka mempengaruhi banyak sistem operasi dan prosesor modern, termasuk prosesor dari Intel, AMD, dan ARM.
Opsi /Qspectre
ini tersedia mulai di Visual Studio 2017 versi 15.5.5 dan semua versi yang lebih baru. Ini tersedia di Visual Studio 2015 Update 3 hingga KB 4338871.
Opsi /Qspectre
nonaktif secara default.
Dalam rilis awalnya, /Qspectre
opsi hanya berfungsi pada kode yang dioptimalkan. Mulai visual Studio 2017 versi 15.7, /Qspectre
opsi ini didukung di semua tingkat pengoptimalan.
Beberapa pustaka Microsoft C++ juga tersedia dalam versi dengan mitigasi Spectre. Pustaka yang dimitigasi Spectre untuk Visual Studio dapat diunduh di Alat Penginstal Visual Studio. Mereka ditemukan di tab Komponen Individu di bawah Kompilator, alat build, dan runtime, dan memiliki "Libs for Spectre" dalam nama. Pustaka DLL dan runtime statis dengan mitigasi diaktifkan tersedia untuk subset runtime Visual C++: kode start-up VC++, vcruntime140, msvcp140, concrt140, dan vcamp140. DLL hanya didukung untuk penyebaran lokal aplikasi. Konten Visual C++ Runtime Libraries Redistributable tidak dimodifikasi.
Anda juga dapat menginstal pustaka yang dimitigasi Spectre untuk MFC dan ATL. Komponen ditemukan di tab Komponen Individual di bawah SDK, pustaka, dan kerangka kerja.
Catatan
Tidak ada versi pustaka yang dimitigasi Spectre untuk aplikasi atau komponen Universal Windows (UWP). Penyebaran pustaka tersebut secara lokal aplikasi tidak dimungkinkan.
Penerapan
Jika kode Anda beroperasi pada data yang melewati batas kepercayaan, kami sarankan Anda menggunakan /Qspectre
opsi untuk membangun kembali dan menyebarkan ulang kode Anda untuk mengurangi masalah ini sesegera mungkin. Contoh kode tersebut adalah kode yang memuat input yang tidak tepercaya yang dapat memengaruhi eksekusi. Misalnya, kode yang melakukan panggilan prosedur jarak jauh, mengurai input atau file yang tidak tepercaya, atau menggunakan antarmuka komunikasi antarproses lokal (IPC) lainnya. Teknik sandboxing standar mungkin tidak cukup. Selidiki kotak pasir Anda dengan hati-hati sebelum Anda memutuskan kode Anda tidak melewati batas kepercayaan.
Ketersediaan
Opsi /Qspectre
ini tersedia mulai dari Visual Studio 2017 versi 15.5.5, dan di semua pembaruan untuk kompilator Microsoft C/C++ (MSVC) yang dibuat pada atau setelah 23 Januari 2018. Gunakan Alat Penginstal Visual Studio untuk memperbarui pengkompilasi, dan untuk menginstal pustaka yang dimitigasi Spectre sebagai komponen individual. Opsi /Qspectre
ini juga tersedia di Visual Studio 2015 Update 3 hingga patch. Untuk informasi selengkapnya, lihat KB 4338871.
Semua versi Visual Studio 2017 versi 15.5, dan semua Pratinjau Visual Studio 2017 versi 15.6. sertakan opsi yang tidak terdokumentasi, /d2guardspecload
. Ini setara dengan perilaku /Qspectre
awal . Anda dapat menggunakan /d2guardspecload
untuk menerapkan mitigasi yang sama ke kode Anda dalam versi pengkompilasi ini. Sebaiknya perbarui build untuk digunakan /Qspectre
di pengkompilasi yang mendukung opsi . Opsi ini /Qspectre
juga dapat mendukung mitigasi baru di versi compiler yang lebih baru.
Efek
Opsi menghasilkan /Qspectre
kode untuk mengurangi varian Specter 1, Bounds Check Bypass, CVE-2017-5753. Ini bekerja dengan penyisipan instruksi yang bertindak sebagai hambatan eksekusi kode spekulatif. Instruksi khusus yang digunakan untuk mengurangi spekulasi prosesor tergantung pada prosesor dan arsitektur mikronya, dan dapat berubah dalam versi kompiler di masa mendatang.
Saat Anda mengaktifkan /Qspectre
opsi , pengkompilasi mencoba mengidentifikasi instans di mana eksekusi spekulatif dapat melewati pemeriksaan terikat. Di situlah ia menyisipkan instruksi pembatas. Penting untuk mengetahui batasan analisis yang dapat dilakukan pengkompilasi untuk mengidentifikasi instans varian 1. Dengan demikian, tidak ada jaminan bahwa semua kemungkinan instans varian 1 diinstrumentasikan di bawah /Qspectre
.
Dampak performa
Efek pada /Qspectre
performa tampaknya dapat diabaikan dalam beberapa basis kode yang dapat diskalakan. Namun, tidak ada jaminan bahwa performa kode Anda di bawah /Qspectre
tetap tidak terpengaruh. Anda harus membuat tolok ukur kode Anda untuk menentukan efek opsi pada performa. Jika Anda tahu bahwa mitigasi tidak diperlukan dalam blok atau perulangan kritis performa, Anda dapat secara selektif menonaktifkan mitigasi dengan menggunakan __declspec(spectre(nomitigation))
direktif. Direktif ini tidak tersedia di pengkompilasi yang hanya mendukung /d2guardspecload
opsi .
Pustaka yang diperlukan
Opsi /Qspectre
kompilator mengurangi masalah dalam kode Anda sendiri. Untuk perlindungan yang lebih besar, kami sangat menyarankan Anda juga menggunakan pustaka yang dibuat untuk memberikan mitigasi Spectre. Beberapa pustaka runtime Microsoft tersedia dengan mitigasi Spectre.
Pustaka ini adalah komponen opsional yang harus diinstal dengan menggunakan Alat Penginstal Visual Studio:
- Versi MSVC version_numbers Libs untuk Spectre [(x86 dan x64) | (ARM) | (ARM64)]
- Visual C++ ATL untuk [(x86/x64) | ARM | ARM64] dengan Mitigasi Spectre
- Visual C++ MFC untuk [x86/x64 | ARM | ARM64] dengan Mitigasi Spectre
Sistem proyek berbasis MSBuild default di Visual Studio IDE memungkinkan Anda menentukan properti Spectre Mitigation untuk proyek Anda. Properti ini mengatur /Qspectre
opsi pengkompilasi dan mengubah jalur pustaka untuk menautkan pustaka runtime yang dimitigasi Spectre. Jika pustaka ini tidak diinstal saat Anda membuat kode, sistem build melaporkan peringatan MSB8040. Jika kode MFC atau ATL Anda gagal dibuat, dan linker melaporkan kesalahan seperti "kesalahan fatal LNK1104: tidak dapat membuka file 'oldnames.lib'", pustaka yang hilang ini mungkin menjadi penyebabnya.
Sistem proyek berbasis MSBuild default di Visual Studio IDE memungkinkan Anda menentukan properti Spectre Mitigation untuk proyek Anda. Properti ini mengatur /Qspectre
opsi pengkompilasi dan mengubah jalur pustaka untuk menautkan pustaka runtime yang dimitigasi Spectre. Jika pustaka ini tidak diinstal saat Anda membuat kode, sistem build melaporkan peringatan MSB8038: "Mitigasi spectre diaktifkan tetapi pustaka yang dimitigasi Spectre tidak ditemukan." Jika kode MFC atau ATL Anda gagal dibuat, dan linker melaporkan kesalahan seperti "kesalahan fatal LNK1104: tidak dapat membuka file 'oldnames.lib'", pustaka yang hilang ini mungkin menjadi penyebabnya.
Ada beberapa cara untuk menentukan pustaka yang dimitigasi Spectre ke baris perintah build. Anda dapat menentukan jalur ke pustaka yang dimitigasi Spectre dengan menggunakan /LIBPATH
opsi linker untuk menjadikannya pustaka default. Anda dapat menggunakan /NODEFAULTLIB
opsi linker dan secara eksplisit menautkan pustaka yang dimitigasi Spectre. Atau, Anda dapat mengatur LIBPATH
variabel lingkungan untuk menyertakan jalur ke pustaka yang dimitigasi Spectre untuk platform target Anda. Salah satu cara untuk mengatur jalur ini di lingkungan adalah dengan menggunakan perintah pengembang yang disiapkan dengan menggunakan spectre_mode
opsi . Untuk informasi selengkapnya, lihat Menggunakan alat pengembang di jendela perintah yang sudah ada.
Pustaka runtime yang dimitigasi spectre untuk platform x86, x64, dan ARM tersedia sebagai bagian dari patch yang tersedia melalui KB 4338871. Secara default, pustaka ini diinstal di direktori berikut:
- 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
- LENGAN:
C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\lib\spectre\arm
Ada beberapa cara untuk menentukan pustaka yang dimitigasi Spectre ke baris perintah build. Anda dapat menentukan jalur ke pustaka yang dimitigasi Spectre dengan menggunakan /LIBPATH
opsi linker untuk menjadikannya pustaka default. Anda dapat menggunakan /NODEFAULTLIB
opsi linker dan secara eksplisit menautkan pustaka yang dimitigasi Spectre. Atau, Anda dapat mengatur LIBPATH
variabel lingkungan untuk menyertakan jalur ke pustaka yang dimitigasi Spectre untuk arsitektur target Anda. Untuk informasi selengkapnya, lihat Menggunakan toolset Microsoft C++ dari baris perintah.
Informasi Tambahan
Untuk informasi selengkapnya, lihat ADV180002 Resmi Microsoft Security Advisory, Panduan untuk mengurangi kerentanan saluran samping eksekusi spekulatif. Panduan juga tersedia dari Intel, Mitigasi Saluran Samping Eksekusi Spekulatif, dan ARM, Saluran Samping Spekulasi Cache.
Untuk gambaran umum spesifik Windows tentang mitigasi Spectre dan Meltdown, lihat Memahami dampak performa mitigasi Spectre dan Meltdown pada Sistem Windows.
Untuk gambaran umum kerentanan Spectre yang ditangani oleh mitigasi MSVC, lihat mitigasi Spectre di MSVC di Blog Tim C++.
Untuk mengatur opsi pengkompilasi ini di lingkungan pengembangan Visual Studio
Buka kotak dialog Halaman Properti proyek. Untuk detailnya, lihat Mengatur pengkompilasi C++ dan membuat properti di Visual Studio.
Pilih halaman properti Properti>Konfigurasi C/C++>Code Generation.
Pilih nilai baru untuk properti Spectre Mitigation . Pilih OK untuk menerapkan perubahan.
Buka kotak dialog Halaman Properti proyek. Untuk detailnya, lihat Mengatur pengkompilasi C++ dan membuat properti di Visual Studio.
Pilih halaman properti Properti>Konfigurasi C/C++>Baris Perintah.
Masukkan
/Qspectre
opsi pengkompilasi dalam kotak Opsi Tambahan. Pilih Terapkan untuk menerapkan perubahan.Pilih halaman properti Umum Linker>Properti>Konfigurasi.
Untuk setiap Platform di properti proyek Anda, edit properti Direktori Pustaka Tambahan. Atur jalur ke direktori pustaka runtime yang dimitigasi Spectre untuk platform target, lalu pilih Terapkan untuk menerapkan perubahan. Setelah selesai, pilih OK.
Untuk mengatur opsi pengkompilasi ini secara terprogram
- Lihat AdditionalOptions.
Lihat juga
/Qspectre-jmp
/Qspectre-load
/Qspectre-load-cf
/Q
options (Operasi tingkat rendah)
Opsi pengkompilasi MSVC
Sintaks baris perintah pengkompilasi MSVC