TL; DR
Op 14 september 2025 identificeerden onderzoekers Shai Hulud, een zichzelf replicerende worm die verborgen zit in npm-pakketten, waardoor een routinematige afhankelijkheidsupdate wordt omgezet in een volledige supply chain-aanval. Voor het eerst gezien in de @ctrl/tinycolor pakket van Daniel dos Santos Pereira, Shai-Hulud verzamelt geheimen, exfiltreert ze via GitHub-repositories en -workflows en publiceert zichzelf opnieuw in het register met behulp van gestolen inloggegevens. Binnen enkele dagen steeg het aantal geïnfecteerde pakketten van tientallen naar honderden, wat bevestigt dat Shaihulud is niet zomaar een trojan, maar een worm die is ontworpen om zich automatisch te verspreiden binnen het npm-ecosysteem.
Impact: Elke ontwikkelaar of CI-runner die openbare npm-pakketten installeert, loopt risico.
Onmiddellijke acties: Bekende versies blokkeren, overschakelen naar installaties die alleen uit lockfiles bestaan, npm- en GitHub-tokens roteren, workflows controleren en controleren op Indicators of Compromise (IoC's).
Wat is er gebeurd?
Het Shai-Hulud-aanval op de toeleveringsketen in npm-pakketten is een van de meest ontwrichtende incidenten in de recente geschiedenis. In tegenstelling tot geïsoleerde Trojaanse paarden, mengt deze worm diefstal van inloggegevens, geautomatiseerde exfiltratie en zelfreplicatieHierdoor werd de besmettingstijd verkort van weken naar slechts enkele uren.
Voor DevOps-teams is de les duidelijk: als elke installatie code kan uitvoeren, dan is elke afhankelijkheidsupdate een potentieel inbreukpunt.
Mogelijke initiële vector en gerichte referenties
Vroege analyse geeft aan dat de aanval waarschijnlijk begon met gestolen inloggegevensBijvoorbeeld phishingcampagnes die npm spoofen login of MFA-prompts hebben mogelijk ontwikkelaarstokens buitgemaakt. Zodra aanvallers hun eerste voet aan de grond kregen, verspreidde de worm zich door zich in te bedden in npm-pakketten en meer geheimen te stelen van:
- npm-configuratiebestanden als
.npmrc, die vaak publicatietokens bevatten. - Omgevingsvariabelen en configuraties met GitHub PAT's en CI/CD geheimen.
- Cloud-metadata-eindpunten (AWS, GCP, Azure) die slechts kortstondige inloggegevens voor laterale verplaatsing opleveren.
Daarom werd diefstal van inloggegevens het startpunt. Met geldige NPM-tokens en GitHub-geheimen kon Shai-Hulud zichzelf repliceren over meerdere pakketten en repositories zonder extra menselijke inspanning.
Impact van de Shai-Hulud Supply Chain-aanval op de directie
Shai-Hulud is nog steeds actief. Deze worm versnelt de impacttijdlijn. Wat ooit weken duurde met een trojan, ontvouwt zich nu in uren. Als gevolg hiervan, de verspreiding verloopt sneller en is moeilijker in te dammen. Het gaat vooruit met:
- Stelen van npm-publicatietokens en GitHub-geheimen.
- Zichzelf opnieuw publiceren in andere npm-pakketten.
- Kwaadaardige GitHub Actions-workflows toevoegen voor persistentie.
Wie wordt getroffen:
Elk team dat openbare NPM-pakketten installeert, loopt risico. Bovendien lopen ontwikkelaars met gecachte NPM- of GitHub-tokens een hoog risico. CI-runners die geheimen met een brede reikwijdte gebruiken, zijn ook kwetsbaar.
Bedrijfsrisico
De impact op de business groeit snel. Gestolen tokens kunnen leiden tot accountovername, pakketkaping en zelfs misbruik van de cloud. Bovendien maakt persistentie in GitHub-workflows het moeilijker om op te schonen.Teams moeten Shai-Hulud behandelen als een doorlopend incident, niet als een afgesloten incident.
Hoe de Shai-Hulud Supply Chain-aanval werkt in npm-pakketten
Doelstellingen en motief van de aanvaller
De campagne optimaliseert op drie punten:
- Het eerste doel is om inloggegevens op grote schaal stelen van ontwikkelaarslaptops en CI-runners. Dit omvat npm-publicatietokens, GitHub-tokens en cloudreferenties. Meerdere analyses bevestigen zelfs systematische geheime verzameling, zoals het uitvoeren van TruffleHog en het bevragen van cloudmetadata-eindpunten.
- Het tweede doel is om automatisch voortplanten Door misbruik te maken van de publicatierechten van gecompromitteerde beheerders. Hierdoor groeit één dreiging snel uit tot een veelvoud, omdat er zonder extra menselijke inspanning nieuwe geïnfecteerde versies van andere pakketten verschijnen.
- Het derde doel is om betrouwbaar blijven bestaan en exfiltreren via GitHub-infrastructuur. Aanvallers creëren een openbare repository genaamd "Shai-Hulud" met een dubbele base64 gegevens.jsonen bovendien planten ze een workflow die serialiseert ${{ toJSON(geheimen) }} en plaatst het in een statische webhook.
De waarschijnlijke opbrengst omvat langdurige toegang tot registers en broncode, snelle laterale verplaatsing naar cloudaccounts en de mogelijkheid om de toeleveringsketen verder te wapenen. Openbare rapportage toont aan dat private repositories openbaar zijn gemaakt met een "-migratie" achtervoegsel, dat de blootstelling en het momentum van gegevens vergroot
Binnenin de Shai-Hulud-lading: bundel.js in npm-pakketten
Shai-Hulud wordt verzonden als een groot, Webpack-gebundeld en zwaar geminimaliseerd JavaScript-bestand (bundel.js, ongeveer 3–3.7 MB) die wordt uitgevoerd vanuit een na installatie haak in package.json. Vervolgens, Elke installatie activeert de payload automatisch. Dit ontwerp verbergt identifiers, comprimeert de controlestroom en pusht alle logica in één enkel artefact dat tijdens de installatie wordt uitgevoerd. Analisten bevestigen consequent de bundeling van Webpack, ongebruikelijke bestandsgrootte en uitvoering tijdens de installatie.
Verduisterings- en anti-analysekenmerken die u in monsters zult zien:
- Geminimaliseerde modulegrafiek met numerieke module-ID's, spaarzame opmerkingen en een afgevlakte besturingsstroom. Bovendien, Deze structuur maakt handmatige beoordeling extreem moeilijk.
- String verbergen via base64-lagen en constructiehulpen. Bijvoorbeeld, Herhaalde base64-codering en -decodering komen meestal voor rond exfiltratieroutines.
- Dynamische verzending brengt eval-stijlpatronen en gegenereerde functielichamen, waardoor code het gedrag tijdens runtime kan veranderen.
- OS-filtering om de uitvoering op Linux en macOS te verkiezen, met name op CI-runners en ontwikkelaarslaptops.
Functioneel gezien is de bundel modulair. De beschrijvingen beschrijven modules voor OS-detectie, bestandssysteem- en Git Secret-scans, toegang tot de cloud SDK, GitHub API-bewerkingen en een propagatie-engine die andere pakketten van de beheerder bewerkt. StepSecurity en ReversingLabs benadrukken zelfs een functie die pakketten automatisch bijwerkt met de kwaadaardige hook.
Uitvoering op installatietijd in Shai-Hulud: hoe npm-pakketten de worm activeren
De aanval begint wanneer postinstall voert node uit bundel.js. Op dit punt initialiseert en pakt het script de werkende status in het geheugen uit, waardoor de worm volledig operationeel kan worden.
Ontdekking en oogst
- De payload dumpt process.env en scant lokale bestanden op geheimen met hoge entropie en tokenprefixen. Daarnaast wordt de dekking uitgebreid door TruffleHog uit te voeren.
- Het vraagt cloudmetadata-eindpunten op om kortstondige inloggegevens te verzamelen. Bijvoorbeeld, oproepen naar
169.254.169.254op AWS ofmetadata.google.internalop GCP verschijnen vaak bij geïnfecteerde hosts. - Bijgevolg Alle gevonden referenties kunnen onmiddellijk worden gebruikt om nieuwe npm-pakketten te publiceren of GitHub-workflows te pushen.
exfiltratie
- De worm creëert een nieuwe GitHub-repository met de naam Shai Hulud en schrijft een dubbele base64-gecodeerde
data.jsonmet platformdetails, omgevingsdumps en geheimen. Zoals te zien is, is dit luidruchtige gedrag gemakkelijk te herkennen als verdedigers weten waar ze moeten zoeken. - Het plant ook een GitHub Actions-workflow, vaak op een branch met de naam shai-hulud, dat serialiseert
${{ toJSON(secrets) }}en plaatst de gegevens in een statische webhook. Bovendien blijft deze workflow bestaan totdat iemand deze actief verwijdert.
Voortplanting
- Met elk gevonden npm-token somt de payload alle pakketten op die eigendom zijn van de gecompromitteerde beheerder. Vervolgens haalt hij elke tarball op, injecteert bundle.js en een postinstall-item en publiceert het pakket opnieuw.
- Hierdoor kunnen er binnen enkele uren tientallen geïnfecteerde pakketten opduiken, waardoor de impactradius in het ecosysteem steeds groter wordt.
Volharding en blootstelling
De worm houdt kwaadaardige workflows in leven en verandert in verschillende gevallen privé-opslagplaatsen in openbare opslagplaatsen met een "-migratie" suffix. Dit alles zorgt ervoor dat de aanvaller voet aan de grond houdt en de kans op datalekken maximaliseert.
Opmerking over sleuteldetectie
Dit ongebruikelijke gebruik van ${{ toJSON(secrets) }} in Acties-workflows komt zelden voor. daarom Teams zouden het moeten beschouwen als een indicator met een sterk signaal tijdens de jacht.
Het gesaneerde workflowpatroon waar u naar op zoek moet
Dit ongebruikelijke gebruik van naar JSON(geheimen) in Acties is een indicator met een hoog signaal in dit incident.
Pseudoniemcode voor verspreiding op hoog niveau (veilig, beschrijvend)
async function propagate(token, owner) {
const pkgs = await npmApi.listPackages(owner, token);
for (const p of pkgs) {
const tgz = await npmApi.fetchTarball(p, token);
const modified = injectBundleAndPostinstall(tgz); // adds bundle.js + "postinstall"
await npmApi.publish(modified, token); // publishes new malicious version
}
}
Analisten observeerden deze lus op grote schaal, wat de snelle sprong van tientallen naar honderden geïnfecteerde pakketten verklaart.
Waarom dit een worm is in een pakket-ecosysteem
Een worm is malware die zich zelfstandig verspreidt zonder dat er in elke fase handmatige handelingen van de operator nodig zijn. In besturingssystemen maken wormen meestal gebruik van netwerkkwetsbaarheden om zich van de ene machine naar de andere te verplaatsen. Shai-Hulud daarentegen opereert binnen het NPM-register. Zijn efficiënte pad loopt via hergebruik van referenties.
De worm maakt misbruik van gestolen npm-publicatietokens. Zodra hij geldige inloggegevens heeft, publiceert hij geïnfecteerde versies opnieuw onder andere pakketten van dezelfde beheerder. Vervolgens worden die pakketten geïnstalleerd door nietsvermoedende ontwikkelaars of CI-runners, en herhaalt de cyclus zich.
Om deze reden hebben beveiligingsanalisten, waaronder Donkere lezing, classificeer Shai-Hulud als een zelfreplicerende worm in plaats van een simpele trojan of een typosquattingincident. Het verschil is belangrijk: een trojan schaadt doorgaans één host, maar een worm versterkt zijn impact automatisch over een heel ecosysteem.
Spiekbriefje 'Hoe het werkt'
Om de levenscyclus van Shai-Hulud samen te vatten, volgt hier een samenvattingcisEen overzicht van de belangrijkste stappen:
- Een pakket met na installatie is geïnstalleerd en
bundle.jsvoert uit. - De payload dumpt omgevingsvariabelen, scant bestanden en de git-geschiedenis, voert uit TruffelHogen raadpleegt cloudmetadataservices. Daardoor wordt elk gevonden geheim direct bruikbaar.
- Exfiltratie vindt op twee manieren plaats: ten eerste door een openbare repository te creëren met de naam Shai Hulud met een dubbele base64-gecodeerde
data.json; ten tweede door een GitHub Actions-workflow te installeren die berichten plaatst${{ toJSON(secrets) }}naar een webhook. - Met behulp van een gestolen npm-token publiceert de worm alle andere pakketten van de gecompromitteerde beheerder opnieuw met dezelfde kwaadaardige hook. Zo vermenigvuldigt de infectie zich snel.
- Ten slotte heeft de aanvaller meer geheimen, meer pakketten om te verspreiden en volharding in GitHub-accounts en -repositories.
Hoe je dit soort aanvallen praktisch kunt vermijden
Shai-Hulud is een wake-upcall. Een worm die tokens steelt en zichzelf opnieuw publiceert, vormt geen toekomstig risico, maar is actief in de ecosysteem van npm-pakketten vandaag. Om dit soort problemen te voorkomen supply chain-aanvalhebben teams behoefte aan controles die programmeerbaar, geautomatiseerd en direct afdwingbaar zijn CI/CD pipelines. Dit zijn dezelfde verdedigingen die u al kunt implementeren met Xygeni.
Stop slechte artefacten bij de poort
U moet npm-pakketten en tarballs scannen voordat ze ontwikkelaars of CI-taken bereiken. bundle.js bestanden, verdachte postinstallatie hooks, en verduisteringsmarkeringen dienen allemaal als vroege waarschuwingssignalen. Bovendien is het afdwingen van afkoelingsperiodes en vastgezette versies in pipelineHiermee wordt voorkomen dat nieuwe, ongecontroleerde releases automatisch worden verbruikt.
verharden CI/CD bij verstek
Guardrails in CI/CD zijn essentieel. Ze weigeren samenvoegingen of installaties die nieuwe scripts of binaire bestanden introduceren. Tegelijkertijd blokkeren ze workflows die geheimen serialiseren of externe berichten proberen te plaatsen. Teams zouden ook installaties met alleen lockfiles moeten vereisen (npm ci) over alle pipelinezodat afhankelijkheidssets reproduceerbaar en veilig blijven.
Verklein de straal van de tokenexplosie
Geheimen mogen geen single points of failure worden. Scan continu code, configuraties en pipeline uitvoer voor blootgestelde referentiesTokens moeten een beperkte reikwijdte hebben, een korte levensduur hebben en automatisch worden geroteerd wanneer blootstelling wordt gedetecteerd. Behandel in principe elk token dat wordt gebruikt op een host die een verdachte postinstall heeft uitgevoerd als gecompromitteerd.
Zie wormengedrag vroeg
Onregelmatigheidsdetectie is cruciaal. Plotselinge pieken in npm-publicatiegebeurtenissen, nieuwe workflows die zonder reden verschijnen, of nieuwe openbare repositories vol vreemde gecodeerde bestanden kunnen allemaal wijzen op wormactiviteit. Teams moeten daarom snel waarschuwingen genereren en alle beheerders of uitvoerders isoleren die deze waarschuwingssignalen vertonen.
Snel repareren zonder builds te breken
Snelheid en veiligheid moeten hand in hand gaan. Geautomatiseerd pull requests kan gecompromitteerde npm-pakketten vervangen door gecontroleerde versies. Bovendien, bereikbaarheid en exploiteerbaarheid Analyse zorgt ervoor dat upgrades minimaal en stabiel blijven. Herbouw ten slotte de getroffen CI-runners vanuit schone beelden zodra de blootstelling is bevestigd, om te voorkomen dat de aanval zich verder verspreidt.
Indicatoren van compromis (IoC's)
Bij het analyseren van Shai-Hulud moeten teams op beide letten statische IoC's in bestanden en gedrags-IoC's in pipelineSamen helpen deze signalen om infecties vroegtijdig op te sporen en te reageren voordat de worm zich verder verspreidt.
Statische IoC's
De volgende SHA-256-digests komen overeen met de waargenomen bundle.js monsters:
- 46faab8ab153fae6e80e7cca38eab363075bb524edd79e42269217a083628f09
- 81d2a004a1bca6ef87a1caf7d0e0b355ad1764238e40ff6d1b1cb77ad4f595c3
- dc67467a39b70d1cd4c1f7f7a459b35058163592f4a9e8fb4dffcbba98ef210c
Let daarnaast ook op de volgende terugkerende patronen:
- A
bundle.jsin de root van het pakket. "postinstall": "node bundle.js"binnenpackage.json.- Benoemde opslagplaatsen Shai Hulud.
- GitHub-workflows met
${{ toJSON(secrets) }}.
Gedrags-IoC's
Naast bestandshandtekeningen openbaart wormactiviteit zich ook via gedrag. Bijvoorbeeld:
- Plotselinge uitbarstingen van npm-publicatiegebeurtenissen van één beheerder.
- Nieuwe workflows die gegevens naar externe eindpunten pushen.
- Uitgaande POST-verzoeken geactiveerd door CI-runners.
- Onlangs aangemaakte openbare opslagplaatsen met gecodeerde blobs.
Snelle jachten
# Find postinstall in package.json
grep -R --line-number '"postinstall"' --include="package.json" /path/to/archives
# Detect tarballs with bundle.js
find /path/to/tarballs -name "*.tgz" -print0 \
| xargs -0 -n1 -I{} sh -c 'tar -tf "{}" | grep bundle.js && echo "== {}"'
# Search workflows for toJSON(secrets)
grep -R --line-number "toJSON(secrets)" --include="*.yml" .github || true
Conclusie: lessen van Shai-Hulud
Het Aanval op de toeleveringsketen van Shai-Hulud in npm-pakketten laat zien hoe kwetsbaar de huidige softwaretoeleveringsketen is geworden. Deze worm deed meer dan alleen schadelijke code toevoegen. Hij stal tokens, verzond data en publiceerde zichzelf vervolgens automatisch opnieuw. Hierdoor verspreidde de aanval zich in uren in plaats van weken.
Voor ontwikkelaars en DevOps-teams zijn de lessen duidelijk:
- Bij elke installatie wordt code uitgevoerd. Zelfs een standaard npm-pakket kan een postinstallatieworm verbergen.
- Elk token heeft een hoge waarde. Eenmaal gestolen, kan de malware verder verspreid worden.
- Elke pipeline heeft controles nodig. zonder guardrails op afhankelijkheden, workflows en geheimen kan één compromis snel de productie treffen.
Het stoppen van aanvallen zoals Shai-Hulud vereist daarom automatische en eenvoudig af te dwingen controles. Teams zouden npm-pakketten moeten scannen vóór installaties, lockfile-builds moeten gebruiken, vreemde publicatieactiviteiten moeten detecteren en tokens kort moeten houden. Deze stappen zijn niet langer optioneel. In plaats daarvan vormen ze de basis van veerkracht in moderne pipelines.
Bij Xygeni zien we de Shai-Hulud-aanval op de toeleveringsketen als een waarschuwing voor het hele open-source-ecosysteem. De duurzame weg vooruit is om de beveiliging van de toeleveringsketen direct in het ontwikkelingsproces te integreren, op het punt waar code, NPM-pakketten en pipelines verbinden.
Hieronder vindt u de volledige lijst met npm-pakketten en -versies die als gecompromitteerd zijn gerapporteerd in Shai-Hulud. Gebruik deze lijst om uw lockfiles, registers en CI te controleren. pipelines voor blootstelling.
Lijst met gecompromitteerde pakketten
📦 Preview van gecompromitteerde npm-pakketten
| Pakketnaam | Versie | Publiceer datum |
|---|---|---|
| json-regels-engine-vereenvoudigd | 0.2.1 | 2025-09-14T17:58:51.203Z |
| piloot | 0.8.8 | 2025-09-14T18:35:07.600Z |
| mcp-kennisgrafiek | 1.2.1 | 2025-09-14T18:35:09.494Z |
| luchtcommandant | 0.3.1 | 2025-09-14T18:35:09.521Z |
| springpoort | 0.0.2 | 2025-09-14T18:35:09.651Z |
| tvi-cli | 0.1.5 | 2025-09-14T18:35:10.996Z |
| @thangved/callback-window | 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/config-manager | 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/validatie | 0.1.6 | 2025-09-14T20:45:55.595Z |
| @hestjs/core | 0.2.1 | 2025-09-14T20:45:55.888Z |
➡️ Bekijk de volledige lijst met gecompromitteerde pakketten
| Pakketnaam | Versie | Publiceer datum |
|---|---|---|
| json-regels-engine-vereenvoudigd | 0.2.1 | 2025-09-14T17:58:51.203Z |
| piloot | 0.8.8 | 2025-09-14T18:35:07.600Z |
| mcp-kennisgrafiek | 1.2.1 | 2025-09-14T18:35:09.494Z |
| luchtcommandant | 0.3.1 | 2025-09-14T18:35:09.521Z |
| springpoort | 0.0.2 | 2025-09-14T18:35:09.651Z |
| tvi-cli | 0.1.5 | 2025-09-14T18:35:10.996Z |
| @thangved/callback-window | 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/config-manager | 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/validatie | 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 |
| ng2-bestand-upload | 7.0.3 | 2025-09-15T02:44:29.555Z |
| condensator-meldingshandler | 0.0.2 | 2025-09-15T04:54:48.431Z |
| condensator-plugin-vonage | 1.0.2 | 2025-09-15T04:54:48.501Z |
| condensator-plugin-healthapp | 0.0.2 | 2025-09-15T04:54:48.704Z |
| condensatorandroidpermissies | 0.0.4 | 2025-09-15T04:54:48.753Z |
| voip-callkit | 1.0.2 | 2025-09-15T04:54:49.223Z |
| condensator-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-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/web-app | 1.0.3 | 2025-09-15T05:21:20.383Z |
| @art-ws/ssl-info | 1.0.9 | 2025-09-15T05:21:20.927Z |





