Bagikan melalui


/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 /Qspectreawal . 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

  1. Buka kotak dialog Halaman Properti proyek. Untuk detailnya, lihat Mengatur pengkompilasi C++ dan membuat properti di Visual Studio.

  2. Pilih halaman properti Properti>Konfigurasi C/C++>Code Generation.

  3. Pilih nilai baru untuk properti Spectre Mitigation . Pilih OK untuk menerapkan perubahan.

  1. Buka kotak dialog Halaman Properti proyek. Untuk detailnya, lihat Mengatur pengkompilasi C++ dan membuat properti di Visual Studio.

  2. Pilih halaman properti Properti>Konfigurasi C/C++>Baris Perintah.

  3. Masukkan /Qspectre opsi pengkompilasi dalam kotak Opsi Tambahan. Pilih Terapkan untuk menerapkan perubahan.

  4. Pilih halaman properti Umum Linker>Properti>Konfigurasi.

  5. 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

Baca juga

/Qspectre-jmp
/Qspectre-load
/Qspectre-load-cf
/Q options (Operasi tingkat rendah)
Opsi pengkompilasi MSVC
Sintaks baris perintah pengkompilasi MSVC