Kamu mungkin merasa dependency confusion sudah beres sejak tim memisahkan paket public dan private. Masalahnya, dunia nyata jarang sesederhana itu. Begitu ada mixed registry, monorepo, mirror internal, atau self-hosted index, jalur bingungnya muncul lagi, lalu resolver paket tinggal memilih sumber yang salah.
Dependency confusion hari ini bukan cuma soal nama paket internal bocor ke registry publik. Sekarang ancamannya sering lahir dari kebijakan penamaan yang longgar, namespace yang berantakan, dan proxy registry yang terlalu permisif. Jadi, kalau tim-mu hanya fokus ke public vs private, masih ada blind spot besar.
Jawaban Singkat, Key Takeaways
Dependency confusion masih bisa terjadi meski organisasi sudah punya registry internal. Penyebab utamanya sering ada di internal naming policy, namespace hygiene, dan urutan resolusi pada proxy registries. Kalau mau aman, kamu perlu mengatur nama paket sejak awal, membatasi namespace, lalu memastikan resolver hanya mengambil artifact dari sumber yang benar.

Kenapa dependency confusion masih relevan di enterprise
Model lama bilang begini. Tim internal punya paket privat, attacker mengunggah paket bernama sama ke registry publik, lalu build menarik versi yang salah. Itu benar, tetapi sekarang konteks enterprise jauh lebih rumit.
Sering kali satu organisasi memakai kombinasi npm private, Artifactory, GitHub Packages, PyPI mirror, bahkan registry lokal untuk CI. Selain itu, beberapa monorepo juga memakai alias, workspace, atau fallback registry. Akibatnya, konflik nama tidak selalu terjadi antara public dan private saja, tetapi juga antar registry internal, antar namespace tim, atau antara cache dan upstream.
- Mixed registries, resolver punya lebih dari satu sumber.
- Monorepo, nama paket lokal sering mirip paket publishable.
- Self-hosted indexes, upstream sync bisa membawa paket yang tidak diharapkan.
- Proxy registries, prioritas sumber kadang tidak eksplisit.
Masalah utamanya bukan public vs private, tetapi nama
Banyak tim menganggap access control adalah benteng utama. Padahal, akar masalahnya sering lebih awal, yaitu siapa boleh menamai apa. Kalau naming policy lemah, registry aman pun tetap bisa membingungkan resolver.
1. Internal naming policy yang longgar
Misalnya, tim A membuat paket core-utils, tim B membuat core-auth, lalu tim platform punya auth-utils. Nama-nama generik seperti ini mudah bertabrakan, mudah disalahpahami, dan mudah dipalsukan di tempat lain.
Lebih aman kalau kamu memaksa pola yang jelas, misalnya berdasarkan organisasi, domain fungsi, atau trust boundary. Contoh, @corp-platform/authz-client atau corp.sec.identity.token. Memang lebih panjang, tetapi justru itu nilai plus. Nama yang terlalu nyaman sering terlalu mudah ditiru.
2. Namespace hygiene yang diabaikan
Namespace hygiene berarti menjaga ruang nama tetap bersih, konsisten, dan memiliki pemilik yang jelas. Banyak insiden kecil bermula karena namespace dipakai seperti tempat parkir bebas. Akhirnya, satu nama bisa punya arti berbeda di repo, registry, dan pipeline.
- Tetapkan owner untuk setiap prefix atau scope.
- Larangkan nama generik tanpa prefix, kecuali untuk paket resmi yang sangat terkontrol.
- Cadangkan namespace penting, meski paketnya belum dipakai.
- Audit paket yatim, alias paket tanpa tim pemilik.

Proxy registry bisa jadi pelindung, bisa juga jadi pembuka pintu
Di atas kertas, proxy registry terlihat ideal. Ia memberi cache, kontrol, dan visibilitas. Namun, kalau konfigurasi upstream dan aturan resolusinya kabur, proxy justru menyamarkan dari mana paket datang.
Ini bagian yang sering luput. Banyak tim fokus ke version pinning, tetapi lupa bahwa source pinning sama pentingnya. Paket versi tepat dari sumber yang salah tetap berbahaya.
Framework sederhana, Name, Source, Trust
Supaya gampang diaudit, pakai kerangka Name, Source, Trust.
- Name, apakah nama paket berada di namespace resmi dan reserved.
- Source, apakah resolver hanya boleh mengambilnya dari registry yang ditentukan.
- Trust, apakah artifact punya provenance, signature, atau bukti asal yang valid.
Kalau satu saja gagal, anggap paket itu mencurigakan. Kerangka ini lebih efektif daripada sekadar tanya, ini private atau public.
Contoh jebakan proxy registry
- Proxy internal mengizinkan fallback otomatis ke registry publik.
- Cache lama menyimpan artifact sebelum policy diperketat.
- Namespace internal tidak di-reserve di upstream publik.
- Build agent berbeda memakai urutan registry berbeda.

Tips yang sering tidak dibahas, sengaja bikin nama internal kurang menarik
Ini terdengar aneh, tetapi efektif. Banyak organisasi masih suka nama paket yang pendek, cantik, dan generik. Padahal, itu memperbesar collision. Untuk aset internal, nama yang sedikit verbose justru lebih aman karena ruang ambigu mengecil.
Jadi, jangan buru-buru mengejar nama seperti utils, auth, atau common. Lebih baik pakai nama yang mencerminkan organisasi, domain, dan level kepercayaan. Sedikit jelek untuk developer experience, tetapi jauh lebih bagus untuk security posture.
Langkah praktis buat platform team dan admin registry
Kalau kamu mengelola ekosistem paket enterprise, fokus ke guardrail berikut.
Standarkan naming policy
- Wajibkan scope atau prefix resmi.
- Buat daftar nama terlarang dan nama yang di-reserve.
- Tolak publish paket tanpa pemilik tim yang valid.
Kunci aturan resolusi
- Petakan package pattern ke registry spesifik.
- Matikan fallback diam-diam ke upstream publik untuk namespace internal.
- Samakan konfigurasi developer workstation, CI, dan release pipeline.
Perkuat trust artifact
- Verifikasi signature atau provenance saat tersedia.
- Catat sumber artifact dalam log build.
- Audit cache dan mirror secara berkala.
Hubungkan dengan kontrol supply chain lain
Biar pertahanannya nyambung, baca juga kenapa lockfile saja belum cukup dan kenapa provenance lebih penting daripada daftar komponen saja. Dua topik itu melengkapi blind spot dependency confusion modern.
Referensi penting yang layak kamu cek
FAQ
Apakah scoped package otomatis aman dari dependency confusion?
Belum tentu. Scope membantu, tetapi kalau resolver masih boleh fallback ke sumber lain, atau scope tidak direserve dengan rapi, risiko tetap ada.
Apakah lockfile cukup untuk mencegah serangan ini?
Nggak selalu. Lockfile mengunci versi, tetapi tidak selalu menjamin sumber artifact yang dipakai memang sumber yang kamu maksud.
Siapa yang paling bertanggung jawab, developer atau admin registry?
Keduanya. Developer perlu patuh ke naming policy, sedangkan admin registry harus mengatur namespace, proxy behavior, dan trust policy.
Penutup
Dependency confusion modern bukan lagi cerita lama soal paket public meniru paket private. Sekarang ancamannya lebih licin karena bersembunyi di naming policy, namespace hygiene, dan proxy registry yang setengah benar. Jadi, kalau kamu ingin menutup jalur ini, mulai dari nama, lanjut ke sumber, lalu kunci trust.
Kalau kamu sedang membenahi supply chain di organisasi, tulis pengalamanmu di kolom komentar atau bagikan artikel ini ke tim platform-mu. Setelah itu, jangan lupa langganan update supaya kamu nggak ketinggalan pembahasan keamanan build pipeline berikutnya.



