TL; DR
Pada 14 September 2025, para penyelidik mengenal pasti Shai Hulud, cacing yang membiak sendiri yang tersembunyi di dalamnya pakej npm, menukar kemas kini kebergantungan rutin kepada skala penuh serangan rantaian bekalanPertama kali dilihat di @ctrl/tinycolor pakej oleh Daniel dos Santos Pereira, Shai-Hulud menuai rahsia, mengeluarkannya melalui repo dan aliran kerja GitHub, dan menerbitkan semula dirinya merentasi pendaftaran menggunakan kelayakan yang dicuri. Dalam beberapa hari, bilangan pakej yang dijangkiti melonjak daripada berpuluh-puluh kepada ratusan, mengesahkan bahawa Shaihulud bukan sekadar trojan lain tetapi cacing yang direka untuk merebak secara automatik merentasi ekosistem npm.
Kesan: mana-mana pembangun atau pelari CI yang memasang pakej npm awam berisiko.
Tindakan segera: sekat versi yang diketahui, tukar kepada pemasangan fail kunci sahaja, putar token npm dan GitHub, audit aliran kerja dan pantau Petunjuk Kompromi (IoC).
Apa yang Berlaku?
. Serangan rantaian bekalan Shai-Hulud dalam pakej npm merupakan salah satu insiden paling mengganggu dalam ingatan baru-baru ini. Tidak seperti trojan terpencil, cacing ini bercampur kecurian kelayakan, penapisan automatik dan replikasi kendiriAkibatnya, jangka masa jangkitan mengecil daripada beberapa minggu kepada hanya beberapa jam.
Bagi pasukan DevOps, pengajarannya jelas: jika setiap pemasangan boleh melaksanakan kod, maka setiap kemas kini kebergantungan merupakan titik pelanggaran yang berpotensi.
Kemungkinan Vektor Permulaan dan Kelayakan Sasaran
Analisis awal menunjukkan bahawa serangan itu mungkin bermula dengan kelayakan yang dicuriContohnya, kempen pancingan data yang memalsukan npm login atau gesaan MFA mungkin telah menangkap token pembangun. Sebaik sahaja penyerang mendapat kedudukan pertama itu, cacing itu merebak dengan membenamkan dirinya ke dalam pakej npm dan mencuri lebih banyak rahsia daripada:
- fail konfigurasi npm seperti
.npmrc, selalunya mengandungi token penerbitan. - Pemboleh ubah persekitaran dan konfigurasi dengan PAT GitHub dan CI/CD rahsia.
- Titik akhir metadata awan (AWS, GCP, Azure) menghasilkan kelayakan jangka pendek untuk pergerakan sisi.
Oleh itu, kecurian kelayakan menjadi landasan pelancaran. Dengan token npm yang sah dan rahsia GitHub, Shai-Hulud boleh mereplikasi sendiri merentasi berbilang pakej dan repositori tanpa usaha manusia tambahan.
Kesan Eksekutif Serangan Rantaian Bekalan Shai-Hulud
Shai-Hulud masih aktif hari ini. Cacing ini mempercepatkan garis masa impak. Apa yang pernah mengambil masa berminggu-minggu dengan trojan kini terbongkar dalam beberapa jam. Hasilnya, penyebarannya lebih cepat dan lebih sukar untuk dibendung. Ia maju dengan:
- Mencuri token penerbitan npm dan rahsia GitHub.
- Menerbitkan semula dirinya ke dalam pakej npm yang lain.
- Menambah aliran kerja Tindakan GitHub yang berniat jahat untuk kegigihan.
Siapa yang terjejas:
Mana-mana pasukan yang memasang pakej npm awam terdedah. Selain itu, pembangun dengan token npm atau GitHub yang disimpan dalam cache menghadapi risiko tinggi. Pelari CI yang menggunakan rahsia berskala luas juga terdedah.
Risiko perniagaan
Kesan perniagaan meningkat dengan cepat. Token yang dicuri boleh menyebabkan pengambilalihan akaun, rampasan pakej dan juga penyalahgunaan awan. Di samping itu, kegigihan dalam aliran kerja GitHub menjadikannya lebih sukar untuk dibersihkan. Oleh itu,, pasukan mesti menganggap Shai-Hulud sebagai insiden yang sedang berlaku, bukan insiden tertutup.
Bagaimana Serangan Rantaian Bekalan Shai-Hulud Berfungsi dalam Pakej npm
Objektif dan motif penyerang
Kempen ini mengoptimumkan untuk tiga perkara:
- Objektif pertama adalah untuk mencuri kelayakan pada skala besar daripada komputer riba pembangun dan pelari CI. Ini termasuk token penerbitan npm, token GitHub dan kelayakan awan. Malah, pelbagai analisis mengesahkan penuaian rahsia sistematik, seperti menjalankan TruffleHog dan menanyakan titik akhir metadata awan.
- Objektif kedua adalah untuk merambat secara automatik dengan menyalahgunakan hak penerbitan penyelenggara yang terjejas. Akibatnya, satu tapak bertapak dengan cepat berkembang menjadi banyak, memandangkan versi pakej lain yang dijangkiti baharu muncul tanpa usaha manusia tambahan.
- Objektif ketiga adalah untuk berterusan dan keluarkan penyusupan dengan andal melalui infrastruktur GitHub. Penyerang mencipta repo awam bernama “Shai-Hulud” dengan pangkalan berganda64 data.json, dan sebagai tambahan mereka menanam aliran kerja yang bersiri ${{ toJSON(rahsia) }} dan menyiarkannya ke webhook statik.
Ganjaran yang mungkin termasuk akses jangka panjang kepada pendaftaran dan kod sumber, pergerakan lateral yang pantas ke dalam akaun awan dan pilihan untuk mempersenjatai rantaian bekalan dengan lebih lanjut. Pelaporan awam menunjukkan repo persendirian dibalikkan kepada awam dengan "-migrasi" akhiran, yang meningkatkan pendedahan dan momentum data
Di dalam Muatan Shai-Hulud: bundle.js dalam Pakej npm
Kapal Shai-Hulud sebagai besar, dibundel Webpack dan diminimumkan secara besar-besaran Fail JavaScript (bundle.js, kira-kira 3–3.7 MB) yang dilaksanakan daripada selepas pemasangan sangkut masuk package.jsonAkibatnya, Setiap pemasangan mencetuskan muatan secara automatik. Reka bentuk ini menyembunyikan pengecam, memampatkan aliran kawalan dan menolak semua logik ke dalam satu artifak yang dilaksanakan semasa pemasangan. Penganalisis secara konsisten mengesahkan penggabungan Webpack, saiz fail yang luar biasa dan pelaksanaan masa pemasangan.
Ciri-ciri kekaburan dan anti-analisis yang akan anda lihat dalam sampel:
- Graf modul yang diminimumkan dengan ID modul berangka, komen yang jarang dan aliran kawalan yang rata. Selain itu, Struktur ini menjadikan semakan manual sangat sukar.
- Penyembunyian rentetan melalui lapisan base64 dan pembantu pembinaan. Contohnya, Pengekodan dan penyahkodan base64 berulang biasanya muncul di sekitar rutin pengekstrakan penapisan.
- Penghantaran dinamik melalui menipucorak gaya dan badan fungsi yang dijana, justeru membolehkan kod mengubah tingkah laku semasa masa jalan.
- Penapisan OS untuk mengutamakan pelaksanaan Linux dan macOS terutamanya pada pelari CI dan komputer riba pembangun.
Dari sudut fungsian, pakej ini adalah modular. Penulisan menerangkan modul untuk penemuan OS, sistem fail dan imbasan rahsia git, akses SDK awan, operasi API GitHub dan enjin penyebaran yang mengedit pakej lain yang dimiliki oleh penyelenggara. Malah, StepSecurity dan ReversingLabs kedua-duanya menyerlahkan fungsi yang mengemas kini pakej secara automatik dengan cangkuk berniat jahat.
Pelaksanaan Masa Pemasangan dalam Shai-Hulud: Bagaimana Pakej npm Mencetuskan Cacing
Serangan bermula apabila selepas pemasangan menjalankan nod bundle.js. Pada ketika ini, skrip akan memulakan dan membuka skop keadaan kerja dalam memori, menyediakan pentas untuk operasi penuh cacing.
Penemuan dan penuaian
- Dump muatan memproses .env dan mengimbas fail setempat untuk rahsia entropi tinggi dan awalan token. Di samping itu, ia meluaskan liputan dengan menjalankan TruffleHog.
- Ia menanyakan titik akhir metadata awan untuk mengumpul kelayakan jangka pendek. Sebagai contoh, panggilan ke
169.254.169.254pada AWS ataumetadata.google.internalpada GCP sering muncul dalam perumah yang dijangkiti. - Oleh yang demikian, sebarang kelayakan yang ditemui boleh digunakan serta-merta untuk menerbitkan pakej npm baharu atau menolak aliran kerja GitHub.
exfiltration
- Cacing itu mencipta repo GitHub baharu bernama Shai Hulud dan menulis kod berganda base64
data.jsondengan butiran platform, tempat pembuangan sampah persekitaran dan rahsia. Seperti yang dapat dilihat, tingkah laku bising ini mudah dikesan jika pembela tahu di mana hendak mencari. - Ia juga menanam aliran kerja GitHub Actions, selalunya pada cabang bernama shai-hulud, yang bersiri
${{ toJSON(secrets) }}dan menyiarkan data ke webhook statik. Tambahan pula, aliran kerja ini berterusan sehingga seseorang mengalih keluarnya secara aktif.
Penyebaran
- Dengan sebarang token npm yang ditemui, muatan menyenaraikan semua pakej yang dimiliki oleh penyelenggara yang dikompromi. Kemudian, ia mengambil setiap tarball, menyuntik bundle.js dan entri pasca pemasangan, dan menerbitkan semula pakej tersebut.
- Akibatnya, berpuluh-puluh pakej yang dijangkiti boleh muncul dalam masa beberapa jam, mendarabkan jejari letupan merentasi ekosistem.
Kegigihan dan pendedahan
Cacing ini memastikan aliran kerja berniat jahat terus hidup dan, dalam beberapa kes, membalikkan repo peribadi kepada awam dengan "-migrasi" akhiran. Secara keseluruhannya, ini memastikan penyerang mengekalkan kedudukan dan memaksimumkan kebocoran data.
Nota pengesanan kunci
Penggunaan yang luar biasa ini ${{ toJSON(secrets) }} aliran kerja dalam Tindakan jarang berlaku. Oleh itu, pasukan harus menganggapnya sebagai penunjuk isyarat tinggi semasa pemburuan.
Corak aliran kerja yang bersih yang perlu anda cari
Penggunaan yang luar biasa ini kepada JSON(rahsia) dalam Tindakan ialah penunjuk isyarat tinggi dalam insiden ini.
Pseudokod penyebaran peringkat tinggi (selamat, deskriptif)
Penganalisis memerhatikan gelung ini secara berskala besar, yang menjelaskan lonjakan pesat daripada berpuluh-puluh kepada ratusan pakej yang dijangkiti.
Mengapa ini cacing dalam ekosistem pakej
Cecacing ialah perisian hasad yang merebak dengan sendirinya tanpa memerlukan langkah pengendali manual pada setiap peringkat. Dalam sistem pengendalian, cecacing biasanya mengeksploitasi kelemahan rangkaian untuk berpindah dari satu mesin ke mesin yang lain. Sebaliknya, Shai-Hulud beroperasi di dalam daftar npm. Laluan cekapnya adalah melalui penggunaan semula kelayakan.
Cecacing tersebut mengambil kesempatan daripada token penerbitan npm yang dicuri. Sebaik sahaja ia memperoleh kelayakan yang sah, ia akan menerbitkan semula versi yang dijangkiti di bawah pakej lain yang dimiliki oleh penyelenggara yang sama. Seterusnya, pakej tersebut dipasang oleh pembangun atau pelari CI yang tidak curiga, dan kitaran tersebut berulang.
Atas sebab ini, penganalisis keselamatan, termasuk Bacaan gelap, mengklasifikasikan Shai-Hulud sebagai cacing yang membiak sendiri bukannya trojan mudah atau insiden kesalahan taip. Perbezaannya penting: trojan biasanya menjejaskan satu hos, tetapi cacing menguatkan impaknya secara automatik merentasi ekosistem.
Helaian ringkas "Cara ia berfungsi"
Untuk meringkaskan kitaran hidup Shai-Hulud, berikut adalah satu kelemahancispecahan langkah-langkah utamanya:
- Satu pakej dengan selepas pemasangan dipasang, dan
bundle.jsmelaksanakan. - Muatan membuang pembolehubah persekitaran, mengimbas fail dan sejarah git, menjalankan TruffleHog, dan membuat pertanyaan tentang perkhidmatan metadata awan. Akibatnya, sebarang rahsia yang ditemui menjadi berguna serta-merta.
- Pengekstrakan berlaku dalam dua cara: pertama, dengan mewujudkan repo awam bernama Shai Hulud dengan pengekodan base64 berganda
data.json; kedua, dengan menanam aliran kerja GitHub Actions yang menyiarkan${{ toJSON(secrets) }}ke webhook. - Menggunakan mana-mana token npm yang dicuri, cacing tersebut menerbitkan semula semua pakej lain yang dimiliki oleh penyelenggara yang dikompromi dengan hook berniat jahat yang sama. Dengan cara ini, jangkitan membiak dengan cepat.
- Akhirnya, penyerang menyimpan lebih banyak rahsia, lebih banyak pakej untuk disebarkan, dan kegigihan di dalam akaun dan repositori GitHub.
Cara untuk mengelakkan kelas serangan ini, secara praktikal
Shai-Hulud ialah satu panggilan bangun. Cacing yang mencuri token dan menerbitkan semula dirinya sendiri bukanlah risiko masa hadapan, ia hidup dalam ekosistem pakej npm hari ini. Untuk mencegah jenis ini serangan rantaian bekalan, pasukan memerlukan kawalan yang boleh diprogramkan, diautomasikan dan dikuatkuasakan secara langsung dalam CI/CD pipelines. Ini adalah pertahanan yang sama yang anda sudah boleh laksanakan Xygeni.
Hentikan artifak buruk di pintu pagar
Anda harus mengimbas pakej npm dan tarball sebelum ia sampai ke pembangun atau kerja CI. Saiz Besar bundle.js fail, pasca pemasangan yang mencurigakan hooks, dan penanda obfuscation semuanya berfungsi sebagai tanda amaran awal. Selain itu, menguatkuasakan tempoh bertenang dan versi yang disematkan dalam pipelines menghalang keluaran segar yang tidak disahkan daripada dimakan secara automatik.
Mengeraskan CI/CD secara lalai
Guardrails in CI/CD adalah penting. Mereka menolak penggabungan atau pemasangan yang memperkenalkan skrip atau binari baharu. Pada masa yang sama, mereka menyekat aliran kerja yang menyiratkan rahsia secara bersiri atau cuba menyiarkan siaran luaran. Pasukan juga harus memerlukan pemasangan fail kunci sahaja (npm ci) merentasi semua pipelines supaya set kebergantungan kekal boleh dihasilkan semula dan selamat.
Kurangkan jejari letupan token
Rahsia tidak boleh menjadi satu-satunya titik kegagalan. Imbas kod, konfigurasi dan pipeline keluaran untuk kelayakan yang terdedahToken hendaklah dihadkan skopnya secara sempit, diberikan jangka hayat yang pendek dan diputar secara automatik apabila pendedahan dikesan. Sebagai peraturan, anggap sebarang token yang digunakan pada hos yang melaksanakan pasca pemasangan yang mencurigakan sebagai diceroboh.
Lihat tingkah laku cacing lebih awal
Pengesanan anomali adalah kunci. Contohnya, lonjakan mendadak dalam peristiwa penerbitan npm, aliran kerja baharu yang muncul tanpa sebab atau repo awam baharu yang dipenuhi dengan fail berkod pelik semuanya boleh menandakan aktiviti cacing. Oleh itu, pasukan harus segera memaklumkan dan mengasingkan mana-mana penyelenggara atau pengendali yang menunjukkan tanda-tanda amaran ini.
Baiki dengan cepat tanpa merosakkan binaan
Kelajuan dan keselamatan mesti seiring. Automatik pull requests boleh menggantikan pakej npm yang terjejas dengan versi yang telah disahkan. Di samping itu, kebolehcapaian dan keboleheksploitasian Analisis memastikan penaiktarafan kekal minimum dan stabil. Akhir sekali, bina semula pelari CI yang terjejas daripada imej bersih sebaik sahaja pendedahan disahkan, bagi mengelakkan serangan daripada merebak lebih lanjut.
Petunjuk Kompromi (IoC)
Apabila menganalisis Shai-Hulud, pasukan harus memerhatikan kedua-duanya IoC statik dalam fail dan IoC tingkah laku in pipelines. Secara keseluruhannya, isyarat-isyarat ini membantu mengesan jangkitan lebih awal dan bertindak balas sebelum cacing merebak lebih lanjut.
IoC Statik
Padanan ringkasan SHA-256 berikut diperhatikan bundle.js sampel:
- 46faab8ab153fae6e80e7cca38eab363075bb524edd79e42269217a083628f09
- 81d2a004a1bca6ef87a1caf7d0e0b355ad1764238e40ff6d1b1cb77ad4f595c3
- dc67467a39b70d1cd4c1f7f7a459b35058163592f4a9e8fb4dffcbba98ef210c
Selain itu, perhatikan corak berulang ini:
- A
bundle.jspada akar pakej. "postinstall": "node bundle.js"di dalampackage.json.- Repositori bernama Shai Hulud.
- Aliran kerja GitHub yang mengandungi
${{ toJSON(secrets) }}.
IoC Tingkah Laku
Selain tandatangan fail, aktiviti cacing mendedahkan dirinya melalui tingkah laku. Contohnya:
- Letupan peristiwa penerbitan npm secara tiba-tiba daripada seorang penyelenggara.
- Aliran kerja baharu yang menghantar data ke titik akhir luaran.
- Permintaan POST keluar dicetuskan daripada pelari CI.
- Repo awam yang baru dibuat dengan gumpalan yang dikodkan.
Pemburuan pantas
Kesimpulan: Pengajaran daripada Shai-Hulud
. Serangan rantaian bekalan Shai-Hulud Dalam pakej npm, ia menunjukkan betapa rapuhnya rantaian bekalan perisian hari ini. Cacing ini bukan sahaja menambah kod berniat jahat. Ia mencuri token, menghantar data dan kemudian menerbitkan semula dirinya secara automatik. Oleh kerana itu, serangan itu merebak dalam beberapa jam dan bukannya beberapa minggu.
Bagi pembangun dan pasukan DevOps, pengajarannya jelas:
- Setiap pemasangan menjalankan kod. Malah pakej npm biasa boleh menyembunyikan cacing pasca pemasangan.
- Setiap token mempunyai nilai yang tinggi. Sebaik sahaja dicuri, ia boleh digunakan untuk menyebarkan perisian hasad dengan lebih lanjut.
- Setiap pipeline memerlukan pemeriksaan. Tanpa guardrails mengenai kebergantungan, aliran kerja dan rahsia, satu kompromi boleh menjejaskan pengeluaran dengan cepat.
Oleh itu, menghentikan serangan seperti Shai-Hulud memerlukan kawalan yang automatik dan mudah dikuatkuasakan. Pasukan harus mengimbas pakej npm sebelum pemasangan, menggunakan binaan fail kunci, mengesan aktiviti penerbitan yang pelik dan memastikan token tidak berjangka masa yang singkat. Langkah-langkah ini bukan lagi pilihan. Sebaliknya, ia adalah asas daya tahan dalam teknologi moden. pipelines.
Di Xygeni, kami melihat serangan rantaian bekalan Shai-Hulud sebagai amaran untuk seluruh ekosistem sumber terbuka. Cara yang mampan ke hadapan adalah dengan membawa keselamatan rantaian bekalan terus ke dalam proses pembangunan, pada titik di mana kod, pakej npm dan pipelinesambungkan.
Berikut ialah senarai penuh pakej npm dan versi yang dilaporkan telah dikompromi dalam Shai-Hulud. Gunakannya untuk menyemak fail kunci, pendaftaran dan CI anda pipelines untuk pendedahan.
Senarai pakej yang terjejas
📦 Pratonton Pakej npm yang Dikompromikan
| Nama pakej | versi | Tarikh Terbitkan |
|---|---|---|
| enjin-peraturan-json-dipermudahkan | 0.2.1 | 2025-09-14T17:58:51.203Z |
| juruterbang udara | 0.8.8 | 2025-09-14T18:35:07.600Z |
| graf-pengetahuan-mcp | 1.2.1 | 2025-09-14T18:35:09.494Z |
| ketua udara | 0.3.1 | 2025-09-14T18:35:09.521Z |
| pintu lompat | 0.0.2 | 2025-09-14T18:35:09.651Z |
| tvi-cli | 0.1.5 | 2025-09-14T18:35:10.996Z |
| @thangved/tetingkap-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/teras | 1.0.8 | 2025-09-14T20:31:42.728Z |
| @teselagen/jadual-tindak balas | 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/pengurus-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/pengesahan | 0.1.6 | 2025-09-14T20:45:55.595Z |
| @hestjs/teras | 0.2.1 | 2025-09-14T20:45:55.888Z |
➡️ Lihat Senarai Penuh Pakej yang Dikompromikan
| Nama pakej | versi | Tarikh Terbitkan |
|---|---|---|
| enjin-peraturan-json-dipermudahkan | 0.2.1 | 2025-09-14T17:58:51.203Z |
| juruterbang udara | 0.8.8 | 2025-09-14T18:35:07.600Z |
| graf-pengetahuan-mcp | 1.2.1 | 2025-09-14T18:35:09.494Z |
| ketua udara | 0.3.1 | 2025-09-14T18:35:09.521Z |
| pintu lompat | 0.0.2 | 2025-09-14T18:35:09.651Z |
| tvi-cli | 0.1.5 | 2025-09-14T18:35:10.996Z |
| @thangved/tetingkap-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/teras | 1.0.8 | 2025-09-14T20:31:42.728Z |
| @teselagen/jadual-tindak balas | 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/pengurus-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/pengesahan | 0.1.6 | 2025-09-14T20:45:55.595Z |
| @hestjs/teras | 0.2.1 | 2025-09-14T20:45:55.888Z |
| @hestjs/cqrs | 0.1.6 | 2025-09-14T20:45:55.966Z |
| @hestjs/skalar | 0.1.7 | 2025-09-14T20:45:56.386Z |
| muat naik fail-ng2 | 7.0.3 | 2025-09-15T02:44:29.555Z |
| pengendali pemberitahuan kapasitor | 0.0.2 | 2025-09-15T04:54:48.431Z |
| kapasitor-plugin-vonage | 1.0.2 | 2025-09-15T04:54:48.501Z |
| kapasitor-plugin-healthapp | 0.0.2 | 2025-09-15T04:54:48.704Z |
| kapasitorandroidkebenaran | 0.0.4 | 2025-09-15T04:54:48.753Z |
| voip-callkit | 1.0.2 | 2025-09-15T04:54:49.223Z |
| kapasitor-plugin-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-nod | 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 |




