Kaynak koduna yerleştirilmiş görünmeyen kodlar

Cambridge’deki araştırmacılar, kaynak koduna gizli kod yerleştirmek için kullanılan Truva Atı Kaynağı yöntemini anlatıyor.

Cambridge Üniversitesi’nden uzmanlar, çoğu modern derleyiciyi etkilediğini ifade ettikleri bir güvenlik açığı olduğunu açıkladılar. Bu yeni bir saldırı yöntemi, geliştirme araçlarındaki geçerli bir özelliği kullanarak farklı bir kaynak kodu göstermesine rağmen tamamen başka bir şey derliyor. Bu, Unicode denetim karakterlerindeki özellik sayesinde gerçekleşiyor.

Saldırıların yeniden sıralanmasıyla ilgili karakterleri biçimlendiren Unicode yönlülüğü. Kaynak.

 

Bazı editörler bunları gösterse de çoğu zaman denetim karakterleri, kodun geri kalanıyla birlikte ekranda görünmez ancak bir şekilde metni değiştirirler. Örneğin bu tabloda, Çift Yönlü Unicode (bidirectional — bidi) Algoritmasının kodları yer alıyor.

Büyük olasılıkla biliyorsunuzdur, bazı diller soldan sağa (örneğin İngilizce), bazıları da sağdan sola (örneğin Arapça) yazılır. Kod yalnızca bir dil içerdiğinde herhangi bir sorun yoktur, ancak örneğin bir satırda İngilizce ve Arapça sözcükler olması gibi gereken hallerde bidi kodları metnin yönünü belirler.

Yazarlar çalışmalarında, Python kodundaki yorum bitiriciyi satırın ortasından sonuna taşıyanlar gibi kodları kullandılar. Yalnızca birkaç karakteri kaydırmak için RLI kodu uyguladılar ve kalanı değiştirilmemiş şekilde bıraktılar.

Bidi kodlarını kullanan Python kodu güvenlik açığı örneği. Kaynak.

 

Sağda, programcıların kaynak kodunu kontrol ederken gördükleri; soldaysa, kodun yürütüldüğü hali yer alıyor. Çoğu derleyici denetim karakterlerini yok sayar. Kodu kontrol eden herkes beşinci satırda yer alan kodun zararsız bir yorum olduğunu düşünür, ancak gerçekte kodun içine gizlenen bir erken dönüş (early-return) komutu, programın banka hesabı bakiyesini borçlandıran işlemi atlamasını sağlar. Diğer bir deyişle bu örnekteki simüle edilen bankacılık programı, parayı verecek ancak hesap bakiyesinden düşmeyecektir.

Güvenlik açığı neden tehlikeli?

İlk bakışta, güvenlik açığı çok basit gibi görünüyor. Sonuçta kim kaynak kodunu denetleyen kişileri kandırmak için görünmez karakterler ekler ki? Buna karşın sorunun, bir güvenlik açığı tanımlayıcısı (CVE-2021-42574) kullanmak zorunda kalacak kadar ciddi olduğu düşünüldü. Yazarlar, geliştiricilere en çok kullanılan derleyicileri bildirerek, bu derleyiciler için makale yayınlanmadan önce yama çıkarma fırsatı sundular.

Raporda, genel hatlarıyla temel saldırı yetenekleri anlatılıyor. Yorumların içine bir komut gizlemek ve örneğin ekranda görünen bir satırdaki herhangi bir şeyi gizlemek için iki yürütme stratejisi kullanılıyor. Teoride, komuta benzeyen ancak aslında bir yorumun parçası olan ve yürütülmeyecek bir kod oluşturmak gibi tam tersi bir durum da söz konusu olabilir. Bu güvenlik açığından yararlanma konusunda elbette çok daha yaratıcı yöntemlerin kullanılması söz konusu.

Örneğin birisi bu yöntem ile karmaşık bir tedarik zinciri saldırısı gerçekleştirmek için yüklenici tarafından şirkete sunulan ve doğru gibi görünen ancak istendiği şekilde çalışmayan bir kod kullanabilir. Ardından ürün piyasaya sürüldükten sonra başka bir taraf, müşterilere saldırmak için bu “alternatif fonksiyonu” kullanabilir.

Peki güvenlik açığı gerçekte ne kadar tehlikeli?

Makale yayınlandıktan kısa bir süre sonra programcı Russ Cox Truva Kaynağı saldırısı konusundaki eleştirilerini ifade etti. En hafif tabirle, bu yöntem onu çok etkilememişti. Bununla ilgili öne sürdüğü argümanlar ise şu şekilde:

  • Söz konusu yöntem hiç de yeni bir saldırı değil,
  • Birçok kod düzenleyicide, “görünmeyen” kodu göstermek için söz dizim vurgusu (syntax highlighting) özelliği bulunuyor,
  • Derleyiciler için yama yayınlanmasına gerek yok — yanlışla yapılan veya kötü niyetli hataları tespit etmek için kodun dikkatlice kontrol edilmesi yeterli.

Gerçekten de, Unicode denetim karakterleriyle ilgili sorunun ortaya çıkış tarihi 2017‘ye kadar gidiyor. Homogliflerle ilgili benzer – aynı görünen ancak farklı kodları olan karakterler – ve ayrıca manuel kontrollerde gereksiz kodların sızmasını sağlayabilen sorun da pek yeni sayılmaz.

Bununla birlikte Cox’un eleştirel analizi, sorunun varlığını inkar etmiyor, aksine raporları, gazeteci Brian Krebs’in korkutucu Tüm Kodların Güvenliğini Tehdit Eden ‘Trojan Kaynağı’ Hatası yazısında olduğu gibi aşırı dramatik olmakla suçluyor.

Gerçekten ortada bir sorun var ama neyse ki çözümü de oldukça basit. Halihazırda yayınlanan veya yakında yayınlanması beklenen tüm yamalar, bu tür karakterlerin yer aldığı kodun derlenmesini engelleyecektir. (Mesela, Rust derleyicisinin geliştiricileri tarafından paylaşılan bu güvenlik danışma belgesine göz atın.) Kendi yazılım oluşturma araçlarınızı kullanıyorsanız, normalde kaynak kodunda bulunmaması gereken gizli karakterler için de benzer bir denetim eklemenizi öneriyoruz.

Tedarik zinciri saldırılarının tehlikeleri

Birçok şirket, geliştirme süreçlerini yüklenicilere yaptırıyor veya projelerinde hazır açık kaynaklı modüller kullanıyor. Bu durum da her zaman tedarik zinciri yoluyla düzenlenen saldırılarına açık kapı bırakıyor. Siber suçlular, bir yüklenicinin güvenliğini ihlal etmiş olabilir veya kodu açık kaynaklı bir projeye gömebilir ve kötü amaçlı kodu yazılımın nihai sürümüne yerleştirebilir. Kod denetimleri genellikle bu tür arka kapıları ortaya çıkarsa da eğer denetim yapılmıyorsa, son kullanıcılar yazılımı güvenilir kaynaklardan edinmesine rağmen verilerini kaybedebilir.

Trojan Kaynağı, oldukça zekice düşünülmüş bir saldırı örneğidir. Saldırganlar, megabaytlarca kötü amaçlı kodu nihai bir ürüne yerleştirmeye çalışmak yerine, yazılımın kritik bir parçasına tespit edilmesi zor bir ekleme ile yerleştirmek ve yıllarca bundan faydalanmak için böyle bir yaklaşımı kullanabilir.

Kendinizi korumanın yolları

Truva Atı Kaynağı türü saldırılara karşı korunmak için:

  • Kullandığınız programlama dili derleyicilerine ilişkin yamaya yayınlandıysa, kullandığınız tüm derleyicileri güncelleyin,
  • Kaynak kodunda belirli bir dizi denetim karakterini algılayan kendi komut dosyalarınızı yazın.

Daha geniş anlamda, potansiyel tedarik zinciri saldırılarına karşı mücadele etmek için hem manuel kod denetimleri hem de bir dizi otomatik test yapılmasını gerekiyor. Tüm güvenlik mekanizmasını bozabilecek bu basit hatayı tespit etmeye çalışırken kendi yazdığınız koda siber suçluların perspektifinden bakmanın asla zararı olmaz. Bu tür bir analiz için kurum içi kaynaklara sahip değilseniz, şirket dışından uzmanlar ile bağlantı kurmayı düşünün.

İpuçları