Açık Kaynak Kodlu Python Siber Güvenlik Projeleri — Bandit İncelemesi
Bandit Nedir?
Genelden özele giderek Bandit aracını inceleyelim ve algılamaya çalışalım
En genel tanımla BANDİT, PyCQA’da yer alan bir güvenlik linteridir.
PyCQA: “Python Code Quality Authority” (“Python Kodu Kalite Yetkilisi”)
PyCQA, Github üzerinde listeleniyor olup PyPI işleyiş mekanizmasına benzemektedir. Geliştiriciler(Developers) ve Bakımcılar(Maintainers) kontrol mekanizmasında yaşam döngüsünü devam ettiriyor olup Python projelerimizin kod kalitesini arttırmayı amaçlar. Bandit, bu iyileştirme için ortaya çıkarılan araçlardan biridir.
PyCQA ⊂ PyPI
PyPI: “Python Package Index” -> “Python Paket Dizini”
Kısaca bahsedecek olursak PyPI, kendi geliştirdiğimiz modüllerimizi (Python modüllerine ek olarak) tüm geliştirici ve araştırmacılara kullanıma sunabildiğimiz bir dizindir. PyPI çok değerli bir kaynak deposudur. Bizler de paylaşıma sunulmuş on binlerce Python paketine PyPI üzerinden ulaşabilmekteyiz.
Linter Nedir?
“Linting” işlemini gerçekleyen araçları linter olarak isimlendiririz
Linting Nedir?
“Yazdığımız kodlarda meydana gelebilecek olası hatalar için kodumuzu analiz edecek bir programın çalıştırılması” anlamına gelir
Toparlayacak olursak Linterler, programlama dillerinde kodun statik analizini yaparak gözden kaçan yazım hatalarını, potansiyel iyileştirmeleri öneren ve kod kalitesini yukarı çıkartmaya çalışan araçlardır.
PyPI Tanımlaması ile Bandit Nasıl İşler?
Bandit, Python kodundaki yaygın güvenlik sorunlarını bulmak için tasarlanmış bir araçtır. Bunu yapmak için Bandit her dosyayı işler, ondan bir AST oluşturur ve AST düğümlerine karşı uygun eklentileri çalıştırır. Bandit tüm dosyaları taramayı bitirdiğinde bir rapor oluşturur.
AST -> “Abstract Syntax Trees” (Soyut Sözdizimi Ağaçları)
Python Standart Kitaplığında (Python Standard Library) yer alan bir modüldür. — AST için bir tanım yapmamız gerekirse; programlama veya script dillerinin çalıştırılmasında, derleyicinin incelediği syntax’ın ağaç yapısında gösterimi diyebiliriz.
Plugins (Eklentiler)
Bandit, Python kodundaki çeşitli güvenlik sorunlarını tespit etmek için birçok farklı testi destekler. Bu testler eklenti olarak oluşturulmuştur. Bu eklentiler içerisinden birkaçını inceleyeceğiz..
Tüm eklentilere, buradaki URL adresinden ulaşılabilir.
Bandit Kurulumu
Tavsiye Niteliğinde Dikkat Edilmesi Gerekenler
- Bandit aracını; Windows işletim sisteminde kurulu olan PyCharm IDE, Komut İstemi(CMD) ve bir IDE’den bağımsız olarak çalışan Python 3.10 üzerinde test etmek istediğimde PowerShell başta olmak üzere işletim sistemi ilişkili birçok problem ile karşılaştım.
- Bandit Kullanım Kılavuzunda da tavsiye edildiği üzere en sağlıklı test imkanını bir sanal sunucu üzerinde çalışarak sağladım.
- Oracle VM VirtualBox aracılığıyla çalıştırdığım, Bir Linux dağıtımı olan Debian tabanlı Kali işletim sistemi üzerinde testlerimizi inceleyeceğiz…
- Python, Kali Linux dağıtımında mevcuttur. Kullanıcı taraflı bir kuruluma ihtiyaç duyulmayacaktır.
- Bandit kurulumunu “ pip install bandit “ komutu ile gerçekleyeceğiz
- Başarı ile kurulumu sağladık. Eklentiler üzerinde testlerimize başlayabiliriz
B105: hardcoded_password_string → Doğrudan (sabit) kodlu parola kullanımı
- Projemizde kaynak kod içerisinde doğrudan bir parola kullanmak işimizi kolaylaştıracak olsa da şifre tahmin etme atakları için bir zafiyet ve önemli ölçüde siber güvenlik riski oluşturur.
- Aslında bu durum bir Exploit atağı için büyük bir zafiyet riski demektir.
- Exploit bir sitede veya bir hosting bilgisayarında en yetkili kişi olmayı amaçlar.
- Biz de “doğrudan (sabit) kodlu parola” kullanımında bulunduğumuzda yönetici yetkisini kaybetme riski ile karşı karşıya kalırız.
- Örnek kullanımda görüleceği üzere Bandit oluşturduğu raporda 2 metriği inceliyor:
— Severity → Güvenlik açığının projemize vereceği zarar değeri
— Confidence → Güvenlik açığının oluşma ihtimali
B105: Doğrudan (sabit) kodlu parola eklentisi için Bandit, Severity metrik değerini “ low “ belirlerken Confidence metrik değerini ise “medium” olarak tespit ediyor.
Pek Bandit bunun tespitini nasıl sağlıyor?
Bandit kendi tarama algoritması belli değişkenlerin takibini yapacaktır
• “şifre” • “şifre” • “şifre” • “pwd” • “gizli” • “token” • “gizli”
Yukarıdaki anahtar kelimelerle bir eşleşme halinde yukarıdaki örnekte de görüleceği üzere güvenlik riskini tespit edecektir.
B108: hardcoded_tmp_directory → tmp geçici dosya/dizinin güvenli olmayan kullanımı
- Linux tabanlı sistemlerde /tmp dizini , sistemin geçici olarak ihtiyaç duyduğu gerekli dosyaları ve makinede çalışan diğer yazılım ve uygulamaları içerir.
- RAM bellekte saklı dosyalar burada işlenir.
Örneğin;
Bir belge yazarken, o belgenin içindeki tüm içerik geçici bir dosya olarak /tmp dizinine kaydedilir.
Veriyi kaydettikten sonra, tercih ettiğimiz konumda depolanır ve belgeden çıkıldığında geçici dosya kaldırılmış olur.
- /tmp dizininde depolanan dosyalar ve veriler sistem yeniden başlatıldığında otomatik olarak silinecektir.
- Biz /tmp dizininde geçici bir dosya oluşturmak istediğimizde belli başlı kurallara uymamız gerekir ve bu durum geçici dizinlere hakim değilsek tavsiye edilmeyen bir durumdur.
- Var olan doğru kütüphane işlevini tercih etmemiz tavsiye edilir.
- Tüm bu önlemleri almazsak kendimizi bir takım tehlikeli güvenlik sorunlarına açık hale getiririz.
- Aşağıda örnek olarak vereceğimiz template_test = “/tmp” tanımlaması gerekli tedbirlerin alınmadığı bir tanımlama biçimidir, dosya adı tahmin edilebilir ve bir güvenlik riski oluşacaktır.
- Dosya adını tahmin edebilen ve geçici dosyayı içeren dizine yazabilen kötü niyetli kullanıcılar, program dosyayı kendisi oluşturmadan önce geçici dosyanın adıyla bir sembolik bağlantı oluşturarak geçici dosyayı etkili bir şekilde ele geçirebilir.
B108: tmp geçici dosya/dizinin güvenli olmayan kullanımı eklentisi için Bandit, Severity metrik değerini B105: Doğrudan (sabit) kodlu parola eklentisi ‘den farklı olarak daha riskli görüp “ medium “ belirliyor. Confidence metrik değerini de aynı risk oranıyla“medium”olarak tespit ediyor.
Test sonuçlarına dikkat edecek olursak da “ low “ güvenlik riskinde “ possible” (var olabilir) “medium” güvenlik riskinde ise “ probable” (var olması muhtemel) anlam farklarına Bandit raporunda dikkat çekmektedir.
Pek Bandit bunun tespitini nasıl sağlıyor?
Bandit kendi tarama algoritması belli değişkenlerin takibini yapacaktır
• /tmp • /var/tmp • /dev/shm • etc
Yukarıdaki anahtar kelimelerle bir eşleşme halinde örnekte de görüleceği üzere güvenlik riskini tespit edecektir.
• — • — • — • — • — • — • — • — • — • — • — • — • — • — • — • — • — • — • — • — • — •
Bandit raporunda güvenlik risklerinin Severity ve Confidence metrik değerlerini satır satır ya da bütün proje içeriği olarak yönetebiliriz
Satır yönetimini aşağıdaki formatta sağlayabiliriz.
«ilgili satır» + # nosec: + «eklenti türü»
Örneğin;
• secret = “svsv684s6v84s6vs456s4v “ # nosec: B105
Sadece ilgili kod satırında yer alan güvenlik açıklarını sorun olarak göstermemeyi sağlar.
Proje dokümanının yönetimini aşağıdaki formatta sağlayabiliriz.
bandit + «ilgili_proje.py» + -s + «eklenti türü»
Örneğin;
•bandit main2_2.py -s B108
Bütün projedeki B108 güvenlik açıklarını sorun olarak göstermemeyi sağlar
Önceki sunularda B105 Bandit taraması için Severity metrik değerini “ low “ Confidence metrik değerini “medium” olarak tespit etmiştik
Yukarıda görüldüğü üzere #nosec ile işaretlenen satır Bandit taraması etki dahiline girmediğinden rapor çıktısında herhangi bir metrik değeri listelenmedi.
— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — —
Yukarıdaki örnek proje satırlarında «bandit main.py» komutu ile bir bandit taraması yapıldığında aşağıdaki görseldeki çıktıda yer alan metrik değerleri listelenecektir.
Fakat aynı proje için «bandit main.py -s B108» komutu ile taramayı başlatır isek /tmp güvenlik riskleri taramaya dahil olmayacak ve doğrudan (sabit) kodlu parola kullanımı güvenlik riskini içeren secret anahtar kelimesi taramaya takılacak ve aşağıdaki metrik değerleri listelenecektir.
Bandit raporunda güvenlik riskleri metrikleri Severity ve Confidence ile ilişkili olan test sonuçlarındaki sorunların listelendiği eklentileri kontrol edebiliriz
Severity için aşağıdaki denklikte güvenlik zaafiyetleri raporlanacaktır
«bandit + «ilgili_proje.py» + -l» // low ve üstü..
«bandit + «ilgili_proje.py» + -ll» // medium ve üstü..
«bandit + «ilgili_proje.py» + -lll» //high ve üstü..
Confidence için aşağıdaki denklikte güvenlik zaafiyetleri raporlanacaktır
«bandit + «ilgili_proje.py» + -i» // low ve üstü..
«bandit + «ilgili_proje.py» + -ii» // medium ve üstü..
«bandit + «ilgili_proje.py» + -iii» // high ve üstü..
Aşağıda “cat” komutu ile içeriği listelenen Python projemizde herhangi bir filtreleme uygulamadan Bandit taraması yapar isek Güvenlik açıkları aşağıdaki gibi listelenecektir
Severity ve Confidence filtreleme adımları sonrası oluşacak ekran çıktılarını sonraki sunularda inceleyelim
1 low 2 medium Severity metrik değerlerini test ederken ‘–l’ için 3 sorunda listelendi. ‘-ll’ için low değeri pasif oldu, mevcuttaki 2 medium eklenti sorunu listelendi. ‘-lll’ için high seviye herhangi bir değer raporlanmadığından ‘herhangi bir sorun algılanmadı’ yazısını gördük.
3 medium Confidence metrik değerlerini test ederken ‘–i’ için 3 sorunda listelendi. ‘-ii’ için herhangi bir low değeri olmadığından bir eleme olmadı ve yeniden 3 sorunun da listelendiğini gördük. ‘-iii’ için high seviye herhangi bir değer raporlanmadığından ‘herhangi bir sorun algılanmadı’ yazısını gördük.
• — • — • — • — • — • — • — • — • — • — • — • — • — • — • — • — • — • — • — • — • — •
BANDİT geliştirilmesi adına ilerideki çalışmalarda neler yapılabilir?
An itibari ile Bandit paketinde 586 adet başlık tanımlanmış ve bunların 437 tanesi şu an kapatılabilmiş. 149 adet görev daha kapatılmayı bekliyor
Yukarıda yer alan genel iyileştirme önerilerine ilaveten şunları eklemek isterim,
- Çok daha fazla kod satırlarının olduğu bir projede bandit taraması yapıldığında okunabilirliği arttırmak için kod üzerindeki zafiyet satırları farklı bir renk ile raporlanabilir ve ilgili satırın numarasına raporda yer verilebilir.
KAYNAKÇA
- Bandit 1.7.4 Project Description → https://pypi.org/project/bandit/#description
- Carberra — Code security with Bandit and Safety — Perfect Python → https://www.youtube.com/watch?v=YZOKnvisJpw
- B105: hardcoded_password_string → https://bandit.readthedocs.io/en/1.7.4/plugins/b105_hardcoded_password_string.html
- B108: hardcoded_tmp_directory → https://bandit.readthedocs.io/en/1.7.4/plugins/b108_hardcoded_tmp_directory.html
- Java Linting ve Kod Analizi Bölüm 1: Linter Nedir? → https://medium.com/@serap_karhan/java-linting-ve-kod-analizi-b%C3%B6l%C3%BCm-1-linter-nedir-16f806e56edc
- Filesystem Hierarchy Standard → https://en.wikipedia.org/wiki/Filesystem_Hierarchy_Standard
- Abstract Syntax Tree (AST) Nedir? → https://medium.com/frontend-development-with-js/abstract-syntax-tree-ast-nedir-4d7c6918b5d5
- Geçici dosyaları güvenli bir şekilde oluşturun, kullanın ve kaldırın → https://security.openstack.org/guidelines/dg_using-temporary-files-securely.html