Belajar Cyber Security #17: CI/CD & Supply Chain — Sabar-sabar Serangan dari Dependensi

Di episode #2 saya menyebut supply chain attack sebagai salah satu ancaman terbesar di lanskap 2026, tapi waktu itu kita hanya menyentuh permukaan. Kali ini saya mau masuk lebih dalam ke tempat saya sendiri paling sering berinteraksi dengan rantai pasok perangkat lunak: pipeline CI/CD dan manajemen dependensi. Jujur, topik ini yang paling mengubah cara saya bekerja sehari-hari — karena setiap kali saya mengetik npm install atau pip install, saya sebenarnya sedang mempercayai kode dari orang yang tidak pernah saya temui.

Infografis pipeline CI/CD dengan lima tahap: source code, dependensi, build, registry, deploy, beserta serangan dan pertahanannya
Lima tahap pipeline dan titik masuk penyerang di masing-masing tahap.

Supply chain attack: analogi untuk programmer

Saya selalu memakai analogi ini untuk mengingat kenapa serangan jenis ini berbahaya. Bayangkan kamu sudah mengunci semua jendela rumahmu, memasang alarm, dan menjaga pintu rapat-rapat — itu semua upaya mengamankan aplikasi kita sendiri: input divalidasi, query dipakai prepared statement, sesi diperbarui dengan benar. Tapi setiap pagi kamu makan sup kaleng dari pemasok yang kamu percaya buta. Kalau pemasoknya diracuni, semua pengaman di rumahmu percuma — racunnya masuk lewat jalur yang kamu anggap aman.

Dependensi open source itu kaleng sup kita. Proyek web modern biasa menarik ratusan paket secara tidak langsung (transitive dependency) hanya untuk satu npm install. Dan bedanya dengan sup kaleng: kamu bisa tahu pemasokmu dalam semalam — maintainernya berubah, token akunnya dicuri, atau versi baru yang tampaknya biasa saja menyimpan skrip tambahan yang jalan otomatis saat dipasang.

Tiga kasus yang membuat saya lebih waspada

SolarWinds (Desember 2020). Penyerang (APT29, dikaitkan dengan SVR Rusia) menyusup ke proses build SolarWinds Orion, lalu backdoor bernama SUNBURST ikut terdistribusi lewat update resmi. Sekitar 18.000 pelanggan berpotensi menerima update yang terinfeksi, walau menurut SolarWinds sendiri fewer than 100 benar-benar dikompromi. Pelajaran besarnya bukan angkanya, melainkan fakta bahwa jalur update resmi — yang biasanya justru cara kita MEMPERBAIKI keamanan — berubah menjadi pintu masuk.

xz utils (CVE-2024-3094, Maret 2024). Ini yang paling membuat saya merinding karena saking sabarnya. Seorang kontributor bernama Jia Tan membangun kepercayaan sejak 2022, perlahan mendapatkan akses maintainership, lalu menyisipkan backdoor ke versi 5.6.0 dan 5.6.1. Backdoor ini menargetkan autentikasi sshd di sistem Linux. Kasus ini terbuka bukan lewat tools canggih, melainkan karena seorang engineer bernama Andres Freund menyadari ssh terasa lambat saat login, telaten mendalami, lalu mengumumkannya di mailing list oss-security pada 29 Maret 2024. Serangan ini nyaris lolos ke distro besar.

Shai-Hulud (September 2025). Worm di ekosistem npm: versi beracun dari 100+ paket populer memakai post-install script yang menjalankan pemindai secret TruffleHog, mencuri variabel lingkungan dan token, lalu — kalau menemukan token npm lain di lingkungan korban — MENERBITKAN SENDIRI versi beracun ke paket yang bisa diaksesnya. Artinya sekali terpasang di satu mesin CI, ia menyebar sendiri ke seluruh token yang tersedia. Wiz Research menyebutnya serangan worm pertama yang sukses di npm dan menempatkannya sebagai satu dari serangan supply chain JavaScript terparah yang pernah diamati; akarnya ditelusuri ke kompromi s1ngularity/Nx di akhir Agustus 2025.

Di mana penyerang masuk di pipeline kita

Kalau dilihat sebagai satu rantai (lihat ilustrasi di atas), pipeline CI/CD punya lima titik masuk utama, dan masing-masing punya cerita kasus sendiri:

  • Source code — token GitHub developer dicuri, commit dibuat dari akun yang sudah dikompromi.
  • Dependensi — paket versi beracun, typosquatting, atau maintainer yang berubah hati seperti kasus xz.
  • Build/CI — runner yang dipakai untuk pivot ke jaringan lain, secret CI yang bocor ke log publik.
  • Registry — token publish npm/Docker dicuri, penyerang menerbitkan versi baru dengan nama paket yang sama. Kasus SolarWinds hidup di titik ini.
  • Deploy — artifact yang tidak diverifikasi langsung dipush ke produksi.

Praktik pertahanan yang saya terapkan

Setelah membaca ketiga kasus di atas, ini yang saya ubah di workflow pribadi dan proyek tim. Tidak ada yang mahal atau rumit — kebanyakan hanya kebiasaan baru:

  1. Commit lockfile dan pin versi. package-lock.json / poetry.lock / requirements.txt dengan versi eksplisit harus ikut ke git. Lockfile memastikan tim memasang kode yang sama persis yang pernah diuji.
  2. Audit otomatis sebelum install berjalan. npm audit, pip-audit, atau Dependabot/Renovate untuk PR update dependensi otomatis.
  3. Waspada script lifecycle. postinstall adalah tempat Shai-Hulud bersembunyi. Di proyek sensitif, npm ci --ignore-scripts dulu adalah langkah yang layak dipertimbangkan.
  4. Secret CI sesedikit mungkin. Token dengan scope minimal, rotasi berkala, jangan taruh credential registry di variabel yang bisa dibaca semua pipeline.
  5. Kenali rantai kita: SBOM. Software Bill of Materials daftar semua komponen beserta versinya — sama seperti daftar bahan di kemasan makanan. Tool seperti syft bisa menghasilkannya.
  6. Verifikasi artifact. Tandatangani image dengan cosign (Sigstore) di CI, lalu wajibkan verifikasi tanda tangan saat deploy — menutup titik masuk registry.

Contoh kecil yang langsung bisa dicoba di proyek Node atau Python:

# audit dependency tanpa mengubah apapun
npm audit --audit-level=high
pip-audit --requirement requirements.txt

# generate SBOM sederhana
syft . -o spdx-json > sbom.spdx.json

Catatan pribadi

Yang paling saya pelajari dari episode ini: keamanan supply chain bukan soal mencurigai semua orang, tapi soal mengurangi kepercayaan yang tidak perlu. Kita tetap memakai dependensi open source — itu justru kekuatan ekosistem kita sebagai programmer — tapi kita pasang rem: lockfile, audit, tanda tangan artifact, dan secret yang sesedikit mungkin. Kalau di episode #16 kita belajar memindai image container, di episode ini kita belajar memindai seluruh rantai yang lebih panjang — dari kode sumber sampai deployment. Anggap saja seperti menanam kebun sendiri: kita tidak bisa mengendalikan cuaca, tapi kita bisa memilih benih, memeriksa air, dan mencabut gulma sebelum ia berbuah.

Sumber

  • CISA — Reported Supply Chain Compromise Affecting XZ Utils (CVE-2024-3094): cisa.gov
  • oss-security — Andres Freund, “backdoor in upstream xz/tukaani”: openwall.com
  • JFrog — XZ Backdoor Attack CVE-2024-3094 timeline: jfrog.com
  • SolarWinds — An Investigative Update of the Cyberattack (angka 18.000 & fewer than 100): solarwinds.com
  • GAO — Federal Response to SolarWinds and Microsoft Exchange (GAO-22-104746): gao.gov
  • Wiz Research — Shai-Hulud npm Supply Chain Attack: wiz.io
  • Unit 42 — The npm Threat Landscape: unit42.paloaltonetworks.com
  • NCSC — Software supply chain attacks: check your dependencies: ncsc.gov.uk

Tinggalkan Balasan

Alamat email Anda tidak akan dipublikasikan. Ruas yang wajib ditandai *

Situs ini menggunakan Akismet untuk mengurangi spam. Pelajari bagaimana data komentar Anda diproses