Windows ve rakiplerinin kalbine iniyoruz...

CHIP Online, sizi Windows ve rakiplerinin kalbine doğru giden uzunca bir yolculuğa davet ediyor...

Çekirdeklerin savaşı - I

Windows 'un ne kadar güçlü olduğunu öğrenmek isteyen onun çekirdeğini görmeli, nasıl çalıştığını ve neler sunduğunu anlamalıdır. Linux ve Mac OS X ile yapılan karşılaştırma sonucunda çokça kullanılan ama pek sevilmeyen işletim sisteminin kendine has güçlü ve zayıf yanlarını ortaya çıkarıyor.

Windows: Bu kelime ile birçok ön yargı ve yarım yamalak gerçeklerle bağdaştırılıyor; mesela "güvensiz" olduğu gibi. İnternete yerleşmiş olan milyonlarca virüs özellikle Windows'a saldırıyor. Ayrıca Microsoft sistemlerinin performansı da baş ağartabiliyor: Çalıştıkça yavaşlıyor. İstikrarı ilgilendiren konularda ise Windows çökmeleri doğrudan "mavi ekran" tanımıyla eşleştiriliyor. Bu kadar çok şeyin gerçekleşmesine şaşmamalı, sonuçta Vista 70 milyon kod satırından oluşuyor. Böyle geniş bir alanda insanın kendini kaybetmeyip hata yapmaması mümkün değil.

Doğru değerlendirmeler mi yoksa kabaca yanlış hükümler mi? Bunu ortaya çıkarmak için işletim sisteminin çekirdeğinin derinliklerine dalmalı ve şu üç belirleyici kriterin hakkının ne kadar iyi verildiği test edilmeli: Güvenlik, performans, istikrar. Bunu yaparken Microsoft-çekirdeğini diğer iki rakibi olan Linux ve Mac OS X ile karşılaştırdık. Ayrıca Windows ve diğerlerinin hangi teknolojileri kullandığını detaylı bir şekilde gösterdik.

Çekirdek: Sistemi kontrol ediyor

Çekirdek: Sistemi kontrol ediyor

Windows-mimarisi: Windows'un birçok bölümünü göremeyiz. İşletim sisteminin donanım ile muhatap olduğu çekirdek-modu sadece işletim sistemine mühürlenmiştir.

İşletim sistemi içinde bulundurduğu çekirdek tarafından kontrol edilir. İşte bunun kalitesi sistemin kalitesini doğrudan etkiler.

Çekirdek, donanım arayüzleri gibi şeylerin kelimenin tam anlamıyla "sürekli" çalışmasını sağlar: Çekirdek harici cihazlarla iletişim kurar ve RAM, CPU, sabit disk gibi dâhili yapı taşlarını yönetir. Kaynakları bellek ve işlem yönetimi için kullanır.

Sistem güvenliğini sağlamak için o anda çalışan tüm işlemleri kontrol etmek zorundadır. Sadece o hangi programın hangi donanıma ne kadar süreyle erişeceğine karar verebilir. İstikrarı kaynak planlaması yaparak sağlar. Bunun arkasında dosya sistemlerini sabit diske yansıtmak gibi her gün kullandığımız fonksiyonlar vardır. İki programın aynı anda sabit diske yazmak istemesi gibi erişim karışıklıklarını çözmek için çekirdeğin iyi bir performansa ihtiyacı vardır. Böyle bir durumda çekirdek sırada bekleyen görevlere öncelik atar ve sadece bir programa yazma izni verir, diğeri ise bu sürecin bitmesini bekler. Sıradaki sayfada Windows'un bu farklı görevleri nasıl yerine getirdiğini detaylı bir şekilde göstereceğiz.

Windows: Her donanımda çalışıyor

Windows: Her donanımda çalışıyor

Windows-çekirdeği: Windows çekirdeğinin kalbi olan NTOS dosyası mantıksal olarak iki katmana ayrılmış durumdadır.

Windows-mimarisi NT serisi duyurulduğundan bu yana kullanıcı (user) ve çekirdek (kernel) modu olmak üzere ikiye ayrılmış durumda. Vista da bu kapsama dâhil. "User" modunda kullanıcıya gözüken her şey çalışır, yani Word veya Photoshop gibi uygulamalar.

Bu modda çalışan hiçbir şey doğrudan donanıma veya sistem belleğine erişemez. Microsoft kullanıcı modunu tabiri caizse bir pamuğun içine yerleştirmiştir. Sistemin derinliklerine giden tüm erişimler ön tanımlı arayüz üzeriden iletilir. Örneğin: DLL sistem kütüphaneleriyle beraber Win32-API'si (Dynamic Link Libraries).

Çekirdek modu gizli bir şekilde arka planda çalışır ve kullanıcı herhangi bir problem ortaya çıkmadığı sürece çekirdeğin farkına bile varmaz. Mesela çekirdek modundaki bir sürücü herhangi bir şekilde sistemi çökme noktasına getirebilir. Kullanıcı bu tip bir durumda sadece mavi ekranı görür.

Windows: Her donanımda çalışıyor"ntoskrnl.exe" dosyası merkezi bir rol oynar. Çekirdek ve kullanıcı moduna uygun şekilde görevler de çekirdek katmanı ve çalıştırma katmanı şeklinde iki farklı bölüme ayrılır. İlk katman kullanıcıyı çekirdek moduyla birleştirir. Ana görevi ise CPU zamanlamasıdır, bunun anlamı ise işlemcinin her programla meşgul olacağı süreyi ayarlamaktır. Çalıştırma katmanı Tak&Çalıştır gibi sistem hizmetlerinden sorumludur.

Sistemin en derininde donanım ayırma katmanı (Hardware Abstraction Layer, HAL) bulunur. HAL, diğer donanım katmanlarının sisteme takılı cihazlara erişmesini sağlayan hizmetleri hazırda tutar. Eğer HAL olmasaydı Microsoft her bilgisayar için ayrı bir Windows geliştirmek zorunda kalırdı.

Linux: Modülleri gerektiği zaman yüklüyor

Linux: Modülleri gerektiği zaman yüklüyor

Linux-çekirdeği: Girdi/çıktı komutlarının, belleğin ve işlemlerin yönetimiyle ilgileniyor.

Linux-çekirdeği Unix'i baz alıyor, fakat bazılarının zannettiğinden daha fazla Windows'a benziyor. O da doğrudan donanımın üzerine yerleşiyor ve çalışan programlara has bir ara katman kullanıyor.

Klasik görevlerde bile neredeyse bir fark yok: Aynı Windows'ta olduğu gibi çekirdek girdi/çıktı cihazları ile beraber çalışıyor ve bellek yönetimini devralıyor. Üçüncü büyük bölüm ise işlem yönetimi etrafında dönüyor, yani hangi programların o anki önceliğe ve işlem süresine sahip olacağına karar veriliyor. Bu iş için en alt seviyedeki çekirdek katmanında duraklamaları (Interrupts) kontrol eden fonksiyonlar vardır. Mesela kullanıcı bir düğmeye bastığında klavye bir duraklama-talebi gönderir.

Özel bir sistem mekanizması bu talepleri düzenler: Dispatcher. Türkçe karşılığıyla "çoklu görev zamanlayıcısı" duraklamanın öncelik seviyesine karar verir ve bunları çalışan işlemler arasında sıraya koyar. Duraklama çalıştırılabildiği anda Dispatcher o an çalışan işlemi durdurur ve bu işlemin durumunu kaydeder. Ancak bundan sonra duraklama, yani klavye komutu işleme alınır.

Linux: Modülleri gerektiği zaman yüklüyorWindows gibi Linux da mimari açısından prensipte tek parçalıdır (monolithic). Fakat Linux çekirdeği diğer modülleri dinamik olarak ekleyebiliyor. Bunlar kural olarak mevcut bileşenleri genişletir veya gerektiğinde tamamen onların yerine geçer.

Linux-çekirdeği sistem ve kütüphane çağrılarının yanında kullanıcı arabirimi için de bağlantı noktaları barındırır. Sistem çağrısına has arabirimin önemi çok büyüktür, zira bu arabirim genel anlamda işlemlerden sorumludur. Burada kullanıcı işlemleri özel bir komut ile çekirdek moduna aktarılır.

OS X: İki çekirdeğin gücünü kullanıyor

OS X: İki çekirdeğin gücünü kullanıyor

OS X çekirdeği: İki kaynaktan oluşuyor. XNU, Unix temelli BSD alt sisteminin fonksiyonlarını ve Mach mikro çekirdeğinin parçalarını kullanıyor.

Mac OS X'in çekirdeği XNU harfleriyle kısaltılıyor. XNU: "X is Not Unix" (X, Unix değildir). Aslında doğru da, zira Apple, işletim sisteminin çekirdeğini oluşturmak için iki kaynağı birleştirdi ve bunların sadece bir kısmı Unix dünyasından geliyor.

Apple çekirdeğin diğer kısmını Mach projesinden kendine transfer etti; Mach mikro çekirdekler için klasik bir örnek teşkil ediyor. Fakat Apple bunu bir mikro çekirdek olarak değil, bilakis mesaj iletimi, yani tekil çekirdek parçalarının birbirleriyle verimli bir şekilde iletişim kurması için kullanıyor. Buna ek olarak XNU, Unix temelli FreeBSD projesine ait kodlara da sahip.

Bu kısım kullanıcı yönetimi, sinyal işleme ve POSIX-uyumluluğu görevlerinden sorumludur. POSIX-uyumluluğu sayesinde Unix dünyasına ait programların çoğu OS X'de de çalışabiliyor.

OS X: İki çekirdeğin gücünü kullanıyorÖnemli Mach bileşenlerinden biri de girdi/çıktı işlemlerinden sorumlu I/O-Kit'tir. İşte OS X bu noktada kendini Windows ve Linux'tan büyük ölçüde ayırıyor, zira I/O-Kit donanım ve sistemin geri kalanı arasında ek bir ayırma katmanı olarak çalışıyor. Burada geliştiricilerin kendilerine has sürücü türetebilmelerine izin veren standardize edilmiş sürücü modelleri bulunur. Tüm bunlar daha fazla istikrar ve daha iyi performans sağlar.

OS X çekirdek hizmetlerinin yanında çekirdek eklentileri kullanmayı da destekler. Sistem bunları istendiğinde dinamik olarak sonradan yükler. Bu sebeple genellikle melez (hybrid) bir çekirdekten bahsedilir fakat uzmanlar OS X çekirdeğini yapısı sebebiyle daha çok tek parçalı (monolithic) olanlar arasında sayar.

İşlemler: İmzalar sayesinde koruma

İşlemler: İmzalar sayesinde koruma
Windows Debugger: Bellek içeriğini inceledikten sonra çökme nedenlerini gösteriyor.

Çekirdeğin önemli görevlerinden biri de işlem yönetimidir. İşlem yönetimi sadece öncelik atamayla sınırlı değildir ve işlemleri korumayı da kapsar.

Windows altında klasik olarak Win32-API işlemleri başlatılır ve yönetilir. Çekirdeğe tarafında ise bunu NTOS çalıştırma katmanı halleder. Çekirdek nesnelerine erişim sağlama "Handles"ların görevidir. Windows altında herhangi bir A işlemi yine aynı tür A işlemini başlatabilir. Mesela Word (işlem 1) yeni bir doküman (işlem 2) açabilir. Klasik Windows modeli Word'ün yeni dokümanı tekrar silmesine veya değiştirmesine de izin verir. Kural şudur: Bir işlem kendi alt işlemleri üzerinde kontrole sahiptir.

Fakat standart işlemlerde erişim yapısına aykırı davranılmasına sebep olan bir açık vardır. Bunun gerçekleşmesini mümkün kılan ise "program hatası ayıklama (debug)" hakkıdır. Bu hak herhangi bir yöneticiye bir işlem üzerinde tam yetki verir. Böylece işlemin adres yüzeyi ve işlem tarafından kullanılan verileri okunabilir veya değiştirilebilir. Saldırganlar bu yöntemle işlemlere yeni parçacıklar (thread) ekleyebilir.

Bu yüzden Vista multimedya dosyalarına has işlem modelini yeniden elden geçirdi ve yeni bir model tanımladı: İşlem yönetimine olan erişimi büyük ölçüde kısıtlayan "korumalı işlemler". Çekirdek, korumalı işlemler için yine tanılama bilgileri sunar, fakat yöneticiye bile doğrudan erişim izni vermez.

Bu yönteme göre bir filmi oynatmak için gerekli codec sadece tek bir şart altında korumalı işlem olarak çalışabilir: Çalıştırılabilir kodun tümü dijital olarak imzalanmış olmalı. Korumalı işlemler kökleri eskiye dayanan Windows-mimarisinin güncel problemlerle nasıl mücadele ettiğini gösteren en iyi örnektir.

Linux ve Mac OS X'deki işlem modeli Windows'a benzer: Ana işlemler kendilerinin oluşturduğu yan işlemler üzerinde kontrole sahiptir. Fakat Vista'daki gibi bir "korumalı işlem" modeli mevcut değildir. Aslında şaşırmamalı, Microsoft bu tekniği öncelikle kendi dijital hak yönetimi (DRM) için kullanıyor. Dolayısıyla Linux ve OS X'de yönetici (root) haklarıyla donatılmış herkes istediği her şeyi yapabilir, hatta işlemleri inceleyebilir ve kontrol bile edebilir.

<strong>Windows Debugger:</strong> Bellek içeriğini inceledikten sonra çökme nedenlerini gösteriyor.Windows Debugging Tools WinDbg: Mavi ekran anındaki belleğin içeriğini analiz etmek için WinDbg gibi bir hata ayıklama aracına ihtiyacınız var. Microsoft'un download sitesinde uygum sembol dosyasını da bulabilirsiniz.

NotMyFault: Bir zorluk testi aracı. Program hatalar oluşturarak Windows'u çökmeye zorluyor. Bu sebeple denemek isteyenler çok dikkatli olsun!

Process Explorer: İşlem yönetimi işletim sistemlerinin temel görevlerinden biridir. Process Explorer bu süreci gözlerinizin önüne getirir: Amaca uygun Handles'ı veya işlemler arasındaki bağımlılığı gösterir.

ASLR: Bellek adreslerini gizlemek

ASLR: Bellek adreslerini gizlemek
Internet Explorer: Zararlılar tarayıcı üzerinden sisteme bulaşabiliyor.

Güncel işlemciler 64-Bit adresleme veriyolu genişliğine sahiptir, fakat öncelikle bazı Bit'lere belirli görevleri atamışlardır.

Mesela NX-Bit dosya çalıştırma işleminden sorumludur (Data Execution Prevention, DEP). Bellek üzerinde "çalıştırılamayan işlem" olarak işaretlenmiş bir kod çalıştırılmak istendiğinde bir içsel hata ortaya çıkar. DEP Windows altındaki yerel 64-Bit programlar için devre dışı bırakılamıyor, fakat çok daha yaygın olan 32-Bit dünyası için aynı durum geçerli değil.

Bu da saldırganlara bellek taşma hatalarından faydalanma imkânı sunuyor. Bu sayede saldırganlar Internet Explorer gibi işlemlere bulaşıp sistemi ele geçirebiliyor. Sisteme bir zararlı yerleştiğinde istediğini yapabilmek için Windows API'lerini kullanabilir, yani bilgileri okuyabilir veya sistem yapılandırmasını değiştirebilir.

Microsoft bu sebeple XP Service Pack 2'ye kısmen, tam anlamıyla ilk kez Vista'ya yeni bir çekirdek koruma fonksiyonu ekledi: Address Space Load Randomization (ASLR). Sebep: Windows'un önceki sürümlerinde DLL'ler her seferinde belleğin aynı noktasına yerleştirilirdi ve saldırganlar bunu giriş noktası olarak kullanırdı. ASLR sayesinde sistem-DLL'leri ve çalıştırılabilir dosyalar her sistem başlangıcında belleğin farklı bir bölgesine yerleştiriyor ve zararlı yazılım sistem hareketlerini standart adresler üzerinden denetleyemiyor.

<strong>Internet Explorer:</strong> Zararlılar tarayıcı üzerinden sisteme bulaşabiliyor.Bellek yöneticisi gizleme amacıyla 256 farklı adres kullanabiliyor. Bir DLL yüklendiğinde bellekte yerleşeceği yeri rastgele seçiyor. Buna ek olarak ASLR'nin taşıma stratejisi adres bölümlerinin önceki Windows sürümlerine göre daha sıkı bir şekilde paketlenmesini ve böylece daha fazla boş bellek alanı oluşmasını sağlıyor.

Hardened Gentoo gibi özel Linux dağıtımlarında ASLR tam entegre edilmiş biçimde geliyor. Buna karşın standart çekirdeğin içinde bu uyarlama eksik biçimde bulunuyor ve kullanıcı tarafından yamalanması gerekiyor. Güncel OS X derlemesinde ASLR kütüphaneleri kullanılıyor, fakat yine eksiksiz bir uygulama mevcut değil.

Modern dijital-öcüler arasında çekirdek-modu-rootkit'leri vardır. Sıradan güvenlik yazılımları bunları yakalayamaz çünkü rootkit'ler çekirdek ile aynı hak seviyesinde çalıştırılır. Bu zararlılar genellikle kernel-modu-sürücüsü olarak gelir ve çekirdeğin hatta sürücülerin davranışlarını kendilerini gizleyecek şekilde değiştirebilirler.

Integrity Check: Kodu güvence altına almak

Integrity Check: Kodu güvence altına almak
Parmak izi: Sürücüler bir imza ile şifreleniyor.

Microsoft ilacı Vista'da sunuyor: Çekirdek modu kod imzası (KMCS) sadece dijital imzalı sürücülerin yüklenmesine izin veriyor.

Birçok sürücü WHQL (Windows Hardware Quality Lab) imzasına sahiptir, fakat geliştiriciler kendi geliştirdikleri kodları kendileri de imzalayabilir. Ama bu iş için geçerli bir sertifikaya sahip olmalıdırlar. Yazar, kodu dijital bir hash-değeri (parmak izi) ile mühürler, hash değerini özel bir anahtar ile imzalar ve sertifikanın yanına şifrelenmiş hash değerini de ekler. Yükleme denemesinde ise Windows, kodun içinde bulunan hash değerini sertifikadaki anahtar ile çözer ve hash değerinin program koduna uyup uymadığını kontrol eder.

Windows ilgili sertifikanın Windows-Loader veya işletim sisteminin çekirdeğinin içine gömülü kök sertifikalarıyla bağlantılı olup olmadığını da kontrol eder.

<strong>Parmak izi:</strong> Sürücüler bir imza ile şifreleniyor.32-Bit'lik Vista sürümleri sürücü imzalarını kontrol ediyor, fakat 64-Bit'lik Vista sürümlerindeki gibi imzasız sürücülerin yüklenmesini engellemiyor.

Mac OS ve Linux altında çekirdek modülleri genellikle dijital olarak imzalanabiliyor. Teorik olarak sürücüler için de aynı şey geçerli, fakat işletim sisteminin içinde denetleme sürecinden sorumlu mekanizmalar yok.

Çekirdeklerin derinliğine yaptığımız yolculuğun ilk bölümü bu kadar. İkinci bölümde Windows ve diğer işletim sistemlerinin derinliklerine inmeye devam edeceğiz.

Okuyucu Yorumları