İşlemcilerin Koruma Mekanizması ve Koruma Mekanizmasının Atlatılması

Yayınlayan
Mehmet Kelepçe
Yayınlanma tarihi
6/5/2022
Okuma süresi
15
Dakika
go back icon
Geri Dön

İşlemcilerin Koruma Mekanizması ve Koruma Mekanizmasının Atlatılması

Gelişmiş birçok işlemci varsayılan olarak koruma mekanizması ile tasarlanmaktadır. İşlemcilerin koruma mekanizmalarının nasıl atlatılabileceğinin anlaşılabilmesi için öncelikle bu koruma mekanizmalarının anlaşılması gerekmektedir.

Bilgisayarlar üzerinde CPU ve RAM donanımları bulunmaktadır. Kullanılan bilgisayarlar üzerlerinde zaman paylaşımlı olarak çalışmakta olan her işleme process (işlem) denilmektedir. Tüm process’ler, RAM bellek ve CPU arasındaki koordinasyon ile çalışmakta, RAM bellek üzerinde belirli alanlarda konumlandırılmakta ve zamanlanmış şekilde, sırayla hızlı bir biçimde çalıştırılmaktadırlar.

Ram bellek üzerinde var olan herhangi iki-üç adet process’e ait şema üstündeki görüntü aşağıdaki gibidir.

Şemaya bakıldığında, chrome.exe ve git.exe process’leri aynı RAM bellek üzerindedir. Daha yukarıdan bakıldığında, işletim sisteminin kendiside tıpkı bu process’ler gibi RAM bellek üzerinde çalışmaktadır.

Yukarıdaki şema üzerinden örneklendirerek devam edilirse; Process 1 üzerinde herhangi bir pointer’a rastgele herhangi bir adres verildiğinde, process kendi alanının dışına çıkacağı için ilgili process sonlandırılacaktır. Koruma mekanizmasının olmadığı durumlarda farklı bir process başka bir process’in bellek alanına erişip orada var olan herhangi bir veriyi bozabilme ihtimali bulunmaktadır. Bu durumu bir örnek ile açıklamak gerekirse bir bankaya ait veri tabanı uygulaması üzerinde yapılacak yanlış bir işlem ile hesap bakiyeleri üzerinde veri değişikliği sağlanabilmesi gibi hatalı bir işlem söz konusu olabilmektedir. İşletim sistemi ve CPU açısından bakıldığında, bu tür durumlar çok büyük risk teşkil etmektedir. Bu sebeple bahsedilen şekillerde riskler teşkil eden bir tehdidin bir şekilde engelleniyor olması gerekmektedir. Engelleme işletim sisteminin yapabileceği bir engelleme olmadığı için gerekli işlem doğrudan doğruya processor (işlemci) tarafından yapılmaktadır.  Fakat gerçekleştirilmesi gereken koruma, tüm işlemci mekanizmaları tarafından sağlanmamaktadır. Düşük seviyedeki işlemciler -örneğin IOT cihazlarda bulunan microcontroller’lar (mikrodenetleyiciler)- CPU’lar üzerinde bahsedilen şekilde mekanizmalar bulunmayabilmektedir. Koruma mekanizması bulunmayan işlemcilere örnek olarak 8, 16 bit işlemciler ve gömülü sistemlerde kullanılan işlemciler verilebilir. Günümüzde kullanılan birçok işlemci koruma mekanizmalarına sahip olarak üretilmektedir.

İşlemcilerin koruma mekanizması iki düzeylidir. Bunlar;

  • Bellek koruması (Memory protection),
  • Komut koruması (Instruction protection).

Yukarıda bahsedilen çerçevede bellek korumasına değinilmiştir.

Komut Koruması Nedir?

İşlemciler üzerinde var olan bazı makine komutları, yanlış kullanılması halinde sistemi tamamen çökmesine sebep olabilmektedir. Haberleşme portlarına bilgi gönderen IN OUT, interrupt’ları (kesme) açıp kapatan komutlar (CLI vb. komutları) bu komutlardan bazılarıdır.

Bir grup makine komutu bu durumlarda özel olarak processor tarafından incelenip kontrol edilmektedir. Bir process’in bu komutları kullanabilecek yetkiye sahip olup olmadığı kontrol edilmektedir. Bu tür bir yetkisi bulunmuyorsa “komut koruması” devreye girerek komutun çalıştırılmaması sağlanmaktadır.

Bahsedilen türdeki komutların kullanımı yüksek tehlike arz edebilmektedir. Bu sebeple ilgili komutları sıradan yetkiye sahip process’ler kullanamamaktadırlar. Sıradan kullanıcı yetkisinde çalışan bir process üzerinde, aşağıda var olan ve “C” dilinde “Inline Assembly” olarak yazılan CLI komutunun çalıştırılması sırasında Komut koruması devreye girerek “exception” (istisna/kural dışılık) oluşturulacaktır.

int main(void){

     __asm{

             cli

          }

     return 0;

}  

Örnekten de anlaşılacağı üzere birkaç satır makine kodu sistem üzerinde çok kritik sonuçlara sebebiyet verebilmektedir.

Inline assembly kodu “debugger” (hata ayıklayıcı) aracılığıyla çalıştırıldığı sırada “privileged instruction” (ayrıcalıklı komut) hatası alınacaktır.

İşletim sisteminin çalışması esnasında kendi faaliyetlerini gerçekleştirmesi için bellekteki her alana erişmesi ve bu sebeple yukarıda örneklendirilen komutları kullanması gerekebilmektedir. Bu durum söz konusu olduğunda hangi process’lerin bu komutu kullanabileceği veya kullanamayacağı devreye girmektedir. İşletim sistem üzerinde çalışan bir process aşağıdaki iki moddan birinde çalışabilir;

  1. User mode (Kullanıcı modu),
  2. Kernel/ Privileged/Supervisor mode (Çekirdek/Ayrıcalıklı/Yönetici modu).

Eğer bir process “kernel mode” üzerinde yürütülüyorsa hiçbir engele takılmadan işlem yapabilecektir. CPU bu durumda ilgili process’in her istediği komutu çalıştırmakla görevlidir.

Eğer process “user mode” üzerinde yürütülmekteyse bellek ve komut korumalarına takılabilmektedir. Linux ve Windows üzerinde sıradan kullanıcıların yazdıkları her process “user mode” üzerinde çalışmaktadır.

Koruma engeline takılmadan çalışan veya “kernel mode” üzerinde çalışan kodlar işletim sisteminin kodlarıdır ve işletim sisteminin kodları bellek üzerinde istediği alana erişebilmektedir.

"Kernel Mode" Üzerinde Process Yürütülebilir Mi?

İşletim sistemi üzerinde hiçbir koruma engeline takılmadan bir process veya herhangi bir kod çalıştırılmak isteniyorsa, ilgili process önceliklendirilmeli ve yetkilendirilmelidir. Aygıt sürücüleri veya kernel modül olarak adlandırılan yazılımlar bu konuda “kernel mode” üzerinde çalışabilmektedirler. Windows işletim sistemi üzerinde kernel modülü biçiminde herhangi bir kullanım söz konusu değildir.

Engelleri aşmak amacıyla aygıt sürücüleri tasarlanıp kodlandıktan sonra bu sürücülerin işletim sistemi üzerinde yüklenmiş olmaları gerekmektedir.

Aygıt sürücülerini yükleyebilecek kullanıcı hesabı yetkili bir kullanıcı hesabı olmalıdır. Windows üzerinde herhangi bir yetki gerektiren yazılımı sistem üzerinde yüklerken, User access control (UAC) popup’ı ile yetkili kullanıcı erişimi istenecektir. Aygıt sürücüsünün sistem üzerinde yapacağı değişiklikler, sistem üzerinde kritiklik arz edebileceğinden bu UAC popup’I güvenlik uyarısı betimlemesi yapmaktadır.

Linux/unix üzerinde root parolasına sahip her kullanıcı bu yüklemeleri gerçekleştirebilir. Linux / Unix üzerinde var olan ve sistemin root yetkilerini ele geçirmek isteyen kernel exploitler (istismar araçları/sömürücüler) bu mantık çerçevesinde çalışmaktadır. Exploitler kernel üzerinde “user mode” ile “kernel mode” arasında geçiş yapılabilecek bir güvenlik zayıflığını sömürmektedirler.

Aşağıdaki ekran görüntüsü üzerinde bir pointer’a adres atanmaktadır. Atanan adres bilgisi process’in erişmeye yetkisi olmadığı bir adres bloğunu temsil etmektedir. Derleme sırasında process, kendi alanının dışına çıktığı icin Exception Thrown (İstisna Atıldı) hatası alınacaktır.

İşlemcilerin Bellek Koruması Uygulama Modeli Nasıldır?

İşlemcilerin bellek koruması sağlayabilmesi için bellek içerisinde var olan process’lerin konumlarını bilmesi gerekmekte ve bu bilgiyi işletim sistemi üzerinden edinmektedirler. İşletim sistemi; oluşturulan her bir process icin process kontrol bloğu tutmakta ve bu blokta bulunan process’lerin konumlarını işlemciye iletmektedir.

Aşağıdaki görselde bir işlemcinin register’ının (kaydının) bulunduğu varsayılmaktadır. Bu register’lardan biri, bir process’in bellek üzerinde nereye yüklü olduğunu göstermektedir. Bir diğer register ise bellekte yüklü bulunan process’in uzunluğunu tutmaktadır. Bu durumda, CPU herhangi bir process’in başka bir process’in alanına erişip erişmediğini anlayabilmektedir. Çünkü hangi process’in nereye konumlandırıldığını ve uzunluğunu bilmektedir.

CPU, kontrollerini sağlamak için kendi üzerinde bulunan bu register’lara bakmaktadır. Register’ların değerlerini yöneten mekanizma işletim sistemi olmaktadır. Koruma mekanizmalarının mantığına ve kontrolüne bu perspektif ile bakıldığı durumda kolay ve uygulanabilir olduğu anlaşılabilmektedir.

İhlal Durumunda Koruma Mekanizması Nasıl İşler?

Aşağıdaki verilen MOV assembly komutu, EAX registerını kullanarak belirli bir adrese ulaşmak istediği sırada, process’in dışına erişim anlaşıldığında, processor içsel kesme denilen internal interruptlar oluşturmaktadır. İşletim sistemleri bu komutları ve ihlalleri gördüğünde process’leri sonlandırmaktadır.

MOV EAX, [X]

Not: X temsilidir.

Mehmet KELEPÇE

Senior Cyber Security Specialist | Red Team

Mehmet Kelepçe

Detaylı Bilgi İçin

info@gaissecurity.com