Güvenli Kod Geliştirme Uygulamaları: Bölüm 2

Haktan Emik
5 min readJun 14, 2020

--

OWASP Güvenli Kod Geliştirme Uygulamaları: Bölüm 2

Herkese Selam :)

Yazının ikinci bölümü ile devam ediyoruz. İlk bölümde; Input Validation, Output Encoding, Authentication and Password Management ve Session Management konu başlıkları üzerinde durmuştuk.

İlk bölüme, aşağıdaki bağlantıdan ulaşabilirsiniz.

OWASP tarafından yayınlanan “OWASP Secure Coding Practices Quick Reference Guide” çalışması referans alınarak, hazırlanmıştır.

Access Control:

  • Sadece güvenilir sistem objeleri kullanılmalıdır. (Örneğin, erişim yetkisi kararlarını almak için sunucu tarafındaki oturum objelerinin kullanılması)
  • Erişim yetkilerini kontrol etmek için uygulama genelinde tek bir bileşen kullanılmalıdır.
  • Yapılan her işlem için sunucu tarafında, yetki kontrolü sağlanmalıdır.
  • Uygulama üzerindeki korunaklı kaynaklar (bağlantılar, fonksiyonlar, nesneler vs.) sadece yetkili kullanıcılar tarafından erişilebilecek şekilde kısıtlanmalıdır.
  • Eğer, durum bilgisinin kullanıcı tarafında saklaması gerekiyorsa, şifreleme ve bütünlük denetimleri, sunucu tarafında kontrol edilmelidir.
  • Bir kullanıcının veya cihazın, belirli bir süre içerisinde gerçekleştirebileceği işlemler sınırlandırılmalıdır. İşlem sınırı, uygulamanın gereksinime bağlı olarak ayarlanmalıdır.
  • Referer başlık bilgisi üzerinden asla yetkilendirme denetimi sağlanmamalıdır. Örneğin, “Referer: example.com/admin” gibi admin yolundan geliyorsa, çeşitli işlemlerin yapılmasına izin ver gibi bir kontrol uygulanmamalıdır. Referer başlık bilgisinin kolaylıkla manipüle edilebileceği unutulmamalı, bu sebeple de sadece ek kontrollerde kullanılmalıdır.
  • Uzun süreli, kimliği doğrulanmış oturumlara izin veriliyorsa, ayrıcalıkların değişmediğin emin olmak için düzenli aralıklar ile kullanıcının yetkisi kontrol edilmeli ve söz konusu durum gerçekleşirse oturum sonlandırılarak, yeniden kimlik doğrulamaya zorlanmalıdır.
  • Hesap denetimi uygulanmalı ve kullanılmayan hesaplar, devre dışı bırakılmalıdır.
  • Uygulama, yetkilendirmenin sonlanması durumunda hesabın devre dışı bırakılmasını veya oturumun sonlandırılmasını desteklenmelidir.
  • Servis hesapları ve harici sistemler ile bağlantıda olan hesaplar, mümkün olabildiğince en az yetkiye sahip olmalıdır.
  • Uygulamanın, iş süreçlerini, veri türlerini ve erişim yetkilendirme ölçütlerini belgelemek ve erişimi uygun bir şekilde sağlayıp, kontrol etmek için erişim kontrol politikası oluşturulmalıdır.

Cryptographic Practices:

  • Tüm şifreleme işlemleri güvenilir bir sunucuda yapılmalıdır.
  • Tüm rastgele ifadelerin (sayılar, GUID’ler vs) tahmin edilemez olması amaçlandığından, şifreleme modülünün onaylanmış rastgele sayı üreteci kullanılarak, üretilmelidir.
  • Uygulama tarafında kullanılacak olan tüm şifreleme ve hashing algoritmaları, güçlü ve standartlara uygun olmalıdır.
  • Şifreleme anahtarlarının nasıl yönetileceğine ilişkin bir politika oluşturulmalıdır.

Error Handling and Logging:

  • Hata mesajlarında, sistem hakkında bilgi ifşasına sebep olabilecek durumlardan kaçınılmalıdır.
  • Stack Trace ve debug hata mesajları kapatılmalıdır.
  • Hata durumları ele alınarak, özel olarak hazırlanmış hata sayfaları kullanıcıya gösterilmelidir.
  • Tüm günlük (loglama) denetimleri güvenilir bir sistemde yapılmalıdır.
  • Güvensiz veriler içeren günlük dosyalarının, günlük görüntüleme arayüzünde veya yazılımda kod olarak yürütülemeyeceğinden emin olunmalıdır.
  • Günlükler, sadece yetkili kişiler tarafında erişilebilecek şekilde kısıtlanmalıdır.
  • Hassas bilgiler (oturum belirteçleri, parola bilgileri gibi) günlük dosyalarında saklanmamalıdır.
  • Tüm giriş doğrulama hataları, kimlik doğrulama işlemleri (özellikle başarısız olanlar), erişim denetimi hataları, sistem hataları, yönetici işlemleri, TLS bağlantıları hataları ve şifreleme hataları gibi durumlar günlüklere kayıt edilmelidir.
  • Günlüklerin, bütünlüğü kontrol edilmelidir.

Data Protection:

  • Kullanıcılar, sadece görevlerini yerine getirebilecek yetkiler ve bilgiler ile sınırlanmalıdır. En az ayrıcalıklar ile çalışacak şekilde tanımlanmalıdır.
  • Sunucu tarafında saklanan veriler dahi olmak üzere tüm hassas/önemli veriler, güçlü bir şifreleme algoritmasıyla şifrelenmelidir.
  • Kullanıcı tarafında saklanacak olan hassas veriler, düz metin olarak veya güvensiz bir şifreleme algoritmasıyla saklanmamalıdır.
  • Kullanıcı tarafından erişilebilen kod üzerinde, bilgi ifşasına sebep olabilecek yorumlar kaldırılmalıdır.
  • GET metodu üzerinden, hassas/önemli veriler taşınmamalıdır.
  • Hassas bilgiler içermesi beklenen form alanlarında, otomatik tamamlama özelliği devre dışı bırakılmalıdır.
  • Hassas bilgiler içeren sayfaların, kullanıcı tarafında önbelleğe alınması devre dışı bırakılmalıdır.
  • Uygulamadan veri dönen noktalar incelerek, iş akışına göre en az şekilde veri döndürülmesi sağlanmalıdır.

Communication Security:

  • İletişim, SSL/TLS üzerinden sağlanmalıdır. HTTP üzerinden gönderilen veriler, düz metin (clear text) olarak taşınmaktadır. Bu durum, olası bir ortadaki adam saldırısında (MiTM) trafiğin okunabilmesine neden olacaktır. Bu sebeple, SSL/TLS ile şifrelenmiş bir şekilde haberleşme sağlanmalıdır.
  • Kullanılan SSL/TLS sertifikasının, geçerli ve doğru alan adına sahip olması gerekmektedir.
  • Başarısız SSL/TLS bağlantıları, güvensiz bağlantılara geri dönmemelidir. HSTS gibi başlık bilgileri kullanılarak, trafik SSL/TLS’e zorlanmalıdır.
  • SSL/TLS sertifikaları, zayıf şifreleme ve hashing algoritmalarını desteklememelidir. (Örneğin, şifreleme olarak RC4 kullanılması yada imzalama için MD5 veya SHA1 kullanılması gibi)

System Configuration:

  • Kullanılan tüm bileşenlerin, en güncel versiyonları tercih edilmelidir. Kullanımda olan sürümler için yayınlanan yamalar takip edilerek, sistemlere geçildiğinden emin olunmalıdır.
  • Dizin listeleme kapatılmalıdır.
  • Gereksiz tüm işlevler ve dosyalar kaldırılmalıdır.
  • Uygulama üzerinde kullanılacak olan HTTP metotları belirlenerek, sadece izin verilen metotların kullanılması sağlanmalıdır.
  • Dönen cevaplardan, işletim sistemi, web sunucu ve kullanılan framework sürümleri kaldırılmalıdır. (Örneğin, Server: IIS 7.5 veya X-Powered-By: PHP/7.2 gibi)
  • Tüm bileşenlerin yer aldığı bir envanter oluşturulmalıdır. Bu envanterin takibi yapılarak, sürekli güncellenmesi sağlanmalıdır.
  • Test ve production ortamları birbirinden ayrılmalıdır. Test ortamı, sadece yetkili kişiler tarafından erişilecek şekilde kısıtlanmalıdır. Test ortamlarının, production ortamlar kadar güvenli bir yapıya sahip olmaması nedeniyle yetkisiz kişilerin, bu ortamlara erişebilmesi büyük risk taşımaktadır.

Database Security:

  • SQL Injection ataklarına karşı, prepared statement yapısı kullanılmalıdır.

Prepared Statement’ı kısaca özetlemek gerekirse, sorguyu ve sorguya dahil olacak verileri ayırır diyebiliriz. Şöyle ki, sorguya dahil olacak nesne, soru işareti “?” ile belirtilir. Ardından sorgu bu şekilde veri tabanına gönderilerek, hazırlanır. Kullanıcıdan gelen veri ile hazırlanan sorgu birleştirilir. Böylelikle, derlenmiş bir ifade ile kullanıcıdan alınan değer birleştirildiğinden dolayı SQL Injection ataklarının önüne geçilmektedir.

  • Girdi doğrulaması ve meta karakterler üzerinde encoding işlemi uygulanmalıdır.
  • Uygulama, veri tabanı üzerinde en az ayrıcalıklara sahip olmalıdır. Sadece, yapılması gereken işlemlere izin verilecek şekilde yetkilerin tanımlanması gerekmektedir.
  • Veri tabanına erişim için güçlü kimlik bilgileri kullanılmalıdır.
  • Veri tabanı bağlantı bilgileri, kaynak kod içerisinde statik olarak tanımlanmamalıdır.
  • Eğer, uygulama ve veri tabanı aynı sunucu üzerinde çalışıyorsa, veri tabanı servisi dış dünyaya kapatılmalıdır. Sadece, localhost üzerinde çalışacak şekilde yapılandırılmalıdır. Genellikle, uygulama ve veri tabanı farklı sunucular üzerinde hizmet vermektedir. Bu durumda, uygulama sunucu ve veri tabanı sunucusu üzerinde IP kısıtlaması yapılarak, sadece uygulama sunucu üzerinden erişilmesi sağlanmalıdır.

File Management:

  • Kullanıcıdan alınan değerler ile dinamik olarak dosya gösterilmesi durumu mevcutsa, beyaz liste ile izin verilen dosya adları kontrol edilmelidir.
  • Kullanıcılar tarafından yüklenebilecek dosya tipleri, beyaz liste yaklaşımı ile kontrol edilmelidir. (Örneğin, sadece JPG, PNG uzantılarına izin verilmesi gibi)
  • Yüklenen dosyanın içeriği kontrol edilmelidir.
  • Yüklenen dosyanın boyutu kontrol edilmelidir.
  • Kullacılar tarafından yüklenen dosyalar, uygulama ile aynı sunucuda saklanmamalıdır. (Örneğin, CDN gibi teknolojiler kullanılabilir.)
  • Dosyaların yüklendiği dizine, çalıştırma yetkisi verilmemelidir. Sadece, okuma yetkisinin verilmesi yeterli olacaktır.
  • Tam dosya yolu, asla kullanıcıya gönderilmemelidir.
  • Kullanıcılar tarafından yüklenen dosya adlarının, sunucu tarafında değiştirilmesi ek koruma sağlayacaktır.
  • Kullanıcılar tarafından yüklenen dosyalar, virüslere ve zararlı yazılımlara karşı taranmalıdır.

Memory Management:

  • Güvenilmeyen veriler için girdi ve çıktı kontrolü yapılmalıdır.
  • Tampon boyutunun belirtildiği kadar büyük olup, olmadı ikinci kez kontrol edilmelidir.
  • Ara bellek sınırları kontrol edilmeli ve ayrılan alanı geçme tehlikesi olmadığından emin olunmalıdır.
  • Kopyalama ve birleştirme işlemlerine geçmeden, tüm girdi dizelerini mantıklı bir uzunlukta kısaltılmalıdır.
  • Kaynaklar özellikle kapatılmalıdır. (Örneğin, bağlantı nesneleri ve dosya tanıtıcıları gibi)
  • Mümkün olduğunca çalıştırılamaz yığınlar kullanılmalıdır.
  • Bilinen zafiyetli fonksiyonlar kullanılmamalıdır. (Örneğin, printf, strcat, strcpy gibi)

General Coding Practices:

  • Ortak işlevler için, standartların kullanılması önerilmektedir.
  • Tüm doğrulama işlemleri sunucu tarafında yapılmalıdır.
  • Kullanıcıdan gelen verilere asla güvenilmemelidir.
  • Kullanıcıdan gelen veriler, doğrudan herhangi bir dinamik yürütme fonksiyonuna geçirilmemelidir.
  • Uygulama tarafından, doğrudan işletim sistemine komut gönderilmesine izin verilmemelidir.
  • Dosyaların ve kütüphanelerin bütünlüğü kontrol edilmelidir.
  • En az ayrıcalıklar ile çalışma prensibi uygulanmalıdır.
  • İkincil uygulamalar, 3. parti yazılımlar ve kütüphaneler kullanılmadan önce gözden geçirilmelidir.

Kaynaklar:

https://owasp.org/www-pdf-archive/OWASP_SCP_Quick_Reference_Guide_v2.pdf

--

--

Haktan Emik
Haktan Emik

Written by Haktan Emik

Penetration Tester at TURKCELL #cybersecurity twitter.com/haktanemik

No responses yet