Back to IF4033 Keamanan Siber

Rangkuman - Studi Kasus Membaca Kode

Questions/Cues

  • Bagaimana cara sistematis membaca kode untuk menemukan kerentanan?
  • Pola kerentanan apa yang sering muncul pada kode soal?
  • Bagaimana memperbaikinya?
  • Bagaimana memetakan temuan ke CIA dan prinsip desain?

Reference Points

  • Rangkuman payung 2 (Software Security)
  • Rangkuman payung 8-9 (konfigurasi pod cloud-native)

Cara Membaca Kode (5 Langkah)

  1. Cari input dari luar: socket, request HTTP, parameter, file, env var.
  2. Ikuti sampai sink berbahaya: akses file, query DB, perintah shell, strcpy, output ke HTML.
  3. Periksa pertahanan di jalur itu: validasi input, penanganan exception, otorisasi, escape.
  4. Periksa hak dan rahasia: berjalan sebagai siapa, kredensial hardcoded, kripto lemah.
  5. Klasifikasikan dan beri perbaikan: CIA mana yang rusak, prinsip desain mana yang dilanggar.

Kasus 1: SimpleWebServer (dari slide)

String request = br.readLine();                 // input dari klien
StringTokenizer st = new StringTokenizer(request, " ");
command  = st.nextToken();                      // (1) bisa melempar exception
pathname = st.nextToken();
...
fr = new FileReader(pathname);                  // (2) path dari klien dipakai langsung
#TemuanDampakPerbaikan
1Request kosong → nextToken() melempar exception tak tertangani; server crashAvailability (DoS)try/catch, balas 400 Bad Request, tutup koneksi
2../../etc/shadow dibaca karena path tidak divalidasiConfidentiality (path traversal)Validasi/kanonikalisasi path, batasi ke root dokumen
3Server tidak membatasi hak prosesDampak membesarLeast privilege: jalankan sebagai user biasa
4Tidak percaya input → belum diterapkanAkar masalahNever trust user input

Kasus 2: Pola Lain yang Sering Muncul

SQL Injection

String q = "SELECT * FROM users WHERE name='" + name + "' AND pw='" + pw + "'";

Input ' OR '1'='1 membuat kondisi selalu benar → bypass login (Authentication/Confidentiality). Perbaikan: prepared statement (parameter terikat), validasi, akun DB least privilege.

Buffer overflow (C)

char buf[16];
strcpy(buf, argv[1]);   // tanpa pengecekan panjang

Input panjang menimpa memori (crash atau RCE). Perbaikan: strncpy/snprintf, cek panjang, bahasa memory-safe.

Kredensial hardcoded

String password = "P@ssw0rd123";

Terbaca dari repo atau binary. Perbaikan: simpan di secrets manager/env/vault, rotasi.

Kripto lemah

Cipher.getInstance("DES/ECB/NoPadding");  MessageDigest.getInstance("MD5");

DES (56-bit) mudah di-brute force, ECB membocorkan pola, MD5 collision. Perbaikan: AES-GCM, SHA-256, password hash (bcrypt/Argon2) dengan salt.

Authorization tidak dicek (IDOR)

Order o = db.getOrder(request.getParameter("id")); // tidak cek pemilik

Pengguna lain dapat membaca pesanan siapa pun (Authorization/Confidentiality). Perbaikan: periksa bahwa o.owner == currentUser.

Output tanpa escape (XSS)

out.println("Halo " + request.getParameter("name"));

Skrip penyerang dieksekusi di browser korban. Perbaikan: HTML escape, CSP.

Error handling membuka celah (fail-open)

try { if (!authServer.check(user)) return deny(); }
catch (Exception e) { /* lanjut saja */ }   // gagal → lolos

Melanggar fail-secure. Perbaikan: catch berakhir di deny.

Pod/konfigurasi (cloud-native)

hostNetwork: true
securityContext: { privileged: true }
image: myapp:latest
env: [{ name: DB_PASSWORD, value: "P@ssw0rd123" }]

Masalah: host network, privileged, tag :latest, secret hardcoded, tanpa resource limit. Perbaikan: runAsNonRoot, drop ALL capabilities, image digest, secretRef, limits.

Tabel Cepat: Temuan → Klasifikasi

Gejala di kodeIstilahProperti yang rusakPrinsip dilanggar
Exception tak tertanganiDoSAvailabilityFail-secure
Path dari input dipakai langsungPath traversalConfidentialityNever trust input, least privilege
String concat ke querySQL injectionC, I, authNInput validation
strcpy tanpa batasBuffer overflowC, I, ASecure coding
Password di kodeHardcoded credentialConfidentialitySecure by default
Tidak cek pemilikIDOR/broken access controlAuthorizationLeast privilege
Log tidak ada/bisa diubah-Accountability-

Summary

Cara membaca kode: cari input → ikuti ke sink → cek validasi/exception/otorisasi → cek hak dan rahasia → klasifikasikan (CIA) dan perbaiki. Pada SimpleWebServer: DoS (exception tak tertangani; fix: try/catch + 400) dan path traversal (path tak divalidasi; fix: validasi path), dengan pelajaran handle exceptions, least privilege, never trust input. Pola lain: SQL injection, buffer overflow, hardcoded credential, kripto lemah, IDOR, XSS, fail-open.