Skip to content

Kunci CA eMudhra Ternyata Cuma Satu Byte. Container Kamu Masih Percaya?

Terbit Terakhir diperbarui 6 menit baca

Poin penting

  • Private key delapan intermediate CA eMudhra ternyata angka kecil seperti 4, 56, dan 115, sehingga bisa ditebak dalam hitungan milidetik.
  • Chrome memblokirnya lewat CRLSet dalam hitungan jam, dan OneCRL Mozilla sampai ke Firefox standar dalam kurang dari tiga jam.
  • Menurut Endor Labs, TLS stack default di Python, Go, Node, dan kebanyakan CLI tool tidak mengecek revocation, jadi hanya update trust store yang menghilangkan risiko.
  • Certifi 2026.10.19 dan Alpine ca-certificates 20261020-r0 sudah membawa perubahannya, sedangkan Java dianggap belum terkonfirmasi sampai vendor JDK menyatakan sebaliknya.
  • Kebijakan yang disarankan: rebuild base image terjadwal, misalnya mingguan di CI dengan docker build --pull --no-cache.

Versi bahasa Inggris: The eMudhra CA Keys Were One Byte Long. Does Your Container Still Trust Them?

Delapan private key milik intermediate CA eMudhra ternyata hanya angka satu byte, bisa ditebak dalam hitungan milidetik. Chrome dan Firefox memblokirnya di hari yang sama. Base image, bundle Python, dan keystore JVM kamu tidak memblokir apa pun sampai ada yang rebuild.

TL;DR (untuk pembaca non-teknis)

  • Sebuah certificate authority (CA), yaitu lembaga yang menjamin sebuah situs itu asli, membuat delapan kunci penandatangan yang begitu lemah sehingga siapa pun bisa menebaknya.
  • Browser menutup celah ini dalam hitungan jam. Tapi server, script, sistem build, dan aplikasi punya daftar “siapa yang dipercaya” sendiri, dan daftar itu tidak update otomatis.
  • Risiko bisnisnya: penyerang bisa menyamar sebagai layanan tepercaya di mata software kamu, bukan di mata browser pelanggan.
  • Tanyakan ke tim teknis: “Layanan kita ambil daftar CA tepercayanya dari mana, dan kapan terakhir di-refresh?”

Yang terjadi

Fakta dari pernyataan eMudhra, analisis Scott Helme, dan ringkasan di dev.to:

Comparison of expected random 384-bit CA keys versus the tiny numbers 4, 56 and 115 that were actually found, so the search is just 1, 2, 3 and so on.

  • Seorang peneliti melaporkan pada 17 Oktober 2026 bahwa private key delapan intermediate CA eMudhra bocor.
  • Helme menemukan kunci itu bukan nilai acak 384-bit. Isinya angka kecil seperti 4, 56, dan 115, jadi “pencariannya” tinggal mencoba 1, 2, 3, dan seterusnya. Google menyebutnya “dibuat dengan randomness yang tidak memadai”. Secara teknis benar, tapi sangat meremehkan.
  • eMudhra menyatakan ada cacat di langkah key wrap/unwrap pada ceremony 30 April 2025. Hasilnya, muncul set kunci kedua yang lemah di samping yang kuat, dan set lemah inilah yang dikirim ke root program.
  • eMudhra juga menyatakan root key tidak terdampak, dan tidak ada dari delapan intermediate itu yang menerbitkan sertifikat untuk situs sungguhan. Satu berada di production tapi belum menerbitkan apa pun.
  • Chrome memblokir intermediate tersebut lewat CRLSet dalam hitungan jam. OneCRL milik Mozilla sampai ke Firefox standar dalam waktu kurang dari tiga jam.
  • Menurut blog keamanan Google, emSign ECC Root CA - G3 juga akan dihapus dari Chrome Root Store, mulai bergulir 27 Oktober 2026.

Kenapa ini relevan di Indonesia

Banyak tim di Indonesia menjalankan container di VM, cloud, atau on-prem dengan image yang di-build sekali lalu jalan berbulan-bulan. Layanan internal, integrasi antar-sistem, dan job CI sering memanggil endpoint HTTPS tanpa ada browser di antaranya.

Di jalur seperti itu, perlindungan cepat dari browser tidak ikut bekerja. Yang menentukan hanya isi trust store di image atau runtime kamu. Jadi pertanyaan “kapan terakhir image ini di-rebuild?” ikut menentukan postur keamanan, bukan sekadar urusan housekeeping.

Celahnya

Trust store map: browsers block compromised CAs in hours, while Debian/Ubuntu images, Python certifi, Java cacerts and vendored stores stay stale until rebuilt, upgraded or released.

Browser            -> fast distrust lane (CRLSet, OneCRL)   -> blocked in hours
Debian/Ubuntu img  -> ca-certificates package, baked in      -> stale until rebuilt
Python (certifi)   -> its own bundle                         -> stale until upgraded
Java (cacerts)     -> JDK keystore                           -> wait for JDK vendor
Vendored (Go, Node, mobile, firmware) -> frozen snapshots    -> depends on release

Menurut Endor Labs, certifi 2026.10.19 dan Alpine ca-certificates 20261020-r0 sudah membawa perubahannya. Untuk Java, anggap belum terkonfirmasi sampai vendor JDK kamu menyatakan sebaliknya. Poin utama mereka: TLS stack default di Python, Go, Node, dan kebanyakan CLI tool tidak mengecek revocation, jadi satu-satunya cara menghilangkan risiko adalah update trust store.

Kata para praktisi

  • Kegagalan proses. Di LWN, seorang komentator bertanya bagaimana HSM bisa menghasilkan kunci satu byte, dan curiga masalahnya lebih dalam dari satu script yang bug.
  • Marketing versus kenyataan. Komentator lain menyoroti CA ini memakai bahasa post-quantum dan zero-trust, sementara yang dikirim setara satu byte entropi.
  • Keraguan soal penyimpanan. Yang ketiga menunjuk bahwa kesulitan eMudhra memverifikasi tanda tangan CRL-nya sendiri mengisyaratkan kunci tidak disimpan di HSM sebagaimana mestinya.
  • Usulan struktural. Satu komentator mengusulkan HSM attestation wajib untuk setiap root dan intermediate, supaya pembuatan kunci bisa dibuktikan.
  • Pandangan “sudah terkendali”. Tidak semua melihatnya sebagai darurat. Karena belum ada sertifikat dari enam intermediate TLS itu yang tercatat di Certificate Transparency, browser yang mewajibkan CT tetap akan menolak sertifikat palsu. Bantahan Helme: curl dan Python dengan senang hati menerima chain palsu di proof of concept-nya.

Pendapat saya

Saya setuju dengan yang bilang CA adalah ceritanya, dan dengan yang bilang trust store adalah pelajarannya. Dua-duanya benar, di lapisan yang berbeda.

Respons browser sangat baik dan saya tidak mau meremehkannya. Hitungan jam, bukan minggu. Tapi kecepatan itu hanya melindungi satu jenis client yang memang dirancang untuk itu. Gambaran jujurnya: web PKI punya jalur cepat untuk browser dan jalur lambat untuk yang lain, dan sebagian besar traffic backend ada di jalur lambat.

Soal pandangan “sudah terkendali”, saya kurang sependapat. Belum ada sertifikat yang tercatat bukan jaminan untuk masa depan. Kuncinya sudah publik, jadi yang tersisa di antara client internal kamu dan sertifikat palsu hanyalah apakah trust store masih mencantumkan parent-nya. Itu bisa diperbaiki dengan rebuild, jadi lakukan.

Untuk tim, ini mengarah ke satu kebijakan yang membosankan: base image di-rebuild terjadwal, dan versi trust store bisa di-query, bukan sekadar diharapkan aman. Ini juga mendukung diversifikasi CA dan masa berlaku sertifikat yang pendek, karena mengganti CA jauh lebih mudah kalau sudah pernah dilatih.

Coba dalam 15 menit

1. Daftar siapa saja yang melakukan panggilan TLS keluar

Five-step 15-minute trust store audit: list TLS callers, check OS bundle, check language bundles, inspect server certificates, rebuild images weekly.

Service, worker, CI runner, script. Tanyakan “trust store yang mana”, bukan “versi berapa”.

2. Cek bundle OS di container yang sedang jalan

docker exec <container> sh -c 'ls -l /etc/ssl/certs/ca-certificates.crt; grep -c "BEGIN CERTIFICATE" /etc/ssl/certs/ca-certificates.crt'
docker exec <container> dpkg -l ca-certificates
docker exec <container> sh -c 'ls /etc/ssl/certs | grep -i emsign'

Bandingkan versi ca-certificates dengan yang dirilis distro kamu sekarang (Endor mencantumkan versi perbaikan untuk Debian dan Ubuntu). Tanggal file yang lebih lama dari 17 Oktober pada image yang berumur panjang berarti harus rebuild.

3. Cek bundle bahasa pemrograman

python -c "import certifi; print(certifi.__version__, certifi.where())"
pip install --upgrade certifi
keytool -list -cacerts -storepass changeit | grep -i emsign

requests memakai certifi kecuali kamu menimpa verify=, jadi satu mesin bisa punya dua “kebenaran” yang berbeda. Untuk Java, changeit adalah password default cacerts. Solusinya build JDK yang lebih baru, bukan mengedit keystore manual.

4. Lihat apa yang disajikan server

openssl s_client -connect example.com:443 -servername example.com -showcerts </dev/null
openssl x509 -in certificate.pem -noout -issuer -subject -fingerprint -sha256

Kalau issuer menyebut intermediate eMudhra atau emSign, cari tahu kenapa dan kapan diperbarui.

Biar jadi kebiasaan

docker build --pull --no-cache -t myapp:$(date +%Y%m%d) .

Jalankan itu mingguan di CI. Base image yang segar membawa trust store yang segar.

Bahan belajar lanjutan

Pertanyaan

Kalau satu CA yang kamu andalkan dicabut kepercayaannya besok, bisakah kamu menyebutkan dalam sepuluh menit layanan mana saja yang masih akan mempercayainya?

Pertanyaan yang sering diajukan

Bagaimana cara mengecek apakah container saya masih mempercayai CA eMudhra?
Jalankan docker exec <container> sh -c 'ls /etc/ssl/certs | grep -i emsign' dan cek versi paket ca-certificates dengan dpkg -l ca-certificates. File yang lebih tua dari 17 Oktober pada image berumur panjang berarti harus rebuild.
Kenapa browser aman tapi curl dan Python belum tentu?
Browser punya jalur cepat distrust (CRLSet dan OneCRL), sedangkan Python, Go, Node, dan kebanyakan CLI tool tidak mengecek revocation. Hanya update trust store yang menghilangkan risikonya.
Bagaimana cara mengecek trust store Python dan Java?
Untuk Python jalankan python -c "import certifi; print(certifi.__version__, certifi.where())" lalu pip install --upgrade certifi. Untuk Java jalankan keytool -list -cacerts -storepass changeit | grep -i emsign, dan solusinya adalah build JDK yang lebih baru.
Apa yang terjadi pada insiden CA eMudhra?
Seorang peneliti melaporkan pada 17 Oktober 2026 bahwa private key delapan intermediate CA eMudhra bocor. eMudhra menyatakan root key tidak terdampak dan tidak ada intermediate yang menerbitkan sertifikat untuk situs sungguhan.
Bagikan Bagikan ke X Bagikan ke LinkedIn

About the author

Security Engineer & Technical Writer

Security engineer and technical writer based in Batam, Indonesia. I review and harden MCP servers and AI agents, build security automation, and write up what holds and what fails. I also train on DNS security as a PANDI .id Academy trainer.

All writing | RSS | Markdown