Ünite 7 / 11

Güvenli Kod İncelemesi ve Statik Analiz: Yapay Zeka ile Zafiyet Bulmak

Kazanimlar:

  • Yapay zekayı bir ikinci göz olarak kullanıp kodda OWASP sınıfındaki zafiyetleri (enjeksiyon, sabit sır, erişim kontrolü) bağlam vererek işaretletebilme
  • Yapay zekanın ürettiği yanlış pozitifleri bağlamla eleyip her bulguyu gerçek zafiyet olarak doğrulamadan ele almayı önleyebilme
  • Yapay zekanın önerdiği düzeltmenin yeni açık/hata getirebileceğini fark edip her yamayı gözden geçirme ve test kapısından geçirebilme

Yazılımın içindeki güvenlik açıkları en pahalı zafiyetlerdendir çünkü ürüne baştan gömülüdür ve milyonlarca kullanıcıya dağıtılır. Güvenli kod incelemesi (secure code review), kaynak kodu satır satır okuyup güvenlik açıklarını — SQL enjeksiyonu, kimlik doğrulama zafiyeti, sabit kodlanmış parola, hatalı yetkilendirme — üretime çıkmadan yakalama işidir. Elle yapıldığında yavaş ve yorucudur; büyük bir kod tabanında bir zafiyeti gözden kaçırmak kolaydır.

Yapay zeka kod incelemesinde iki nedenle güçlüdür: kod da bir dildir ve YZ örüntü tanımada iyidir. YZ bir kod parçasındaki tehlikeli örüntüleri (kullanıcı girdisinin doğrudan sorguya konması, şifresiz veri saklama, eksik girdi doğrulama) hızla işaretleyebilir, her birinin neden riskli olduğunu açıklayabilir ve bir düzeltme taslağı önerebilir. Ama YZ kodun tüm çalışma bağlamını görmez (girdi başka bir katmanda temizleniyor olabilir), olmayan bir zafiyet uydurabilir (yanlış pozitif) ya da gerçek bir açığı kaçırabilir (yanlış negatif), ve en önemlisi önerdiği "düzeltme" yeni bir açık ya da hata getirebilir. YZ kod incelemesinde bir ikinci göz ve işaretçidir; bir bulgunun gerçek zafiyet olduğuna, düzeltmenin doğru ve güvenli olduğuna geliştirici ve güvenlik uzmanı karar verir.

Kod incelemesinin adımları

  1. Kapsamı ve bağlamı ver. Hangi dil, hangi çerçeve (framework), bu kod nereden girdi alıyor, nereye çıktı veriyor, hangi katmanda çalışıyor. Bağlamsız kod incelemesi yanlış pozitif üretir.
  2. Tehlikeli örüntüleri taratın. YZ'ye bilinen zafiyet sınıflarını (OWASP Top 10 gibi) aratın: enjeksiyon, kimlik doğrulama, hassas veri ifşası, erişim kontrolü.
  3. Her bulguyu gerekçelendirtin. Her işaret için: hangi satır, hangi zafiyet sınıfı, nasıl istismar edilebilir, kanıt ne. Gerekçesiz bulgu ciddiye alınmaz.
  4. Yanlış pozitifi eleyin. Girdi gerçekten temizleniyor mu, o yol gerçekten erişilebilir mi — bağlamla kontrol edin.
  5. Düzeltmeyi doğrulayın. YZ'nin önerdiği yamanın açığı gerçekten kapattığını, yeni açık/hata getirmediğini ve testlerden geçtiğini teyit edin.
  6. İnsan onayı. Bulguyu ve düzeltmeyi geliştirici + güvenlik uzmanı gözden geçirir; kod deposuna öyle girer.

Terimler: SAST (Static Application Security Testing — kaynak kodu çalıştırmadan analiz eden statik güvenlik testi). DAST (Dynamic — çalışan uygulamayı dışarıdan test eden dinamik test). OWASP Top 10, en yaygın web uygulama zafiyetlerinin standart listesidir. Enjeksiyon (injection), kullanıcı girdisinin komut/sorgu olarak yorumlanmasıyla oluşan zafiyet (örn. SQL injection). Parametreli sorgu (parameterized query), girdiyi koddan ayırarak enjeksiyonu önleyen doğru yöntem.

Yaygın zafiyet sınıfları tablosu

Zafiyet sınıfı

Belirti (kodda)

Doğru çözüm

YZ'nin tuzağı

SQL enjeksiyonu

Girdinin sorguya birleştirilmesi

Parametreli sorgu

Sanitizasyonu görmezden gelebilir

Sabit kodlanmış sır

Kodda parola/anahtar

Sır kasası (vault), env

Yanlış pozitif (örnek/test)

Zayıf kimlik doğrulama

Eksik/yanlış kontrol

Güçlü, merkezî kontrol

Bağlamı kaçırır

Hatalı erişim kontrolü

Yetki kontrolü yok

Sunucu tarafı yetki

Karmaşık akışı anlamaz

Hassas veri ifşası

Şifresiz saklama/loglama

Şifreleme, maskeleme

Kritikliği bilemez

Güvensiz seri hale getirme

Güvenilmez veri deserialize

Güvenli ayrıştırma

Nadir örüntüyü kaçırır

Üç mini vaka

Vaka 1 — Gerçek enjeksiyonu yakalamak. Bir geliştirici, YZ'ye bir veri erişim fonksiyonunu inceletir. YZ, kullanıcıdan gelen kullaniciId değerinin doğrudan SQL metnine birleştirildiği satırı işaretler ve "bu klasik SQL enjeksiyonu, parametreli sorguya çevirin" der; örnek düzeltme sunar. Geliştirici, girdinin başka yerde temizlenmediğini teyit eder, bunun gerçek bir açık olduğunu doğrular, önerilen parametreli sorguyu uygular ve bir test yazar. YZ açığı öne çıkardı; doğrulama ve düzeltme testi geliştiriciden geldi.

Vaka 2 — Yanlış pozitif sabit sır. YZ bir dosyada password = "test1234" satırını görüp "kritik: sabit kodlanmış parola" der. Geliştirici bağlamı kontrol eder: bu bir birim test dosyasıdır, sahte bir test verisidir, üretime çıkmaz ve gerçek bir sisteme bağlanmaz. Bulgu yanlış pozitiftir. Geliştirici bunu belgeler ama gerçek bir sır olmadığı için işlem yapmaz. Ders: YZ'nin "sabit sır" işareti bağlamla elenmeli; her string bir sır değildir.

Vaka 3 — Yeni açık getiren düzeltme. YZ, bir XSS (siteler arası betik çalıştırma) zafiyeti için bir düzeltme önerir; ama önerdiği kod, girdiyi yanlış yerde temizler ve başka bir alanda çıktı kodlamasını (output encoding) atlar; sonuçta açık tam kapanmaz. Güvenlik uzmanı düzeltmeyi gözden geçirir, eksik kodlamayı fark eder ve doğru katmanda düzeltir. Ders: YZ'nin önerdiği yama otomatik güvenli değildir; her düzeltme gözden geçirilir ve test edilir.

Zayıf prompt / Güçlü prompt

Zayıf prompt:

Bu kodda açık var mı, düzelt: [kod]

Bu istem bağlam vermiyor (dil, çerçeve, girdi kaynağı), gerekçe istemiyor, yanlış pozitifi sorgulamıyor ve YZ'nin ürettiği düzeltmeyi körlemesine kabul etmeye açık. YZ hem gerçek açığı hem de olmayanı karışık işaretler.

Güçlü prompt:

Rolün: güvenli kod incelemesinde geliştiriciye İKİNCİ GÖZ olan asistan.Karar verme; düzeltmeyi doğrudan uygulanmış sayma. Kod: [dil/çerçeve belirt].Bağlam: bu fonksiyon [girdi kaynağı: örn. dış HTTP isteği] alıyor,[çıktı yeri]'ne yazıyor. Görevin: (1) olası zafiyetleri OWASP sınıfıylaişaretle, her biri için satır numarası + neden riskli + nasıl istismaredilir + kanıt ver, (2) her bulgu için en az 1 yanlış pozitif senaryosu(örn. girdi başka katmanda temizleniyorsa) yaz, (3) düzeltme öner ama"[gözden geçir + test yaz]" işaretiyle; düzeltmenin yeni açık/hatagetirip getirmediğini de değerlendir. Uydurma zafiyet ekleme.[kod]

Güçlü istem bağlam verir, OWASP sınıfı ve kanıt ister, yanlış pozitifi ve düzeltmenin risklerini sorgular, insan gözden geçirmesini zorunlu kılar.

Kopyalanabilir prompt şablonları

ZAFİYET TARAMA ŞABLONUŞu [dil/çerçeve] kodunu OWASP Top 10 açısından incele. Her olası bulguiçin: satır no, zafiyet sınıfı, neden riskli, örnek istismar, kanıt gücü(kesin/olası/zayıf). Bağlam: girdi [kaynak], çıktı [hedef]. Uydurma bulguekleme; emin değilsen "[doğrulanmalı]" yaz. Kod: [yapıştır]

YANLIŞ POZİTİF ELEME ŞABLONUŞu kod bulgusu için, gerçek bir zafiyet OLMADIĞI senaryoları listele:girdi başka katmanda temizleniyor olabilir mi, bu yol erişilebilir mi,bu değer test/örnek mi, çerçeve otomatik koruyor mu. Her biri için nasılteyit edeceğimi yaz. Bulgu: [yapıştır]

DÜZELTME DEĞERLENDİRME ŞABLONUŞu zafiyet için bir düzeltme öner; sonra kendi düzeltmeni eleştir:(1) açığı gerçekten kapatıyor mu, (2) yeni bir açık/hata getiriyor mu,(3) hangi testi yazmalıyım (pozitif ve negatif durum), (4) performans/işlevsellik etkisi. Düzeltmeyi ben gözden geçirip test edeceğim.Zafiyet + kod: [yapıştır]

GÜVENLİ ÖRÜNTÜ ÖĞRETME ŞABLONUŞu zafiyet sınıfı için [örn. SQL enjeksiyonu] bu dilde/çerçevede güvenliyazım örüntüsünü ve yaygın hatalı örüntüleri karşılaştırmalı göster.Genel kural + kod örneği ver; ama benim koduma uygulamadan önce bağlamısormanı istiyorum. Dil/çerçeve: [yaz]

Sık yapılan hatalar

  • Bağlamsız inceleme. Dil, çerçeve ve girdi/çıktı bağlamı olmadan YZ hem gerçek hem sahte bulguyu karıştırır; bağlamı mutlaka verin.
  • Her işareti gerçek zafiyet sanmak. YZ yanlış pozitif üretir (test verisi, başka katmanda temizlenen girdi); her bulguyu bağlamla eleyin.
  • YZ'nin düzeltmesini körlemesine uygulamak. Önerilen yama yeni açık/hata getirebilir; gözden geçirin ve test yazın.
  • Yanlış negatife güvenmek. YZ "açık yok" dese de kritik yolları kendiniz inceleyin; statik tarama her açığı görmez.
  • Kodu/sırrı dış araca vermek. Özel kod ve gerçek sırlar (anahtar, parola) fikrî mülkiyet ve güvenlik açığıdır; anonimleştirin veya kurumsal, izole araç kullanın.
İpucu: YZ'ye kod inceletirken her bulgu için "kanıt gücü" (kesin/olası/zayıf) istemek en verimli filtredir. "Zayıf" işaretli bulguların çoğu yanlış pozitiftir; enerjinizi "kesin" olanlara ayırırsınız.
Dikkat: YZ'nin önerdiği güvenlik düzeltmesi test edilmeden depoya girmemelidir. Yanlış bir "düzeltme" hem açığı açık bırakabilir hem de üretimde işlevsel bir hataya yol açabilir; her yama gözden geçirme ve test kapısından geçer.

Özetle

Güvenli kod incelemesi, zafiyetleri üretime çıkmadan yakalamanın en ucuz yoludur ve kod da bir dil olduğu için YZ burada güçlü bir ikinci göz olur: tehlikeli örüntüleri işaretler, riski açıklar, düzeltme önerir. Ama YZ tüm çalışma bağlamını görmez, yanlış pozitif ve yanlış negatif üretir ve önerdiği yama yeni açık getirebilir. Bu yüzden inceleme altı adımlıdır (bağlam, tarama, gerekçe, yanlış pozitif eleme, düzeltme doğrulama, insan onayı) ve karar geliştirici ile güvenlik uzmanınındır. Üç ilke: bağlam olmadan bulgu yorumlanmaz, her işaret bağlamla elenir, hiçbir düzeltme test edilmeden depoya girmez. Ve kod/sır asla anonimleştirilmeden dış araca verilmez.

Uygulama görevi

Bir örnek kod parçası alın (kendi kodunuzdan hassas kısımları çıkararak ya da bir örnek zafiyetli kod). "Zafiyet Tarama" şablonuyla YZ'ye inceletin; çıkan her bulgu için "Yanlış Pozitif Eleme" şablonunu uygulayıp gerçek olanları ayıklayın. En ciddi bulgunun düzeltmesini "Düzeltme Değerlendirme" şablonuyla alın, kendiniz gözden geçirin ve bir pozitif + bir negatif test durumu yazın. Kaç bulgunun yanlış pozitif çıktığını not edin.

Kontrol listesi

  • [ ] Kodu incelemeden önce dil, çerçeve ve girdi/çıktı bağlamını verdim.
  • [ ] Her bulgu için satır no, zafiyet sınıfı, istismar yolu ve kanıt istedim.
  • [ ] Her bulguyu yanlış pozitif açısından bağlamla eledim.
  • [ ] YZ'nin düzeltmesini körlemesine uygulamadım; gözden geçirdim ve test yazdım.
  • [ ] "Açık yok" çıktısına rağmen kritik yolları kendim inceledim.
  • [ ] Kodu/sırları anonimleştirdim veya kurumsal, izole araç kullandım.
  • [ ] Bulguyu ve düzeltmeyi geliştirici + güvenlik onayından geçirdim.