TL, DR
Dvacet npm balíčků publikovaných během dvou dnů na konci července a začátku srpna 2026 se prezentuje jako interní knihovny komponent uživatelského rozhraní a sdílené backendové utility. Žádný z nich neimplementuje funkcionalitu, kterou inzeruje. Každý z nich obsahuje třídu stub, soubor README, který popisuje balíček jako interní, a soubor s názvem _polyfill.js.
Zajímavé je, odkud se tento soubor vyvolá. Není to instalační hook — manifesty nedeklarují žádnou předinstalační, instalační ani postinstalační operaci. Místo toho poslední řádek index.js zní: try { require("./_polyfill"); } catch (_) {}Datová část se spustí při prvním importu balíčku kódem aplikace. Instalace s --ignore-scriptsse standard rady pro snížení expozice dodavatelskému řetězci v době instalace, tomu nebrání.
Co _polyfill.js To, co proces dělá, je načíst spustitelný soubor specifický pro danou platformu z jednoho ze tří hostitelů Cloudflare Workers, zapsat ho do dočasného adresáře pod náhodným názvem, označit ho jako spustitelný soubor a spustit ho odděleně od nadřazeného procesu. Tento spustitelný soubor je sám o sobě zavaděčem: vyjmenovává produkty pro zabezpečení koncových bodů podle názvu procesu, kontroluje aktuální uživatelské jméno oproti známým účtům analytického prostředí, opravuje telemetrická rozhraní AMSI a ETW v paměti, instaluje persistenci pod názvem zvukové komponenty systému Windows a načítá třetí binární soubor o velikosti několika megabajtů. Třetí fáze je doručena zašifrovaná a je... dešifrováno a spuštěno v paměti, nikoli zapsáno na disk.
1. srpna, zhruba čtyři hodiny poté, co byly balíčky při ruční kontrole potvrzeny jako škodlivé, bylo devatenáct z dvaceti názvů z npm odstraněno jejich vlastním vydavatelem během pětadvacetisekundového sledu. 2. srpna byl jeden z těchto názvů znovu zaregistrován – jiným účtem se stejným kódem. V době psaní tohoto textu sloužila distribuční infrastruktura všem třem fázím.
| Balíčky | 20 názvů npm, ~74 publikovaných verzí |
| Pojmenování témat | beaver-ui-* (13) accounts-* (3) a dále afisha-storybook-default, bcore-bravo-eslint-config, arbocrate-sla-prober-arbocrate-sla-prober-core, a.poltoradnev-package-c |
| spoušť | Import modulů (require), nikoli skript životního cyklu npm |
| Stage 1 | _polyfill.js — vyzvednutí a spuštění |
| Stage 2 | Staticky linkovaný zavaděč, UPX-packed na Linuxu; výčet zabezpečení koncových bodů, opravy AMSI/ETW, perzistence |
| Stage 3 | beacon_linux.bin / beacon_mac.bin / update_win.exe, 4–13 MB; doručeno šifrované, spuštěno v paměti |
| Platformy | Linux x64 a arm64, univerzální macOS, Windows x64 |
| Vydavatelé | Dva účty, jedna kódová základna |
| Status | 19 z 20 jmen nezveřejněno provozovatelem; 1 znovu publikováno a spuštěno; doručovací infrastruktura spuštěna |
Anatomie útoku
Fáze 1 – balíček
Každý člen dodává stejný tvar se třemi soubory. index.js exportuje třídu s init() která nastavuje booleovskou hodnotu, verze(), A konfigurovat() který slučuje objekt možností. Nic jiného. README.md dává instalační řádek, a vyžadovat řádek a věta „Interní balíček. Pokyny viz CONTRIBUTING.md“ — CONTRIBUTING.md není v tarballu.
_polyfill.js má něco málo pod 5 KB a čte se jako běžný kód infrastruktury. Otevře se třemi kontrolami prostředí:
if (process.env.DISABLE_TELEMETRY ||
process.env.ANALYTICS_OPT_OUT ||
process.env.DO_NOT_TRACK)
return;Tyto proměnné jsou konvenční ovládací prvky ochrany soukromí. Zde kontrolují, zda je binární soubor stažen a spuštěn. Stroj, který nastavuje NESLEDOVAT je zcela přeskočeno.
Dále přichází razítko run-once: soubor na adrese /tmp/.analytics_statenebo analytický_stav pod % TEMP% ve Windows, jehož čas modifikace je porovnán s okénkem o délce 20 357 sekund. V tomto okně modul okamžitě vrátí data, takže opakované importy během sestavení vedou k jednomu pokusu o načtení, nikoli k desítkám.
Cílové hostitele nejsou přítomny jako literály. Jsou sestavovány za běhu z fragmentů:
["oob-worker.cf102-","baf.workers.d","ev"].join("")
Tímto způsobem se sestaví tři hostitelé, kteří se před použitím promíchají, takže pořadí se liší podle provedení. Načtení je HTTPS GET připnutý k IPv4 s User-Agent of node-fetch/2.6 — věrohodná hodnota, kterou má proces uzlu vydat. Odpověď menší než 1 000 bajtů je zahozena a je proveden pokus o spojení s dalším hostitelem.
Pokud všechny tři selžou, modul se vrátí k DNS. Vydá TXT dotaz pro C. pro získání počtu bloků, pak požadavky 0. přes n. v dávkách po deseti zřetězí odpovědi a výsledek dekóduje pomocí base64. Tato cesta přenáší stejný spustitelný soubor přes TXT záznamy DNS, který přežije prostředí, kde je filtrován odchozí HTTP, ale DNS resolver nikoli.
Načtené bajty se zapisují do /var/tmp/.cache_<8-hex> na Unixu, nebo %TEMP%\dotnet_diag_<8-hex>.exe ve Windows – název souboru, který se čte jako diagnostický artefakt .NET. V Unixu je souboru přiřazen režim 0755. Spuštění je potěr s oddělený: pravda, stdio: „ignorovat“, a unref(), takže podřízený proces přežije proces Node, který jej spustil; ve Windows volání přidá windowsHide: true.
Dva detaily doplňují obraz. Pomocník definovaný jako const _l = (…a) => process.stderr.write(“”) je volána v každém kroku načítání – zapíše prázdný řetězec a zahodí jeho argumenty, čímž obsadí pozici, kde by se nacházelo logování. A každý balíček dodává soubor o velikosti 81 KB na adrese lib/telemetry.js jehož komentář v záhlaví popisuje „Sadu analytických nástrojů SDK“ s „transportem HTTPS s rotací a opakováním koncových bodů“ a „vyhledáváním služeb založených na DNS pro failover“. V aktuálním sestavení to nic nevyžaduje.
Fáze 2 – nakladač
Binární soubor pro Linux x64 je staticky linkovaný ELF komprimovaný pomocí UPX 3.96. Sestavení pro macOS je univerzální binární soubor pokrývající x86_64 a arm64; sestavení pro Windows je ořezaný spustitelný soubor pro konzoli PE32+. Všechny čtyři byly načteny a staticky prozkoumány; žádný nebyl spuštěn.
Importy a tabulka řetězců sestavení Windows jasně popisují jeho chování. Řeší JeDebuggerPresent, CheckRemoteDebuggerPresent, a NtQueryInformationProcessa čte SYSTÉM\AktuálníOvládacíSada\Služby\Disk\Výčet — cesta k registru, jejíž hodnoty identifikují řadiče virtuálních disků. Volá GetDiskFreeSpaceExW a GlobalMemoryStatusEx, což je v souladu s kontrolou, zda se prostředky hostitele shodují s krátkodobou instancí analýzy.
Obsahuje seznam uživatelských jmen: AktuálníUživatel, Správce IT, Hong Lee, TESTBOX, hapubws, milozs, Timmy, administrátor, malware, vzorek, virus, životní prostředíNěkolik z nich jsou artefakty veřejně zdokumentovaných analytických prostředí.
Obsahuje také seznam produktů pro zabezpečení koncových bodů a názvů jejich procesů, vyjmenovaných pomocí CreateToolhelp32Snapshot a Process32FirstW/Process32NextW:
- CrowdStrike Falcon (
csfalconservice,CSFalconContainer) - Carbon Black (
cb.exe) - Cylance (
cylancesvc.exe) - BitDefender (
bdagent.exe) - Kaspersky (
avp.exe,kavfs.exe) - Trend Micro a Deep Security (
coreServiceShell,ds_agent.exe) - FireEye/Mříž (
xagt.exe) - Tanium (
taniumclient.exe) - HitmanPro (
hmpalert.exe) - Elastický (
elastic-agent.exe,elastic-endpoint,filebeat.exe,winlogbeat.exe) - Wazuh a OSSEC (
wazuh-agent.exe,ossec-agent.exe) - Check Point
- Windows Defender
Jsou přítomny dva další symboly: AmsiScanBuffer, vstupní bod, který systém Windows zpřístupňuje pro skenování obsahu v paměti, a EtwEventWrite, funkce, jejímž prostřednictvím funkce Event Tracing for Windows zaznamenává události. Obě jsou běžnými cíli pro úpravy v procesu, které potlačují telemetrii, kterou by tato rozhraní jinak produkovala.
Perzistence se ve Windows objevuje dvakrát. Binární soubor se zkopíruje do %APPDATA%\Microsoft\Windows\Themes\SystemSoundsService.exea odkazují na ni dva mechanismy: hodnota pod SOFTWARE\Microsoft\Windows\Aktuální verze\Spustita naplánovaný úkol registrovaný jako
schtasks /Create /F /SC ONLOGON
/TN "\Microsoft\Windows\Multimedia\SystemSoundsService"
/TR "\"%s\""
/RL HIGHESTCesta k úloze, název úlohy a název spustitelného souboru odpovídají originální zvukové komponentě systému Windows. /RL NEJVYŠŠÍ požaduje nejvyšší dostupnou úroveň oprávnění.
Sestavení macOS se řídí stejným vzorem s názvy odpovídajícími platformě: zapíše seznam vlastností do ~/Knihovna/LaunchAgents/com.apple.windowserver.helper.plist a umístí jeho spustitelný soubor na ~/.local/share/runtime/com.apple.runtimeKontroluje /Aplikace/VMware Fusion.app a /Knihovna/Podpora aplikací/Nástroje VMware.
Síťové možnosti zahrnují tři druhy transportu: Soubor WININET.dll pro HTTPS s https://%s:%d%s formátovací řetězec, WS2_32.dll zásuvky a Soubor DNSAPI.dll s DnsQuery_A vedle a c.%s.%s formátovací řetězec – stejný tvar dotazu na počet kusů, jaký používá první fáze.
Výše uvedený popis ukazuje, co ukazují importy, řetězce a cesty registru binárního souboru při kontrole. Veřejná analýza stejného vzorku systému Windows pomocí více enginů dodává podrobnosti, které statické čtení importní tabulky samo o sobě nemůže zjistit, a je zde uvedena jako přímá pozorování, nikoli jako přepracované pozorování. Tato analýza uvádí, že odkazy na AMSI a ETW nejsou pouze vyřešeny, ale také opraveny – AmsiScanBuffer in amsi.dll a EtwEventWrite in ntdll.dll — což potlačuje skenování obsahu v paměti a trasování událostí pro daný proces. Kontroly antianalýzy hlásí také jako časově založené, a to i na… CheckRemoteDebuggerPresenta identifikuje GetThreadContext volání jako kontrola hardwarového breakpointu čtením ladicích registrů. Také hlásí mutex pro jednu instanci, Global\{7A3B9E1F-C2D4-4F8A-B5E6-D7A1F0C3E2B9}a jména Služba SystemSounds jako hodnotu Run-key. Tato hodnota mutexu nebyla mezi zde získanými řetězci – extrakční filtr vyloučil tokeny s velkými hexadecimálními písmeny v závorkách – a je zaznamenána v tabulce indikátorů na základě této veřejné analýzy, nikoli přímého pozorování.
Stage 3
Zavaděč odkazuje na další sadu cest na stejných hostitelích. Všechny byly během analýzy dosažitelné: beacon_linux.bin při velikosti 5.3 MB, beacon_mac.bin při velikosti 13.3 MB, update_win.exe s velikostí 10.3 MB a arm.bin při velikosti 4.3 MB. Tyto soubory nebyly načteny a jejich chování není známo.
Pro cestu Windows popisuje veřejná analýza zavaděče, jak je tato třetí fáze zpracována: je načtena přes WinINet, dorazí zašifrovaná, dešifrována v paměti a reflexivně spuštěna – alokována paměť, vyřešen import, zpracována relokace a řízení předáno novému vláknu prostřednictvím Vytvořit vláknoZ tohoto důvodu se třetí fáze nikdy nezapisuje do souborového systému, takže detekce na základě souborů a forenzní analýza disku po incidentu z ní nemají co získat. To také znamená, že načtení bajtů z doručovacího hostitele by vedlo k zašifrovanému textu, nikoli k analyzovatelnému spustitelnému souboru.
Timeline
Všechna časová razítka jsou UTC a pocházejí z metadat registru npm, která zaznamenávají vytvoření a zrušení publikace balíčků nezávisle na jakémkoli pozorovateli.
| Kdy | Co |
|---|---|
| 2026-07-31 09:25:05 → 09:29:56 | Vytvořeno deset jmen, každé začínající na verzi 0.0.1, zhruba s odstupem třinácti sekund. |
| 2026-08-01 09:38 → 11:29 | Stávající názvy se prodírají nadsazenými čísly verzí, 6.1.9 přes 6.1.12, 9.9.9 přes 9.9.12, 8.9.3 přes 8.9.6, 5.4.6 přes 5.4.9. |
| 2026-08-01 13:04:14 → 13:04:18 | Devět dalších beaver-ui-* jména vytvořená v čtyřsekundovém nárůstu, každé publikované přímo ve verzi 12.x bez předchozí historie. |
| 2026-08-01 ~13:00–14:30 | Verze klasifikované jako škodlivé při ruční kontrole. |
| 2026-08-01 17:39:49 → 17:40:14 | Devatenáct z dvaceti jmen bylo nezveřejněno během dvaceti pěti sekund, postupně, s odstupem asi 1.2 sekundy. |
| 2026-08-02 18:58:41 | a.poltoradnev-package-c znovu vytvořeno pod jiným účtem správce, verze 0.0.2. |
| 2026-08-02 19:20:28 | Verze 33.9.5 publikováno pod stejným názvem. |
| 2026-08-02 20:14 | Všechny tři doručovací hostitelské stanice obsluhující druhou a třetí fázi; záložní DNS odpovídá s počtem bloků. |
Dva z těchto záznamů stojí za to se zastavit.
Výbuch ve 13:04 umístil do registru devět balíčků během čtyř sekund, každý s jednou verzí ve dvanácti a žádný 0.0.1 pod ním. Čísla verzí v tomto měřítku, s názvy starými jeden den, nepopisují historii vydávání.
Sekvence odhlášení je stejně mechanická: devatenáct jmen, dvacet pět sekund, rovnoměrné mezery. npm je zaznamenává jako běžné události odhlášení, nikoli jako zástupný symbol, který zanechává odstranění iniciované registrem, což umisťuje akci na publikační účet, nikoli na registr.
Ukazatele kompromisu
Hostitelé a cesty jsou odinstalovány. Neprovádějte jejich překlad ani načítání z produkčního systému.
| Typ | Hodnota |
|---|---|
| Hostitel doručení | oob-worker[.]cf99-9b3[.]workers[.]dev |
| Hostitel doručení | oob-worker[.]cf102-baf[.]workers[.]dev |
| Hostitel doručení | oob-worker[.]cf103-070[.]workers[.]dev |
| Transport DNS | tin[.]dl[.]well1[.]site (Linux x64), tina[.] (rameno64), ldr[.] (Operační Systém Mac), win[.] (Windows) — počet bloků na c.<domain>, data na <n>.<domain> |
| Cesty 2. fáze | /pkg/package, /pkg/package-arm64, /pkg/loader_mac, /pkg/package.exe |
| Cesty 3. fáze | /pkg/beacon_linux.bin, /pkg/beacon_mac.bin, /pkg/update_win.exe, /pkg/arm.bin |
| Cesta pro vyřazení (Unix) | /var/tmp/.cache_<8-hex> |
| Cesta pro přetažení (Windows) | %TEMP%\dotnet_diag_<8-hex>.exe |
| Perzistence (Windows) | %APPDATA%\Microsoft\Windows\Themes\SystemSoundsService.exeúkol \Microsoft\Windows\Multimedia\SystemSoundsServiceHodnota klíče pro spuštění SOFTWARE\Microsoft\Windows\CurrentVersion\Run\SystemSoundsService |
| Mutex (Windows) | Global\{7A3B9E1F-C2D4-4F8A-B5E6-D7A1F0C3E2B9} |
| Perzistence (macOS) | ~/Library/LaunchAgents/com.apple.windowserver.helper.plistbinární na ~/.local/share/runtime/com.apple.runtime |
| Razítko s jednou ručičkou | /tmp/.analytics_state, %TEMP%\analytics_state (okno 20 357 s) |
| Žádost o podpis | HTTPS GET, IPv4-pinned, User-Agent: node-fetch/2.6 |
| Soubor fáze 1 | _polyfill.js, SHA-256 392dc9ec85042ce1796bfa9b8c7bf6e05c7710579aab8b7b1eb73788683883af |
| Neodkazovaný soubor | lib/telemetry.js, SHA-256 2266c9b8e199daebe31a9afcb61d9b0d76706b63c92312fc8223d22de42e63c7 |
| Fáze 2 (Linux x64) | SHA-256 7e486657f30594afda379b97030252a09a19fe8055e25c9e371544f59bd8e9e3 |
| Fáze 2 (Linux arm64) | SHA-256 aafc37589c0d21fb729761a1579ca3b278b95bce152aacfa29243ffd27f5eeb7 |
| Fáze 2 (macOS) | SHA-256 c214746c74cae8ece8bdaf69aa05da4db6ce013f9e77452d1eed1a002fd9ba00 |
| Fáze 2 (Windows) | SHA-256 d632c2c0c7801c3da57cf849fe4b4ca8351d9a7fe73c31050bf5dbcc96a16791 |
Názvy balíčků
Atribuce a pozorované chování
Jde o dva npm účty. Devatenáct nezveřejněných jmen bylo zveřejněno jedním účtem; a.poltoradnev-balíček-c byl 2. srpna znovu zaregistrován pod jiným názvem účtu a jinou e-mailovou doménou. Kód má v obou stejný původ a druhá registrace obsahuje stejné doručovací hostitele, stejné záložní domény DNS, stejnou konstrukci cesty pro odkládání a stejné razítko pro jednorázové spuštění.
Znovu publikovaná dvojice také ukazuje, jak byla sestavena. Verze 0.0.2 a 33.9.5 jsou bajtově identické, s výjimkou řetězce verze v balíček.jsonA index.js dodáváno jako 0.0.2 prohlašuje, konstantní VERZE = „33.9.5“Oba artefakty byly vyříznuty ze stejného zdrojového stromu a následně očíslovány. Neexistuje žádný 0.0.2 historie vývoje pro 0.0.2 uvolnění k zastupování.
Číslování verzí v celé sadě se řídí stejnou logikou. Názvy balíčků v této kampani se čtou jako věci, které by existovaly uvnitř organizace, spíše než ve veřejném registru: sada komponent uživatelského rozhraní, konfigurace ESLint, SLA sonda, balíček pojmenovaný po osobě. Když sestavení řeší závislost podle názvu a konzultuje veřejný registr vedle soukromého, vítězí verze s vyšším číslem. Název vytvořený na 0.0.1 v pondělí a s sebou 12.9.6 v úterý je připraveno pro toto srovnání.
Dvě publikační vlny se také liší způsobem, který naznačuje iteraci. Dřívější kód pojmenoval svůj soubor s datovým zatížením setup.js a uvedl pět doručovacích hostitelů; aktuální soubor má název _polyfill.js a uvádí tři. Starší verze odstranila odstraněný soubor pět sekund po spuštění, takže proces běžel z odstraněného inodu; aktuální verze to nedělá. Neodkazovaný lib/telemetry.js zůstává v tarballu na obou, stále odesílán, již není připojen.
Za zmínku stojí jedno pozorování ohledně vypínačů kill switch.cisely, protože to odporuje běžnému výkladu. ZAKÁZAT_TELEMETRII, ODHLÁŠENÍ_Z_ANALYTIKY, a NESLEDOVAT jsou respektovány a jsou kontrolovány dříve, než se cokoli dalšího stane. Výzkumník, jehož analytické prostředí nastavuje kterýkoli z nich, pozoruje balíček, který nedělá vůbec nic.
Dopad a co mohou obránci udělat
Praktický důsledek spouštěče v době importu je úzký a stojí za to ho uvést samostatně. npm install –ignore-scripts zabraňuje spuštění skriptů životního cyklu a je to rozumná rada. Zde to nemá žádný vliv, protože tento kód nepoužívá skript životního cyklu. Užitečná část se spustí, když kód aplikace, testovací běh, bundler nebo linter nejprve importuje modul. U běžce CI, který instaluje a poté ihned sestavuje, jsou tyto dva okamžiky od sebe vzdáleny několik sekund.
Pro lov jsou trvalé signály spíše strukturální než doslovné. Hostitelé, název souboru a cesty k přetažení se budou měnit; tyto tvary je obtížnější měnit:
- Vstupní bod modulu, jehož poslední příkaz je try { require(“./x”); } catch (_) {} kolem souboru, který není součástí exportovaného API. Balíček s originálním polyfillem importuje soubor na začátku a používá jeho výsledek. Pohlcení všech chyb z importu na konci souboru není ošetření chyb.
- Hostitelské řetězce sestavené uživatelem .připojit("") z řady fragmentů. Legitimní kód nemá důvod rozdělovat název hostitele mezi prvky pole.
- Balíček, jehož deklarované závislosti jsou prázdné, ale který sahá po https, dns, a podřízený_proces v době importu. Načtení a spuštění v balíčku, který inzeruje komponentu uživatelského rozhraní, je celým nálezem.
- Čísla verzí neodpovídají stáří balíčku. Jméno, které bylo poprvé zveřejněno před několika dny s dvojciferným počtem prodaných velkých verzí, bez jakýchkoli mezilehlých vydání, popisuje něco jiného než jeho vývoj.
- Píše komu / var / tmp or % TEMP% následuje chmod do 07:55 a oddělený spawn. Sekvence je krátká, uspořádaná a zřídkakdy benigní dohromady.
Na hostitelích s Windows existují dvě levné kontroly s vysokou spolehlivostí. Artefakty perzistence jsou fixní řetězce a žádný z nich nepatří do čistého systému: naplánovaná úloha na \Microsoft\Windows\Multimedia\SystemSoundsService, hodnota Run-key s názvem Služba SystemSoundsa spustitelný soubor se stejným názvem pod %APPDATA%\Microsoft\Windows\Motivy\Originální zvuková služba Windows se nenachází na žádném z těchto míst. Za druhé, zavaděč používá pevný mutex pro jednu instanci, Global\{7A3B9E1F-C2D4-4F8A-B5E6-D7A1F0C3E2B9}; jeho přítomnost na hostiteli je indikátorem a protože zavaděč považuje existující mutex za „již spuštěný“, je jeho předběžné vytvoření schůdnou krátkodobou inokulací, zatímco je naplánována náprava.
Detekce ve třetí fázi je složitější problém a je vhodné si ho ujasnit. Podle veřejné analýzy je kód dešifrován a mapován do paměti, nikoli zapsán na disk, takže skenování souborů a forenzní analýza disku jej nevidí. Pozorovatelná zůstává pouze stopa zavaděče – perzistenční položky, mutex a odchozí požadavky na doručovací hostitele nebo domény DNS-TXT.
Pro prostředí, která řeší závislosti jak ze soukromého, tak z veřejného registru, se zmírnění rizik ničím z tohoto postupu nemění: interními názvy oborů, aby je veřejný název nemohl splňovat, a připnutím rozlišení k internímu registru pro tyto obory. Chování inflace verzí popsané výše funguje pouze v případě, že vyšší veřejná verze může získat název.
Konečně, nepublikování stojí za to si přečíst pozorněji, spíše než ho považovat za konec. Devatenáct jmen opustilo registr během dvaceti pěti sekund a jedno se vrátilo o den později pod novým účtem, přičemž infrastruktura pro doručování zůstala po celou dobu nedotčena. Odstranění balíčků nepředstavuje odstranění operace; hostitelé pokračovali v obsluze všech fází, zatímco se toto psalo. S každým stromem závislostí, který vyřešil jeden z těchto jmen mezi 31. červencem a 1. srpnem, by se mělo zacházet, jako by měl možnost spustit první fázi, ať už daný název stále existuje, nebo ne.
Reference
- Analýza zavaděče Windows pomocí více enginů — zdroj pro opravy AMSI/ETW, reflexivní spuštění v paměti a podrobnosti o mutexu uvedené výše.
- Dokumentace k npm skriptům — události životního cyklu, které tato kampaň nepoužívá.
- Dokumentace k instalaci npm — kryty –Ignorovat skripty a jeho rozsah.







