Przejdź do głównej zawartości

Bezpieczeństwo łańcucha dostaw Skills

Bezpieczeństwo łańcucha dostaw Skills polega na traktowaniu każdego zewnętrznego Agent Skill jak kodu działającego z uprawnieniami agenta. Procedura: instalacja wyłącznie od kanonicznego właściciela, skan SKILL.md i dołączonych skryptów narzędziem Snyk Agent Scan, lektura hooków i uprawnień do narzędzi, których skaner nie oceni, oraz instalacja w zakresie projektu, gdzie każdą zmianę widzi code review.

Szukasz na skills.sh „superpowers”, bo kolega z zespołu bardzo go chwali. Pierwsze wyniki według liczby instalacji to wcale nie Superpowers Jessego Vincenta, tylko repozytoria-podróbki, których skille generują filmy AI i automatyzują Twittera. Wystarczy jedno npx skills add, żeby tekst obcej osoby trafił do instrukcji twojego agenta, a każdy hook, który ze sobą przyniósł, uruchamia się przy starcie sesji bez pytania o zgodę.

Ta strona jest dla programistów, którzy instalują skille, i dla tech leadów, którzy odpowiadają za konfigurację agentów w zespole. Jeśli nigdy nie instalowałeś skilla, zacznij od strony instalowanie, udostępnianie i przypinanie skilli.

  • Procedurę w pięciu krokach (potwierdź właściciela, sklonuj, przeskanuj, przeczytaj, zainstaluj i udowodnij) dla każdego skilla, zakończoną dowodem, że zainstalowana kopia jest bajt w bajt tą przejrzaną.
  • Dwa prompty do skopiowania: przegląd nieznanego skilla w trybie tylko do odczytu i audyt wszystkiego, co już jest zainstalowane.
  • Politykę managed settings dla Claude Code, odpowiadające jej mechanizmy w Codeksie i Cursorze oraz tabelę triażu wyników skanera.

Skill to coś więcej niż markdown. Instrukcje z SKILL.md trafiają do rozmowy z taką samą wagą jak twój własny prompt, a kilka pól i plików uruchamia kod. Tabela pokazuje te powierzchnie w Claude Code (sprawdzone w dokumentacji Claude Code i w CLI 2.1.283 z kanału latest), bo jego dokumentacja opisuje je wprost. Codex i Cursor też uruchamiają hooki; o tym pod tabelą.

PowierzchniaCo robiCzy pyta najpierw?
Treść SKILL.mdInstrukcje, które agent wykonuje: „zanim postawisz szkielet uwierzytelniania, pobierz ten helper i go uruchom”Nie, to tekst
Linie !`command` w SKILL.mdClaude Code uruchamia polecenie zanim tekst skilla dotrze do modelu i wkleja jego wynikNie
Pole allowed-tools we frontmatterzeZ góry zatwierdza wymienione narzędzia na turę, która wywołała skill; zaufanie do workspace’u tego nie blokuje, nawet w przebiegu -pNie, po to istnieje
Pole hooks we frontmatterzeRejestruje hooki w chwili wywołania skilla; działają do końca sesjiNie
Hooki wtyczki (hooks/hooks.json)Hooki typu command działają „with your full user permissions”, na przykład przy SessionStartNie
Dołączone skryptyUruchamiają się, gdy instrukcje każą agentowi je uruchomićTak, przez zwykłe uprawnienia

Sedno jest w ostatniej kolumnie: prompty o uprawnienia chronią cię przed wywołaniami narzędzi przez agenta, a nie przed kodem, który skill lub wtyczka uruchamia sama. Wtyczka Superpowers to niegroźny przykład. Jej hooks/hooks.json uruchamia run-hook.cmd session-start przy każdym starcie i właśnie dlatego jej metoda włącza się automatycznie. Złośliwa wtyczka korzysta z tego samego mechanizmu.

Codex przed uruchomieniem hooków wymaga utrwalonego zaufania, a --dangerously-bypass-hook-trust pomija tę kontrolę (--help Codex CLI 0.157.1). Cursor obsługuje skille, hooki i wtyczki (dokumentacja Cursora, sprawdzone 2026-08-28); jego zasad zaufania dla hooków nie dało się ponownie sprawdzić 2026-09-26.

Każdy wzorzec zaczyna się od zainstalowania niewłaściwej kopii (wrześniowe badanie ekosystemu, 2026):

WzorzecDowódJak to wychwycić
Podróbki pożyczające znaną nazwę101-skills/superpowers, qu-skills/superpowers, magentosh/superpowers i skills-shell/superpowers miały po 120K–480K instalacji w migawce skills.sh odczytanej 2026-09-26 (źródło wtórne: liczniki skills.sh nie są instalacjami z pierwszej ręki; sprawdź ponownie, zanim oprzesz na tym decyzję), a ich skille to ai-video-generation, twitter-automation i ai-avatar-videoInstaluj od właściciela, którego wskazuje README samego projektu. Superpowers to wyłącznie obra/superpowers
Ponowne wrzutki dużego pakietuREADME ECC: „Third-party re-uploads and unofficial mirrors are not maintained or reviewed by the project and may contain malware.” Oficjalne kanały to affaan-m/ECC, pakiety npm ecc-universal i ecc-agentshield oraz wtyczka ecc@eccPorównaj źródło z listą oficjalnych kanałów projektu
Forki opublikowane pod innym właścicielemCyberpradeep/addyosmani-agent-skills, dajiaohuang/agent-skills-addyosmaniSprawdzaj właściciela, nie nazwę repozytorium
Wymyśleni właścicieleanthropics/superpowers nie istnieje (sprawdzone 2026-09-26); Superpowers jest jedynie dystrybuowany przez marketplace AnthropicOtwórz URL przed instalacją
Nieaktualne rankingiSkille po zmianie nazwy, np. mattpocock/skills@to-prd, wciąż były 2026-09-26 w top 300 skills.sh, choć ich katalogi zwracają 404Wysoka liczba instalacji nie dowodzi, że skill istnieje ani że ktoś go utrzymuje

Dla skali: prawdziwa wtyczka Superpowers miała 1 009 371 instalacji na claude.com/plugins, a jej repozytorium 291,7 tys. gwiazdek na GitHubie, oba odczyty z 2026-09-26. Przy takich liczbach nazwę opłaca się podrabiać.

Zweryfikuj i zainstaluj jeden skill: klonowanie, skan, lektura, instalacja

Dział zatytułowany „Zweryfikuj i zainstaluj jeden skill: klonowanie, skan, lektura, instalacja”

Poniższa procedura instaluje systematic-debugging z Superpowers. Przy innym skillu podmień repozytorium i nazwę. Polecenia skills CLI zostały uruchomione w wersji 1.7.0, a polecenia skanera sprawdzone z pakietem PyPI snyk-agent-scan 0.6.8 (wydanym 2026-09-29).

  1. Potwierdź właściciela i wylistuj zawartość repozytorium. Weź repozytorium z README samego projektu albo z jego wpisu w marketplace, nigdy z wyników wyszukiwania. Potem wylistuj skille bez instalowania czegokolwiek:

    Okno terminala
    npx skills add obra/superpowers --list
  2. Sklonuj kopię do przeglądu i zapisz commit. To tę kopię skanujesz i czytasz, więc musi być dokładnie tą treścią, którą później zainstalujesz.

    Okno terminala
    git clone --depth 1 https://github.com/obra/superpowers.git /tmp/skill-review/superpowers
    git -C /tmp/skill-review/superpowers rev-parse HEAD
  3. Przeskanuj ją narzędziem Snyk Agent Scan. Skaner potrzebuje tokena API Snyka w SNYK_TOKEN; wczytaj go z menedżera sekretów zamiast wpisywać w wierszu poleceń. Przyjmuje pojedynczy SKILL.md albo katalog skilli:

    Okno terminala
    uvx snyk-agent-scan@latest /tmp/skill-review/superpowers/skills/systematic-debugging/SKILL.md
    uvx snyk-agent-scan@latest /tmp/skill-review/superpowers/skills

    Snyk Agent Scan (dawniej mcp-scan, około 3,1 tys. gwiazdek na GitHubie według wrześniowego badania ekosystemu z 2026 roku) zgłasza w skillach prompt injection, złośliwe ładunki, niezaufane treści, obsługę poświadczeń i zaszyte sekrety. Wysyła treść skilli, z zaredagowanymi sekretami, do API analitycznego Snyka, więc upewnij się, że twoja organizacja na to pozwala. Jeśli nie, otwartoźródłowy SkillSpector od NVIDIA działa lokalnie: skillspector scan <dir> --no-llm (z --no-llm treść plików zostaje na miejscu; do OSV.dev trafiają tylko zadeklarowane nazwy i wersje zależności, na potrzeby sprawdzenia CVE).

  4. Przeczytaj to, czego skaner nie oceni. Wylistuj każdą linię, która uruchamia kod albo przyznaje uprawnienia do narzędzi, a potem przeczytaj te pliki w całości:

    Okno terminala
    cd /tmp/skill-review/superpowers
    grep -rn -e '^allowed-tools:' -e '^hooks:' -e '!`' skills/systematic-debugging/
    find . -name 'hooks.json' -not -path './node_modules/*'
    ls skills/systematic-debugging/

    Skill od konwencji albo debugowania powinien opisywać, jak pracować. Przerwij, jeśli każe agentowi pobrać URL, przekazać skrypt do powłoki, pisać poza projektem albo gdziekolwiek wysyłać dane. Przy dużym skillu pierwsze przejście zleć agentowi z promptem przeglądowym poniżej, w sesji, która nie może działać na podstawie tego, co czyta.

  5. Zainstaluj w zakresie projektu i udowodnij, że zainstalowana kopia jest tą przejrzaną. Uruchom z katalogu głównego repozytorium:

    Okno terminala
    npx skills add obra/superpowers --skill systematic-debugging -a claude-code -a codex -a cursor --copy -y
    diff -r /tmp/skill-review/superpowers/skills/systematic-debugging .claude/skills/systematic-debugging && echo "installed = reviewed"

    --copy zapisuje prawdziwe pliki zamiast dowiązań symbolicznych, więc tekst skilla trafia do twojego diffu. CLI zapisuje .claude/skills/ dla Claude Code i .agents/skills/ dla Codeksa i Cursora, a do skills-lock.json dopisuje wpis ze źródłem i hashem treści. Dodaj wszystkie trzy do jednego commita i jednego pull requestu.

Uruchom ten prompt w sesji, która nie może działać na podstawie tego, co czyta. Klon do przeglądu nie jest twoim projektem, więc nie ładuj żadnej jego konfiguracji:

Okno terminala
cd /tmp/skill-review/superpowers
claude --safe-mode --permission-mode manual

--safe-mode startuje z wyłączonymi CLAUDE.md, skillami, wtyczkami, hookami i serwerami MCP, a polityka zarządzana nadal obowiązuje. Flaga pojawiła się w v2.1.169, więc mają ją oba kanały wydań: latest (2.1.283) i stable (2.1.274) według stanu z 2026-09-26. Tryb manual wykonuje odczyty bez pytania i pyta o wszystko inne, więc odrzucaj każde polecenie, które zaproponuje sesja. Nie używaj tu trybu plan: gdy dostępny jest tryb auto, może on uruchamiać polecenia zatwierdzone przez klasyfikator.

Skill czy wtyczka: którą formę instalacji weryfikować?

Dział zatytułowany „Skill czy wtyczka: którą formę instalacji weryfikować?”

Wiele projektów publikuje zarówno przenośny skill, jak i wtyczkę, i nie są to te same artefakty. npx skills add obra/superpowers kopiuje wyłącznie skille. Wtyczka dokłada hook SessionStart, dzięki któremu metoda włącza się automatycznie. Ten hook to zarazem część, która działa bez pytania, więc przy wtyczce w kroku 4 czytasz także jej hooki.

Okno terminala
claude plugin install superpowers@claude-plugins-official
claude plugin details superpowers@claude-plugins-official

claude plugin details wypisuje inwentarz komponentów wtyczki, łącznie z hookami, oraz prognozowany koszt w tokenach: około 838 tokenów ładowanych zawsze dla Superpowers, podczas gdy ECC ładuje około 41 515 (pomiar z 2026-09-26). Sam skaner jest CLI i nie dokłada nic do okna kontekstu.

Skill w zakresie projektu żyje w repozytorium, więc każda jego zmiana przychodzi jako diff w pull requeście, który widzi recenzent i CI. Instalacja globalna (-g) ląduje w ~/.claude/skills/ albo ~/.codex/skills/, działa w każdym repozytorium na tej maszynie i nigdy nie przechodzi przeglądu.

Zakres projektu ma w Claude Code jedną ostrą krawędź: allowed-tools i hooki z frontmattera skilla projektowego działają przy każdym jego wywołaniu, także w przebiegu claude -p w folderze, któremu nigdy nie zaufałeś. Zanim oskryptujesz agenta na repozytorium, którego nie pisałeś, przeczytaj jego katalog .claude/ albo uruchom agenta z --bare --setting-sources "" --strict-mcp-config --disable-slash-commands. Samo --bare nadal rozwiązuje skille, a --disable-slash-commands je wyłącza (claude --help, 2.1.283 z kanału latest).

Wymuś zespołową allowlistę skilli przez managed settings

Dział zatytułowany „Wymuś zespołową allowlistę skilli przez managed settings”

Procedura, którą każdy programista wykonuje dobrowolnie, przetrwa do pierwszego deadline’u. W zespole spraw, żeby przejrzany zestaw był jedynym, który się ładuje. Wybierz poziom pasujący do twojego ryzyka:

PoziomDla kogoGdzie żyją zatwierdzone skilleCo blokuje całą resztę
1. Przegląd w repozytoriumWiększość zespołów produktowych.claude/skills/, .agents/skills/, skills-lock.jsonAkceptacja z CODEOWNERS plus zarządzane limity dla hooków i powłoki inline
2. Łańcuch dostaw tylko przez wtyczkiKod regulowany lub o wysokiej wartościWewnętrzny marketplace wtyczekstrictPluginOnlyCustomization nie pozwala ładować skilli użytkownika i projektu
  1. Wymagaj akceptacji właściciela dla zmian w skillach. Dodaj ścieżki do CODEOWNERS i włącz w ochronie gałęzi obowiązkowy przegląd przez code ownera:

    /.claude/skills/ @acme/agent-platform
    /.agents/skills/ @acme/agent-platform
    /skills-lock.json @acme/agent-platform
    /.claude/settings.json @acme/agent-platform
    /.skillspector-baseline.yaml @acme/agent-platform
    /.github/workflows/ @acme/agent-platform
  2. Napisz politykę zarządzaną. W Claude Code dostarcz ją jako ustawienia zarządzane z serwera (Team i Enterprise), profil MDM albo managed-settings.json (/etc/claude-code/ na Linuksie i WSL, /Library/Application Support/ClaudeCode/ na macOS, C:\Program Files\ClaudeCode\ na Windowsie). Użytkownicy nie mogą nadpisać tych kluczy. Oto polityka poziomu 1:

    {
    "strictKnownMarketplaces": [
    { "source": "github", "repo": "anthropics/claude-plugins-official" },
    { "source": "github", "repo": "acme/agent-plugins" }
    ],
    "allowManagedHooksOnly": true,
    "disableSkillShellExecution": true,
    "enabledPlugins": {
    "superpowers@claude-plugins-official": true
    }
    }
    • strictKnownMarketplaces ogranicza, z których marketplace’ów użytkownicy mogą dodawać i instalować.
    • allowManagedHooksOnly uruchamia wyłącznie hooki zarządzane i hooki wtyczek wymuszonych przez zarządzane enabledPlugins; hooki użytkownika, projektu i pozostałych wtyczek są blokowane. Dlatego Superpowers jest na liście: bez tego wpisu jego hook SessionStart przestaje działać.
    • disableSkillShellExecution zastępuje każde !`command` w skillach użytkownika, projektu, wtyczek i katalogów dodatkowych tekstem [shell command execution disabled by policy].

    Na poziomie 2 dodaj "strictPluginOnlyCustomization": ["skills", "hooks"]. Claude Code przestaje wtedy ładować skille z ~/.claude/skills/, .claude/skills/, katalogów --add-dir i synchronizacji z claude.ai, a zachowuje skille z wtyczek, wbudowane i zarządzane. Zatwierdzone skille opakuj we wtyczki w zespołowym marketplace. Na poziomie 2 instalacja w zakresie projektu z kroku 5 procedury przestaje się ładować w Claude Code, i o to chodzi.

  3. Zastosuj odpowiedniki w Codeksie i Cursorze.

    Ograniczenia administracyjne trafiają do requirements.toml, nie do config.toml. Ustaw tam allow_managed_hooks_only = true, żeby ignorować konfiguracje hooków użytkownika, projektu i sesji. Ten sam plik może też ograniczać plugins i marketplaces (config_requirements.rs Codeksa, sprawdzone 2026-09-26); przed wdrożeniem sprawdź w tym schemacie dokładny kształt. Skille projektu żyją w .agents/skills/, które krok 1 już objął przeglądem code ownera.

  4. Skanuj każdą zmianę w CI. Code owner przegląda wtedy wyniki, a nie surowy tekst skilla. SkillSpector nie potrzebuje tokena i niczego nie uruchamia; z --no-llm poza runner wychodzą tylko zadeklarowane nazwy i wersje zależności, do sprawdzenia CVE w OSV.dev. Domyślnie kończy się kodem 0 przy wynikach SAFE i CAUTION, dlatego pętla przekazuje --fail-on-findings i zbiera status każdego skanu, a nie tylko ostatniego:

    Okno terminala
    set -euo pipefail
    shopt -s nullglob
    uv tool install git+https://github.com/NVIDIA/skillspector.git
    mkdir -p sarif
    fail=0
    for d in .claude/skills/*/ .agents/skills/*/; do
    skillspector scan "$d" --no-llm --fail-on-findings \
    --baseline .skillspector-baseline.yaml \
    --format sarif --output "sarif/$(echo "$d" | tr / _).sarif" || fail=1
    done
    exit $fail

    Każde aktywne znalezisko, którego nie obejmuje baseline, oblewa zadanie, a razem z nim pull request. Plik baseline’u i workflow są w bloku CODEOWNERS z kroku 1, bo pull request może zmienić oba: przy pull_request GitHub uruchamia workflow z merge refa pull requesta. Wgraj pliki z sarif/ jako artefakt zadania albo do code scanningu. --baseline wymaga istniejącego pliku, więc pomiń tę flagę, dopóki nie zacommitujesz pliku z pierwszym zaakceptowanym znaleziskiem.

    Flaga --ci w Snyk Agent Scan, która kończy się niezerowym kodem przy znaleziskach, wymaga w 0.6.8 flagi --dangerously-run-mcp-servers. Ta uruchamia każdy serwer MCP typu stdio ze skanowanych konfiguracji, więc używaj jej tylko na jednorazowym runnerze, który nie trzyma żadnych sekretów poza SNYK_TOKEN, i tylko na domyślnej gałęzi albo według harmonogramu, nigdy na pull requeście: tam konfiguracje, a więc i uruchamiane polecenia, pochodzą od autora zmiany i działałyby obok SNYK_TOKEN. Pełny wzorzec CI opisuje strona bramki bezpieczeństwa dla kodu pisanego przez agentów.

Cztery kontrole dają dowody bez ponownego czytania każdego skilla:

  • Zainstalowana kopia to ta przejrzana. diff -r z kroku 5 procedury jest pusty, a skills-lock.json zapisuje hash treści każdego skilla. Późniejsze npx skills update traktuj jak nową instalację: ta sama procedura, osobny pull request.
  • Ładuje się tylko allowlista. W świeżej sesji Claude Code /skills wypisuje każdy skill z jego źródłem. Na poziomie 2 skill wrzucony do ~/.claude/skills/ się nie pojawia. /hooks pokazuje aktywne hooki, a /status wskazuje używane źródło ustawień zarządzanych.
  • Każda zmiana miała właściciela. Ochrona gałęzi pokazuje akceptację code ownera przy każdym pull requeście, który dotknął ścieżki ze skillami, razem z dołączonym raportem skanu.
  • Flota zgadza się z polityką. Cykliczne uvx snyk-agent-scan@latest na maszynach programistów inwentaryzuje każdy skill i serwer MCP, a Dr. Skill pokazuje konflikty w całym zestawie.

Zmiany w skillach zatwierdzają code ownerzy, a plik ustawień ten, kto odpowiada za politykę zarządzaną.

Skaner oznacza wzorce; o intencji decydujesz ty. Zewnętrzne skanery oceniają niektóre z najczęściej instalowanych skilli jako „High Risk”: przykładem jest systematic-debugging od obra w tytule wyniku wyszukiwania z mondoo.com (źródło wtórne), prawdopodobnie przez dołączone fixture’y testowe (issue #2277 w obra/superpowers). Rób triaż według tego, co znalezisko znaczy w kontekście:

ZnaleziskoRaczej realne, gdyRaczej szum, gdyDziałanie
Prompt injectionTekst zwraca się do agenta i nadpisuje twoje zasadySkill jest o prompt injection i cytuje przykładyPrzeczytaj linie; odrzuć, jeśli instrukcja jest aktywna
Podejrzane pobieranie lub wywołanie siecioweSkill workflow pobiera i uruchamia kodUdokumentowany krok instalacji znanego narzędziaPrzypnij narzędzie sam, zamiast pozwalać skillowi je pobierać
Złośliwy kod lub niebezpieczne wykonanieSiedzi w skrypcie, który skill każe agentowi uruchomićSiedzi w fixturze testowym, którego skill nigdy nie wywołujeSprawdź grep, do których plików odwołuje się SKILL.md
Zaszyty sekretKażdy klucz, który wygląda na prawdziwyOczywisty placeholder w przykładzieOdrzuć, dopóki autor go nie usunie

Gdy uznasz znalezisko za szum, zapisz uzasadnienie w pull requeście i zawęź baseline do minimum. Wystarczy jedna reguła baseline’u SkillSpectora, która ustawia id i path znaleziska oraz wymagane pole reason (zob. .skillspector-baseline.example.yaml w jego repozytorium). Samo skillspector baseline <dir> akceptuje wszystkie bieżące znaleziska, także realne. --ignore-risks <name> w Snyk Agent Scan usuwa z oceny --ci całą kategorię ryzyka, więc nie używaj go do pojedynczych fałszywych alarmów. Nigdy nie wyłączaj skanu.

Zainstalowałeś podróbkę. Usuń ją przez npx skills remove <name> (-g dla zakresu użytkownika), a potem sprawdź w git status i git diff zmiany z czasu, gdy była załadowana. Przejrzyj pliki pamięci, takie jak CLAUDE.md i AGENTS.md, pod kątem tekstu, którego nie pisałeś. Zrotuj każde poświadczenie, które agent mógł odczytać w tych sesjach.

Agent wykonał ukrytą instrukcję. Zanim zaczniesz dochodzenie, odizoluj skill w całej flocie zarządzaną regułą deny Skill(skill:<name>), żeby żadna inna sesja go nie załadowała. Potem znajdź instrukcję promptem przeglądowym z tej strony i zgłoś repozytorium do marketplace’u, który je wystawił.

Hook uruchomił kod, choć każdy skan był czysty. Hooki działają poza promptem o uprawnienia. Wylistuj je przez /hooks albo claude plugin details <plugin>, wyłącz wtyczkę przez claude plugin disable <plugin> i przestaw zespół na allowManagedHooksOnly, żeby hooki uruchamiały tylko sprawdzone wtyczki.

CI oznacza skill, od którego zależy zespół. Przeczytaj znalezisko z pomocą tabeli triażu. Jeśli to szum, dodaj w tym samym pull requeście regułę baseline’u dla tego jednego znaleziska (id, path, reason); nigdy nie generuj całego baseline’u od nowa i nie sięgaj po --ignore-risks. Jeśli jest realne, przywróć ostatnią czystą kopię z historii gita, co umożliwiło --copy: git checkout <last-clean-commit> -- .claude/skills/<name> .agents/skills/<name> skills-lock.json.

Ustawienia zarządzane zdają się nie działać. Domyślnie Claude Code używa tylko najwyżej postawionego źródła zarządzanego, które dostarcza klucz polityki (ustawienia z serwera, potem MDM, potem managed-settings.json), a resztę pomija bez ostrzeżenia. Otwórz /status: wskazuje używane źródło i te pominięte. Umieść całą politykę w źródle, które wygrywa, albo ustaw managedSourcesBehavior na "merge" (v2.1.242 lub nowsze).