7 kroków: bezpieczeństwo agentów AI po atakach na npm
Praktyczna checklista dla founderów/CTO MŚP po atakach na łańcuch dostaw npm. 7 kroków: sandbox (Windows/Docker), egress, SBOM, skan zależności, pinned + provenance, allowlista wywołań narzędzi (tool calls), Vercel AI Gateway i telemetria. Z krótkimi snippetami JSON/YAML.

Najważniejsze wnioski
- Izoluj agentów w sandboxie (Windows/Docker) i domyślnie blokuj egress.
- Generuj SBOM i skanuj zależności w CI; failuj build przy wysokich ryzykach.
- Używaj pinned dependencies i provenance w npm; instaluj przez npm ci.
- Allowlista wywołań narzędzi (tool calls) i walidacja parametrów.
- Prowadź ruch LLM przez Vercel AI Gateway i rotuj klucze per agent.
- Zbieraj telemetrię zdarzeń agenta i alertuj na anomalie.
Po ostatnich incydentach supply‑chain w npm (m.in. TanStack) i fałszywych repozytoriach na Hugging Face, domyślna konfiguracja agentów AI w Next.js/Node/Windows bywa łatwym wektorem ataku. Oto 7 kroków: sandbox i egress, SBOM + skan, przypięte wersje z provenance, allowlista wywołań narzędzi, kontrola kluczy przez Vercel AI Gateway i telemetria — z krótkimi snippetami do wdrożenia w tydzień.
Czy problem dotyczy Twoich agentów AI w Next.js/Node?
Agent AI to autonomiczny komponent wykonujący zadania na podstawie promptu oraz dostępu do narzędzi. Prompt to zestaw instrukcji wejściowych (od użytkownika, systemu lub innego agenta), który definiuje cel, kontekst i ograniczenia działania, np. „napraw błąd X w repo Y, użyj tylko searchDocs i createIssue”. Tool call to wywołanie konkretnego narzędzia udostępnionego agentowi (np. wyszukiwarka dokumentacji, tworzenie PR). Każde z nich może otwierać powierzchnię ataku.
W ostatnich dniach mieliśmy głośne incydenty supply‑chain (np. TanStack) i fałszywe repozytoria na Hugging Face. W SMB rośnie adopcja agentów (Next.js/TypeScript/Windows), a więc i ryzyko. Atakujący celują w: zależności npm, skrypty postinstall, nadmierne uprawnienia tool calls, swobodny egress oraz wycieki kluczy.
Wniosek: przyjmij, że incydent się wydarzy. Zmniejsz skutki w 7 krokach poniżej.
- Zależności npm i przejęte konta maintainerów
- Skrypty install/postinstall uruchamiane w CI/produkcyjnie
- Tool calls wykonujące kod lub sięgające do zasobów bez limitów
- Nieograniczony egress (exfiltracja danych/kluczy)
- Klucze API w logach i brak rotacji
Krok 1–2: Sandbox (Windows/Docker) i domyślnie zablokowany egress
Krok 1. Izoluj agentów kodujących w sandboxie. Na Windows użyj Windows Sandbox do zadań generowania/uruchamiania kodu. W Linux/hostingu użyj Docker z ograniczeniami. Przykład konfiguracji Windows Sandbox (.wsb) – wyłącza sieć i GPU, montuje wyłącznie katalog roboczy w trybie tylko‑do‑odczytu i startuje agenta bez profilu użytkownika; tym samym minimalizujesz egress, uprawnienia i trwałość ewentualnego ataku:
<Configuration> <VGpu>Disable</VGpu> <Networking>Disable</Networking> <MappedFolders> <MappedFolder> <HostFolder>C:\agents\work</HostFolder> <ReadOnly>true</ReadOnly> </MappedFolder> </MappedFolders> <LogonCommand> <Command>powershell -NoProfile -ExecutionPolicy Bypass npm ci; node agent.js</Command> </LogonCommand> </Configuration>
Przykład Docker Compose (izolacja, brak sieci domyślnie):
version: "3.8" services: agent: image: node:20-alpine user: "1000:1000" read_only: true cap_drop: ["ALL"] security_opt: - no-new-privileges:true network_mode: none tmpfs: - /tmp:rw,noexec,nosuid,nodev command: ["node","agent.js"] environment: - NODE_ENV=production
- Sandbox dla zadań z uruchamianiem kodu; reszta w standardowym środowisku.
- Czyść i niszcz środowisko po zadaniu (ephemeral).
- Nie montuj poświadczeń/sekretów do sandboxa bez potrzeby.
Krok 3–4: SBOM Node.js i skanowanie zależności w CI
Krok 3. Generuj SBOM (Software Bill of Materials) przy każdym buildzie. Minimalny start:
npx @cyclonedx/cyclonedx-npm@latest --output-file sbom.json
Alternatywnie użyj Syft (CycloneDX): syft dir:. -o cyclonedx-json=sbom.json
Krok 4. Skanuj zależności i blokuj build przy wysokich ryzykach. Połącz npm audit i skaner obrazów/bibliotek (np. Grype). Minimalny workflow GitHub Actions:
- name: sbom-and-scan on: [push] jobs: ci: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: { node-version: 20 } - run: npm ci --ignore-scrip
Krok 5–6: Pinned dependencies i provenance w npm
Krok 5. Pinned dependencies i twarde reguły instalacji. Wymuś dokładne wersje i brak skryptów w CI/produkcji. Przykład .npmrc:
save-exact=true audit=true engine-strict=true fund=false ignore-scripts=true
Instalacja w CI/PROD: npm ci --ignore-scripts --omit=dev
Dla transitive użyj overrides w package.json: { "overrides": { "axios": "1.6.8" } } , a aktualizacje rób wsadowo i kontrolowanie (np. raz w tygodniu). Krok 6. Provenance dla własnych pakietów: publikuj z podpisem/attestacją (npm publish --provenance) z GitHub OIDC. Przy zewnętrznych paczkach trzymaj allowlistę wydawców/orgów i źródeł (sprawdzaj repository.url oraz maintainerów).
- Używaj npm ci zamiast npm install w CI i produkcji.
- Blokuj postinstall; włączaj tylko dla pakietów, które tego wymagają, w odizolowanym kroku.
- Aktualizuj zależności kontrolowanie (renovate/pnpm update – nie ad hoc).
- Własne paczki publikuj z provenance; cudze konsumuj z allowlisty.
Krok 7: Allowlist tool calls, Vercel AI Gateway i telemetria/alerty
Krok 7a. Allowlista narzędzi (tool calls) i walidacja parametrów. Zdefiniuj tylko potrzebne narzędzia i waliduj wejście. Przykład (TypeScript + zod):
const ALLOWED_TOOLS = ["searchDocs","createIssue"] as const; const searchDocs = { name: "searchDocs", parameters: z.object({ query: z.string().max(200) }), execute: async ({ query }) => {/* ... */} }; function guardToolCall(name:string){ if(!(ALLOWED_TOOLS as readonly string[]).includes(name)) throw new Error("blocked_tool:"+name);}
Krok 7b. Kontrola kluczy i ruchu przez Vercel AI Gateway. Użyj osobnych kluczy per agent/środowisko, taguj żądania i ustaw limity/przekierowanie modeli w Gateway. Minimalne wywołanie z tagiem użycia:
const resp = await fetch(process.env.AI_GATEWAY_URL!,{ method:"POST", headers:{ "Authorization":"Bearer "+process.env.AI_GATEWAY_KEY, "x-usage-tag":"agent:codebot:prod" }, body: JSON.stringify({ model:"openai:gpt-4.1-mini", input }) }); // rotuj AI_GATEWAY_KEY co 30 dni; trzymaj w Server-only env
- Klucze per agent i środowisko; rotacja automatyczna.
- Włącz limity zapytań i logowanie w Gateway; filtruj po x-usage-tag.
- Jeśli możesz, blokuj bezpośrednie wywołania dostawców (tylko przez Gateway).
To 7 kroków, które realnie zmniejszają skutki ataków łańcucha dostaw npm i nadużyć agentów AI. Zacznij od sandboxu i egress, potem włącz SBOM/skan, przypnij zależności i uszczelnij tool calls oraz klucze. Jeśli chcesz, przejdziemy przez Twoje repo i środowisko w 90-min konsultacji i zrobimy plan wdrożenia na tydzień.
Najczęstsze pytania
Czy Next.js na Vercel umożliwia blokadę egress?
Na Vercel (Serverless/Edge) nie skonfigurujesz platformowego firewall’a egress. Zaimplementuj allowlistę hostów w kodzie (np. własny wrapper na fetch) i kieruj ruch LLM wyłącznie przez Vercel AI Gateway. W infrastrukturze własnej użyj Docker/k8s z NetworkPolicy lub egress proxy.
Czy Windows Sandbox wystarczy do produkcji?
Nie. Windows Sandbox nie jest środowiskiem klasy produkcyjnej ani nie oferuje wymaganych gwarancji zarządzania, sieci i obserwowalności. Traktuj go wyłącznie do krótkich, odizolowanych zadań bez sekretów. W produkcji używaj kontenerów lub VM z kontrolą egress/allowlist, podpisanymi obrazami, minimalnymi uprawnieniami, monitoringiem i audytem.
Czy pinned dependencies wystarczą, jeśli paczka zostanie przejęta?
Nie. Pinned ograniczają dryf wersji, ale jeśli przejęta jest sama „przypięta” wersja, zainstalujesz dokładnie złośliwy kod. Lockfile i integrity hash chronią przed podmianą artefaktu, nie przed złośliwą publikacją. Potrzebujesz: SBOM + skan w CI, --ignore-scripts w buildzie, allowlisty wydawców/orgów i provenance, code review diffów, izolację uruchomień oraz szybki rollback.
Jak szybko wdrożyć SBOM w monorepo Node/pnpm?
Generuj SBOM na poziomie workspaca i per pakiet. Najprościej: uruchom Syft w katalogu repo (CycloneDX JSON) lub per pakiet (pnpm -r exec syft dir:. -o cyclonedx-json=sbom.json). W CI dodaj krok po pnpm install --frozen-lockfile. Archiwizuj artefakty i skanuj je Grype; build przerywaj przy high/critical.