Açık Kaynak Kodlu Python Siber Güvenlik Projeleri — Bandit İncelemesi

Okan CAN
8 min readMar 30, 2023

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.

https://github.com/orgs/PyCQA/repositories?page=1&type=all
Github "Python Kodu Kalite Yetkilisi"

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ım: secret = “svsv684s6v84s6vs456s4v “
  • Ö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.
Örnek Kullanım: template_test = “/tmp”

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.

Dosya Sistemi üzerindeki tmp dizini

• — •

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 lowConfidence 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

# bandit main.py -l ekran çıktısı
# bandit main.py -ll ekran çıktısı
# bandit main.py -lll ekran çıktısı

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.

# bandit main.py -i ekran çıktısı
# bandit main.py -ii ekran çıktısı
# bandit main.py -iii ekran çıktısı

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?

Bandit Aracı İyileştirme Bekleyen Görevler

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

--

--

Okan CAN

Cyber Security Graduate Researcher | Computer Engineering Department | Duzce University