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

  1. Yönetilen dil hangi hata sınıfını büyük ölçüde çözer?
  2. Neyi çözmez?
  3. 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

  1. Bellek güvenliği hatalarını (tampon taşması, use-after-free, çift/sarkan işaretçi) — GC + sınır denetimiyle.
  2. Mantık/enjeksiyon/yetkilendirme, güvensiz deserialization, zayıf kripto, bağımlılık açıkları — bunlar dil-üstü, çözülmez.
  3. 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);   // WRONG: name leaks into the query

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);    // name is only DATA
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);  // HATALI

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);  // WRONG

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

  1. ' OR '1'='1 neden tüm satırları döndürür?
  2. ProcessBuilder argüman dizisi neden güvenli?
  3. 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

  1. Dizeye katılınca WHERE koşulunu her zaman doğru yapar → tüm satırlar (veri, kod olarak ayrıştırıldı).
  2. Argümanlar kabuğa değil programa ayrı ayrı geçer; ; | gibi meta-karakter yorumu yok → komut enjeksiyonu kapanır.
  3. (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();  // TEHLİKELİ

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.*;!*");  // allowed classes only
ois.setObjectInputFilter(f);

Tek bir sınıf bekleniyorsa daha dar bir desen de yazılabilir:

ois.setObjectInputFilter(ObjectInputFilter.Config
  .createFilter("com.app.Session;!*"));  // this class only
  • 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);
// ya da dış varlıkları kapat
  • 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)                 # WRONG: any Python expression

import ast
value = ast.literal_eval(input_text)     # Better: literals only
value = int(input_text)                  # Best: parse the expected type

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

  1. Güvensiz deserialization neden kod çalıştırabilir?
  2. XXE'yi hangi ayar kapatır?
  3. 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

  1. Nesne kurulurken sınıfların yan etkili yöntemleri (readObject/gadget zinciri) tetiklenir → saldırgan nesne grafiğiyle akış kurar.
  2. Dış varlıkları ve DOCTYPE'ı kapatan ayrıştırıcı ayarı (disallow-doctype-decl, external entities kapalı).
  3. 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    # disassemble the bytecode
  • 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.
    1. 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

  1. Java bayt kodu neden C'den kolay okunur?
  2. -keep dengesi nedir?
  3. 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

  1. 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.
  2. -keep dengesi: çok keep → gizleme zayıflar; az keep → reflection/serileştirme kırılır. Yalnız dış giriş noktalarını keep et.
  3. 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.

# örnek: CycloneDX eklentisi
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

  1. SBOM ne işe yarar?
  2. VEX neden gürültüyü azaltır?
  3. 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

  1. SBOM = bileşen/bağımlılık envanteri; yeni açık çıkınca "bende var mı?" sorusunu hızla yanıtlar.
  2. VEX açığın üründe gerçekten sömürülebilir olup olmadığını bildirir; etkilenmeyenler "not affected" → yanlış alarm azalır.
  3. 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

Bağlam · giriş formu

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' -- ' AND password='...'

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.