Aracılığıyla paylaş


Platform güvenliği için Flow Guard'ı denetleme

Control Flow Guard nedir?

Control Flow Guard (CFG), bellek bozulması güvenlik açıkları ile mücadele etmek için oluşturulmuş, yüksek oranda iyileştirilmiş bir platform güvenlik özelliğidir. Bir uygulamanın kod çalıştırabileceği yere sıkı kısıtlamalar getirerek, açıklardan yararlanmaların arabellek taşmaları gibi güvenlik açıkları yoluyla rastgele kod yürütmesini çok daha zor hale getirir. CFG, /GS (Arabellek Güvenlik Denetimi), Veri Yürütme Engellemesi (DEP)ve Adres Alanı Düzeni Rastgele (ASLR)gibi önceki güvenlik ihlali azaltma teknolojilerini genişletir.

CFG kullanmak şu işlemlere yardımcı olabilir:

  • Bellek bozulmasını ve fidye yazılımı saldırılarını önleyin.
  • Saldırı yüzeyini azaltmak için sunucunun özelliklerini yalnızca belirli bir noktada gerekenlerle kısıtlayın.
  • Arabellek taşması gibi güvenlik açıkları aracılığıyla rastgele kodlardan yararlanmayı zorlaştırın.

Bu özellik Microsoft Visual Studio'da kullanılabilir ve Windows'un CFG Kullanan sürümlerinde çalışır; İstemcide Windows 10 ve Windows 11 ve sunucu tarafında Windows Server 2019 ve üzeri.

Geliştiricilerin uygulamaları için CFG'yi etkinleştirmeleri kesinlikle teşvik edilir. CFG etkin ve CFG etkin olmayan kodun bir karışımı sorunsuz yürütüleceği için kodunuzun her bölümü için CFG'yi etkinleştirmeniz gerekmez. Ancak CFG'nin tüm kodlar için etkinleştirilmemiş olması, korumada boşluklar açabilir. Ayrıca CFG özellikli kod, Windows'un CFG-Unaware sürümlerinde düzgün çalışır ve bu nedenle onlarla tamamen uyumludur.

CFG'yi nasıl etkinleştirebilirim?

Çoğu durumda kaynak kodu değiştirmeniz gerekmez. Tek yapmanız gereken Visual Studio projenize bir seçenek eklemektir; derleyici ve bağlayıcı CFG'yi etkinleştirir.

En basit yöntem Projesine gitmektir | Özellikler | Yapılandırma Özellikleri | C/C++ | Kod Oluşturma ve Control Flow Guard için Evet (/guard:cf) seçin.

Visual Studio'nun Kod Oluşturma derleme yapılandırmasında Control Flow Guard özelliğinin ekran görüntüsü.

Alternatif olarak, Project'e /guard:cf ekleyin | Özellikler | Yapılandırma Özellikleri | C/C++ | Komut Satırı | Ek Seçenekler (derleyici için) ve Projesine /guard:cf | Özellikler | Yapılandırma Özellikleri | Bağlayıcı | Komut Satırı | Ek Seçenekler (bağlayıcı için).

Özelliği /guard:cf olarak ayarlanmış Visual Studio'da C/C++ Komut Satırı Ek Seçenekler derleme yapılandırmasının ekran görüntüsü

Visual Studio'daki Bağlayıcı Komut Satırı Ek Seçenekler derleme yapılandırmasının, özelliği /guard:cf olarak ayarlanmış bir ekran görüntüsü

Ek bilgi için bkz. /guard (Denetim Akışı Koruyucusunu Etkinleştirme).

Projenizi komut satırından oluşturuyorsanız, aynı seçenekleri ekleyebilirsiniz. Örneğin, test.cpp adlı bir proje derlediyseniz cl /guard:cf test.cpp /link /guard:cfkullanın.

Ayrıca, Bellek Yönetimi API'sinden setProcessValidCallTargets kullanarak CFG tarafından geçerli kabul edilen icall hedef adresleri kümesini dinamik olarak denetleme seçeneğiniz de vardır. Sayfaların CFG için geçersiz mi yoksa geçerli hedefler mi olduğunu belirtmek için aynı API kullanılabilir. VirtualProtect ve VirtualAlloc işlevleri, varsayılan olarak belirli bir yürütülebilir ve işlenen sayfa bölgesini geçerli dolaylı çağrı hedefleri olarak değerlendirir. PAGE_TARGETS_INVALID belirterek VirtualAlloc veya PAGE_TARGETS_NO_UPDATE belirterek VirtualProtect çağırarak bu davranışı geçersiz kılmak mümkündür. Bu konular Bellek Koruma Sabitlerialtında ayrıntılı olarak açıklanmıştır.

İkiliNin Denetim Akış Koruması Altında Olduğunu Nasıl Anlarım?

/headers ve /loadconfig seçenekleriyle Visual Studio komut isteminden dumpbin aracını çalıştırın: dumpbin /headers /loadconfig test.exe. CFG altındaki bir ikilinin çıktısı üst bilgi değerlerinin "Guard" içerdiğini ve yük yapılandırma değerlerinin "CF instrumented" ve "FID table present" değerlerini içerdiğini göstermelidir.

Dumpbin /headers çıktısının ekran görüntüsü

Dumpbin /loadconfig çıkışının ekran görüntüsü

CFG Gerçekten Nasıl Çalışır?

Yazılım güvenlik açıkları genellikle çalışan bir programa olası olmayan, olağan dışı veya aşırı veriler sağlayarak kötüye kullanılır. Örneğin, bir saldırgan, bir programın beklediğinden daha fazla veri girerek arabellek taşması güvenlik açığından yararlanabilir ve böylece bir yanıtı saklamak için program tarafından ayrılmış alanı aşabilir. Bu, bir işlev işaretçisini tutabilen bitişik belleği bozabilir. Program bu işlev aracılığıyla çağırdığında saldırgan tarafından belirtilen istenmeyen bir konuma atlayabilir.

Ancak CFG'den gelen derleme ve çalışma zamanı desteğinin güçlü bir birleşimi, dolaylı çağrı yönergelerinin yürütülebileceği yerleri sıkı bir şekilde kısıtlayan denetim akışı bütünlüğünü uygular.

Derleyici aşağıdakileri yapar:

  1. Derlenen koda basit güvenlik denetimleri ekler.
  2. Uygulamadaki dolaylı çağrılar için geçerli hedefler olan işlev kümesini tanımlar.

Windows çekirdeği tarafından sağlanan çalışma zamanı desteği:

  1. Geçerli dolaylı çağrı hedeflerini tanımlayan durumu verimli bir şekilde korur.
  2. Dolaylı çağrı hedefinin geçerli olduğunu doğrulayan mantığı uygular.

Göstermek için:

Derleyici tarafından eklenen CFG denetimlerini gösteren diyagram.

CFG denetimi çalışma zamanında başarısız olduğunda, Windows programı hemen sonlandırır ve böylece dolaylı olarak geçersiz bir adres çağırmaya çalışan herhangi bir güvenlik açığından yararlanmayı önler.

/guard (Denetim Akış Koruyucusunu Etkinleştir)

/GUARD (Koruma Denetimlerini Etkinleştir)