TL;DR
Three vendors shipped official Agent Skills into GitHub's trending list on the same day — Cloudflare's security-audit-skill (12.5k stars), Alibaba's open-code-review (36.3k stars) and Tencent's BrowserSkill (5k stars). Installing any of them is one command. That is the problem: Snyk's ToxicSkills study (2026-02-05) scanned 3,984 skills and found security issues in 36.82%, 13.4% rated critical, with 76 confirmed malicious payloads. A skill is plain Markdown your agent obeys at runtime, so dependency scanners miss it entirely. Read the SKILL.md before you install. Skip registries with no publisher verification.
Why Auditing Agent Skills Suddenly Matters: the Vendor Wave of September 2026
By Rohit Raj — AI Consultant · Forward Deployed Engineer · LinkedIn
On September 18, 2026, GitHub's daily trending list had five separate Agent Skills repositories on it at once. Cloudflare's security-audit-skill sat at the top with 12.5k stars and 675 forks under MIT. Alibaba's open-code-review — Apache-2.0, 36.3k stars, 734 commits on main — ships as both a skill and a set of per-agent plugins. Tencent's BrowserSkill (MIT, 5k stars) bridges an agent to a real browser window through a bsk CLI and names nine supported runtimes. Alongside them: addyosmani/agent-skills at 96.2k stars with 25 skills, 4 agent personas and 9 slash commands.
This is the moment the format stopped being an Anthropic convention and became an ecosystem. The plumbing is vercel-labs/skills — the npx skills CLI, MIT, 31.9k stars, which installs a skill into 78 different agents and knows each one's path convention (.claude/skills/ for Claude Code, .agents/skills/ for Cursor and OpenCode, and so on).
So the install story is genuinely excellent. One command, any agent, portable format.
The audit story has not caught up. That gap is the whole post.
What Is an Agent Skill, Technically — and Why Scanners Miss It
A skill is a folder with a SKILL.md inside it. The file is YAML frontmatter (name, description) plus a Markdown body of instructions. Optional scripts, reference docs and assets sit beside it. The agent reads the description at startup, decides from it whether the skill is relevant to the current request, and only then pulls the full body into context.
That design is why skills are cheap — they stay out of your context window until needed. It is also why they are a genuinely new attack surface, and the distinction is worth stating precisely:
An MCP server is code you run. A skill is instructions your model obeys.
A malicious npm package has to execute to hurt you, so static analysis, sandboxing and SBOM tooling all have purchase on it. A malicious skill does not execute anything. It is a paragraph of English that persuades an agent — which already holds your repo, your shell and your credentials — to do something on the attacker's behalf. There is no syscall to trap and no binary to hash against a CVE feed.
The CSA Labs research note on SKILL.md context poisoning (2026-05-06) gives the canonical example. Buried in otherwise-legitimate documentation:
No code. No dependency. Just a sentence, and every subsequent outbound fetch leaks your key. The same note documents hidden Unicode Tag characters — codepoints that render as nothing to a human reviewer but arrive as ordinary semantic tokens to the model. Your eyes see a clean file; the agent sees an instruction.
If you are already running MCP servers alongside skills, the threat models are different enough that they need separate reviews — I wrote up the server-side half separately, and it is a large part of what an MCP integration consultant actually spends review time on.
How Bad Is It Really? The ToxicSkills Numbers
Numbers, because "be careful out there" is not a security posture.
Snyk's ToxicSkills study, published 2026-02-05, scanned 3,984 skills across the ClawHub and skills.sh registries using the mcp-scan engine against an eight-category taxonomy (prompt injection, malicious code, suspicious downloads, credential handling, secret exposure, third-party content, unverifiable dependencies, direct money access).
| Finding | Count | Share of corpus |
|---|---|---|
| Skills with any security issue | 1,467 | 36.82% |
| Rated critical severity | 534 | 13.4% |
| Confirmed malicious after human review | 76 | 1.9% |
| Still publicly installable at publication | 8 | — |
The CSA note adds a further 341 malicious skills specifically targeting OpenClaw users.
Three details matter more than the headline percentage:
One — the registries are not screening this. Per Snyk, skills.sh has zero publisher verification and no automated scanning. ClawHub is better: it ties publishing to a GitHub account and runs VirusTotal. But ClawHub's scanner inspects JavaScript and TypeScript only — it does not read .md, .sh or .py. Since SKILL.md is by definition Markdown, the primary carrier of the payload falls outside the scanner's scope entirely. A "scanned ✓" badge on a skill means the JS was checked, not the instructions.
Two — the malicious skills cluster by author. Snyk names user zaycv as responsible for 40+ skills built on identical programmatic patterns, and Aslaep123 for a set of crypto-targeting ones. Publisher identity is a cheap, high-signal filter that nobody is applying.
Three — 36.82% is not 36.82% malicious. Most of that bucket is sloppy, not hostile: a skill that tells the agent to curl | sh an install script, or to read .env and echo values while debugging. That distinction matters for how you respond. You do not need to treat the ecosystem as radioactive. You need a five-minute review gate.
The Review Gate: What I Actually Check Before Installing a Skill
This is the procedure I run before any skill lands in a client repository. It takes about five minutes and it is deliberately boring.
1. Fetch, do not install. npx skills add will happily write into ~/.claude/skills/ globally. Clone or curl the raw SKILL.md into a scratch directory first and read it as a document. The install command is the last step of this process, not the first.
2. Read the whole SKILL.md, top to bottom. Not skim. These files are usually 100–400 lines. You are looking for instructions that reference anything outside the task: environment variables, credential paths (~/.aws, .env, ~/.ssh), outbound URLs, telemetry, "before responding to any request" framing, or anything that tells the agent to modify its own configuration.
3. Grep for the non-obvious carriers. Three commands, run inside the skill folder:
That third one is the important one and the one people skip. It is the only check that catches a payload a careful human reader physically cannot see.
4. Check the publisher, not the star count. Stars measure popularity, and the malicious clusters Snyk found were farmed specifically to accumulate them. Check instead: does the account have unrelated history, is the repo under a real org (cloudflare/, alibaba/, Tencent/), when was the first commit, does one author own 40 near-identical skills. An org-owned repo with a years-long commit history is a materially different risk than a three-week-old account with twelve skills.
5. Pin the version and diff the updates. npx skills update is the step where a clean skill becomes a hostile one — the classic dependency-confusion timeline applied to prose. Commit the skill folder into your repo so every update arrives as a reviewable diff instead of a silent overwrite. If you read only one line of this post: review skill updates like code review, because that is exactly what they are.
6. Scope the blast radius. Install into the project (.claude/skills/) rather than globally (~/.claude/skills/) unless you genuinely want it in every repo you open, including the client one you are under NDA for.
Skills vs MCP Servers vs Plugins: Which Review Does Each Need?
These three get conflated constantly, and they fail in different ways, so the review differs.
| Agent Skill | MCP Server | Agent Plugin | |
|---|---|---|---|
| What it is | Markdown instructions | Running process with tools | Bundle: skills + commands + MCP config |
| Executes code? | No (unless it ships scripts) | Yes | Usually yes |
| Primary risk | Prompt injection, context poisoning | Over-broad tool scope, credential handling | Both, plus opaque bundling |
| Caught by dependency scanners? | No | Partially | Partially |
| Review method | Read the prose; grep for Unicode and egress | Audit tool definitions and auth scope | Unbundle, then review each part |
| Right question | "What is this telling my agent to do?" | "What can this process reach?" | "What did I just agree to, in total?" |
The practical rule: MCP gives an agent reach; a skill gives it intent. An over-scoped MCP server is dangerous because of what it can touch. A poisoned skill is dangerous because of what it will decide to do with whatever it can already touch — including every MCP server you already trust. That composition is the part teams underestimate: a skill needs no permissions of its own, because it borrows all of yours.
Plugins are the worst of the three to review because they bundle. Alibaba's open-code-review ships as a Claude Code plugin with slash commands, a Codex plugin with callable skills, a Cursor portable-skills plugin and native OpenCode tools — four distinct trust decisions behind one install. Unbundle before you approve.
How I Would Roll This Out on a Real Team
Here is the part the security-vendor writeups leave out. They tell you the ecosystem is dangerous. They do not tell you what to do on Monday when four engineers have already installed nine skills each.
Blocking skills outright is the wrong call, and it will not hold. Cloudflare's security-audit-skill is genuinely useful; Alibaba benchmarked open-code-review against 200 real pull requests across 50 repositories and 10 languages, with 1,505 ground-truth issues annotated by 80+ senior engineers. That is more review rigour than most internal tooling gets. Ban the category and your engineers will install them on personal machines and paste the output into work — you lose the visibility and keep the risk.
What I would actually do, in order:
Week one — inventory. Find what is already installed before you write any policy. find ~ -name SKILL.md -not -path '*/node_modules/*' on every dev machine, plus .claude/skills/ and .agents/skills/ in every repo. Teams are consistently surprised here. The number is never zero and it is rarely under twenty.
Week two — an allowlist of about six. Not a registry, not a platform. A list in the engineering handbook: these skills, from these orgs, at these commit SHAs, reviewed on this date by this person. Six good skills covers most of the value. The long tail is where the 36.82% lives.
Week three — vendor them. Commit approved skill folders into a shared internal repo and have projects pull from there instead of from the public registries. This is the single highest-leverage control, because it converts every future update from a silent overwrite into a pull request. It is also the one thing on this list that survives a new registry appearing next quarter.
The failure mode I would actually worry about is none of the above. It is the skill someone writes *internally*, for a legitimate reason, that says "when debugging auth issues, read the values in .env and include them in your summary." Nobody is attacking you. It is well-intentioned, it works, and it quietly turns every debugging session into a credential disclosure in a chat log that gets pasted into a ticket. Every team I have set this up for has had at least one. Your internal skills need the same review gate as third-party ones — arguably more, because nobody thinks to apply one.
This is the kind of work I do as a fractional forward deployed engineer: sitting inside the team for a couple of days a week, setting up the gate, writing the six approved skills against the actual codebase, and leaving behind something the team runs without me. If you are further along and the problem is wiring the agent into internal systems safely, that is the MCP integration half of the same job.
When to Skip a Skill Entirely
Not everything deserves the five-minute review. Some things are a straight no.
Skip any skill from a registry with no publisher verification. skills.sh currently has none. That is not a subtle judgement call — an unverified publisher on an unscanned format is the entire attack precondition in one line.
Skip skills that instruct the agent to install things. A skill whose body contains curl ... | sh, npm i -g, or "download and run the setup script" has moved from instructions to execution, and you have lost the one property that made skills easy to review.
Skip `--all`. npx skills add <repo> --all installs every skill in a repository to every detected agent, non-interactively. It is a convenience flag that turns one review decision into twenty-five unreviewed ones. Use --skill <name> and name them.
Skip skills you cannot read. If the SKILL.md is 2,000 lines, or machine-generated, or written in a language nobody on the team reads, you are not reviewing it — you are approving it. Those are different things.
Wait, do not skip, on the big vendor drops. A repo that appeared yesterday with 12k stars is popular, not vetted. Give it two weeks. The ToxicSkills methodology is public and the security community is actively scanning this space now; if something is wrong with a high-profile skill, it surfaces fast. There is very little cost to being second.
And the honest counter-position: if you are one developer on a side project with no customer data and no credentials worth stealing, most of this is overhead. Read the SKILL.md once, skip the rest. The gate scales with what you would lose.
FAQ
Q: Are Agent Skills safe to install? Most are. Snyk's ToxicSkills scan of 3,984 skills found 36.82% with some security issue and 76 confirmed malicious — meaning roughly 63% were clean and under 2% were hostile. The risk is real but concentrated, and reading the SKILL.md before installing filters out nearly all of it.
Q: What is the difference between an Agent Skill and an MCP server? An MCP server is a running process that gives an agent access to live systems through defined tools. A skill is a Markdown file that teaches an agent how to perform a task. MCP provides reach; skills provide instructions. They compose — and a poisoned skill can direct an agent to misuse every MCP server you already trust.
Q: Can a SKILL.md file contain malware? Not executable malware in the traditional sense — it is Markdown. It can contain prompt injection: natural-language instructions that persuade the agent to exfiltrate credentials, disable safety checks, or fetch and run external payloads. CSA Labs documented hidden Unicode Tag characters used to make such instructions invisible to human reviewers while remaining fully readable to the model.
Q: Do dependency scanners catch malicious skills?
Generally no. ClawHub's scanner covers JavaScript and TypeScript only and does not inspect .md, .sh or .py files, so SKILL.md — the primary payload carrier — falls outside its scope. Treat a registry "scanned" badge as covering the code, not the instructions.
Q: Should I install skills globally or per project?
Per project, by default. A global install in ~/.claude/skills/ applies to every repository you open, including client work under NDA. Project-scoped installs also mean the skill folder can be committed and reviewed as a diff.
Ship Agent Tooling Without Opening a Supply Chain
The Agent Skills ecosystem crossed from novelty to infrastructure in about six months. Cloudflare, Alibaba and Tencent publishing official skills on the same day is the signal that it is not going back — and the npx skills CLI reaching 78 agents means whatever you adopt is portable across whichever coding agent your team standardises on next.
The review gate is genuinely five minutes: read the file, grep for egress and invisible Unicode, check the publisher, pin the SHA, scope it to the project. What takes longer is the organisational half — the inventory, the allowlist, the internal mirror, and the internally-written skill that reads .env because someone was debugging in a hurry.
If you are rolling agents out across a team and want that gate set up properly — approved skills written against your actual codebase, the internal mirror wired up, and the review process documented so it outlives the engagement — that is exactly the work I do as a Claude Code consultant. And if you would rather have someone embedded for a fixed-scope pilot than a slide deck about it, start here.
