İçeriğe geç

2.6 · Seviye 0 · Dijital Dünyanın Temelleri

Yazılım nasıl çalışır?

kaynak kod, derleme, yorumlama; bir hatanın nasıl zafiyete dönüşebildiği

Siber Güvenlik Akademisi — M02, Bilgisayar Nasıl Çalışır · 1.994 kelime · 4 saha durumu · ≈ 9 dk okuma · 13 dk dinleme

Saha durumlarındaki kişiler ve kurumlar kurgusaldır; kaynaklar gerçektir. Bu akademi savunma odaklıdır: saldırılar mekanizma düzeyinde anlatılır, adım adım saldırı tarifi verilmez. Uygulamalar yalnız kendi cihazında, kendi hesabında ya da yalıtılmış bir laboratuvarda yapılır; başkasının sistemine izinsiz erişim suçtur. Dersler hukuki danışmanlığın yerini tutmaz.

Açılış

Selin bir salı öğleden sonra yeni bir iş arkadaşının kod değişikliğini inceliyordu. Değişiklik basitti: müşterinin teslimat adresini alıp kargo firmasına gönderilecek etikete yazan küçük bir fonksiyon. Etiket formatında adres alanı yüz yirmi karakterle sınırlıydı ve fonksiyon adresi bu alana kopyalıyordu. Kod düzgün görünüyordu, testler geçiyordu.

Selin bir şey denedi. Test verisine gerçek bir adres yazdı: Kocaeli'de uzun bir mahalle adı, bir site adı, blok, kat, daire ve tarifli bir not. Adres yüz yirmi karakteri aşıyordu. Şirketin kullandığı programlama dili bunu yakaladı ve fonksiyon bir hata vererek durdu. Etiket basılmadı, ama başka bir şey olmadı.

Selin iş arkadaşına döndü ve sordu: Aynı kodu, etiket yazıcısının kendi içinde çalışan, otuz yıllık bir dilde yazılmış küçük programda yazsaydın ne olurdu? O dilde fazla karakterler hata vermeden, ayrılan alanın ötesine, bellekte o anda başka bir şeyin durduğu yere yazılabilirdi. Bir müşterinin uzun adresi, yazıcının başka bir ayarını sessizce bozabilirdi. Bu ders o sorunun arkasındaki şeyi anlatıyor: yazılım nasıl çalışır ve sıradan bir hata nasıl bir zafiyete dönüşür.

Tek fikir

Yazılım, insanların yazdığı talimatların makinenin anlayacağı biçime çevrilmesidir ve insanlar hata yapar. Bir hata, programın beklemediği bir girdiyle beklemediği bir şeyi yapmasına izin veriyorsa, artık yalnız bir hata değil, birinin kullanabileceği bir zafiyettir.

Nasıl çalışır

İşletim sisteminin programları çalıştırdığını ve her sürecin bir hesabın yetkisini taşıdığını gördük. Peki programın kendisi nedir?

İşlemci kaynak kodu doğrudan anlamaz; yalnız kendi komutlarını, sayılarla yazılmış makine kodunu anlar. Aradaki çeviri iki temel yolla yapılır.

Bu ayrımın güvenlik açısından bir sonucu var. Derlenmiş bir programın kullanıcıya ulaşan hâli makine kodudur ve kaynak kodu okumak çoğu zaman mümkün değildir; ne yaptığını anlamak için özel analiz gerekir. Yorumlanan bir betik ise genellikle düz metin olarak durur ve açılıp okunabilir. Ama hangisi olursa olsun, programın davranışını belirleyen şey yazan kişinin kurduğu mantıktır ve o mantıkta bir boşluk varsa, çeviri yöntemi onu kapatmaz.

Şimdi Selin'in sorusuna gelelim. Bir program bellekte bir veri için belirli büyüklükte bir alan ayırır; yüz yirmi karakterlik bir adres alanı gibi. Ardından gelen veri bu alana yazılır. Program gelen verinin büyüklüğünü kontrol etmezse ve dil de bunu kendisi engellemezse, fazla kısım alanın sınırını aşıp bellekte yanındaki bölgeye yazılır. O bölgede programın başka bir değişkeni, bir ayarı ya da programın bir sonra hangi talimata gideceğini gösteren bilgi durabilir.

Bu, kasıtlı olmayan bir hata olarak başlar: program çöker ya da tuhaf davranır. Ama girdiyi kontrol edebilen biri, yani adresi, dosyayı ya da ağdan gelen mesajı kendisi hazırlayan biri, aşan kısmın ne olacağını da seçebilir. Hata o noktada zafiyete dönüşür: programı, yazanın hiç düşünmediği bir şeyi yapmaya zorlamak mümkün hâle gelir. Bu akademi o zorlamanın nasıl yapılacağını öğretmez; öğrettiği, bu tür hataların neden bu kadar tehlikeli olduğu ve nasıl önlendiğidir.

Bu, kuramsal bir kaygı değil.

Bu derste dikkat edilmesi gereken bir ayrım var: her hata zafiyet değildir. Bir butonun yanlış renkte görünmesi bir hatadır ama kimse onu kullanarak bir şey elde edemez. Bir hata, bir saldırganın kontrol edebildiği bir girdiyle tetiklenebiliyor ve programın gizliliğini, bütünlüğünü ya da erişilebilirliğini bozabiliyorsa zafiyettir. Modül 1'in ilk dersinde zafiyeti tehdidin varlığa ulaşmasını mümkün kılan zayıflık olarak tanımlamıştık; yazılım zafiyetleri bu tanımın en yaygın örneğidir.

Sahada

Savunma

Yazılım hatalarına karşı savunma iki tarafta kurulur: yazılımı yazanlar ve yazılımı kullananlar.

Yazılımı yazanlar için ilk savunma, dışarıdan gelen her veriye güvenmemektir. Kullanıcının yazdığı bir adres, yüklenen bir dosya, ağdan gelen bir mesaj; hepsinin uzunluğu, biçimi ve türü kullanılmadan önce kontrol edilir. Bu, girdi doğrulama olarak adlandırılır ve Seviye 6'da ayrı bir derste işlenecek. İkinci savunma, bellek güvenliği sağlayan dilleri tercih etmektir; bu diller sınır dışı yazmayı ve okumayı programın çalışması sırasında engeller ve bir hata sınıfını bütünüyle ortadan kaldırır. Devlet kurumları ve büyük yazılım şirketleri son yıllarda yeni projelerde bu dillere geçişi açıkça önermeye başladı. Üçüncü savunma, Selin'in yaptığı gibi kod incelemesi ve tam olarak beklenmedik durumları deneyen testlerdir.

Yazılımı kullananlar için savunma daha basittir ama aynı derecede önemlidir. Kullandığın yazılımı yazan kişinin hata yaptığını varsay; bu bir hakaret değil, istatistiktir. O hatalar bulunup düzeltildiğinde düzeltmenin sana ulaşmasını sağla, yani güncellemeleri kur; bunu bir sonraki derste ayrıntılı konuşacağız. Bir yazılımın, özellikle ağdan girdi alan bir yazılımın, kimden girdi alabileceğini sınırla; Bora'nın cihazının yalnız tek bir sistemden mesaj alabilmesi, bir hata henüz düzeltilmemişken bile ona ulaşabilecek kişi sayısını küçültür. Ve gereksiz yazılımı kaldır; kurulu olmayan bir programın zafiyeti seni etkilemez.

Son olarak hataları ciddiye alan bir kültür kurmak gerekir. Bir yazılım beklenmedik bir girdiyle çöküyorsa, bu yalnız bir rahatsızlık değil, bir uyarı olabilir. Böyle bir durumu üreticiye ya da kurumundaki ilgili ekibe bildirmek, bir sonraki zafiyetin önlenmesine katkıdır.

Uygulama

Bu uygulamada kullandığın bir yazılımın gerçek bir zafiyet kaydını okuyacaksın. Bütün adımlar yalnız kamuya açık kayıtları okumaktır.

Kayıtları okurken çoğunun teknik dille yazıldığını göreceksin ve her kelimeyi anlaman gerekmiyor. Amaç, kullandığın yazılımın da düzenli olarak hatalar içerdiğini, bunların sınıflandırılıp kayda geçtiğini ve düzeltmelerin bir sürüm numarasıyla geldiğini kendi gözünle görmek.

Defter: Tehditler bölümüne okuduğun zafiyet kaydının kodu, CWE türü ve düzeltmenin geldiği sürüm; envanterde o yazılımın satırına kendi sürümün ve güncel olup olmadığı.

Hata köşesi

Yaygın yanlış"Zafiyet, kötü yazılımcıların hatasıdır."
Doğrusu

Zafiyetler her ölçekteki yazılımda, en deneyimli ekiplerin yazdığı kodda da bulunur; Microsoft gibi büyük bir şirket bile her yıl verdiği zafiyet numaralarının büyük bölümünün bellek güvenliği hatalarından kaynaklandığını kendisi açıkladı. Sorun bireysel beceri değil, insan yazımı kodun doğası ve bazı dillerin bu hatalara izin vermesidir.

Yaygın yanlış"Kaynak kodu gizli olan yazılım daha güvenlidir."
Doğrusu

Kodu gizlemek hataları ortadan kaldırmaz, yalnız onları bulmayı zorlaştırır; hem savunanlar hem saldırganlar için. Pek çok zafiyet kaynak kodu hiç görülmeden, programın davranışı incelenerek bulunur. Güvenlik, kodun gizliliğine değil, kodun doğru yazılmasına, incelenmesine ve hızla düzeltilmesine dayanır.

Yaygın yanlış"Program çöküyorsa sadece kalitesizdir, güvenlikle ilgisi yok."
Doğrusu

Beklenmedik bir girdiyle çöken bir program, o girdiyle belleğinde beklenmedik bir şey olduğunu gösteriyor olabilir. Pek çok bellek güvenliği zafiyeti ilk olarak sıradan bir çökme olarak fark edilmiştir. Tekrarlayan çökmeler üreticiye bildirilmeye değer.

Etik ve sınırlar

Bu ders sana bir hatanın nasıl zafiyete dönüşebileceğini anlattı ve bazı okurlar bunun ardından bir programı "çökertip çökertemeyeceğini" denemek isteyebilir. Bunu yalnız kendi yazdığın kodda ya da kendi kurduğun, dış dünyaya kapalı bir deneme ortamında, kendine ait yazılım kopyalarında yaparsın. Başkasının çalışan bir hizmetine bilerek bozuk girdi göndermek, sahibinin izni yoksa, hizmetin işleyişini bozmaya yönelik bir eylem olarak değerlendirilebilir. Kendi kullanımın sırasında tesadüfen bir hata bulursan, ki bu sık olur, onu kurcalamadan üreticiye bildirirsin; birçok üretici bunun için bir adres ve kurallar yayımlar. Zafiyet kayıtlarını okumak ise herkese açık ve tamamen meşrudur; savunmanın en temel araçlarından biridir.

Kapanış

  1. Yazılım, insanların yazdığı kaynak kodun derleme ya da yorumlama yoluyla makinenin anlayacağı biçime çevrilmesidir; çeviri yöntemi, yazanın kurduğu mantıktaki boşluğu kapatmaz.
  2. Bir hata, saldırganın kontrol edebildiği bir girdiyle tetiklenip programın gizliliğini, bütünlüğünü ya da erişilebilirliğini bozabiliyorsa zafiyete dönüşür; bellek güvenliği hataları bunun en yaygın ve en tehlikeli örneklerindendir.
  3. Yazanlar için savunma girdiyi doğrulamak, bellek güvenliği sağlayan dilleri tercih etmek ve kodu incelemektir; kullananlar için ise güncellemek, yazılımın girdi aldığı yerleri sınırlamak ve gereksiz yazılımı kaldırmaktır.

Üç soru

  1. Bir programın yüz yirmi karakterlik bir alana daha uzun bir adres yazması iki farklı dilde nasıl farklı sonuçlar doğurabilir?
  2. Her yazılım hatası bir zafiyet midir? Ayrımı neye göre yaparsın?
  3. Bora, laboratuvar cihazının güncellemesini hemen kuramadığı günlerde riski nasıl küçük tutuyor?

Yanıtlar

  1. Bellek güvenliği sağlayan bir dilde, alanın sınırını aşan yazma işlemi program çalışırken yakalanır ve program bir hata vererek durur; etiket basılmaz ama başka bir şey bozulmaz. Bu güvenceyi sağlamayan bir dilde ise fazla karakterler ayrılan alanın ötesine, bellekte yanındaki bölgeye yazılabilir ve orada duran başka bir veriyi ya da programın akışını belirleyen bilgiyi sessizce bozabilir.
  2. Hayır. Bir hata, ancak birinin kontrol edebildiği bir girdiyle tetiklenebiliyor ve sistemin gizliliğini, bütünlüğünü ya da erişilebilirliğini bozabiliyorsa zafiyettir. Görünüşle ilgili bir hata ya da kimsenin dışarıdan tetikleyemeyeceği bir sorun hata olarak kalır; dışarıdan gelen veriyle belleğin bozulmasına yol açan bir sorun ise zafiyettir.
  3. Cihazın ağdan girdi alabileceği yerleri sınırlayarak: bir kural, cihaza yalnız laboratuvar bilgi sisteminin mesaj göndermesine izin veriyor. Zafiyet yerinde dursa bile, onu tetikleyecek bozuk mesajı gönderebilecek kaynak sayısı çok küçülür ve risk, güncelleme kurulana kadar düşük kalır.

Sonraki derse köprü

Bu derste yazılım hatalarının kaçınılmaz olduğunu ve düzeltmelerin bir sürüm numarasıyla geldiğini gördük. Uygulamada belki de kullandığın bir yazılımın güncel olmadığını fark ettin. Sıradaki ders güncellemenin neden önemli olduğunu ele alıyor: yamanın kapattığı açığı, güncellemeyi ertelemenin bedelini ve desteği biten bir cihazın neden ayrıca düşünülmesi gerektiğini.

Anlamadığın bir yer mi var?

Mentor yalnız bu dersin metnine dayanarak cevap verir. Metinde geçmeyen bir şey sorarsan uydurmaz, geçmediğini söyler.