TL; DR
Pada tanggal 14 September 2025, para peneliti mengidentifikasi Shai Hulud, cacing yang dapat memperbanyak diri yang tersembunyi di dalam paket npm, mengubah pembaruan dependensi rutin menjadi pembaruan skala penuh. serangan rantai pasokanPertama kali terlihat di @ctrl/warna kecil Dalam paket yang dibuat oleh Daniel dos Santos Pereira, Shai-Hulud mengumpulkan rahasia, mengeksfiltrasi rahasia tersebut melalui repositori dan alur kerja GitHub, dan menerbitkan ulang dirinya sendiri di seluruh registri menggunakan kredensial yang dicuri. Dalam beberapa hari, jumlah paket yang terinfeksi melonjak dari puluhan menjadi ratusan, yang menegaskan bahwa Shaihulud Ini bukan sekadar trojan biasa, melainkan worm yang dirancang untuk menyebar secara otomatis di seluruh ekosistem npm.
Dampak: Setiap pengembang atau pelaksana CI yang memasang paket npm publik berisiko.
Tindakan segera: Blokir versi yang diketahui, beralih ke instalasi hanya menggunakan lockfile, rotasi token npm dan GitHub, audit alur kerja, dan pantau Indikator Kompromi (IoC).
Apa yang terjadi?
The Serangan rantai pasokan Shai-Hulud pada paket npm merupakan salah satu insiden paling merusak dalam beberapa waktu terakhir. Tidak seperti trojan yang berdiri sendiri, worm ini mencampurkan pencurian kredensial, eksfiltrasi otomatis, dan replikasi mandiriAkibatnya, jangka waktu infeksi menyusut dari beberapa minggu menjadi hanya beberapa jam.
Bagi tim DevOps, pelajarannya jelas: jika setiap instalasi dapat mengeksekusi kode, maka setiap pembaruan dependensi merupakan titik celah potensial.
Kemungkinan Vektor Awal dan Kredensial yang Ditargetkan
Analisis awal menunjukkan bahwa serangan tersebut kemungkinan besar dimulai dengan kredensial yang dicuriSebagai contoh, kampanye phishing yang memalsukan identitas npm. login atau permintaan MFA mungkin telah menangkap token pengembang. Setelah penyerang mendapatkan pijakan pertama itu, worm menyebar dengan menyisipkan dirinya ke dalam paket npm dan mencuri lebih banyak rahasia dari:
- file konfigurasi npm 'like'
.npmrc, seringkali berisi token publikasi. - Variabel lingkungan dan konfigurasi dengan GitHub PAT dan CI/CD rahasia.
- Titik akhir metadata cloud (AWS, GCP, Azure) memberikan kredensial jangka pendek untuk pergerakan lateral.
Oleh karena itu, pencurian kredensial menjadi landasan peluncurannya. Dengan token npm dan rahasia GitHub yang valid, Shai-Hulud dapat mereplikasi dirinya sendiri di berbagai paket dan repositori tanpa upaya manusia tambahan.
Dampak Eksekutif dari Serangan Rantai Pasokan Shai-Hulud
Shai-Hulud masih aktif hingga saat ini. Worm ini mempercepat jangka waktu dampak. Apa yang dulunya membutuhkan waktu berminggu-minggu dengan trojan, kini terjadi dalam hitungan jam. Akibatnya, Penyebarannya lebih cepat dan lebih sulit dikendalikan. Hal ini berkembang dengan cara:
- Mencuri token publikasi npm dan rahasia GitHub.
- Menerbitkan ulang dirinya sendiri ke dalam paket npm lainnya.
- Menambahkan alur kerja GitHub Actions berbahaya untuk persistensi.
Siapa yang terkena dampak:
Tim mana pun yang menginstal paket npm publik berisiko. Terlebih lagi, pengembang dengan token npm atau GitHub yang tersimpan dalam cache menghadapi risiko tinggi. CI runner yang menggunakan rahasia dengan cakupan luas juga rentan.
Resiko bisnis
Dampak bisnisnya berkembang dengan cepat. Token yang dicuri dapat menyebabkan pengambilalihan akun, pembajakan paket, dan bahkan penyalahgunaan cloud. Selain itu, persistensi dalam alur kerja GitHub mempersulit pembersihan. Oleh karena ituOleh karena itu, tim harus memperlakukan insiden Shai-Hulud sebagai insiden yang masih berlangsung, bukan insiden yang sudah selesai.
Bagaimana Serangan Rantai Pasokan Shai-Hulud Bekerja pada Paket npm
Tujuan dan motif penyerang
Kampanye ini dioptimalkan untuk tiga hal:
- Tujuan pertama adalah untuk mencuri kredensial dalam skala besar dari laptop pengembang dan CI runner. Ini termasuk token publikasi npm, token GitHub, dan kredensial cloud. Bahkan, beberapa analisis mengkonfirmasi pengumpulan rahasia secara sistematis, seperti menjalankan TruffleHog dan melakukan kueri pada endpoint metadata cloud.
- Tujuan kedua adalah untuk menyebar secara otomatis dengan menyalahgunakan hak penerbitan dari pengelola yang telah dikompromikan. Akibatnya, satu celah keamanan dengan cepat meluas menjadi banyak, karena versi baru yang terinfeksi dari paket lain muncul tanpa upaya manusia tambahan.
- Tujuan ketiga adalah untuk bertahan dan keluar dengan andal Melalui infrastruktur GitHub, penyerang membuat repositori publik bernama “Shai-Hulud” dengan base64 ganda. data.json, dan sebagai tambahan mereka menanamkan alur kerja yang menserialisasi ${{ toJSON(secrets) }} dan mengirimkannya ke webhook statis.
Keuntungan yang mungkin diperoleh termasuk akses jangka panjang ke registri dan kode sumber, perpindahan lateral yang cepat ke akun cloud, dan opsi untuk mempersenjatai rantai pasokan lebih lanjut. Pelaporan publik menunjukkan repositori pribadi dialihkan ke publik dengan "-migrasi" akhiran, yang meningkatkan paparan data dan momentum
Di dalam Muatan Shai-Hulud: bundel.js dalam paket npm
Kapal Shai-Hulud sebagai besar, dibundel dengan Webpack, dan diminifikasi secara ekstensif File JavaScript (bundel.js(sekitar 3–3.7 MB) yang dieksekusi dari sebuah pascainstal kaitkan package.json. Akibatnya, Setiap instalasi memicu payload secara otomatis. Desain ini menyembunyikan pengidentifikasi, memampatkan alur kontrol, dan mendorong semua logika ke dalam satu artefak yang dieksekusi selama instalasi. Analis secara konsisten mengkonfirmasi penggabungan Webpack, ukuran file yang tidak biasa, dan eksekusi pada saat instalasi.
Ciri-ciri pengaburan dan anti-analisis yang akan Anda lihat dalam sampel:
- Grafik modul yang diperkecil dengan ID modul numerik, komentar yang minim, dan alur kontrol yang disederhanakan. Selain itu,, Struktur ini membuat peninjauan manual menjadi sangat sulit.
- Penyembunyian string melalui lapisan base64 dan alat bantu konstruksi. Misalnya, Pengkodean dan dekode base64 yang berulang biasanya muncul di sekitar rutinitas eksfiltrasi.
- Pengiriman dinamis melalui evaluasi-pola gaya dan badan fungsi yang dihasilkan, sehingga memungkinkan kode untuk mengubah perilaku saat runtime.
- Penyaringan OS lebih memilih eksekusi Linux dan macOS khususnya pada CI runner dan laptop pengembang.
Dari sudut pandang fungsional, paket ini bersifat modular. Penjelasan tersebut menjabarkan modul untuk pendeteksian sistem operasi, pemindaian sistem file dan rahasia Git, akses SDK cloud, operasi API GitHub, dan mesin penyebaran yang mengedit paket lain yang dimiliki oleh pengelola. Bahkan, StepSecurity dan ReversingLabs sama-sama menyoroti fungsi yang secara otomatis memperbarui paket dengan hook berbahaya.
Eksekusi Saat Instalasi di Shai-Hulud: Bagaimana Paket npm Memicu Worm
Serangan dimulai ketika postinstall menjalankan node bundel.js. Pada tahap ini, skrip menginisialisasi dan membongkar status kerja di memori, menyiapkan panggung untuk pengoperasian worm secara penuh.
Penemuan dan pemanenan
- Payload ini mengambil isi process.env dan memindai file lokal untuk mencari rahasia dengan entropi tinggi dan awalan token. Selain itu, cakupan pemindaian diperluas dengan menjalankan TruffleHog.
- Sistem ini melakukan kueri ke titik akhir metadata cloud untuk mengumpulkan kredensial yang berumur pendek. Misalnya, panggilan ke
169.254.169.254di AWS ataumetadata.google.internalPada GCP sering muncul pada inang yang terinfeksi. - Akibatnya, Setiap kredensial yang ditemukan akan langsung dapat digunakan untuk menerbitkan paket npm baru atau mendorong alur kerja GitHub.
exfiltration
- Worm tersebut membuat repositori GitHub baru bernama Shai Hulud dan menulis double yang dikodekan base64
data.jsondengan detail platform, data lingkungan, dan rahasia. Seperti yang terlihat, perilaku yang berisik ini mudah dikenali jika pihak yang bertahan tahu ke mana harus mencari. - Selain itu, ia juga menanamkan alur kerja GitHub Actions, seringkali pada cabang bernama... shai-hulud, yang menserialisasi
${{ toJSON(secrets) }}dan mengirimkan data ke webhook statis. Selain itu, alur kerja ini tetap berjalan hingga seseorang secara aktif menghapusnya.
Perambatan
- Dengan token npm yang ditemukan, payload akan menghitung semua paket yang dimiliki oleh pengelola yang disusupi. Kemudian, ia mengambil setiap tarball, menyuntikkan bundle.js dan entri postinstall, lalu menerbitkan ulang paket tersebut.
- Akibatnya, puluhan paket yang terinfeksi dapat muncul dalam hitungan jam, memperluas jangkauan dampak di seluruh ekosistem.
Ketekunan dan paparan
Worm tersebut menjaga alur kerja berbahaya tetap aktif dan, dalam beberapa kasus, mengubah repositori pribadi menjadi publik dengan cara tertentu. "-migrasi" akhiran. Secara keseluruhan, ini memastikan penyerang mempertahankan pijakan dan memaksimalkan kebocoran data.
Catatan deteksi kunci
Penggunaan yang tidak biasa ini ${{ toJSON(secrets) }} Dalam alur kerja Actions, hal ini jarang terjadi. Oleh karena itu, Tim harus menganggapnya sebagai indikator sinyal tinggi selama perburuan.
Pola alur kerja yang telah disanitasi yang harus Anda cari.
Penggunaan yang tidak biasa ini untuk JSON(rahasia) Tindakan yang dilakukan merupakan indikator penting dalam insiden ini.
Kode semu propagasi tingkat tinggi (aman, deskriptif)
Para analis mengamati siklus ini dalam skala besar, yang menjelaskan lonjakan cepat dari puluhan menjadi ratusan paket yang terinfeksi.
Mengapa ini menjadi worm dalam ekosistem paket?
Worm adalah malware yang menyebar dengan sendirinya tanpa memerlukan langkah-langkah manual dari operator di setiap tahapnya. Dalam sistem operasi, worm biasanya memanfaatkan kerentanan jaringan untuk berpindah dari satu mesin ke mesin lain. Sebaliknya, Shai-Hulud beroperasi di dalam registri npm. Jalur efisiennya adalah melalui penggunaan kembali kredensial.
Worm ini memanfaatkan token publikasi npm yang dicuri. Begitu mendapatkan kredensial yang valid, worm ini mempublikasikan ulang versi yang terinfeksi di bawah paket lain yang dimiliki oleh pengelola yang sama. Selanjutnya, paket-paket tersebut diinstal oleh pengembang atau pelaksana CI yang tidak curiga, dan siklus pun berulang.
Oleh karena itu, analis keamanan, termasuk Membaca Gelap, mengklasifikasikan Shai-Hulud sebagai sebuah cacing yang dapat memperbanyak diri alih-alih trojan sederhana atau insiden typosquatting. Perbedaannya penting: trojan biasanya mengkompromikan satu host, tetapi worm memperkuat dampaknya secara otomatis di seluruh ekosistem.
Lembar contekan “Cara kerjanya”
Untuk meringkas siklus hidup Shai-Hulud, berikut adalah sebuah kesimpulan.cisBerikut rincian langkah-langkah utamanya:
- Sebuah paket berisi pascainstal terpasang, dan
bundle.jsmengeksekusi. - Payload tersebut memuat variabel lingkungan, memindai file dan riwayat git, lalu menjalankan perintah. TruffleHog, dan melakukan kueri ke layanan metadata cloud. Akibatnya, setiap rahasia yang ditemukan menjadi langsung berguna.
- Eksfiltrasi terjadi dengan dua cara: pertama, dengan membuat repositori publik bernama Shai Hulud dengan pengkodean base64 ganda
data.json; kedua, dengan menanamkan alur kerja GitHub Actions yang memposting${{ toJSON(secrets) }}ke webhook. - Dengan menggunakan token npm yang dicuri, worm tersebut menerbitkan ulang semua paket lain yang dimiliki oleh pengelola yang terinfeksi dengan hook berbahaya yang sama. Dengan cara ini, infeksi berkembang biak dengan cepat.
- Terakhir, penyerang menyimpan lebih banyak rahasia, lebih banyak paket untuk disebarkan, dan ketekunan di dalam akun dan repositori GitHub.
Bagaimana cara menghindari jenis serangan ini secara praktis?
Shai-Hulud adalah sebuah peringatan. Worm yang mencuri token dan menerbitkan ulang dirinya sendiri bukanlah risiko di masa depan, melainkan ancaman yang sudah ada saat ini. ekosistem paket npm hari ini. Untuk mencegah jenis ini serangan rantai pasokanTim membutuhkan kontrol yang dapat diprogram, diotomatisasi, dan diterapkan secara langsung. CI/CD pipelineIni adalah pertahanan yang sama yang sudah dapat Anda terapkan dengan Xygeni.
Hentikan artefak buruk di gerbang.
Anda harus memindai paket dan tarball npm sebelum sampai ke pengembang atau pekerjaan CI. Ukuran terlalu besar bundle.js file, postinstall mencurigakan hooks, dan penanda pengaburan semuanya berfungsi sebagai tanda bahaya awal. Terlebih lagi, pemberlakuan masa tenggang dan versi yang disematkan dalam pipelines mencegah produk baru yang belum diverifikasi dikonsumsi secara otomatis.
Mengeras CI/CD secara default
Guardrails in CI/CD sangat penting. Mereka menolak penggabungan atau instalasi yang memperkenalkan skrip atau biner baru. Pada saat yang sama, mereka memblokir alur kerja yang menserialisasi rahasia atau mencoba posting eksternal. Tim juga harus mensyaratkan instalasi hanya menggunakan lockfile (npm ci) di seluruh pipelineDengan demikian, kumpulan dependensi tetap dapat direproduksi dan aman.
Kurangi radius ledakan token.
Rahasia tidak boleh menjadi titik kegagalan tunggal. Lakukan pemindaian kode, konfigurasi, dan secara terus-menerus. pipeline keluaran untuk kredensial yang tereksposToken harus memiliki cakupan yang sempit, masa berlaku yang singkat, dan dirotasi secara otomatis ketika terdeteksi adanya kerentanan. Sebagai aturan umum, perlakukan setiap token yang digunakan pada host yang menjalankan postinstall yang mencurigakan sebagai token yang telah disusupi.
Amati perilaku cacing sejak dini.
Deteksi anomali Ini sangat penting. Misalnya, lonjakan tiba-tiba dalam peristiwa `npm publish`, alur kerja baru yang muncul tanpa alasan, atau repositori publik baru yang dipenuhi dengan file terenkripsi yang aneh, semuanya dapat menandakan aktivitas worm. Oleh karena itu, tim harus segera memberikan peringatan dan mengisolasi pengelola atau pelaksana yang menunjukkan tanda-tanda peringatan ini.
Perbaiki dengan cepat tanpa merusak build.
Kecepatan dan keselamatan harus berjalan beriringan. Otomatis. pull requests dapat mengganti paket npm yang bermasalah dengan versi yang telah diverifikasi. Selain itu, jangkauan ke kemampuan eksploitasi Analisis memastikan peningkatan tetap minimal dan stabil. Terakhir, bangun ulang CI runner yang terdampak dari image yang bersih setelah paparan dikonfirmasi, untuk mencegah serangan menyebar lebih jauh.
Indikator Kompromi (IoC)
Saat menganalisis Shai-Hulud, tim harus memperhatikan kedua hal berikut. IoC statis dalam berkas dan indikator perilaku in pipelineSecara bersama-sama, sinyal-sinyal ini membantu mendeteksi infeksi sejak dini dan merespons sebelum cacing menyebar lebih luas.
Indikator Kompromi Statis
Hasil digest SHA-256 berikut sesuai dengan hasil pengamatan. bundle.js sampel:
- 46faab8ab153fae6e80e7cca38eab363075bb524edd79e42269217a083628f09
- 81d2a004a1bca6ef87a1caf7d0e0b355ad1764238e40ff6d1b1cb77ad4f595c3
- dc67467a39b70d1cd4c1f7f7a459b35058163592f4a9e8fb4dffcbba98ef210c
Selain itu, perhatikan pola-pola berulang berikut ini:
- A
bundle.jsdi direktori root paket. "postinstall": "node bundle.js"dalampackage.json.- Repositori bernama Shai Hulud.
- Alur kerja GitHub yang berisi
${{ toJSON(secrets) }}.
Indikator Kompromi Perilaku
Selain melalui tanda tangan file, aktivitas worm terungkap melalui perilakunya. Misalnya:
- Ledakan tiba-tiba peristiwa npm publish dari satu pengelola.
- Alur kerja baru yang mengirimkan data ke titik akhir eksternal.
- Permintaan POST keluar yang dipicu dari CI runner.
- Repositori publik yang baru dibuat berisi blob yang telah dienkode.
Perburuan cepat
Kesimpulan: Pelajaran dari Shai-Hulud
The Serangan rantai pasokan Shai-Hulud Kasus worm ini pada paket npm menunjukkan betapa rapuhnya rantai pasokan perangkat lunak saat ini. Worm ini tidak hanya menambahkan kode berbahaya, tetapi juga mencuri token, mengirimkan data, dan kemudian menerbitkan ulang dirinya sendiri secara otomatis. Karena itu, serangan menyebar dalam hitungan jam, bukan minggu.
Bagi para pengembang dan tim DevOps, pelajarannya jelas:
- Setiap instalasi menjalankan kode. Bahkan paket npm biasa pun dapat menyembunyikan worm postinstall.
- Setiap token memiliki nilai yang tinggi. Setelah dicuri, data tersebut dapat digunakan untuk menyebarkan malware lebih lanjut.
- Setiap pipeline perlu diperiksa. Tanpa guardrails Pada dependensi, alur kerja, dan rahasia, satu celah keamanan dapat dengan cepat berdampak pada produksi.
Oleh karena itu, menghentikan serangan seperti Shai-Hulud membutuhkan kontrol yang otomatis dan mudah diterapkan. Tim harus memindai paket npm sebelum instalasi, menggunakan build lockfile, mendeteksi aktivitas penerbitan yang mencurigakan, dan menjaga agar token berumur pendek. Langkah-langkah ini bukan lagi pilihan. Sebaliknya, langkah-langkah ini adalah fondasi ketahanan di era modern. pipelines.
Di Xygeni, kami melihat serangan rantai pasokan Shai-Hulud sebagai peringatan bagi seluruh ekosistem sumber terbuka. Cara berkelanjutan ke depan adalah dengan membawa keamanan rantai pasokan langsung ke dalam proses pengembangan, pada titik di mana kode, paket npm, dan pipelineterhubung.
Berikut adalah daftar lengkap paket dan versi npm yang dilaporkan telah disusupi di Shai-Hulud. Gunakan daftar ini untuk memeriksa file lock, registri, dan CI Anda. pipelines untuk paparan.
Daftar paket yang terkompromikan
📦 Pratinjau Paket npm yang Terkompromikan
| Nama Paket | Versi | Tanggal Publikasikan |
|---|---|---|
| mesin aturan json yang disederhanakan | 0.2.1 | 2025-09-14T17:58:51.203Z |
| pilot pesawat | 0.8.8 | 2025-09-14T18:35:07.600Z |
| grafik pengetahuan mcp | 1.2.1 | 2025-09-14T18:35:09.494Z |
| kepala udara | 0.3.1 | 2025-09-14T18:35:09.521Z |
| gerbang lompat | 0.0.2 | 2025-09-14T18:35:09.651Z |
| tvi-cli | 0.1.5 | 2025-09-14T18:35:10.996Z |
| @thangved/jendela panggilan balik | 1.1.4 | 2025-09-14T20:31:38.479Z |
| @tnf-dev/api | 1.0.8 | 2025-09-14T20:31:39.547Z |
| @tnf-dev/js | 1.0.8 | 2025-09-14T20:31:41.251Z |
| @tnf-dev/mui | 1.0.8 | 2025-09-14T20:31:41.259Z |
| @tnf-dev/core | 1.0.8 | 2025-09-14T20:31:42.728Z |
| @teselagen/react-table | 6.10.20 | 2025-09-14T20:37:08.597Z |
| @hestjs/demo | 0.1.2 | 2025-09-14T20:45:52.348Z |
| @nexe/eslint-config | 0.1.1 | 2025-09-14T20:45:53.625Z |
| @hestjs/eslint-config | 0.1.2 | 2025-09-14T20:45:55.044Z |
| @nexe/manajer-konfigurasi | 0.1.1 | 2025-09-14T20:45:55.066Z |
| @nexe/logger | 0.1.3 | 2025-09-14T20:45:55.170Z |
| @hestjs/logger | 0.1.6 | 2025-09-14T20:45:55.197Z |
| @hestjs/validasi | 0.1.6 | 2025-09-14T20:45:55.595Z |
| @hestjs/core | 0.2.1 | 2025-09-14T20:45:55.888Z |
➡️ Lihat Daftar Lengkap Paket yang Terkompromikan
| Nama Paket | Versi | Tanggal Publikasikan |
|---|---|---|
| mesin aturan json yang disederhanakan | 0.2.1 | 2025-09-14T17:58:51.203Z |
| pilot pesawat | 0.8.8 | 2025-09-14T18:35:07.600Z |
| grafik pengetahuan mcp | 1.2.1 | 2025-09-14T18:35:09.494Z |
| kepala udara | 0.3.1 | 2025-09-14T18:35:09.521Z |
| gerbang lompat | 0.0.2 | 2025-09-14T18:35:09.651Z |
| tvi-cli | 0.1.5 | 2025-09-14T18:35:10.996Z |
| @thangved/jendela panggilan balik | 1.1.4 | 2025-09-14T20:31:38.479Z |
| @tnf-dev/api | 1.0.8 | 2025-09-14T20:31:39.547Z |
| @tnf-dev/js | 1.0.8 | 2025-09-14T20:31:41.251Z |
| @tnf-dev/mui | 1.0.8 | 2025-09-14T20:31:41.259Z |
| @tnf-dev/core | 1.0.8 | 2025-09-14T20:31:42.728Z |
| @teselagen/react-table | 6.10.20 | 2025-09-14T20:37:08.597Z |
| @hestjs/demo | 0.1.2 | 2025-09-14T20:45:52.348Z |
| @nexe/eslint-config | 0.1.1 | 2025-09-14T20:45:53.625Z |
| @hestjs/eslint-config | 0.1.2 | 2025-09-14T20:45:55.044Z |
| @nexe/manajer-konfigurasi | 0.1.1 | 2025-09-14T20:45:55.066Z |
| @nexe/logger | 0.1.3 | 2025-09-14T20:45:55.170Z |
| @hestjs/logger | 0.1.6 | 2025-09-14T20:45:55.197Z |
| @hestjs/validasi | 0.1.6 | 2025-09-14T20:45:55.595Z |
| @hestjs/core | 0.2.1 | 2025-09-14T20:45:55.888Z |
| @hestjs/cqrs | 0.1.6 | 2025-09-14T20:45:55.966Z |
| @hestjs/scalar | 0.1.7 | 2025-09-14T20:45:56.386Z |
| unggah-file-ng2 | 7.0.3 | 2025-09-15T02:44:29.555Z |
| penangan pemberitahuan kapasitor | 0.0.2 | 2025-09-15T04:54:48.431Z |
| kapasitor-plug-vonage | 1.0.2 | 2025-09-15T04:54:48.501Z |
| plugin kapasitor-aplikasi kesehatan | 0.0.2 | 2025-09-15T04:54:48.704Z |
| kapasitorandroidpermissions | 0.0.4 | 2025-09-15T04:54:48.753Z |
| voip-callkit | 1.0.2 | 2025-09-15T04:54:49.223Z |
| plugin kapasitor-ihealth | 1.1.8 | 2025-09-15T04:55:08.113Z |
| @art-ws/common | 2.0.22 | 2025-09-15T05:21:15.411Z |
| @art-ws/config-eslint | 2.0.4 | 2025-09-15T05:21:17.199Z |
| ngx-ws | 1.1.5 | 2025-09-15T05:21:17.514Z |
| @art-ws/slf | 2.0.15 | 2025-09-15T05:21:17.524Z |
| @art-ws/http-server | 2.0.21 | 2025-09-15T05:21:17.745Z |
| pm2-gelf-json | 1.0.4 | 2025-09-15T05:21:18.413Z |
| @art-ws/di | 2.0.28 | 2025-09-15T05:21:18.488Z |
| @art-ws/di-node | 2.0.13 | 2025-09-15T05:21:18.849Z |
| @art-ws/config-ts | 2.0.7 | 2025-09-15T05:21:19.408Z |
| @art-ws/db-context | 2.0.21 | 2025-09-15T05:21:19.814Z |
| @art-ws/openapi | 0.1.9 | 2025-09-15T05:21:19.969Z |
| @art-ws/aplikasi-web | 1.0.3 | 2025-09-15T05:21:20.383Z |
| @art-ws/ssl-info | 1.0.9 | 2025-09-15T05:21:20.927Z |




