Aracılığıyla paylaş


Sanallaştırma tabanlı güvenlik (VBS) Kuşatmalarına yönelik geliştirme kılavuzu

Bu geliştirme rehberi, temel bir VBS koruma alanını derleme, imzalama ve hata ayıklama işlemlerini açıklamaktadır.

Önkoşullar

VBS Enclaves'i kullanmaya başlamak için aşağıdaki gereksinimleri karşılamanız gerekir.

  • VBS Kuşatmalarına genel bakış bölümünde cihaz gereksinimlerini görüntüleyin ve karşılayın.
  • VBS Kuşatmalarına genel bakış bölümünde geliştirme önkoşullarını görüntüleyin ve karşılayın.
    • Visual Studio yükleyicisi aracılığıyla C++ iş yüküyle Masaüstü geliştirmenin yüklenmesi önerilir. Windows Yazılım Geliştirme Seti (SDK) dahil olmak üzere tüm gerekli araçları yükler.
  • GitHub'dan örnek kodu indirin. Bir VBS kapanımının yaşam döngüsünü ve kapanıma işlev çağrıları yapmanın yöntemlerini gösterir.
    • Her yerleşke için bir ana bilgisayar uygulaması olmalıdır. Örnek kod, iki proje içeren bir Visual Studio Çözüm dosyası içerir: alan konağı ve test alanı.

Uyarı

İşletim sistemi desteğinde yakın zamanda değişiklik yapıldığından, yukarıda belirtilen VBS alanlarına yönelik desteği gözden geçirdiğinizden emin olun.

Başlangıç Yapmak

Yukarıdaki önkoşulları karşıladıktan sonra Çözüm dosyasını Visual Studio'daki VbsEnclave örneğinden açabilmeniz ve derleyebilmeniz gerekir. İlgili enkılav ile birlikte bir test uygulaması oluşturur. Ancak uygulamanızı başarıyla çalıştıramazsınız çünkü enklav geçerli bir sertifikayla imzalanmış olmalıdır.

Bu kılavuz, geliştirme makinenizde temel bir VBS (Virtualization-Based Security - Sanallaştırma Tabanlı Güvenlik) güvenli alanı nasıl oluşturacağınızı açıklar. VBS güvenlik bölgesi oluşturma adımları şunlardır:

  1. VBS güvenli alan DLL'sini ve buna karşılık gelen bir ana bilgisayar uygulamasını yazın
  2. DLL'yi ve ana bilgisayarı derle
  3. VBS enklav DLL'sini imzala
  4. VBS güvenli bölgesinde hata ayıklama

Bir enklavın yaşam döngüsünü anlayarak başlayalım. Yerleşik API'ler aşağıdaki sırayla çağrılır:

VBS Kuşatma API'lerinin çağrılma sırasını gösteren diyagram

1. Adım: VBS enklavlarını yazma

Şimdi örnek kodu inceleyelim ve VBS kapanımını kullanan bir uygulamanın nasıl yazılacağını anlayalım.

Enklav Ana Bilgisayarı Yazma

VBS kapanım DLL'lerinin yalnızca bir DLL olduğunu ve bu nedenle bir konak uygulaması gerektirdiğini unutmayın. Sunucu uygulaması standart bir Windows uygulamasından başka bir şey değildir. VBS alanlarını kullanmak için konağın enclaveapi.h üst bilgisinden Windows alan API'lerini kullanması gerekir. Host uygulamanıza windows.h dahil etmek, bu API'lere erişim sağlar.

Bir test enklavına yüklenecek DLL'yi yazma

Aşağıdaki adımları takip etmek için, Test bölgesi projesindeki örnek koda bakın.

Örnek Enclave'mizde, girdiyi 0xDADAF00D ile XOR'layan ve sonucu döndüren basit bir enclave oluşturuyoruz. Şimdi bunu nasıl yaptığımıza bakalım:

  1. winenclave.h ile başlayın. Örnek kodda Samples/VbsEnclave/Test enclave/precomp.h öğesine bakın.

    #include <winenclave.h>
    

    winenclave.h VBS enklavlarının merkezi dahil etme dosyasıdır ve kendisi windows.h, ntenclv.h, ve winenclaveapi.h içerir.

  2. Her DLL, bir ayrık ortamda yüklenirken bir yapılandırma gerektirir. Bu yapılandırma, const türünde bir __enclave_config genel değişken kullanılarak tanımlanır. Örnek kodda Samples/VbsEnclave/Test enclave/enclave.c öğesine bakın.

    const IMAGE_ENCLAVE_CONFIG __enclave_config = {
        sizeof(IMAGE_ENCLAVE_CONFIG),
        IMAGE_ENCLAVE_MINIMUM_CONFIG_SIZE,
        IMAGE_ENCLAVE_POLICY_DEBUGGABLE,    // DO NOT SHIP DEBUGGABLE ENCLAVES TO PRODUCTION
        0,
        0,
        0,
        { 0xFE, 0xFE },    // family id
        { 0x01, 0x01 },    // image id
        0,                 // version
        0,                 // SVN
        0x10000000,        // size
        16,                // number of threads
        IMAGE_ENCLAVE_FLAG_PRIMARY_IMAGE
    };
    

    Uyarı

    Her mahalde yalnızca bir birincil görüntü olabilir. Birden çok birincil görüntü yüklerseniz, önce yüklenen birincil görüntü olarak değerlendirilir ve kalanlar bağımlılık olarak değerlendirilir. Bu örnekte, enklav platformu DLL'lerinden başka bağımlılık yoktur.

  3. DllMain() işlevi zorunludur ve enklevye giriş noktasını tanımlar. Bu, InitializeEnclave() sırasında çağrılır. Örnek kodda Samples/VbsEnclave/Test enclave/enclave.c öğesine bakın.

    BOOL
    DllMain(
        _In_ HINSTANCE hinstDLL,
        _In_ DWORD dwReason,
        _In_ LPVOID lpvReserved
    )
    {
        UNREFERENCED_PARAMETER(hinstDLL);
        UNREFERENCED_PARAMETER(lpvReserved);
    
        if (dwReason == DLL_PROCESS_ATTACH) {
            InitialCookie = 0xDADAF00D;
        }
    
        return TRUE;
    }
    
  4. Ana uygulamadan çağrılan kapanım içindeki tüm işlevler dışa aktarılmalı ve LPENCLAVE_ROUTINE türünde olmalıdır. İşlev imzası şöyle görünür:

    void* CALLBACK enclaveFunctionName(_In_ void* Context)
    

    Örnek kodda Samples/VbsEnclave/Test enclave/enclave.c öğesine bakın.

    void*
    CALLBACK
    CallEnclaveTest(
        _In_ void* Context
    )
    {
        WCHAR String[32];
        swprintf_s(String, ARRAYSIZE(String), L"%s\n", L"CallEnclaveTest started");
        OutputDebugStringW(String);
    
        return (void*)((ULONG_PTR)(Context) ^ InitialCookie);
    }
    

    Uyarı

    Ana uygulamadan yalnızca birincil bellek bölgesi görüntüsü tarafından dışarı aktarılan işlevlere erişilebilir.

    Ardından bir dosya kullanarak .DEF işlevi dışarı aktarabilirsiniz. Örnek kodda Samples/VbsEnclave/Test enclave/vbsenclave.def öğesine bakın. Daha fazla bilgi için bkz. DEF Dosyalarını Kullanarak DLL'den Dışarı Aktarma.

İşte bu şekilde bir temel VBS enclave DLL'i yazarsınız.

Önemli

Enclave bellek erişimcilerini (EnclaveCopyOutOfEnclave ve EnclaveCopyIntoEnclave) kullanarak Normal (kapanım dışı) belleğe okuma ve yazma işlemleri yapmanız kesinlikle önerilmektedir. Lütfen normal belleğe tüm bellek erişimlerinin bu erişimciler aracılığıyla yapıldığından emin olun.

2. Adım: VBS enklavlarını derlenmesi

VBS enklav DLL'imizi yazdığımıza göre şimdi derleyelim.

Ortam ana bilgisayarını derleme

Konak uygulamasını derlemek, herhangi bir Windows uygulamasını derlemekle aynıdır, ancak bağlama sırasında bağımlılık listesine onecore.lib eklenmesi gerekir.

Test enclave DLL'sini derleme

Test kapanım DLL'sini derlemeden önce derleyici ve bağlayıcı yapılandırmalarında bazı değişiklikler yapılması gerekir:

  1. MSVC bağlayıcısı, kapanım yapılandırma ayrıntılarını alan bir /ENCLAVE bayrak sağlar. /ENCLAVE Bayrağı artımlı bağlama ile uyumsuz olduğundan ayarlamamız /INCREMENTAL:NOgerekir.

  2. [Yalnızca hata ayıklama yapılandırması]/EDITANDCONTINUE ile /INCREMENTAL:NOuyumsuz olduğundan, derleyicide /Zi yerine /ZI kullanırız.

  3. [Yalnızca hata ayıklama yapılandırması]Temel Çalışma Zamanı Denetimleriyapılandırmasının Varsayılan olarak ayarlanması gerekir. Çalışma zamanı hata denetimleri VBS kuşatmalarında desteklenmez.

  4. Enclave DLL'nin dijital imzası yükleme zamanında kontrol edilmelidir ve bu, bağlayıcıda /INTEGRITYCHECK bayrağının ayarlanmasını gerektirir.

  5. Enclave DLL'leri, bağlayıcıda bayrağını kullandığımız /GUARD:MIXED için izlenmelidir.

  6. Enklavlar, platform, startup, runtime ve UCRT kitaplıklarının kendi sürümlerine sahiptir. Enklav dışı sürümleri bağlamadığımızdan emin olmak için /NODEFAULTLIB bayrağı kullanın. Daha sonra AdditionalDependencies altına doğru kitaplıkları ekleyin. Örnek kodda, bu kitaplıklar VBS_Enclave_Dependencies makronun altında kapsüllenir. VBS bölge kitaplıkları şunlardır:

    1. libcmt.lib ve libvcruntime.lib - Visual C++ derleme araçlarının enclave bulunduğu klasörde bulunan C çalışma zamanı (CRT) ve C++ standart kitaplığı (STL) .lib dosyalarına bakın.
    2. vertdll.lib ve bcrypt.lib - Windows SDK kitaplıklarının bulunduğu klasörde bulunur um .
    3. ucrt.lib - Windows SDK kitaplıklarının bulunduğu klasörde bulunur ucrt_enclave .

Uyarı

VBS enklavlarında başka hiçbir platform kütüphanesi desteklenmez.

Özetle, aşağıdaki değişiklikler gereklidir:

Derleyici (yalnızca hata ayıklama yapılandırması):

  • Hata Ayıklama Bilgileri Biçimi: /Zi
  • Temel Çalışma Zamanı Denetimleri: Default

Bağlayıcı:

  • /ENCLAVE
  • /NODEFAULTLIBS + AdditionalDependencies
  • /INCREMENTAL:NO
  • /INTEGRITYCHECK
  • /GUARD:MIXED

Şimdi enklav DLL'sini derleyebilirsiniz.

VEIID ile güvenli hale getirme

VEIID (VBS Kapanım İçeri Aktarma Kimliği bağlama yardımcı programı), Windows SDK'sında bir VBS kapanım içindeki içeri aktarma tablolarını platform DLL'leri için bilinen kimliklerle güncelleştiren bir araçtır. Bu, platform DLL'lerinden biriyle aynı ada sahip kötü amaçlı (imzalı) bir DLL'nin yüklenmesini engelleyerek VBS kuşatmalarının güvenliğini artırır.

Örnek kodda bu işlem, derleme sonrası olay olarak otomatik olarak gerçekleştirilir.

Uyarı

Platform DLL'leri dışında kendi birincil olmayan DLL'lerinizi kullanmaktan kaçınmanız kesinlikle önerilir. Bunun yerine, tüm kodunuzu enklav DLL'sinin içinde tutun.

3. Adım: VBS enklav DLL'leri imzalama

VBS bölmelerinin başarıyla yüklenebilmesi için imzalanması gerekir. Enklav üzerindeki imza, enklav yazarı hakkında bilgiler içerir. Bu, bir yerleşke için Yazar Kimliğini türetmek için kullanılır. Kapsamınızı üretim için imzalamadan önce test etmek için imzalayabilirsiniz.

Test İmzalama – Yerel

Her kapanım imzalama sertifikası için en az 3 EKU gerekir:

  1. Kod İmzalama EKU - 1.3.6.1.5.5.7.3.3

  2. Enklav EKU - 1.3.6.1.4.1.311.76.57.1.15

  3. Yazar EKU - EKU şu formattadır: 1.3.6.1.4.1.311.97.X.Y.Z..., burada X, 999 değerinden büyüktür. ek ... değerleri EKU biçiminde gösterir. Açıklama için aşağıdaki örniğe bakın.

    Test için, bu desenle eşleşen herhangi bir Yazar EKU'su kullanmayı seçebilirsiniz. Üretim için, üretim sertifikasının bir parçası olarak bir Yazar EKU sağlanacaktır (üretim imzalama hakkında daha fazla ayrıntı aşağıda bulunmaktadır).

    Örnek: 1.3.6.1.4.1.311.97.814040577.346743379.4783502.105532346

Enklav DLL'nizi geliştirirken imzalamak istiyorsanız test imzalamayı etkinleştirin. Test imzalama etkinleştirildiğinde, bu üç EKU'yu içeren bir sertifika oluşturabilir ve bu sertifikayla kayıt işleminizi imzalayabilirsiniz. Sertifika oluşturmak için New-SelfSignedCertificate cmdlet'ini kullanabilirsiniz. Enclave DLL'lerinin sayfa karması imzalı olması gerektiğini unutmayın.

Uyarı

Sertifikanız olduktan sonra, derleme sonrası etkinliğinde imzalama işlemini otomatikleştirebilirsiniz.

New-SelfSignedCertificate -CertStoreLocation Cert:\\CurrentUser\\My -DnsName "MyTestEnclaveCert" -KeyUsage DigitalSignature -KeySpec Signature -KeyLength 2048 -KeyAlgorithm RSA -HashAlgorithm SHA256 -TextExtension "2.5.29.37={text}1.3.6.1.5.5.7.3.3,1.3.6.1.4.1.311.76.57.1.15,1.3.6.1.4.1.311.97.814040577.346743379.4783502.105532346"
signtool sign /ph /fd SHA256 /n "MyTestEnclaveCert" vbsenclave.dll

Enklav DLL'niz imzalandıysa, artık bunu test imzalama özelliği etkinleştirilmiş bir ortama yükleyebilirsiniz.

Üretim İmzalama – Güvenilir İmzalama (eski adıyla Azure Kod İmzalama)

Enklavlar için üretim imzalama, Güvenilen İmzalama içindeki VBS enklav sertifika profili aracılığıyla sağlanır. Güvenilir İmzalama'yı kullanma hakkında ayrıntılı bilgi için lütfen belgelere bakın.

Güvenilir İmzalama, komut satırında güvenlik bölgenizi imzalamanıza da olanak tanır. Bu, Visual Studio'da kapanımınızı oluştururken kullanıma hazır, imzalı bir kapanım oluşturur.

4. Adım: VBS yığınlarında hata ayıklama

Genellikle, bir enklavın belleği hata ayıklayıcılardan gizlenir ve VTL0'dan korunur. Ancak, VBS kapanım DLL'nizde hata ayıklamak isterseniz, geliştirme sırasında hata ayıklanacak şekilde oluşturabilirsiniz. Enclaves, bir VTL1 kullanıcı modunda çalışan süreçtir ve bu nedenle kullanıcı modu hata ayıklayıcısı ile debug edilebilir.

Kapanımınızın hata ayıklanabilir olmasını sağlamak için:

  1. Kapanım DLL görüntü yapılandırmasının hata ayıklamaya izin verebilmesi gerekir– Bu, IMAGE_ENCLAVE_CONFIG'de IMAGE_ENCLAVE_POLICY_DEBUGGABLE bayrağı ayarlanarak yapılır.
  2. Kapanım oluşturma sırasında hata ayıklamaya izin verilmelidir – Bu, CreateEnclave çağrısına geçirilen ENCLAVE_CREATE_VBS_INFO yapısında ENCLAVE_VBS_FLAG_DEBUG bayrağı ayarlanarak yapılır.

Kapanımınızın hatalarını ayıklamak için:

  1. Kullanıcı modu hata ayıklayıcısını enklav ana bilgisayar sürecine ekleyin.
  2. Ana işlem, yerleşke görüntüsünü belleğe yükledikten sonra yerleşke simgelerini yeniden yükleyin.
  3. Enclavın içindeki işlevlerde kesme noktaları ayarlayın. Hata ayıklayıcı, bir sınırlı alan çağrısında buna müdahale eder.

Ayrıca CreateEnclave, InitializeEnclave gibi kullanıcı modu kesme noktalarında durabilirsiniz, bu da ntdll.dll içindeki ilgili koda daha fazla atlamanızı sağlar.

Uyarı

Üretim ortamlarında hiçbir zaman hata ayıklanabilir enklavlar kullanmayın.

Bu sayede, artık ilk VBS alanınızı derleyebilir ve dağıtabilirsiniz. Sorularınız varsa lütfen Windows geliştirici desteğine ulaşın.

VBS Kuşatmalarına genel bakış

Azure Güvenli İmzalama

enclaveapi.h üst bilgisi

VBS kuşatmalarında kullanılabilen API'ler