Javada Yazılım Güvenliği

Furkan Yesilyurt
Kodluyoruz
Published in
4 min readDec 14, 2021

--

Yazılım ve sistemlerde güvenlik konusunda aklımıza ‘Who Am I’ filmine ait ikonlaşmış bir ifade olan “No system is safe!” geliyor. Türkçe anlamıyla “Hiçbir sistem güvenli değildir.” Peki böyle bir durumda biz yazılım geliştiriciler olarak ne yapmalıyız? Geliştirdiğimiz yazılımların daha güvenli hale gelebilmesi için neler yapabiliriz? Bu yazımızda JAVA’da yazılım geliştirirken güvenlik için neler yapabileceğimizden bahsedeceğiz.

Siber güvenlik uzmanlarının sürekli tekrar ettiği bir cümleyi hatırlayalım. “Güvenlik bir ürün değil, süreçtir.” Satın aldığımız herhangi bir güvenlik ürünü bize tam anlamıyla koruyamaz. ‘X ürününü satın aldım ve artık güvendeyim” mentalitesi yanlıştır. Güvenlik denilen süreç; güvenlik politikaları oluşturma, bu politikaları uygulamaya geçirme ve bunun sonuçlarını düzenli olarak takip etme gibi adımları içerir. Bu yüzden güvenlik süreci, yazılım geliştirme sürecine entegre edilmelidir. Bu entegrasyon durumu bizim karşımıza ‘Güvenli Yazılım Geliştirme(GYG)’ veya ‘Secure Software Development Life Cycle(SDLC)’ süreçlerini ortaya çıkarmaktadır.

Günümüzde SAMM, BSIMM2 ve Microsoft SDL gibi çalışmalar GYG süreçleri adına ön plana çıkmaktadırlar. Özellikle bir OWASP projesi olan SAMM (Software Assurance Maturity Model) açık bir framework olarak organizasyonların yapılarına ve güvenlik ihtiyaçlarına göre uyarlanabilen örnek bir model ortaya koymaktadır. SAMM ile var olan yazılım sürecinizin güvenlik açısından hangi konumda olduğunu belirleyebilir ve daha güvenli bir yazılım için gelecekte neler yapmanız gerektiğinin yol haritasını çıkarabilirsiniz.

Güvenli bir yazılım geliştirme süreci için değinilmesi gereken yöntemler;

1. TASARIM

Kod yazarken programın nasıl çalışacağını düşünmenin yanı sıra nasıl çalışmayacağını da hesaba katılmalı. Kendimizi kötü niyetli saldırganın yerine koyarak yazdığımız kodda açık aramalıyız. Örneğin; char olarak girilmesi beklenen girdinin char olmaması durumunu ve bu durumda programın nasıl aksiyon alacağını planlamalıyız.

Java’nın kalıtım ve polimorfizm özelliklerini kullanarak spagetti kod diye tabir edilen okunması zor ve gereksiz kod barındıran yazılımlardan kaçınılmalı. Bu özellikleri kullanırken de üst sınıfta yapılan değişikliklerin ondan miras alan alt sınıflarda güvenlik açığı oluşturmadığından emin olunmalı. Ayrıca erişim belirleyicileri çok iyi tanıyarak metot ve değişken tanımlamalarında gereğinden fazla yetki verilmesinden kaçınmalıyız.

Yazılan yazılım multithread olarak tanımlandı ise threadler arasındaki senkronizasyona dikkat edilmesi gerekir. Aksi takdirde paralel çalışan kanalların aynı anda bir veriye erişim sağlayarak o veriyi değiştirmeye çalışmaları istenmeyen sonuçlar doğuracaktır.

2.GİZLİLİK VE MAHREMİYET

Gizli ve mahremiyeti ilgilendiren kritik veriler ile işlem yaparken dikkatli olunmalı. Örneğin parola ve kimlik numarası gibi kritik bilgileri log dosyalarına yazmayın. Kendi kodunuzda buna engel olsanız bile sisteminize entegre ettiğiniz bir kütüphanenin de bunu yapmadığından emin olun.

Program içerisinde bize yardımcı olduğunu düşündüğümüz exceptionları kullanırken ihtiyaçtan fazla bilgi vermemesine dikkat edilmeli. Sistem hakkında bilgi almak isteyen saldırgan dönen bu hatalardan bilgi toplayabilir.

Parola ve şifreleme anahtarı gibi kritik bilgileri String olarak tanımlamayın: String değiştirilemez bir sınıftır ve String olarak tanımladığınız veriyi silseniz bile daha sonrasında bellekte izlerini bulma riski vardır. Bunun yerine karakter ya da bayt dizisini tercih edin. Buna ek olarak kritik veri ile işiniz bittiğinde kritik veriyi hafızadan silen private olarak tanımlı bir metodu oluşturun ve kullanın.

3.GİRDİ DENETİMİ

Kullanıcı girdisine güvenilmemelidir. Girilen her girdi tipine, uzunluğuna, içerebileceği karakter kümesine göre denetlenmelidir.

Web güvenliği alanında en çok karşılaşılan tehditlerden biri olan SQL enjeksiyon, kullanıcı girdisinin denetlenmemesinden ya da yetersiz denetlenmesinden kaynaklanmaktadırlar. Sorgu oluşturmak için java.sql.Statement yerine java.sql.PreparedStatement kullanılmalıdır. PreparedStatement, özel karakterlerden otomatik olarak kaçtığı için SQL enjeksiyon saldırılarını önlememize yardımcı olur. Stored Procedure kullanılmalıdır. Saklı yordam (proc, storp, sproc, StoPro, StoredProc, StoreProc, sp veya SP olarak da adlandırılır), ilişkisel bir veritabanı yönetim sistemine (RDBMS) erişen uygulamalar için kullanılabilen bir alt yordamdır.

Web güvenliği alanında en çok karşılaşılan tehditlerden bir diğeri olan XSS, kullanıcı girdisinin çıktı kodlaması (output encoding) yapılmamasından ya da hiç/yetersiz denetlenmemesinden kaynaklanmaktadır. XSS, diğer kullanıcılar tarafından görüntülenen web sayfalarına istemci taraflı kodun enjekte edilmesine imkân verir.

4. SERİLEŞTİRME

Serileştirme bellekteki nesnelerin bayt dizisine çevrilmesi işlemidir ve bu sayede nesneler dosya sisteminde ya da veritabanında saklanabilirler. Bu işlemin tersi olarak bir bayt dizisi de tekrar başlangıçtaki nesneye dönüştürülebilir (deserialization). Serileştirme ve ilk nesneye dönüştürme işlemleri esnasında özellikle güvenlik açısından kritik sınıflar için problemler ortaya çıkabilir. Bu durumu engellemek için kritik olan sınıfları serileştirmemek daha güvenli olacaktır.

5.ERİŞİM KONTROLÜ

Erişim kontrolü sayesinde ilgili yürütülen kodun neyi yapıp neyi yapamayacağını kontrol edebilirsiniz. Örneğin bir dosyayı okuma/yazma hakkı var mı, sistemin hangi özellik (property) değişkenlerini okuma/yazma hakkı var, programı sonlandırma hakkı var mı ya da ağ üzerinden hangi bilgisayara erişim hakkı var gibi kontrollerin yapılması mümkün olmaktadır. Erişim kontrolü konseptini anlamak için SecurityManager, AccessController, AccessControlContext, Policy, Permission ve ProtectionDomain sınıflarını ve aralarındaki ilişkileri iyi anlamak gerekmektedir.

Gerektiğinde SecurityManager’ı aktif hale getirin: SecurityManager erişim kontrolünün merkezindeki öğedir. Ancak uygulamaların standart olarak SecurityManager’ı aktif değildir. Şayet uygulamanız güvensiz kodlar içerecekse (plug-inler gibi) ve bu sebeple erişim kontrolü yapmanız gerekiyorsa SecurityManager’ı aktif hale getirmeli ve gerekli erişim izinlerini politika (policy) dosyalarında tanımlamanız gerekmektedir.

SecuritManager’ı aktifleştirmek için Java, ‘Djava.security.manager‘ ve ‘Djava.security.policy=politika_dosyası’ seçenekleri ile birlikte başlatılmalıdır.

KAYNAKLAR

--

--