Previous slide Next slide Toggle fullscreen Open presenter view
CEN429 Güvenli Programlama · Hafta 5
Kod Sağlamlaştırma: Java ve Yorumlanan Diller
CEN429 Güvenli Programlama — Hafta 5
Dr. Öğr. Üyesi Uğur CORUH · 16.10.2026
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
Bugün
Saat
Bölüm
Konu
1
1–4
Yönetilen diller ve enjeksiyonun kökü, SEI CERT · SQL enjeksiyonu Demo 1 · Komut enjeksiyonu Demo 2 · Yol geçişi Demo 3
2
5–7
Güvensiz seri durumdan çıkarma Demo 7 · XML/XXE, şablon, XSS · Python ve JavaScript (ReDoS)
3
8–12
Bayt kodu Demo 4 · ProGuard/R8 + dize gizleme Demo 5 · Android R8/ölçme · SBOM Demo 6 · Proje
Öğrenme çıktıları (ÖÇ.3 / ÖÇ.4): enjeksiyon sınıfını tanımak ve önlemek (SQL, komut, yol, XML, seri durum) · ProGuard/R8 ile gizleme ve -keep kuralları yazmak · SBOM üretip bağımlılık riskini yönetmek
Yönetilen dil bellek hatalarını büyük ölçüde çözer; ama veri ile komutun karışması (enjeksiyon) her dilde vardır.
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
Önceki haftalardan gelenler
Bellek hataları (taşma, serbest bellek kullanımı, tanımsız davranış) — ilk dört hafta C/C++'ta bu hataların nasıl oluştuğunu ve önlendiğini gördük (Hafta 4)
SEI CERT kural kitabının yapısı — kimlik, hatalı örnek, uyumlu çözüm ve risk bölümlerinden oluşan ortak yapı (Hafta 4)
TOCTOU (denetim ile kullanım arasındaki zaman) — dosya izin denetimiyle gerçek kullanım arasındaki zaman farkının bir yarış durumu açığı olduğu (Hafta 2)
Bu hafta: bellek hataları → hangileri dil düzeyinde kalkıyor (Bölüm 1); SEI CERT yapısı → Oracle Java standardına (Bölüm 1); TOCTOU → yol geçişinde dosya açıldıktan sonra da kök denetimi (Bölüm 4).
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
Bu haftanın kavramları
Her terim, gövdede ilk geçtiği yerde tanımlanır; burada yalnız nerede olduğunu işaretliyoruz.
Kavram
Nerede
Enjeksiyon
Bölüm 1
JVM ve bayt kodu
Bölüm 8
Parametreli sorgu
Bölüm 2
Seri durumdan çıkarma
Bölüm 5
XXE
Bölüm 6
Yol geçişi
Bölüm 4
ProGuard / R8
Bölüm 9
-keep kuralı
Bölüm 9
SBOM
Bölüm 12
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
Ön bilgi: Yönetilen dil ve çöp toplayıcı
Yönetilen dil: belleği otomatik yöneten dil (Java, C#, Python, JS); programcı malloc/free yapmaz.
GC (çöp toplayıcı): artık kullanılmayan nesneleri arka planda otomatik temizler; programcı belleği elle bırakmaz.
Bu tek fark → çoğu bellek hatası (taşma, serbest bırakıldıktan sonra kullanma (use-after-free)) ortadan kalkar ; Bölüm 1 bunu ayrıntılı gösterir.
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
Ön bilgi: Veritabanları ve SQL
SQL: veritabanı sorgulama dili (SELECT ... WHERE ...).
Uygulama, kullanıcı girdisini sorguya koyar.
Yanlış konursa → SQL enjeksiyonu (Bölüm 2).
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
Ön bilgi: Yansıma ve bağımlılıklar
Reflection (yansıma): bir sınıfı/metodu çalışma anında adıyla bulup çağırma (Class.forName("..."), getMethod("...")); gizleme bunu bozabilir → -keep gerekir (Bölüm 9).
Bağımlılık: projenizin kullandığı, kendi ekibinizin yazmadığı dış kütüphane; kendi kodunuz güvenli olsa bile, bir bağımlılıktaki açık sizi etkiler (Bölüm 12).
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
Demolar nasıl çalışıyor?
7 demo, code/week-05 klasöründe — Python 3 ve JDK 17+ ister
SQL demosunun ana bölümü Python'un yerleşik sqlite3 modülüyle, hiçbir şey indirmeden çalışır
Çalıştır: Windows .\demo.ps1 · WSL/Linux sh demo.sh
İsteğe bağlı Java bölümleri (JDBC, ProGuard) için her demo klasöründe bir hazirla betiği vardır
⚠️ Etik: enjeksiyon örnekleri yalnız demo klasöründeki sentetik veritabanı/dosyalara karşı çalışır;
bu teknikleri başka birinin sistemine asla uygulamayın.
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
1. Yönetilen diller ve enjeksiyonun kökü
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
Kısa tarihçe — yönetilen diller ve kalan açıklar
1995 — Java/JVM : bellek hatalarının çoğu dil düzeyinde biter
1998 — SQL enjeksiyonu belgelenir · 2003 OWASP Top 10
2002 — ProGuard (sonra R8 ): bayt kod kolay geri çevrildiği için
2015 deserialization · 2020–21 SolarWinds ve Log4Shell → SBOM çağı
Dil bellek hatasını çözer; enjeksiyonu ve bağımlılık riskini çözmez .
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
Yönetilen dil neyi çözer?
Otomatik bellek yönetimi (GC) → taşma, UAF, çift bırakma büyük ölçüde yok .
Dizi erişimi sınır denetimli → ArrayIndexOutOfBounds (çökme, sömürü değil).
Tür güvenliği daha sıkı.
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
Yönetilen dil neyi ÇÖZMEZ?
Enjeksiyon (veri = komut) — her dilde var.
Mantık hataları , yetki hataları.
Bağımlılık açıkları.
Seri durumdan çıkarma saldırıları.
Bellek hatası azaldı; yeni cephe: enjeksiyon ve tedarik zinciri.
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
Yönetilen dil: çözer / çözmez — şema
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
SEI CERT Oracle Java
Java için ayrı bir kural kitabı (CERT Oracle Coding Standard for Java).
Aynı yapı: hatalı örnek + uyumlu çözüm + risk.
Örnek alanlar: enjeksiyon, seri durum, eşzamanlılık, hassas veri.
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
CERT Oracle Java — şema
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
SEI CERT · bu haftaya dokunan kurallar
Kısaltma
Kategori
Kural (örnek)
IDS
Girdi doğrulama
IDS00-J SQL · IDS07-J Runtime.exec · IDS16/17-J XML
FIO
Girdi/çıktı
FIO16-J: yol adını kanonikleştir
SER
Serileştirme
SER12-J: güvenilmeyen veriyi seri durumdan çıkarma
MSC
Çeşitli
MSC03-J: koda gömülü hassas bilgi kullanma
ERR
Hata işleme
ERR01-J: istisnada hassas bilgi sızdırma
Kimlikler -J sonekiyle biter.
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
Java'da hassas veri
Java String değişmezdir (immutable) → bellekten silinemez.
Parola/anahtar için char[] kullan, işi bitince doldur (Arrays.fill).
GC ne zaman toplayacağını garanti etmez .
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
Enjeksiyonun ortak kökü
Enjeksiyon = veri ile komutun karışması.
Kullanıcı verisi bir yorumlayıcıya (SQL, kabuk, XML) komut olarak gider.
Kök aynı; hedef (SQL/kabuk/XML) değişir.
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
Enjeksiyonun kökü — veri mi, kod mu?
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
Çözümün ortak kökü
Her enjeksiyon türünde aynı ilke:
Veriyi koddan ayır (parametreli API).
Veriyi asla string birleştirmeyle komuta gömme.
Beyaz liste + bağlama uygun kaçış (son çare).
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
Tek kanal mı, iki kanal mı? — tablo
Yorumlayıcı
Tek kanal (hatalı)
İki kanal (doğru)
SQL motoru
"...WHERE name='" + name + "'"
PreparedStatement + ?
Kabuk
exec("sh -c '...' " + host)
ProcessBuilder(...) — kabuk yok
Dosya sistemi
new File(root, request)
Kanonikleştir + kök denetimi
XML
Dize birleştirerek XML kurmak
DOM/StAX API'siyle öğe oluşturmak
Aynı ilke, dört farklı yorumlayıcı.
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
Enjeksiyon aileleri (bugün)
SQL enjeksiyonu
Komut enjeksiyonu
Yol geçişi
Seri durumdan çıkarma
XML/XXE, şablon, XSS
Hepsinin kökü ve çözümü aynı mantık .
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
Bu bölümün kuralı
Yönetilen dil bellek hatasını çözer; enjeksiyonu çözmez.
Enjeksiyonun kökü hep aynı: veri = komut.
Çözüm hep aynı: veriyi koddan ayır .
Bu ilkeyi şimdi tek tek enjeksiyon türlerinde göreceğiz.
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
Bölüm 1 — kısa sınama
Yönetilen dil hangi hata sınıfını büyük ölçüde çözer?
Neyi çözmez?
Enjeksiyonun ortak kökü nedir?
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
Bölüm 1 — cevaplar
Bellek güvenliği hatalarını (tampon taşması, use-after-free, çift/sarkan işaretçi) — GC + sınır denetimiyle.
Mantık/enjeksiyon/yetkilendirme , güvensiz deserialization, zayıf kripto, bağımlılık açıkları — bunlar dil-üstü, çözülmez.
Güvenilmeyen VERİ ile KOD/komutun aynı kanalda karışması; yorumlayıcı veriyi komut olarak ayrıştırır.
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
2. SQL enjeksiyonu
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
Hatalı kod
String q = "SELECT * FROM users WHERE name = '" + name + "'" ;
stmt.executeQuery(q);
name içine tırnak ve SQL koyulursa?
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
Saldırı · örnek
Kullanıcı name olarak şunu girer:
' OR '1'='1
Sorgu şuna döner:
SELECT * FROM users WHERE name = '' OR '1' = '1'
'1'='1' her zaman doğru → tüm satırlar döner.
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
Neden oldu?
name, sorgu metnine birleştirildi.
Tırnak, veriyi bitirip komut kısmına geçmeyi sağladı.
Veri ile komut karıştı .
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
SQL enjeksiyonu adım adım — şema
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
Doğru · parametreli sorgu
PreparedStatement ps =
con.prepareStatement("SELECT * FROM users WHERE name = ?" );
ps.setString(1 , name);
ps.executeQuery();
? bir parametre ; name asla komut olarak yorumlanmaz.
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
SQL enjeksiyonu — animasyon
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
SQL enjeksiyonu — uç durum: parametreli sorguda tek tırnak bile zararsız
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
Neden çalışır?
Sorgu iskeleti önceden veritabanına gönderilir (derlenir).
ad sonradan veri olarak bağlanır.
Tırnak koysa bile veri olarak kalır.
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
Diğer katmanlar
En az yetki: uygulamanın DB kullanıcısı yalnız gerekeni yapsın.
Girdi doğrulama: yine de beyaz liste.
ORM kullanıyorsanız da parametreli API'yi kullanın (string birleştirme değil).
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
⚠️ Kaçış (escaping) son çaredir
Elle tırnak kaçırmak hataya açık ; her DB farklı.
Öncelik her zaman parametreli sorgu.
Kaçış yalnız parametrelenemeyen yerlerde, dikkatle.
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
SQL enjeksiyonu · bu bölümün kuralı
Sorguyu asla string birleştirmeyle kurma.
Her zaman parametreli sorgu (PreparedStatement, ?).
Ad/sütun gibi tanımlayıcılar için beyaz liste .
Kaçış (escaping) yalnız son çare.
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
3. Komut enjeksiyonu
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
Kabuk var mı yok mu — şema
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
Hatalı kod
Runtime.getRuntime().exec("ping " + host);
host içine kabuk metakarakteri koyulursa?
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
Saldırı · örnek
host olarak:
example.com; rm -rf data
Kabuk bunu iki komut olarak çalıştırır: ping ve rm.
(Örnek sentetik; asla çalıştırmayın.)
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
Neden oldu?
Komut bir kabuğa metin olarak verildi.
;, |, && kabukta komut ayırıcı .
Veri, komut satırına karıştı.
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
Doğru · argüman dizisi
new ProcessBuilder ("ping" , "-c" , "1" , host).start();
Kabuk yok ; host tek bir argüman .
Metakarakterler yorumlanmaz.
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
Komut enjeksiyonu — animasyon
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
Komut enjeksiyonu — uç durum: aynı saldırı izin listesine önce çarpıyor
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
Ek kurallar
Mümkünse dış komut hiç çalıştırma; kütüphane API'si kullan.
Çalıştıracaksan: sabit yol, argüman dizisi, beyaz liste.
ENV33-C benzeri: system()/kabuk çağırma.
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
Komut enjeksiyonu · bu bölümün kuralı
Mümkünse dış komut hiç çalıştırma.
Çalıştıracaksan: kabuksuz argüman dizisi (ProcessBuilder).
Sabit yol + beyaz liste; - ile başlayan girdiye dikkat (argüman enjeksiyonu).
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
4. Yol geçişi
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
Yol geçişi (path traversal)
Yol geçişi: ../ ile izin verilen klasörün dışına çıkma.
dosyalar/../../etc/passwd gibi.
Kanonikleştirme + kök denetimiyle önlenir.
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
Yol geçişini kapatan iki adım — şema
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
Hatalı kod
File f = new File ("uploads/" + name);
name içine ../ koyulursa?
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
Saldırı · örnek
name olarak:
../../etc/passwd
Sonuç: uploads/../../etc/passwd → izin verilen klasörün dışı .
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
Neden oldu?
name, dosya yoluna doğrudan eklendi.
../ dizisi, yorumlayıcı (dosya sistemi) tarafından "üst klasöre çık" olarak okundu.
Denetim yoktu: hangi klasörün dışına çıkıldığı hiç sorulmadı.
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
Doğru · kanonikleştir + kök denetimi
Path root = Paths.get("uploads" ).toRealPath();
Path target = root.resolve(name).normalize().toRealPath();
if (!target.startsWith(root)) throw new SecurityException ();
Kanonik yol kökün altında mı? Değilse reddet.
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
Yol geçişi — animasyon
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
Yol geçişi — uç durum: güvenli sürüm aynı saldırıyı reddediyor
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
Neden çalışır?
Önce yol kanonik (tek, kesin) hale getirilir.
Sonra kanonik yolun kök içinde olup olmadığı denetlenir.
../, kodlanmış biçim (..%2f) ya da sembolik bağlantı — hepsi kanonikleştirmeden sonra aynı gerçek yola iner; hiçbiri denetimden kaçamaz.
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
Yol geçişi · ek
Dosya adını beyaz listeyle sınırla ([a-zA-Z0-9_.-]).
Sembolik bağlantılar (symlink) kanonikleştirmeyle çözülür.
Kullanıcı adını doğrudan dosya adı yapma.
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
Yol geçişi · bu bölümün kuralı
Ham dizeye (string) asla güvenme (contains("..") yetmez).
Önce kanonikleştir , sonra kök içinde mi diye denetle.
Sembolik bağlantıları da çöz (toRealPath()); denetimi dosya açıldıktan sonra da tekrarla.
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
Üç enjeksiyon · ortak ders
Tür
Yanlış
Doğru
SQL
String birleştirme
Parametreli sorgu
Komut
Kabuğa metin
Argüman dizisi
Yol
../ birleştirme
Kanonikleştir + kök denetimi
Kök aynı: veriyi koddan/komuttan ayır .
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
Bölüm 2–4 — kısa sınama
' OR '1'='1 neden tüm satırları döndürür?
ProcessBuilder argüman dizisi neden güvenli?
Yol geçişini hangi iki adım kapatır?
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
Bölüm 2–4 — cevaplar
Dizeye katılınca WHERE koşulunu her zaman doğru yapar → tüm satırlar (veri, kod olarak ayrıştırıldı).
Argümanlar kabuğa değil programa ayrı ayrı geçer; ; | gibi meta-karakter yorumu yok → komut enjeksiyonu kapanır.
(1) Kanonik yola çevir (realpath/normalize), (2) izinli kök dizin içinde mi doğrula (allowlist). Kullanıcı girdisini yola doğrudan koyma.
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
5. Güvensiz seri durumdan çıkarma
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
Seri durum (serialization)
Serileştirme: bir nesneyi bayt dizisine çevirme (kaydetmek/göndermek için).
Seri durumdan çıkarma (deserialization): baytları geri nesneye çevirme.
Güvenilmez baytları çıkarmak tehlikeli (kod çalıştırma).
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
Hatalı kod
Object o = new ObjectInputStream (giris).readObject();
giris güvenilmeyen bir kaynaktan geliyorsa?
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
Deserialization gadget zinciri — şema
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
Sorun
Güvenilmez baytları bir nesneye çevirmek tehlikelidir .
Java'da ObjectInputStream.readObject() çıkarken kod çalıştırabilir (gadget zincirleri).
Sonuç: uzaktan kod çalıştırma.
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
Neden bu kadar kötü?
Çıkarma sırasında nesnelerin kurucuları/metotları çalışır.
Uygun kütüphaneler varsa (gadget), zincirlenip komut çalıştırılabilir.
Girdi "sadece veri" sanılır ama kod gibi davranır.
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
Doğru · en iyisi: hiç yapma
Güvenilmez veriyi native serileştirmeyle çıkarma.
Onun yerine JSON/veri biçimi + katı şema.
Yalnız beklediğiniz alanları okuyun.
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
Zorundaysanız · filtre
ObjectInputFilter f = ObjectInputFilter.Config
.createFilter("com.app.*;!*" );
ois.setObjectInputFilter(f);
Tek bir sınıf bekleniyorsa daha dar bir desen de yazılabilir:
ois.setObjectInputFilter(ObjectInputFilter.Config
.createFilter("com.app.Session;!*" ));
Beyaz liste : yalnız beklenen sınıflar.
Derinlik/boyut sınırı da koyun (DoS'a karşı).
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
Deserialization — animasyon
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
Deserialization — uç durum: filtre beklenmeyen sınıfı reddediyor
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
Deserialization · bu bölümün kuralı
Güvenilmeyen bayt akışını çıkarmak, saldırgana sınıf seçme yetkisi vermektir.
En iyisi: hiç yapma (JSON + katı şema).
Zorundaysan: izin listesi filtresi , derinlik/boyut sınırı.
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
6. XML, şablon, XSS
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
XML ve XXE
XML: yapılandırılmış veri biçimi (etiketlerle).
XXE (XML External Entity): XML'in "dış varlık" özelliğinin kötüye kullanımı → dosya okuma, SSRF.
XML ayrıştırıcıda dış varlıklar kapatılır .
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
XXE · sorun
XML'de dış varlık tanımlanabilir; ayrıştırıcı onu çözer .
Saldırgan bununla dosya okutabilir ya da sunucudan istek yaptırabilir (SSRF).
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
XXE — şema
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
XXE · doğru
dbf.setFeature(
"http://apache.org/xml/features/disallow-doctype-decl" , true );
Dış varlıkları kapat , DOCTYPE'ı reddet.
Çoğu kütüphanede tek satırlık ayar.
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
Şablon enjeksiyonu (SSTI)
Şablon motoruna kullanıcı girdisini şablon olarak vermek.
Motor onu kod gibi çalıştırabilir.
Kural: kullanıcı girdisi veri , şablon sabit .
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
XSS (kısaca)
XSS: kullanıcı verisinin bir web sayfasına HTML/JS olarak sızması.
Çözüm: çıktı bağlama uygun kodlama (HTML-encode), CSP.
Kök yine aynı: veri ≠ kod.
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
XML/şablon/XSS · bu bölümün kuralı
Yorumlayıcının hangi özelliği açık , bil ve gereksizini kapat.
XML: dış varlık + DOCTYPE kapalı.
Şablon: kullanıcı verisi yalnız değişken , asla şablonun kendisi.
HTML: çıktıyı bağlama uygun kodla.
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
7. Python ve JavaScript'te aynı hatalar
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
Yorumlanan dillerde aynı hatalar — şema
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
Aynı kök, farklı dil
Enjeksiyon her dilde: Python os.system, JS child_process.
Çözüm aynı: argüman dizisi, parametreli sorgu.
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
Python · örnekler
os.system("cmd " + x) → komut enjeksiyonu; subprocess.run([...]) kullan.
eval(input_text) / pickle.loads(untrusted) → asla güvenilmez veriyle.
SQL: parametreli (cursor.execute("... ?", (x,))).
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
Python · eval örneği (kod)
value = eval (input_text)
import ast
value = ast.literal_eval(input_text)
value = int (input_text)
Kural: kullanıcı verisi eval'e asla ulaşmamalı.
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
ReDoS (düzenli ifade DoS)
Kötü bir regex , belirli girdilerde üstel zaman harcayabilir.
Saldırgan bununla CPU'yu kilitler.
Çözüm: güvenli regex, girdi uzunluğu sınırı, zaman aşımı.
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
ReDoS · somut örnek
Desen: ^(a+)+$
Girdi: "aaaaaaaaaaaaaaaaaaaaaaaaaaaaa!"
Motor, eşleşmeyi kanıtlamak için milyonlarca yol dener.
Tek istek, işlemciyi saniyelerce/dakikalarca kilitler (CWE-1333).
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
JavaScript · prototype pollution
Prototype pollution: saldırgan __proto__ üzerinden tüm nesnelerin ortak özelliğini bozar.
Beklenmedik davranış, yetki atlatma.
Çözüm: güvenli birleştirme, Object.create(null), kütüphane güncelliği.
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
Yorumlanan diller · ortak kural
eval, exec, pickle, dinamik require → güvenilmez veriyle kullanma .
Girdi doğrulama + parametreli API + güncel bağımlılık.
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
Bölüm 5–9 — kısa sınama
Güvensiz deserialization neden kod çalıştırabilir?
XXE'yi hangi ayar kapatır?
ReDoS nedir, nasıl azaltılır?
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
Bölüm 5–9 — cevaplar
Nesne kurulurken sınıfların yan etkili yöntemleri (readObject/gadget zinciri ) tetiklenir → saldırgan nesne grafiğiyle akış kurar.
Dış varlıkları ve DOCTYPE'ı kapatan ayrıştırıcı ayarı (disallow-doctype-decl, external entities kapalı).
ReDoS: katastrofik geri izlemeli regex; kötü girdi üstel zaman → CPU kilitlenir. Azaltma: doğrusal-zaman motoru (RE2), iç içe niceleyiciden kaçın, uzunluk/zaman sınırı.
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
8. Bayt kodu ve tersine derleme
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
JVM ve bayt kodu
JVM (Java Virtual Machine): Java'yı çalıştıran sanal makine.
Bayt kodu: Java kaynağının derlendiği ara biçim (.class dosyaları).
Bayt kodu makineden bağımsız; JVM onu çalıştırır.
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
Bayt kod vs makine kodu — şema
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
Java bayt kodu kolay okunur
.class/.jar bayt kodu, kaynağa çok yakın geri çevrilebilir.
Araçlar: javap (sökme), JD-GUI/CFR/Procyon (tersine derleme).
Adlar, dizeler, yapı büyük ölçüde görünür .
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
javap örneği
javap -c -p Application.class
Metot adları, çağrılar, sabitler görünür.
Bu yüzden Java'da gizleme daha da gerekli.
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
javap çıktısı — ne görünüyor?
private static final java.lang.String VALID_PIN;
static boolean pinCorrect(java.lang.String);
Code:
0: ldc #9 // String 4729
2: aload_0
3: invokevirtual #11 // String.equals
6: ireturn
Kaynak kod yok, ama sabit (4729), ad (VALID_PIN, pinCorrect) ve mantık ("girdiyi bu sabitle karşılaştır") açıkça görünüyor.
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
Bayt kodundan kaynağa — animasyon
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
Bayt kodundan kaynağa — uç durum: lisans kontrolü, yanlış yıl
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
Neden C'den daha kolay?
Bayt kodu yüksek seviyeli ve tür bilgisi taşır.
Değişken/metot adları çoğunlukla korunur.
→ tersine mühendislik ucuz; gizleme şart.
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
⚠️ İstemcide sır yoktur
Gizleme bunu zorlaştırır , ama sırrı gerçekten saklamaz .
İstemcide durmak zorunda olmayan anahtar/parola → sunucuda tutulur.
İstemcide durmak zorunda olan sır → whitebox kriptografi ister (11. hafta).
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
9. ProGuard ve R8
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
R8 ve ölçme adımları — şema
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
ProGuard/R8 ne yapar?
Üç iş:
Küçültme (shrink): kullanılmayan kodu atar.
İyileştirme (optimize): kodu sadeleştirir.
Gizleme (obfuscate): adları anlamsızlaştırır (a, b, c).
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
ProGuard/R8 · dört aşama — tablo
Aşama
Ne yapar?
Güvenlik katkısı
Küçültme
Kullanılmayan kodu atar
Saldırı yüzeyi azalır
İyileştirme
Satır içi alma, sabit katlama
Yapı kaynaktan uzaklaşır
Gizleme
Adları a, b, c yapar
Anlamlı adlar kaybolur
Ön doğrulama
Eski JVM için doğrulama bilgisi
—
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
Ad gizleme örneği
LicenseChecker.verify() → a.b()
Anlamlı adlar kaybolur.
Tersine mühendis için harita zorlaşır.
Ölü kod atılınca binary küçülür.
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
-keep neden gerekir?
Reflection ile adıyla çağrılan kod (API, giriş noktaları, JNI) korunmalı.
Gizleme adı değiştirirse çağrı kırılır .
-keep class com.app.Api { public *; }
Birden çok giriş noktası ve ek açıklamalı (annotation) alanlar için:
-keep class com.app.PublicApi { public *; }
-keepclassmembers class * {
@com.app.Reflected *;
}
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
-keep dengesi — şema
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
-keep dengesi
Çok az -keep: uygulama çöker (reflection kırılır).
Çok fazla -keep: gizleme zayıflar (her şey açık kalır).
Yalnız gerçekten gereken giriş noktalarını tut.
Reflection kullanan akışları test et — gizleme sonrası çökme var mı?
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
ProGuard/R8 — animasyon
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
Eşleme dosyası (mapping)
R8 bir mapping.txt üretir: gizli ad → gerçek ad.
Gizli tutulur (dağıtılmaz), ama çökme izlerini çözmek için saklanır.
Sürüm kimliğiyle birlikte arşivlenir.
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
Eşleme dosyası · örnek (mapping.txt)
com.example.payment.CardManager -> com.example.a:
android.content.Context context -> a
boolean setDefaultCard(java.lang.String) -> b
Eski ad → yeni ad. Bu dosya, gizlemeyi tamamen geri alır.
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
ProGuard/R8 · bu bölümün kuralı
Küçült + iyileştir + gizle; dizeleri gizlemez .
-keep yalnız gerçekten reflection/JNI ile çağrılana.
mapping.txt bir sır : sakla, dağıtma.
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
10. Dize gizleme ve reflection
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
Dize gizleme ve dinamik çağrı — şema
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
Java'da dizeler açık
.class içindeki sabit dizeler düz görünür (strings, tersine derleyici).
Hassas URL, anahtar parçası, mesajlar sızar.
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
Dize gizleme
Dizeler derlemede kodlanır , kullanımda çözülür.
haftadaki kuralla aynı: strings'i durdurur, anahtar saklamaz .
Çözme kodu da bytecode'da → sınırlı koruma.
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
Dize gizleme — animasyon
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
⚠️ Reflection ile gizleme çatışması
Ada göre çağrı (getMethod("verify")) gizlemeden sonra kırılır.
Çözüm: ya -keep ya reflection'ı bırakıp doğrudan çağrı.
Reflection'ı azaltmak hem güvenlik hem gizleme için iyidir.
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
11. Android R8 ve ölçme
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
Android'de R8
R8, Android derlemesinin varsayılan küçültücü/gizleyicisi.
minifyEnabled true + proguard-rules.pro.
DEX (Android bayt kodu) üretir.
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
Sürüm derlemesinde R8 açmak
android { buildTypes { release {
minifyEnabled true
shrinkResources true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt' ),
'proguard-rules.pro'
}}}
Hata ayıklama (debug) derlemesi gizlenmez ; dağıtılan sürümün release olduğunu doğrulayın. Android'siz salt Java/Gradle projelerinde daha sade bir biçim yeterlidir:
buildTypes { release {
minifyEnabled true
proguardFiles(..., 'proguard-rules.pro' )
}}
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
Gizlemenin etkisini ölçmek
Gizleme öncesi/sonrası:
anlamlı ad oranı
düz metin hassas dize sayısı
APK boyutu
Ölç ve S9'a yaz (9. haftadaki ölçme mantığı).
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
Ölçüm tablosu — genişletilmiş
Ölçüt
Beklenen değişim
Sınıf/metot sayısı
Küçültmeyle azalır
Anlamlı ad oranı
Gizlemeyle çok düşer
Düz metin hassas dize
Dize gizlemeyle sıfıra iner
Paket boyutu
Küçültmeyle azalır
Günlük çağrısı sayısı
Sürümde sıfır
Denetimi bulma süresi
Artar (insan deneyi)
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
Java için statik analiz
SpotBugs, Error Prone, SonarQube.
CERT Java kurallarına yakın denetimler.
CI'da her birleştirmede.
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
Bölüm 8–13 — kısa sınama
Java bayt kodu neden C'den kolay okunur?
-keep dengesi nedir?
Reflection gizlemeyle neden çatışır?
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
Bölüm 8–13 — cevaplar
Bayt kod yüksek seviyeli ; tip ve ad meta verisi (sınıf/alan/metot) korunur → decompiler neredeyse kaynağı verir. C, adları atarak makine koduna derlenir.
-keep dengesi: çok keep → gizleme zayıflar; az keep → reflection/serileştirme kırılır. Yalnız dış giriş noktalarını keep et.
Reflection adları dizeyle çağırır; gizleyici adı değiştirince dize eşleşmez → çalışma anında hata. O adları keep etmek gerekir (gizleme boşluğu).
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
12. Bağımlılık güvenliği ve SBOM
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
Sorun · tedarik zinciri
Kendi kodunuz kusursuz olsa bile, kullandığınız kütüphanelerdeki açık sizi etkiler.
Modern uygulama yüzlerce bağımlılık içerir.
"Hangi sürüm bende var?" sorusu kritik.
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
Gerçek örnekler
Log4Shell (Log4j): tek bir kütüphane açığı, milyonlarca sistemi etkiledi.
Kötü niyetli paket (typosquatting): benzer adlı sahte paket.
Bakımsız/terk edilmiş bağımlılık.
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
Log4Shell · somut örnek (Aralık 2021)
Log4j 2'de günlüğe yazılan özel bir ifade, uzaktaki bir adresten sınıf yükletip çalıştırıyordu.
CVE-2021-44228, CVSS 10.0 (en yüksek skor).
Asıl kriz yamayı uygulamak değildi: hangi sistemde hangi sürüm var sorusuydu.
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
SBOM nedir?
Yazılımın malzeme listesi : hangi bileşen, hangi sürüm, hangi lisans.
Bir açık duyurulunca "etkilendim mi?" hızlı yanıtlanır.
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
SBOM biçimleri
CycloneDX (OWASP) — güvenlik odaklı, yaygın.
SPDX (Linux Foundation) — lisans odaklı da güçlü.
Araçlarla otomatik üretilir (derleme adımında).
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
CycloneDX örneği (JSON, sentetik)
{
"bomFormat" : "CycloneDX" ,
"components" : [ {
"type" : "library" , "name" : "example-json" , "version" : "1.2.0" ,
"purl" : "pkg:maven/com.example/example-json@1.2.0"
} ]
}
Her bileşen: ad, sürüm, purl (ekosistemden bağımsız tekil kimlik), özet değeri.
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
VEX nedir?
VEX (Vulnerability Exploitability eXchange): "bu açık bende var ama sömürülebilir değil " bilgisini paylaşır.
Gürültüyü azaltır: her CVE panik değil.
SBOM'a eşlik eder.
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
SBOM → CVE eşleştirme — animasyon
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
SBOM → CVE eşleştirme — uç durum: düzeltilmiş sürüm artık işaretlenmiyor
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
Bağımlılık yönetimi kuralları
Sürümleri sabitle (pin); rastgele "en son" çekme.
Bilinen açıkları tara (dependency-check, npm audit, pip-audit).
Güvenli güncelleme süreci; kritik yamaları hızlı uygula.
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
SBOM üretimi · örnek akış
Her sürümün SBOM'u sürüm kimliğiyle saklanır.
mvn org.cyclonedx:cyclonedx-maven-plugin:makeBom
dependency-check --scan . --format HTML
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
Projeye bağ
S13: güvenli geliştirme süreci + SBOM.
Her sürüm için güncel SBOM ve bağımlılık taraması.
Devredilen gereksinimler: "güvenli güncelleme" üst uygulamaya (13. hafta).
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
SBOM · bu bölümün kuralı
Kendi kodun kusursuz olsa da bağımlılığın açığı seni etkiler .
SBOM = malzeme listesi; VEX = "gerçekten etkilendim mi?" cevabı.
Sürümü sabitle , sürekli tara , kritik yamayı hızlı uygula.
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
Bölüm 14 — kısa sınama
SBOM ne işe yarar?
VEX neden gürültüyü azaltır?
Bağımlılık sürümlerini neden sabitleriz?
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
Bölüm 14 — cevaplar
SBOM = bileşen/bağımlılık envanteri; yeni açık çıkınca "bende var mı?" sorusunu hızla yanıtlar.
VEX açığın üründe gerçekten sömürülebilir olup olmadığını bildirir; etkilenmeyenler "not affected" → yanlış alarm azalır.
Sabit sürüm = yeniden üretilebilir derleme + tedarik zinciri güvenliği; beklenmedik/zararlı güncellemeyi engeller.
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
Kullanıcı adı ve parola ile giriş yapan bir uygulama.
String q = "SELECT * FROM users WHERE name='" + name +
"' AND password='" + p + "'" ;
Nerede yanlış?
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
Adım 1 · saldırgan girdisi
name alanına:
admin' --
-- SQL'de yorum başlatır; sonrası yok sayılır.
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
Adım 2 · sorgu ne oluyor?
SELECT * FROM users WHERE name= 'admin'
Parola denetimi yorumda kaldı → parolasız admin girişi.
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
Adım 3 · etki
Kimlik doğrulama atlatıldı .
Daha ileri: UNION SELECT ile başka tabloları okuma.
; DROP TABLE (yığın sorgu destekliyse) veri kaybı.
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
Adım 4 · düzeltme
PreparedStatement ps = con.prepareStatement(
"SELECT * FROM users WHERE name=? AND password_hash=?" );
ps.setString(1 , name);
ps.setString(2 , hash(p));
name ve parola artık veri ; -- etkisiz.
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
Adım 5 · katmanlı savunma
Parolayı düz saklama: özet + tuz (3. hafta).
En az yetki: DB kullanıcısı yalnız SELECT.
Girdi doğrulama: kullanıcı adı beyaz liste.
Günlük/izleme: başarısız giriş denemeleri.
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
Ders
Tek kök: veri komuta karıştı.
Asıl çözüm: parametreli sorgu.
Ama derinlemesine savunma her katmanda.
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
Aynı hata, üç dil
Tehlike
Java
Python
JS
Komut
Runtime.exec(str)
os.system(str)
exec(str)
Güvenli
ProcessBuilder([...])
subprocess.run([...])
execFile([...])
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
Aynı hata, veri çıkarma
Tehlike
Java
Python
JS
Kod çalıştırma
readObject
pickle.loads, eval
eval, Function
Güvenli
JSON + şema
json.loads
JSON.parse
Kök hep aynı: veri ≠ kod.
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
Üç dil · tek kural
Dinamik "çalıştır" (eval, exec, pickle, readObject) → güvenilmez veriyle asla .
Komut → argüman dizisi.
SQL → parametreli.
Girdi → beyaz liste + reddetme.
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
Enjeksiyon · genel ders
Enjeksiyon dile bağlı değil; kalıba bağlı.
Kalıbı tanı: "kullanıcı verisi bir yorumlayıcıya komut olarak mı gidiyor?"
Tanıdıysan çözüm hazır: ayır.
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
Klasik hatalar — özet
Hata
Bölüm
Kural
String birleştirmeyle SQL/komut kurmak
2, 3
Parametreli sorgu / argüman dizisi kullan
Güvenilmez veriyle eval/pickle/readObject
5, 7
Veri biçimi + şema kullan, asla çalıştırma
XML'de dış varlıkları açık bırakmak
6
Dış varlıkları ve DOCTYPE'ı kapat
-keep * ile her şeyi korumak
9
Yalnız gerçekten gereken giriş noktalarını tut
Bağımlılıkları taramamak
12
SBOM üret, sürekli tara
Beşi de bu destede işlendi; burada tek bakışta toparlıyoruz.
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
Proje · S9/S13 (Java tarafı)
[ ] Enjeksiyona açık noktaları parametreli API'ye çevir (SQL, komut, yol).
[ ] Yol: kanonikleştir + kök denetimi (path traversal kapalı).
[ ] Güvensiz deserialization varsa filtre/şema.
[ ] XXE kapalı (dış varlıklar + DOCTYPE reddedilir).
[ ] R8/ProGuard ile gizleme; -keep yalnız gereken giriş noktaları.
[ ] Dize gizleme; hassas dize strings/tersine derlemede yok.
[ ] SBOM üret + bağımlılık taraması (S13).
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
Soru 1
Yönetilen dil hangi hata sınıfını çözer, neyi çözmez?
Cevap: Bellek hatalarını (taşma, UAF) büyük ölçüde çözer. Enjeksiyon, mantık/yetki hataları, bağımlılık ve deserialization saldırılarını çözmez .
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
Soru 2
' OR '1'='1 neden tüm satırları döndürür?
Cevap: Girdi string birleştirmeyle sorguya girer; tırnak veriyi bitirir, OR '1'='1' her zaman doğru olur. Parametreli sorgu bunu engeller.
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
Soru 3
Komut enjeksiyonunu ProcessBuilder nasıl önler?
Cevap: Kabuk kullanmadan argümanları dizi olarak verir; metakarakterler (;, |) yorumlanmaz, girdi tek argüman kalır.
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
Soru 4
Yol geçişini hangi iki adım kapatır?
Cevap: Kanonikleştirme (normalize/toRealPath) + kök denetimi (startsWith(root)). Ayrıca dosya adı beyaz listesi.
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
Soru 5
Güvensiz deserialization neden tehlikelidir? Çözüm?
Cevap: Çıkarma sırasında nesne metotları çalışır; gadget zinciriyle kod çalıştırılabilir. Çözüm: native serileştirme yerine veri biçimi + şema; zorunda kalınırsa ObjectInputFilter beyaz listesi.
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
Soru 6
XXE nedir, hangi ayar kapatır?
Cevap: XML dış varlıklarının kötüye kullanımı (dosya okuma/SSRF). Dış varlıkları ve DOCTYPE'ı kapatan ayrıştırıcı ayarı kapatır.
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
Soru 7
ReDoS ve prototype pollution nedir?
Cevap: ReDoS: kötü regex'in üstel zaman harcaması (DoS). Prototype pollution: JS'te __proto__ üzerinden tüm nesneleri bozma. İkisi de girdi denetimi + güvenli API ister.
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
Soru 8
Java bayt kodu neden gizlemeye daha çok ihtiyaç duyar?
Cevap: Bayt kodu yüksek seviyeli, tür ve ad bilgisi taşır; kaynağa çok yakın tersine derlenir. Adlar/dizeler açık görünür.
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
Soru 9
-keep dengesi nedir?
Cevap: Çok az -keep → reflection kırılır, uygulama çöker. Çok fazla → gizleme zayıflar. Yalnız gerçekten reflection'la çağrılan giriş noktaları tutulur.
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
Soru 10
Dize gizleme Java'da anahtar saklar mı?
Cevap: Hayır. strings/statik taramayı durdurur ama çözülen dize bellekte açıktır ve çözme kodu bytecode'dadır. Anahtar için farklı koruma gerekir.
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
Soru 11
SBOM ve VEX ne işe yarar?
Cevap: SBOM bileşen listesidir; açık duyurulunca etkilenip etkilenmediğinizi hızla söyler. VEX, açığın sömürülebilir olup olmadığını belirtir, gürültüyü azaltır.
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
Soru 12
Tüm enjeksiyon türlerinin ortak kökü ve çözümü?
Cevap: Kök: veri ile komutun karışması. Çözüm: veriyi koddan ayırmak (parametreli/argüman dizisi API), string birleştirmeyle komut kurmamak.
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
Sözlük
Terim
Anlam
Enjeksiyon
Veri = komut karışması
Parametreli sorgu
Veri ayrı bağlanır
Deserialization
Bayt → nesne (riskli)
XXE
XML dış varlık kötüye kullanımı
R8/ProGuard
Küçültme + ad gizleme
SBOM/VEX
Bileşen listesi / sömürülebilirlik
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 5
Bir sonraki hafta
Hafta 6 — RASP ve çalışma anı korumaları
Bu hafta gizleme ve küçültmeyle bayt kodunun statik olarak okunmasını zorlaştırdık; ama saldırgan uygulamayı çalışırken de inceleyebilir (hata ayıklayıcı bağlamak, bellek dökümü almak, kanca takmak).
Hafta 6'da RASP (Runtime Application Self-Protection) ile bir uygulamanın çalışma anında kendini nasıl doğruladığını, hata ayıklayıcıyı ve kancaları nasıl algıladığını göreceğiz — bu haftaki statik savunmanın üstüne inşa edilen bir sonraki katman.
Bu haftanın özeti: Yönetilen dil bellek hatalarını çözer ama enjeksiyon her dilde vardır ; çözüm her zaman veriyi komuttan ayırmak, koruma tarafında ise gizleme (R8) ve bağımlılık/SBOM yönetimidir.
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
Konuşma notu: Bu hafta yönetilen dillere geçiyoruz: bellek güvenliği bedava gelir ama enjeksiyon, seri durumdan çıkarma, okunabilir bayt kodu ve bağımlılıklar yeni riskler getirir.
Konuşma notu: Hafta 4'teki C/C++ karşılığını Java/yorumlanan dillerde işliyoruz. Sıfır ön bilgi varsayıyoruz; her terimi tanımlayacağız.
Konuşma notu: Sonra SQL enjeksiyonu.
Konuşma notu: Parola alanına yazılan ilk tek tırnak dize sabitini kapatır; ondan sonraki her karakter artık VERİ değil, SQL SÖZ DİZİMİ olarak okunur. Parametreli sorguda aynı karakterler tek bir DEĞER olarak kalır. Örnek seçiciden "Uç durum" örneklerini de gösterin.
Konuşma notu: Aynı tehlikeli karakter (tek tırnak) bu kez parametreli sorguda: sorgunun YAPISI hiç değişmiyor, tırnak yalnızca DEĞERİN bir parçası kalıyor.
Konuşma notu: Kabuk metni önce belirteçlere ayırır; bir `;`/`&` belirteci "yeni bir komut başlat" demektir, "ek bir argüman" değil. argv listesinde aynı karakterler TEK bir argümanın içinde kalır, kabuk hiç çalışmaz.
Konuşma notu: `runSecure` önce `isAllowed(name)`i çalıştırır; bu girdi orada REDDEDİLİYOR, `buildSecureArgs`/`ProcessBuilder` çağrılmıyor bile. İki bağımsız savunma katmanı: izin listesi + argv listesi.
Konuşma notu: İstek segment segment işlenir; köktenken bir `..` kökün DIŞINA çıkma girişimidir. Güvensiz yol hiç denetlemeden okur; güvenli yol kanoniklleştirip kök denetimi yapar.
Konuşma notu: Aynı `../secret.txt` isteği bu kez `resolveSafely` ile: kanonik yol kökün dışına çıktığı için `null` döner, dosya hiç okunmaz.
Konuşma notu: Sonra seri durumdan çıkarma ve XML.
Konuşma notu: Filtresiz akış, içindeki sınıf adı ne olursa olsun onu örnekler. Filtreli akış önce sınıf adını izin listesi kalıbıyla karşılaştırır; eşleşmezse InvalidClassException — sınıf hiç oluşturulmaz.
Konuşma notu: Bu kez ObjectInputFilter DEVREDE; akıştaki sınıf adı kalıbın hiçbir parçasıyla eşleşmiyor, InvalidClassException fırlatılır, nesne HİÇ oluşturulmuyor.
Konuşma notu: Sonra bayt kodu ve gizleme.
Konuşma notu: Dört bayt kodu komutu (ldc, aload_0, invokevirtual, ireturn) birer birer kaynak parçasına eşleniyor; sonunda `return VALID_PIN.equals(entered);` tamamen yeniden kuruluyor.
Konuşma notu: Aynı dört bayt kodu komutu bu kez `licenseValid` için; aday değer `LICENSE_KEY` ile birebir eşleşmiyor, bytecode'dan okunan mantık `false` sonucunu veriyor.
Konuşma notu: Her üye -keep kuralıyla eşleşiyorsa adı korunur, eşleşmiyorsa a, b, c... gibi kısa bir adla değiştirilir. Bu uç durumda -keep TÜM üyeleri kapsıyor — hiçbir şey yeniden adlandırılmıyor, gizleme boşa gidiyor.
Konuşma notu: Şifreli bayt dizisi bayt bayt işlenip çözülen dize canlı olarak kuruluyor. Bu uç durumda anahtar 0x00 — şifreli baytlar zaten düz metinle aynı; XOR ile "0" anahtar hiçbir şey gizlemez.
Konuşma notu: Sonra SBOM ve bağımlılık güvenliği.
Konuşma notu: Her bileşen adı VE tam sürümüyle bilinen zafiyetler listesine karşı tek tek denetleniyor. Bu örnek Demo 6'nın gerçek SBOM'u — iki bileşen (log-core, json-tool) işaretleniyor.
Konuşma notu: Aynı `log-core` adı, ama sürüm artık 2.17.1 (düzeltilen sürüm) — `if record and version in record["versions"]` bu kez `hayır` sonucunu veriyor, hiçbir uyarı çıkmıyor. Tam sürüm eşleşmesi bu yüzden kritik.
Konuşma notu: Sonra proje ve çözümlü sınama.
Konuşma notu: Tek bir SQL enjeksiyonunu hatalı koddan saldırıya, düzeltmeye ve katmanlı savunmaya kadar izliyoruz.