Sunday, February 23, 2020

Kısa fıkra: "Açık kaynaklı yazılımlarda arka kapı olmaz"

Geçtiğimiz hafta Windows sistemlere bulaşmış olabilecek zararlı yazılımları ve izinsiz erişimleri tespit etmeye yardımcı olabilecek çok basit bir uygulamayı ücretsiz yayımladım. (Uygulamanın ayrıntılarına https://sparta.com.tr/rontgen/ adresinden ulaşabilirsiniz.) Sonrasında çıkan 1-2 trolün söylediklerini ciddiye aldığımdan değil, açık kaynak yazılımların güvenlik seviyesine bakmak için iyi bir fırsat olduğu için yazıyorum.



“Açık paketlerde problem yok” yazmış mesela bir tanesi… Açık kaynaklı yazılımlara yerleştirilen arka kapılara bakalım öyleyse.

Güvenlikle ilgili başımıza dert olan birkaç hurafeden biridir bu. “Linuxlara virüs bulaşmaz” ve “MAClere kimse virüs yazmıyor” gibi bilimsel herhangi bir temele bağlayamadığımız konulardan birisi.

Açık kaynak kodlu yazılımlar daha mı güvenilir?
Genel algı bu yazılımların kaynak kodlarının açık olması sebebiyle pek çok kişi tarafından denetlendiği, dolayısıyla arka kapı yerleştirmenin mümkün olmadığı yönündedir. Ne yazık ki bu tezi çürütecek pek çok olay yaşandı. Bunlar phpmyadmin gibi çok geniş bir kullanıcı sayısına sahip yazılımları da etkiledi, daha az bilinen ssh-decorator Python kütüphanesini de etkiledi. Öncelikle herhangi bir açık kaynak yazılım projesine arka kapı eklenmesinin çok zor olmadığını kabul etmek gerekir. Dolayısıyla konu eklenen arka kapının tespit edilememesine geliyor. 

Açık kaynak kodlu yazılım projelerini iki ana gruba ayırabiliriz; ürün ve modül. “Ürün” olarak adlandırabileceklerimiz tek başına kullanılan yazılımlardır (örn: ProFTD, VSFTP veya PHPmyAdmin). “Modül” dediklerimse yukarıda sözünü ettiğim “ssh-decorator” gibi tek başına kullanılmayan ancak başka kodlar içerisine dahil edilenlerdir.

2018 yılında açık kaynaklı event-stream Javascript kütüphanesine bir arka kapı yerleştirildiği ortaya çıktı. Olay ortaya çıktığında event-stream kütüphanesi 2 milyondan fazla yazılım içerisinde kullanılıyordu. Açık kaynak yazılımın güvenliğine ayrıca dikkat edilmesi gerektiğine dair önemli bir nokta çünkü bunların bir kısmı bizim “ticari” olarak nitelendirdiğimiz yazılımların içerisinde. Yazılım geliştiriyorsanız veya size özel bir yazılım geliştiriliyorsa bunun içerisindeki açık kaynak yazılım oranını takip etmenizde fayda var. Böylece, en basiti GitHub’da bedava olan kodlara mı para veriyorsunuz yoksa gerçekten size özel mi yazılıyor görebilirsiniz. Bu konuda “açık kaynak kod oranı tespit hizmeti” veriyoruz ve bir müşterimizde açık kaynak kod oranı %90’nın üzerinde bir projeye rastladık. Bunun yanında bünyenizde kullanılan yazılımların içerisinde ortaya çıkması muhtemel bir güvenlik açığının da sizi nasıl etkileyeceğini takip etme şansınız olur. Biraz önce sözünü ettiğimiz event-stream kütüphanesi kuruluşunuzun bünyesinde bulunan açık kaynaklı veya ticari lisanslı herhangi bir yazılım içerisinde kullanılmış mı mesela?

Arka kapılar yazılımlardaki tek tehlike mi?
Asıl sorun daha büyük; yazılım hataları. Açık kaynak veya ticari lisanslı olsun yaızlımı geliştirenlerin tamamen iyi niyetli olduklarını düşünelim. Yaızlımın tasarlanma aşamasından geliştirmesine kadar pek çok noktada hatalar yapıldığını görüyoruz. Bunların sonucunda yazılımlarda güvenlik açıkları ve çeşitli hatalar meydana gelmektedir. Çok büyük açık kaynak kodlu projelerde birden fazla yazılımcının çalıştığını görebiliriz ancak daha küçük modüllerde genellikle tek kişinin ve günlük mesaisinin dışında kalan zamanlarda çalıştığı bir senaryo daha gerçekçi oluyor. Bu durumda insanın aklına şu geliyor; onlarca yazılımcısı, test mühendisi ve güvenli yazılım geliştirme süeci ve yatırımı olan Microsoft hata yaparken bu arkadaşların hata yapma ihtimali yok mu gerçekten? Elbette var ve genelde yazılım test konusuna ağırlık verilmediği için basit hataların (örn. Tanımlanmış değişkenin kod içerisinde hiç kullanılmaması, girdinin temizlenip çıktının temizlenmemesi, vb.) daha sık görülmesi muhtemeldir. Hataların bir kısmının yine yazılım geliştirme hijyen kurallarına uymamaktan kaynaklandığını görebiliyoruz (örn. Sınıfların tek bir işlev yapması, controller sınıflarının olmaması, vs.). 

2018 yılında BitPay ve CoPay kriptopara cüzdanı uygulamalarında kullanılan bir NodeJS kütüphanesinin arka kapı barındırdığı açıklanmıştı. Yazılım tedarik zincirimizin oluşturduğu riskleri değerlendirmezsek bizlerin de, özellikle yerli ve milli yazılım geliştirme konusunda gelişmeler yaşanırken, başını ağrıtabilecek bir konu haline gelebilir. Bu örnekte NodeJS kütüphanesine eklenen zararlı kod parçası sıradan bir arka kapı değil, özellikle kriptopara cüzdanı uygulamalarında kullanılması halinde devreye girmek üzere planlanmış bir arka kapıydı. Özetle birisi şunu düşünmüş: “Ticari lisanslı kriptopara cüzdanları var, bunlardaki paraları çalmak lazım. Bunun için ben arka kapıyı açık kaynak koldu bileşene yerleştireyim, nasılsa fark etmezler”. Kısmen haklıymış diyebiliriz çünkü arka kapının tespit edilmesi 3 aydan fazla sürmüş ve bu arada kriptopara cüzdanlarının 5.0.2 ile 5.1.0 arasındaki sürümlerini etkilemiş.

Nasıl oluyor da gözden kaçıyor?
Yukarıda verdiğim kriptopara cüzdanı örneğinde kullanılan arka kapı kodunun “okunabilir” formata getirilmiş hali aşağıda;


… Evet? Binlerce satırlık açık kaynak kodlu bir proje içerisinde hemen göze çarpacağını iddia edemezsiniz herhalde. Kaynak kod içerisine yerleştirilecek arka kapılar hayal ettiğimiz gibi “GET” veya “POST” olarak gönderilen bir HTTP talebinden biraz daha farklıdır. Bu da arka kapıları tespit etmeyi oldukça zorlaştırıyor. Üstelik proje içerisinde özellikle kaynak kod incelemesi yapmaya gönüllü olmuş kimse yoksa zaten tespit edilmesi neredeyse imkânsız. Bu kodu herhangi bir projenin Türkçe dil desteği paketine rahatlıkla yerleştirebiliriz. (Laf aramızda İstihbaratta çalışsam gece gündüz bu işle uğraşan bir ekibim olurdu ki hiç değilse belli başlı açık kaynaklı yazılımların kullanıldığı sistemlere erişimimiz olsun).

Açık kaynaklı yazılımların güvenliği
Açık kaynak kodlu bir yazılım kullanıyorsanız veya kuruluşunuza özel yazılımlar geliştiriliyorsa, bütçenizin el verdiği ölçüde, aşağıdaki kontrol maddelerini yerine getirmeye çalışmakta fayda olur;
  • Açık kaynak kod kullanım oranını takip edin
  • Kullanılan açık kaynak kod parçalarının envanterini tutun
  • Güvenli yazılım geliştirme prensiplerine uyun
  • Kaynak kod analizi yapın
  • Yazılım testlerini yapın
  • Güvenlik testlerini yapın
  • Güncellemelerden sonra testleri tekrarlayın
Yazılım güvenliği teoride basit pratikte neredeyse imkansıza yakın bir konu olarak gündemimizde olmaya devam edecek.
 

No comments:

Post a Comment