Oracle
Reads an encrypted message without ever having the key, by asking a server one yes/no question about two thousand times — a real padding-oracle attack against real hand-written AES, with every step animated and the app structurally unable to see the answer it's about to reveal
Solo Developer
Sep 2026
Di halaman ini
- Masalahnya
- Pendekatannya
- Rahasianya disegel di balik closure, dan antarmukanya benar-benar tak bisa melihatnya
- Oracle-nya mengembalikan tepat satu boolean, tak ada lagi
- Disambiguasi false-positive-nya diimplementasikan, dianimasikan, dan terbukti perlu
- Jalankan serangannya sekali, lalu putar ulang jejaknya — jangan pernah animasikan secara real-time
- Hasil
Masalahnya
Kebanyakan orang, termasuk banyak insinyur, percaya "kami mengenkripsinya dengan AES" berarti sebuah pesan aman. Tidak. Sebuah serangan nyata dan terdokumentasi dengan baik — padding oracle — memulihkan seluruh pesan terenkripsi tanpa pernah mematahkan cipher-nya sendiri, dengan mengeksploitasi fakta bahwa sebuah server akan memberi tahu apakah padding sebuah pesan valid. Satu bit umpan balik itu, diulang sekitar dua ribu kali, cukup untuk merekonstruksi seluruh plaintext-nya.
Masalah yang diatasi ini adalah soal keyakinan, bukan informasi: serangan ini sudah ditulis di lusinan tempat, dan tulisan-tulisan itu tak meyakinkan siapa pun, karena satu halaman aljabar tak membuat pembaca merasa AES mereka jadi tak relevan. Visualisasi serangan ini yang sudah ada punya dua masalah berulang: banyak yang mengandung bug implementasi sungguhan — mereka melewati sebuah pemeriksaan false-positive halus yang sebenarnya dibutuhkan serangannya — dan kebanyakan diam-diam menyimpan jawabannya dalam sebuah variabel lalu menganimasikannya kembali ke penonton, yang membuatnya jadi trik sulap alih-alih demonstrasi. Aplikasi ini sama sekali tak punya kode jaringan: sebuah tes memeriksa bundel yang di-build dan menggagalkannya jika API jaringan apa pun muncul di mana pun di dalamnya, sehingga ketidakmampuannya menyerang server sungguhan adalah properti dari build itu sendiri, bukan janji dalam README.
Pendekatannya
Rahasianya disegel di balik closure, dan antarmukanya benar-benar tak bisa melihatnya
Ini mekanisme integritas yang menopang seluruh aplikasi ini. Satu modul menghasilkan kunci, plaintext, dan initialization vector, mengenkripsi, lalu hanya menyerahkan ke atas ciphertext, IV, sebuah fungsi oracle satu-boolean, dan sebuah penghitung panggilan — kunci dan plaintext-nya hidup sepenuhnya di dalam closure dan tak pernah diekspor ke mana pun yang bisa dijangkau antarmuka. Jadi ketika sebuah karakter yang dipulihkan muncul di layar, ia muncul karena serangannya benar-benar menghasilkannya; tak ada jalur kode yang membuat antarmuka bisa sekadar diberi jawabannya. Ini ditegakkan dua cara: pada level tipe, objek yang diserahkan ke setiap tampilan tak punya kolom yang mampu menampung kunci atau plaintext, dan saat runtime, sebuah tes menyimpan plaintext yang diketahui dalam closure-nya sendiri, menjalankan serangan sungguhan terhadapnya, dan menegaskan byte yang dipulihkan cocok — membuktikan aplikasi ini tak curang alih-alih sekadar mengklaimnya.
Oracle-nya mengembalikan tepat satu boolean, tak ada lagi
Tanda tangan tipenya menerima sebuah ciphertext dan mengembalikan boolean polos — tanpa detail galat, tanpa informasi waktu, tanpa indikasi byte mana yang gagal. Tipe kembalian yang lebih kaya akan membiarkan serangannya curang dan akan salah merepresentasikan sinyal sungguhan yang didapat penyerang di dunia nyata. Serangannya harus bekerja dari satu bit karena itulah kebenaran dari serangan sungguhan.
Disambiguasi false-positive-nya diimplementasikan, dianimasikan, dan terbukti perlu
Saat memulihkan byte terakhir sebuah blok, serangan naif bisa mengenai false positive: jika plaintext sungguhan kebetulan sudah berakhir dengan byte padding tertentu, sebuah pemalsuan yang direkayasa juga bisa terlihat seperti padding valid secara kebetulan, dan implementasi naif diam-diam mencatat byte yang salah lalu merusak setiap byte yang dipulihkan setelahnya. Perbaikan yang benar adalah mengganggu byte sebelumnya dan bertanya ulang ke oracle-nya. Aplikasi ini mengimplementasikan pemeriksaan itu, menganimasikannya sebagai ketukan yang terlihat sendiri dalam pemulihannya, membiarkan pembaca mematikannya dan menyaksikan pemulihannya rusak terlihat, dan sebuah tes khusus menegaskan jalur naifnya sungguh gagal pada plaintext yang dikonstruksi untuk memicunya — sehingga perbaikannya terbukti perlu alih-alih sekadar diasumsikan ide bagus.
Jalankan serangannya sekali, lalu putar ulang jejaknya — jangan pernah animasikan secara real-time
Mesin serangannya murni, sinkron, dan tak mengimpor apa pun — tanpa React, tanpa DOM, bahkan tanpa jam. Ia menjalankan seluruh serangan dalam milidetik di muka dan menghasilkan jejak terstruktur yang mencatat setiap byte kandidat yang dicoba, setiap putusan oracle, setiap probe disambiguasi, dan resolusi setiap byte dengan aritmetika lengkapnya. Antarmukanya tak pernah menjalankan ulang serangannya; ia hanya menggambar sebuah posisi dalam jejak itu. Ini membuat penggeseran maju-mundur lewat pemulihannya gratis, memisahkan sepenuhnya kecepatan animasi dari komputasi, dan membuat momen spesifik apa pun dalam pemulihannya bisa dibagikan sebagai URL.
Hasil
Live dan publik: sebuah tumpukan byte empat baris adalah tampilan utama aplikasi ini — apa yang dikirim penyerang, padding apa yang sebenarnya dinilai oracle, blok cipher perantara, dan plaintext-nya — dengan baris plaintext dimulai sebagai kekosongan sungguhan lalu terisi dari kanan ke kiri, satu byte emas setiap kalinya, seiring serangannya benar-benar memulihkan tiap satu. Sebuah sakelar menukar AES-128 tulisan tangan sungguhan dengan cipher mainan yang dilabeli jelas, dan serangan yang sama memulihkan plaintext yang sama dengan biaya yang sama pada keduanya — mendemonstrasikan alih-alih sekadar menyatakan bahwa cipher spesifiknya tak relevan bagi serangan ini. Menyalakan encrypt-then-MAC membuat setiap pemalsuan yang direkayasa gagal autentikasi sebelum pernah didekripsi, sehingga oracle-nya mengembalikan putusan yang identik untuk setiap pertanyaan dan pemulihannya terlihat kelaparan — tak ada emas yang pernah muncul — yang justru untuk itulah enkripsi terautentikasi ada, ditunjukkan alih-alih dideskripsikan dalam prosa.
Penulis tunggal, 65 commit dalam 7 hari, sekitar 3.560 baris TypeScript. Dua dependensi runtime — React dan renderer DOM-nya — dengan AES-128, SHA-256, HMAC, mode cipher CBC, dan padding PKCS7 semuanya diimplementasikan dari nol alih-alih diambil dari pustaka kriptografi mana pun. Sebuah serangan penuh berbiaya sekitar 2.000 panggilan oracle per blok, cocok dengan rata-rata teoretisnya dan ditegaskan oleh tes. Aplikasi ini juga mengirim mode bit-flipping yang mendemonstrasikan kelenturan (malleability) dasar yang sama dari arah lain: menulis ulang user=guest menjadi user=admin dalam pesan terenkripsi, tanpa pernah memegang kuncinya.
- ~2,000
- 5
- 0
- 2
Punya proyek serupa?
Jika Anda butuh sistem yang dibangun dengan ketelitian yang sama — scope jelas, eksekusi solid — mari bicara.
Mulai proyek