官方那页第一句话就把结论写完了:「一个你装上的 Claude Code plugin 可以用你的用户权限在你机器上执行任意代码。」本期给三条当天就能跑的准入命令、官方的四步审查、三层信任到底保证了什么,以及最反直觉的一条——你根本不用「装」,git clone 加一次 claude -p 就够了。
skill 与 plugin 已经是软件供应链的一段,只是没人把它当依赖管。NVIDIA 自己的扫描器在 README 里给了个刺眼的数:其研究数据集的子集里 26.1% 的 skill 存在漏洞、5.2% 疑似带恶意意图(据 NVIDIA/SkillSpector GitHub 仓库页,2026-10)。本期不停在吓人这一步:先给能跑的准入流水线,判据放后半程,用来在这几个已经点名的工具之间取舍。
# ① 先盘点机器上「已经」有什么(覆盖十几种 client 的配置位置)
uvx snyk-agent-scan@latest
# ② 对下一个候选:静态扫一遍(--no-llm = 不调模型,纯静态)
uv tool install git+https://github.com/NVIDIA/skillspector.git
skillspector scan ./candidate-skill/ --no-llm
# ③ 官方:不起会话,列出它到底往你这儿装什么
claude --plugin-dir ./that-plugin plugin details <plugin-name>
# ④ 结构体检——注意它只验结构,不验安全
claude plugin validate ./that-plugin
--no-skills 只扫 MCP,--ci 有发现就非零退出。别用的时候:你一个第三方都没装;以及别把 --dangerously-run-mcp-servers 写进脚本——那是放弃逐个同意。claude --plugin-dir … plugin details(官方,零安装)— 替你干掉「面板不告诉我它有几个 hook」:读目录而不起会话,打印 Component inventory——skills 与命令、agents、每个 hook 连它挂的事件、MCP 与 LSP server。装完之后同一条 claude plugin details <name> 看的是 ~/.claude/plugins/cache/ 里那份实装副本。claude plugin validate — 验 JSON 语法、必填字段、命名规则、相对路径里的 ..。诚实说清:它不看 hook 跑什么命令,✔ Validation passed 跟安全无关。hooks/hooks.json(每个 hook 实际执行的命令)、.mcp.json(每个 server 的命令或 URL)、bin/(目录里的每一个文件)。这三个文件没看过,前面三条命令都只是热身。bin/ 目录:被加进 Bash 工具那个 shell 的 PATH。官方把边界划得很直白:权限规则与沙箱管的是 Claude 发起的工具调用,不管 plugin 自己跑的代码——hooks 和 MCP server 由 Claude Code 跑在沙箱之外,带你完整的用户权限。只有当 Claude 用 Bash 去调 bin/ 里那个可执行文件时,那才算一次工具调用,你的权限规则才拦得到。
skills、slash 命令、agents 不执行代码,它们作为指令进入上下文,改写模型打算用已有工具干什么。而 skill 的 allowed-tools 能自己给自己授权:官方原话是工作区信任不 gate 这个字段——「一个 skill 可以给自己授予很宽的工具访问权,所以在一个仓库里跑 Claude Code 之前,先审它签入的 skill 的 allowed-tools」。skill 正文里的 ! 命令行同理:那是在内容送给模型之前在你机器上跑的。
allowed-tools:Used(claude -p 跑在从未信任过的目录里也 Used);.mcp.json 里的 server:-p 下不问你就连,批没批都一样;而 permissions.allow:Not used,要等你点信任。危险的那一半默认生效,保护你的那一半默认不生效。# 一次性最省事:什么项目侧定制都不读
claude --bare -p "审一下这个仓的结构"
# 或者按需关:只读用户设置 / 关掉全部 hook / 点名拒某个 .mcp.json server
claude --setting-sources user -p "…"
claude --settings '{"disableAllHooks": true}' -p "…"
# 常驻两条:杀掉 skill 正文里的 shell 执行;按名字拒某个 skill
{ "disableSkillShellExecution": true,
"permissions": { "deny": ["Skill(skill:deploy)"] } }
disableAllHooks 写在你的用户设置里不够——项目设置优先级更高,能把它改回 false,所以要走 --settings。deny 规则里裸写 Skill 是把整个工具从模型上下文里摘掉;Skill(skill:<name>) 这种写法则能按它的任何别名命中同一个 skill。
社区目录的 README 把它的保证写得很具体:每个条目都经 claude.ai 提交、通过自动化安全扫描、获批分发;仓库本身是只读镜像,直接提 PR 会被自动关闭,每夜从内部流水线同步。配套的硬约束在客户端:该目录给近乎每个条目钉了 commit SHA,你想装另一个 commit,Claude Code 直接拒绝。第三方那一层就没有这些——官方原话是 Anthropic 不审第三方 marketplace。
knowledge-work-plugins 与 first-party-plugins 除外),社区、第三方、本地开发 marketplace 默认关。第三方那个就让它保持关着,别手动开。/plugin marketplace add your-org/plugins#v1.2.0 把它钉在 tag 上。archive 源可以在条目里钉 sha256,下载文件摘要不符就拒装。claude plugin uninstall <plugin> --scope <你装的那个 scope> 之后,它的文件还会留在 ~/.claude/plugins/cache/ 里十四天才被后台清理,要立刻没就自己删那个目录。真正不信任的是 owner 的话,连 marketplace 一起删——那会把从它装的每个 plugin 都卸掉。
strictKnownMarketplaces(源白名单,别名 allowedMarketplaces;空数组 [] 连官方一起挡)· blockedMarketplaces(黑名单,先于白名单判)· disableSideloadFlags(拒 --plugin-dir / --plugin-url / --agents 与 CLAUDE_CODE_PLUGIN_DIRS)· strictPluginOnlyCustomization(只许 plugin、托管设置或内置来源的 skills / agents / hooks / mcp)· allowManagedHooksOnly · pluginTrustMessage(往安装前那条信任警告后面接你自己的话)。
SKILL.md 读完,把真正有用的那二十行抄进你自己的 .claude/skills/——不要它的 hooks、不要 bin/、不要它捎带的 MCP server。方法论型 skill 的价值几乎全在正文里,而正文是唯一你能一眼读完的部分。claude --plugin-dir ./that-plugin 只为这一次会话加载,不写进 enabledPlugins(注意:团队开了 disableSideloadFlags 时这条会被拒)。docx/pdf/pptx/xlsx 四件套为 source-available)与 anthropics/claude-plugins-official。读过几个正常的,你才看得出第三方那个为什么多了一个 hook。strictKnownMarketplaces: [] 会把官方 marketplace 一起挡掉;设了任何白名单却漏写 {"source": "skills-dir"},你自己放在 ~/.claude/skills/ 下带 .claude-plugin/plugin.json 的那些会停止加载(纯 SKILL.md 不受影响)。而且一台机器只要在挡掉官方的策略下启动过一次,policy 改回来也不会自动重试注册。anthropics/skills 的 README 原话是「这些 skill 仅供演示与教育用途」,并要求「在依赖它们处理关键任务之前,先在你自己的环境里充分测试」。星数不是安全属性。今天就做这三件:① uvx snyk-agent-scan@latest——先把机器上已经有的盘一遍,多数人会在这一步发现自己忘了装过什么。② 下一个第三方候选按顺序走完:skillspector scan ./x --no-llm → claude --plugin-dir ./x plugin details <name> → 手读 hooks/hooks.json、.mcp.json、bin/。③ 写两行常驻配置:"disableSkillShellExecution": true,并让第三方 marketplace 的 auto-update 保持关闭(默认就是关的)。
按需再加:claude plugin validate(你自己发 marketplace)· strictKnownMarketplaces + disableSideloadFlags(给团队定策略)· Skill(skill:<name>) deny 规则(某个 skill 留着但不许模型自己触发)· claude --bare -p(要在陌生仓里跑非交互)· trailofbits/mcp-context-protector(它捎带了 MCP server,要首次信任即固定)。
明确别做:在陌生仓里直接 claude -p · 把「通过扫描」当成「安全」 · 以为 star 多就安全 · 给第三方 marketplace 开 auto-update · 把 --dangerously-run-mcp-servers 写进脚本 · 只卸 plugin 不删 marketplace · 读了 Will install 面板就以为读过 hook · 把 disableAllHooks 只写在用户设置里。
permissions.allow 这类「给仓库更多权」的东西,不 gate hooks 与 skill 的 allowed-tools。claude plugin details 打印的清单:skills 与命令、agents、hooks(含每个 hook 的事件)、MCP 与 LSP server。装之前用 --plugin-dir 就能看。github.com/anthropics/ 下的,Claude Code 拒绝加载,所以第三方无法冒名。#ref 或 sha256。~/.claude/skills/ 或项目 .claude/skills/ 下、带 .claude-plugin/plugin.json 的那种。设了 marketplace 白名单就得补一条 {"source": "skills-dir"},否则它们停止加载。bin/ 里的命中跟正文里的措辞完全不同量级)、它声称的功能需不需要这个能力、以及不装它你损失什么。第三个问题通常最有决定性:绝大多数时候答案是「损失二十行提示词」,那就根本不用纠结 70 分该怎么读。--plugin-dir … plugin details;信任警告原文;卸载后 cache 留 14 天(2026-10)allowed-tools 在 -p 下仍生效、.mcp.json 不问就连、permissions.allow 反而不生效);--bare / --setting-sources user / disableAllHooks / disabledMcpjsonServers;Skill(skill:<name>) deny 规则(2026-10)allowed-tools」与「一个 skill 可以给自己授予很宽的工具访问权」原话;skill 正文里 ! 命令的执行时机与 disableSkillShellExecution(2026-10)strictKnownMarketplaces / blockedMarketplaces / disableSideloadFlags / strictPluginOnlyCustomization / allowManagedHooksOnly / pluginTrustMessage 各自管什么、管不到什么;[] 连官方一起挡与 skills-dir 那条坑(2026-10)#ref 钉版本;command 源安装前要你确认(2026-10)scan 用法;71 个模式 / 17 类与 0–100 风险分;SARIF 输出与 --no-llm;数据集子集 26.1% / 5.2% 那两个数;自列的五条边界(Apache-2.0,据其仓库页 2026-10)uvx snyk-agent-scan@latest;发现 harness / MCP server / skill 的覆盖清单与十几种 client;十四类风险;--no-skills / --ci / --dangerously-run-mcp-servers(Apache-2.0,据其仓库页 2026-10).claude-plugin/marketplace.json 就是目录本身(2026-10)