Bypassing VirtualBox Process Hardening on Windows

Process’ler Windows makinalarda güvenli nesnelerdir. Bu, non-administrator (yönetici olmayan) kullanıcısı için oldukça önemli bir güvenlik özelliğidir. Güvenlik, yönetici olmayan bir kullanıcının, rastgele bir işlem yaptığında sistemin bütünlüğünü riske atmasını önler. Güvenlik bariyeri, administrator için Debug Privilege özelliği enable edildiğinde ortadan kalkmaktadır. Administrator kullanıcısı uygulanan güvenliğe rağmen herhangi bir process’i açabilmektedir. Process’leri korumak, eğer kullanıcı modu uygulamalarından (user mode applications) yapılırsa oldukça zor bir olaydır. Bu nedenle bir çok çözüm, korumayı gerçekleştirmek için Kernel desteğini kullanmaktadır. Unutulmamalıdır ki, kullanılan tekniklerde hala “protected” süreci aşmak için çeşitli kusurlar bulunmaktadır.

Oracle VirtualBox Process Hardening

Process’leri kullanıcı modunda korumak neredeyse imkansızdır. Bir process içerisine kod enjekte etmek için ise bir çok yol bulunmaktadır. Bu durum özellikle, korumaya çalıştığınız process, engellemeye çalıştığınız kullanıcıyla aynı bağlamda çalıştığı zaman geçerlidir. Örneğin bir saldırgan, PROCESS_CREATE_THREAD ile işlemi handle edebilir ve yeni bir thread ekleyebilir. Ya da, THREAD_SET_CONTEXT ile process içerisine yeni bir thread açabilir ve Instruction Pointer’ı rastgele bir konuma atlatabilirler. Bunlar doğrudan yapılabilen saldırılardır. Saldırgan ayrıca, registry veya environment’ı değiştirebilir. Process’i rastgele COM nesneleri ya da Windows Hooks yüklemeye zorlayabilir. Olası değişiklikler listesi sonsuzdur.

Bu sebepledir ki, VirtualBox process’lerini korumak için Kernel’in yardımını ister. VirtualBox, aynı kullanıcı altında çalışan process’lerini korumaya çalışır (source code comments) TL ve DL koruma kapıları VirtualBox Kernel driver’larına erişebilmektedir. Bundan dolayı, Kernel’i ele geçirmek ya da privelege’ları yükseltmek için bazı yöntemler bulunmaktadır. Linux’ta VirtualBox, yalnızca root olarak VirtualBox drivers’a erişimi sınırlar ve VirtualBox kullanıcı işlemlerinin ayrıcalıklarını bırakmadan önce driver’a erişmesine izin vermek için SUID ikili dosyalarını kullanır. Windows, SUID çiftleri yerine Kernel API’lerini kullanır. VirtualBox driver’ın kullanmış olduğu Kernel API, kullanıcıların ve yöneticilerin korumalı işlemleri açıp, kod yerleştirmesini durdurmayı amaçlamaktadır.

Çekirdek bileşeninin çekirdeği (The Core of The Kernel) Support \ win \ SUPDrv-win.cpp dosyasında bulunur. Bu kod, modern Windows Kernel tarafından desteklenen iki geri arama mekanizması (callback) ile kaydedilir:

  1. PsSetCreateProcessNotifyRoutineEx - Driver, yeni bir işlem oluşturulduğunda uyarılır.
  2. ObRegisterCallbacks - Process ve Thread handles oluşturulduğunda veya çoğaltıldığında driver bilgilendirilir.

PsSetCreateProcessNotifyRoutineEx yeni bir process için koruma yapılarını yapılandırmak için kullanılır. Daha sonradan process VirtualBox driver’ına, bir handle açmaya çalıştığında, Hardening yalnızca aşağıdaki doğrulama adımlarının supHardenedWinVerifyProcess çağrısında gerçekleştirilmesinden sonra erişime izin verir:

  1. Process’e bağlı debugger olmadından emin olun.
  2. Process içerisinde tek bir thread olduğundan emin olun.
  3. İzin verilen DLL’lerin dışında küçük bir çalıştırabilir bellek sayfası olmadığından emin olun.
  4. Yüklenen tüm DLL’lerin imzalarını doğrulayın.
  5. Ana çalıştırılabilir dosyanın imzasını ve izin verilen türde olduğunu kontrol edin (ör. VirtualBox.exe).

Kernel’de imza doğrulaması, driver’a derlenen özel çalışma zamanı kodu kullanılarak yapılır. Bu adımda, yalnızca Microsoft’un işletim sistemi ve Authenticode sertifikaları ile tüm VirtualBox ikili dosyalarının imzalanan Oracle sertifikası olmak üzere sınırlı sayıda Güvenilir Köklerin (Trusted Roots) doğrulanmasına izin verilmektedir. (source repository)

ObRegisterCallback bildirimi, sistemdeki diğer kullanıcı işlemlerinin korunan işlemi için verilebilecek maksimum erişimi sınırlandırmak için kullanılır. ObRegisterCallback API, process’leri kötü niyetli koda enjekte edilmekten veya sonlandırmaktan korumak amacıyla Anti-Virüs için tasarlanmıştır. VirtualBox benzer bir yaklaşım kullanır ve korunan işleme herhangi bir handle’ı aşağıdaki erişim haklarına sınırlar:

  • PROCESS_TERMINATE
  • PROCESS_VM_READ
  • PROCESS_QUERY_INFORMATION
  • PROCESS_QUERY_LIMITED_INFORMATION
  • PROCESS_SUSPEND_RESUME
  • DELETE
  • READ_CONTROL
  • SYNCHRONIZE

İzin verilen erişim hakları kullanıcıya, bellek okumak, süreci senkronize etmek ve sonlandırmak gibi process’e yeni kod enjekte etmeye izin vermemek gibi bekledikleri tipik hakların çoğunu verir. Benzer şekilde, thread’e erişim veya benzeri saldırılarda değişiklik yapılmasını önlemek için aşağıdaki erişim haklarıyla sınırlandırılmıştır.

  • THREAD_TERMINATE
  • THREAD_GET_CONTEXT
  • THREAD_QUERY_INFORMATION
  • THREAD_QUERY_LIMITED_INFORMATION
  • DELETE
  • READ_CONTROL
  • SYNCHRONIZE

Bu erişim sınırlamasını, VirtualBox işlemini ve onun thread’ini açarak doğrulayabilir ve hangi erişim haklarına izin verdiğimizi görebiliriz. Örneğin aşağıdaki resim process ve thread erişim izni vurgulamaktadır.

Hardening, hangi modüllerin process’e yüklenmesine izin vereceğine karar vermelidir. Karar, esas olarak, Authenticode kod imzalamasına dayanır. Yalnızca Microsoft tarafından imzalanmış ikili dosyaların yüklenmesini etkinleştirmek için seçenekler (PROCESS_MITIGATION_BINARY_SIGNATURE_POLICY gibi) bulunmaktadır. Bu politika esnek değildir. Bu nedenle, korunan VirtualBox işlemleri, bellekte yüklü olan DLL’in bütünlüğünü doğrulamak için hook user modunda birkaç iç işleve yükler. Hooked işlevler şunlardır:

  1. LdrLoadDll – Bir DLL dosyasını belleğe yüklemek için çağrılır.
  2. NtCreateSection – Diskteki bir PE dosyası için bir Image Section nesnesi oluşturmak için çağrılır.
  3. LdrRegisterDllNotification – Bu, yeni bir DLL yüklendiğinde veya boşaltılırken uygulamaya bildiren, yarı resmen desteklenen bir geri arama yöntemidir.

Bu hook’lar, yüklenebilecek izin verilen DLL dizisini genişletebilir. Yüklenen DLL, imzalama için VirtualBox’ın beklenen ölçütlerini karşılamazsa, user-mode hooks bu DLL’in yüklenmesini reddeder. VirtualBox yine de kullanıcıya tamamen güvenmiyor; WinVerifyTrust sertifikaları, kullanıcının CA sertifikalarındaki bir kök sertifikaya zincirlenecektir. Bununla birlikte, VirtualBox yalnızca sistem CA sertifikalarına güvenir. Yönetici olmayan bir kişi, sistemin CA sertifikaları listesine yeni bir kök sertifika ekleyemediğinden, kötü amaçlı DLL’lerin enjeksiyonunu ciddi şekilde sınırlamalıdır.

Özetle, VirtualBox Hardening şu korumaları sağlamaya çalışıyor:

  1. Başlatma sırasında korunan ikili dosyalara hiçbir kod eklenmediğinden emin olun.
  2. Kullanıcı işlemlerinin, “yazılabilir” handle, rastgele kod enjeksiyonuna izin verecek şekilde korunan process veya thread açmasını engeller.
  3. COM gibi normal yükleme yollarıyla güvenilmeyen DLL’lerin enjeksiyonunu önleyin.

Kaynak