Back to IF5161 Keamanan Data dan Perangkat Lunak

Bug Kriptografi Lima Kelas Utama

Questions/Cues

  • Mengapa bug kriptografi tidak terlihat oleh tes fungsional?
  • Apa lima bug kripto yang paling sering muncul beserta CWE-nya?
  • Mengapa ECB membocorkan struktur data dan apa bahaya IV/nonce statis?
  • Mengapa kunci hardcoded, RNG lemah, dan hash cepat berbahaya?
  • Apa temuan umum lain dan mengapa bug ini terus muncul?

Reference Points

  • IF5161 — W07 Crypto and Data Security, “Crypto-Related Vulnerabilities” (Bridge from Last Class s.d. “Anti-Patterns in Crypto Code Review”)

Mengapa Kode Kripto Gagal secara Berbeda

Bug kripto jarang crash: keluarannya tampak acak dan tes lolos karena encrypt lalu decrypt menghasilkan plaintext kembali. Kegagalan hanya terlihat dari sudut model penyerang, bukan tes fungsional. Kebanyakan kegagalan di dunia nyata adalah salah pakai algoritma yang benar, bukan algoritma yang rusak.

Lima Bug Utama

BugKelas kelemahanYang didapat penyerang
ECB modeCWE-327Pola plaintext bocor
IV/nonce statis atau dipakai ulangCWE-329, CWE-323Prediksi, pemulihan plaintext, pemalsuan
Kunci hardcodedCWE-321, CWE-798Siapa pun yang punya kode dapat mendekripsi semuanya
RNG lemahCWE-330, CWE-338Token, kunci, session ID dapat diprediksi
Hash password cepat/tanpa saltCWE-916, CWE-759Cracking offline miliaran tebakan per detik

Bug 1 — ECB: setiap blok dienkripsi independen dengan kunci sama, sehingga blok plaintext identik menghasilkan blok ciphertext identik; struktur data bertahan (“ECB penguin”), dan penyerang dapat memotong, menyusun ulang, dan me-replay blok.

Bug 2 — IV/nonce: mode butuh IV/nonce segar dan unik per pesan. CBC dengan IV yang dapat ditebak membuka chosen-plaintext attack (ide di balik BEAST pada TLS 1.0). Pada CTR dan GCM, nonce berulang berakibat katastrofik: keystream dipakai ulang sehingga XOR plaintext bocor, dan pada GCM dapat membocorkan kunci autentikasi. Bentuk umumnya: IV = b"\x00" * 16.

Bug 3 — Kunci hardcoded: terbaca oleh siapa pun dengan akses repo/build/binary, tak dapat dirotasi tanpa redeploy (sehingga tak pernah dirotasi), tersalin ke fork, backup, log CI, dan image container. Secret scanning murah dan efektif (gitleaks, trufflehog).

Bug 4 — RNG lemah: random, rand(), Math.random() dibuat untuk kecepatan dan statistik, bukan kerahasiaan. Mersenne Twister Python dapat dipulihkan statenya dari 624 keluaran 32-bit berurutan. Korban umum: token sesi, link reset password, API key, IV, salt.

Bug 5 — Hash cepat: MD5, SHA-1, SHA-256 polos cepat by design, salah untuk password. GPU menguji miliaran tebakan MD5 per detik; tanpa salt per pengguna, password sama menghasilkan hash sama dan rainbow table berlaku.

Temuan Lain yang Sering Muncul

  • Validasi sertifikat dimatikan: verify=False, TrustManager trust-all (CWE-295).
  • Algoritma buatan sendiri (XOR “enkripsi”, obfuscation).
  • Enkripsi tak terautentikasi: CBC tanpa MAC yang memungkinkan padding-oracle attack.
  • Perbandingan MAC/token tidak constant-time (timing side channel, CWE-208).
  • Ukuran kunci lemah atau primitif usang: DES, RC4, RSA-1024 (CWE-326).

Mengapa Bug Ini Bertahan

Snippet copy-paste dari forum dengan saran usang; library yang default atau cara termudahnya tidak aman; tidak ada review kripto dalam proses; tekanan kompatibilitas (“sistem lama butuh ECB”); contoh aman dan tidak aman terlihat sama bagi non-ahli.

flowchart LR
    U["Developer menyalin snippet<br/>atau memakai default"] --> B["Algoritma benar,<br/>penggunaan salah"]
    B --> T["Tes fungsional lolos<br/>(encrypt-decrypt OK)"]
    T --> P["Lolos ke produksi"]
    P --> A["Penyerang memakai<br/>model ancaman berbeda"]
    A --> L["Plaintext / kunci / password bocor"]

Anti-Pattern Review Kripto

Berhenti ketika melihat kata “AES”; memeriksa algoritma tetapi bukan mode, IV, sumber kunci, dan randomness; menganggap keluaran terenkripsi aman tanpa bertanya siapa pemegang kunci; menerima diamnya scanner sebagai jaminan; memperbaiki panggilan tanpa merotasi kunci yang sudah bocor.

Summary

Lima kelas bug kripto: ECB, IV/nonce statis, kunci hardcoded, RNG lemah, dan hash password cepat. Algoritmanya biasanya benar; penggunaannya yang salah. Bug ini tak terlihat tes fungsional, bertahan karena snippet usang, default tidak aman, dan tidak adanya review. Perbaikannya dibahas di Perbaikan Bug Kriptografi dan Praktik Terbaik.