本地 Skill 安全体检

SKILL运维和基础设施
运维和基础设施 未标注权限 许可证不明确
安装这个技能

本地已安装 AI Agent Skill 的全盘安全体检与清理决策。扫描本机 skills/experts 目录(WorkBuddy、Claude、Codex、OpenClaw 均可),按 Snyk ToxicSkills 攻击族做静态初筛,再用「上下文语义 + 来源信任边界」两道过滤压掉教学误报,最后逐条给出「留 / 拆 / 删 / 先别装」的明确处置建议;本地扫描完全免费。需要深度溯源报告时可走支付宝 AI 按量付费(HTTP 402),单次 ¥3.00,由买家侧 alipay-bot 付款、服务端验付履约。触发词:扫一下我装了哪些技能、本地 skill 体检、技能清单盘点、清理无用 skill、安装前先看看有没有毒、experts 盘点。

一句话选型结论

按资料字段整理

本地 Skill 安全体检是运维和基础设施类的 Agent Skill,安装方式未标注,权限级别未标注,许可证不明确,有可直接复制的安装命令。技能本质是给模型读的说明书,效果取决于模型与客户端;装完先用一个小任务验证,再放进正式流程。

分类运维和基础设施 安装方式未标注 权限级别未标注权限 许可证许可证不明确
累计安装 未标注 本周 未标注
GitHub 星标 未标注 仓库 未标注
下载量 未标注 技能市场下载数
权限级别 未标注权限 安装前请确认风险范围
许可证 许可证不明确 未说明

安装

未标注
在支持 Skills 的客户端里执行,装完问一句「你有哪些技能」验证
skillhub install user_e81bda48/skill-local-triage
  1. 1
    确认客户端支持

    确认你的客户端支持 Skills(Claude、Codex、Cursor 等),并升级到较新的版本。

  2. 2
    拿到技能文件

    执行上面的命令安装;也可以把仓库里的 SKILL.md 手动放进客户端的 skills 目录。

  3. 3
    刷新技能列表

    重新打开客户端,或刷新技能列表,让新放进来的技能被加载。

  4. 4
    验证是否生效

    问一句「你有哪些技能」,确认列表里出现它,再拿一个小任务试跑。

技能档案

运维和基础设施
字段来自技能仓库与公开索引,中文说明由本站标注
作者 / 维护方user_e81bda48仓库 未标注 · 版本 未标注
宿主客户端未标注技能可被这些客户端加载
安装方式未标注安装包 community
权限级别未标注权限安装前请确认风险范围
许可证未说明许可证不明确,商用前请自行确认条款
仓库可用性available技能仓库当前是否可访问
最近核验未标注上游最后核验时间 · 数据更新 1791672186
正文体量17.8 KBSKILL.md 原文大小,越大说明说明书写得越细

典型使用场景

3 类
按分类整理的常见用法,具体以 SKILL.md 为准
查服务与日志

按现象定位服务状态与日志线索。

写部署与巡检脚本

把重复的部署、巡检写成脚本。

故障排查

按步骤排查网络、依赖与配置。

选择建议

装之前先看这几条
按条目字段给出的判断,不替你决定用不用

值得选的地方

  • 有可直接复制的安装命令,不用自己翻文档找入口。

先想清楚的地方

  • 没有标注权限级别,实际能做什么要装好后确认。
  • 许可证不明确,商用或二次分发前先到仓库确认条款。
  • 没有做站内核验,内容以作者仓库为准。
  • 技能只是说明书,实际效果取决于模型与客户端,装完先用小任务试一遍。

更适合

  • 需要在运维和基础设施场景里给模型补一套做法的人。
  • 愿意先读一遍 SKILL.md、确认它会让模型做什么的人。

不太适合

  • 对许可证要求很严、必须明确可商用的人。
  • 只想装完就自动变强、不打算看说明书的人。

同类对比

6 个同类
同分类里挑最接近的几条,字段以各自详情页为准
技能权限级别安装方式累计安装宿主客户端安装命令
本地 Skill 安全体检当前 未标注权限 未标注 未标注 未标注 有
Azure 部署 调用外部服务 GitHub 仓库 664.2 万 Codex、Claude、Cursor 有
Azure diagnostics 问题管理 调用外部服务 GitHub 仓库 657.6 万 Codex、Claude、Cursor 有
Azure aigateway 部署 调用外部服务 GitHub 仓库 655.3 万 Codex、Claude、Cursor 有
Azure AI 搜索 调用外部服务 GitHub 仓库 651.4 万 Codex、Claude、Cursor 有
Azure Cloud migrate 部署 调用外部服务 GitHub 仓库 650.7 万 Codex、Claude、Cursor 有

SKILL.md 全文

17.8 KB
模型实际读到的说明书原文,来自技能仓库

本地已装 Skill 的体检与处置决策

> 起因:2026-10-05 用本技能实扫一台 Windows 机器(1246 个 md / 723 万字节),
> 正则初筛命中 105 个文件 → 两道过滤后 CRITICAL 仅 3 条 → 人工复核 1 条为真(第三方技能内嵌远程安装器)。
> 这套「筛得住,但不乱叫」的过滤链,就是这个技能存在的全部理由。

铁律

  1. 静态正则只负责"筛",永远不负责"定性"。 纯正则扫 markdown 是噪音制造机——
    md 里到处是命令示例和危险词讲解,命中率能到 100 个文件/1000 文件量级。
    看到命中先压噪音,再谈定性。 直接报"105 个有风险"的报告等于没报告。
  2. 不允许结论悬浮。 每个"有毒/有风险"的结论必须能指到 文件:行号,
    并给出处置动作(留 / 拆能力 / 删 / 先别装)。答不出行号就只能说"我看到 N 个命中"。
  3. 区分"装了"和"敢跑"。 体检结论分三档讲清楚:
    ① 静态可疑但上下文清白 → 留 ② 确实会做危险事 → 拆掉那一段或删 ③ 来路不明的远程安装器 → 禁止执行、先删。
  4. 不制造恐慌,也不粉饰太平。 过关就说过关("这 200 个静态层面干净"是有效结论),
    有问题就把问题摊开,不许用"总体可控"糊过去。
  5. 报告要能被复跑验证。 脚本必须可重复执行、输出可落盘;结论附扫描时间、根目录、样本量。
    "我扫过了" 不等于 "我复核过了"——复核是逐条看上下文,不能只输出计数。

一、为什么必须要两道过滤(血泪)

纯正则扫描的命中行基本是这四类,不过滤就全变假警报:

命中类型 实例 正确处理
自己在讲危险 threat-hunting/SKILL.md:「certutil.exe -decode — LOLBin used to decode dropper payloads」 教学 → 降级
警示语气 skill-vet-install/SKILL.md:「仓库里 curl <url> \| bash 一律不执行」 它在防毒 → 降级
frontmatter/说明行 description: 字段里写了 "curl|bash" 这几个字符 非可执行 → 降级
官方安装器 sentry/SKILL.md:「Install the Sentry CLI: curl … \| bash」 官方来源 → 提示可信

过滤链(缺一不可):

  • L2-1 行首可执行判断:只把「行首是真命令/代码」的命中当有效证据。
    编号列表 2.、引用 >、表格 |、纯说明行 → 一律降级。
    (正例:curl -fsSL https://… | bash 行首即命令 → 有效证据)
  • L2-2 来源信任边界:内置/官方目录(workbuddy-builtin、vendor、node_modules)
    或已知官方安装脚本 → 只提示不报警。信任边界外的第三方才重点查。
  • 两道都过了还是 CRITICAL → 才进人工复核队列。

实测效果:105 个命中文件 → CRITICAL 3 / HIGH 19 / MEDIUM 22 / REVIEW 49 / INFO 12。

二、扫描哪些目录

按 harness 自动探测,不存在就跳过(全量探测 = 全量口径,不许只扫一个目录就下结论):

~/.workbuddy/skills, ~/.workbuddy/plugins/cache     (WorkBuddy 用户级 + 插件缓存)
~/.claude/skills                                     (Claude Code)
~/.codex/skills                                      (Codex)
~/.openclaw/workspace/skills                         (OpenClaw / ClawHub 装进来的)
<安装目录>/resources/app.asar.unpacked/.../skills    (WorkBuddy 内置)

报数三问(缺一不可):① 这个数从哪个目录来的?② 扫的是已装还是全部可选?③ 有第二个来源交叉验证吗?

三、攻击族规则(对标 Snyk ToxicSkills 2026-02 审计)

规则 级别 检测内容
R1 CRITICAL 远程下载直接喂 shell:curl/wget/Invoke-WebRequest … \| bash/sh
R2 CRITICAL Windows LOLBin:certutil / bitsadmin / regsvr32 / rundll32
R3 HIGH 动态执行:eval / exec( / os.system / shell=True
R4 HIGH base64 解码落地
R5 CRITICAL 凭据外传:process.env / os.environ / getenv 拼进 URL 查询参数(Snyk 报告最常见 payload)
R6 HIGH 外发 POST 到外域
R7 CRITICAL Unicode Tag 字符隐藏指令 U+E0000–U+E007F(Anthropic 到 2026-02-10 才在 Claude Code 修)
R8 HIGH 零宽/不可见字符 U+200B–U+200F / U+FEFF
R9 MEDIUM 持久化写点:.bashrc / AppData\Roaming / crontab / launchctl
R10 MEDIUM 批量删除:rm -rf / Remove-Item -Recurse / shutil.rmtree
R11 HIGH 疑似硬编码凭据:api_key=<20+ 位字符

R5 是最容易漏的一族:它伪装成正常 HTTP 调用,把 token 当 query 参数拼出去。
正则要同时抓「环境变量取值」和「拼进 URL 参数」这两段,中间允许隔 60 个字符。

四、跑法

# 自动探测本机所有 harness 目录
python scripts/scan_local.py --json result.json

# 显式指定(排查某一个来源时用)
python scripts/scan_local.py --dir ~/.workbuddy/skills --dir ~/.openclaw/workspace/skills

Windows 坑(必读):脚本里含 certutil/rundll32 等 LOLBin 名时,别用 bash heredoc 内联跑,
整条命令会被安全策略拦下
。一律写成 .py 文件再执行。
另外 .md 文件可能带 UTF-8 BOM(U+FEFF),扫 R8 会命中——
BOM 头不是攻击,看到 U+FEFF 打头的第一行先排除再说。

五、外链域名统计(比规则更会用)

单个技能文件里同一个域名出现几百次 = 它的真实依赖;只出现 1–2 次 = 文档里的示例链接。
统计外链出现次数,能直接抓出"包装成正常技能的后端外传通道"。
实测里 astral.sh 出现在内置 docx 安装脚本里是因为它真的装 uv——统计要给域名配上下文,不能只看次数。

六、报告模板(照着填,不许自己发挥)

【体检范围】扫描时间 / 根目录清单 / 扫描文件数 / 总字节
【初筛结果】命中文件数、各级别计数(并说明压掉多少教学误报)
【逐条处置】
  - CRITICAL 1: &lt;文件:行号&gt;
      命中:&lt;规则号&gt; &lt;原文&gt;
      判定:&lt;是什么 / 为什么 / 依据&gt;
      处置:留 / 拆 / 删 / 先别装  ← 必须写字面动作
  - REVIEW N 个:仅列数,说明&quot;教学/文档命中,已排除&quot;,不逐条展开
【结论】静态层面 N 个文件干净,M 个需要动作,0 个确认有毒
【复跑命令】原命令 + 落盘路径

七、已知坑

  1. 误报会毁掉整份报告的可信度(比漏报更致命)。安全类技能自己就在讲危险,
    一报"有毒"用户立刻不信。见第一节的四类命中。
  2. U+FEFF BOM 不是攻击,是 Excel/Windows 生成文件的默认头,seen on schema_principle.md。
    实测:plugins/cache/.../excel-generation/references/schema_principle.md 第一行就是 BOM + 标题,虚惊一场。
  3. R3 的 eval 要区分"语言级执行"和"CLI 子命令":
    playwright-cli eval &quot;document.title&quot; / pwcli eval &quot;el =&gt; …&quot; 是浏览器调试工具的参数,
    不是 python eval() / node eval() 那种动态执行。看到 eval 先看前面有没有 CLI 前缀。
  4. 同名多副本:plugins/cache/ 里同一插件不同版本并存(如 tencent-docx 两套版本目录),
    命中会重复计数,报告里要合并说明,别让用户以为机器上有两个毒。
  5. 扫不到 ≠ 安全:本技能只做静态文本分析,跑起来才执行的动态 payload 抓不到。
    结论必须写"静态层面",不许说"完全安全"。
  6. .staging-* 临时目录:plugins/cache 里可能有 .staging-&lt;随机&gt; 残留,
    扫到先确认是不是正在安装的临时产物,别当成品报。
  7. 专家(agent)包跟 skill 是两套东西:专家是 agents/*.md,一般不含可执行脚本,
    扫专家时命中率天然更低,别拿同一个阈值要求两边。
  8. ★ 自检必须免疫自己(2026-10-05 实测,第一版最大的洞):
    本脚本自己的正则定义行会被自己的规则命中——r&quot;(process\.env|os\.environ…&quot; 命中 R5、
    r&quot;|curl|wget|…&quot; 命中 R1、Unicode 区间字符串命中 R7/R8。跑起来就是 CRITICAL 4 条全指向自己,
    整份报告自毁可信度。
    两条修复:① scan_tree 里 if abspath(dirpath) == dirname(dirname(__file__)) 时 dirnames[:] = []
    ——只免疫本技能所在目录,别处出现同名目录照样扫(不能用粗暴的文件名过滤);
    ② 必须从安装位置运行(~/.workbuddy/skills/skill-local-triage/scripts/scan_local.py),
    否则扫的是另一份副本、自检逻辑不生效。
    实测收敛:CRITICAL 4 → 0,剩 HIGH 10(全是文档/教学/CLI 参数误报)。
  9. ★ 发布 skillhub publish 有硬性 frontmatter 三件套(2026-10-05 逐个报错试出来的):
    slug / version / displayName 缺一个就直接卡死在预检,报错只有一行「SKILL.md 缺少 X」,
    不会告诉你该填什么。WorkBuddy 原生的 name + description 不够。
    最小可用 frontmatter 是这四行齐的:
    ```

name: skill-local-triage
slug: skill-local-triage
displayName: 本地 Skill 安全体检
version: 1.1.0
description: …(写触发词,平台靠它匹配)


`` 发布前先本地预检(**不发 HTTP**):skillhub publish --dry-run <目录>→ 出✓ Dry-run passed: slug@version才说明打包合法;没 token 也能先跑这一步把打包问题全清掉。 9. ★ **.md里的命中必须降一档**:skill 本质是**提示词**,md 里的curl | bash是&quot;示意要人去跑的命令&quot;, 不是&quot;文件自己会执行的代码&quot;。给.md一律降一档(CRITICAL→HIGH、HIGH→MEDIUM), 只有.py/.sh/.ps1/.js/.ts` 且行首是真命令才算有效证据。不降档的话,
每一份讲安全的技能都会被自己的规则打爆(自指 + 教学双误报叠加)。

八、上架后的验真:别信"我发上去了",要拿平台签名

技能挂到商店以后,"发布成功"和"装上去是真东西"是两回事。SkillHub 提供平台级签名,
任何人都能独立验证某个包没被投毒替换——这是把"我帮你扫过"升级成"你随时可自证"的关键一环。

# 1) 从平台拉真包(★ 必须带 &amp;version= ,否则 404 Version not found)
skillhub install &lt;slug&gt; --namespace &lt;handle&gt;
curl -sL -o pkg.zip \
  &quot;https://api.skillhub.cn/api/v1/download?slug=&lt;slug&gt;&amp;namespace=&lt;handle&gt;&amp;version=&lt;ver&gt;&quot;

# 2) 拿平台签名对包(★ 用 --zip,verify 不支持 --dir)
skillhub verify &lt;slug&gt; --version &lt;ver&gt; --zip ./pkg.zip --json

返回里必须认这三个字段,缺一个就不算验过:

字段 Meaning 要什么值
content_hash_match 包内容与平台签名 records 是否一致 必须 true
publisher_user_name 发布者 handle 必须是你自己
publisher_real_name_verified 发布者实名状态 true 才说明带实名徽章

实测样本(2026-10-05 本机跑出):
{&quot;ok&quot;:true,&quot;slug&quot;:&quot;skill-local-triage&quot;,&quot;version&quot;:&quot;1.1.0&quot;,&quot;verify_mode&quot;:&quot;remote&quot;, &quot;issuer&quot;:&quot;skillhub.cn&quot;,&quot;publisher_user_name&quot;:&quot;user_e81bda48&quot;, &quot;publisher_real_name_verified&quot;:true,&quot;content_hash_match&quot;:true, &quot;content_hash&quot;:&quot;668ace4ef230017745d30862d1cd1d807cdce683b400d8d61a24f47d644e4da4&quot;}

三个必踩的坑(都实踩过):
1. 重发必须升版本号:平台对已存在的版本返回 slug 冲突: 版本 X 已存在,请使用新的版本号发布,不覆盖。要迭代就 1.1.1 / 2.0.0。
2. 下载不带 &amp;version= 只回 404:那是分发接口的正常行为,别读成"没上架"。带上才 302 到对象存储(curl 还得 -L,否则只拿到 121 字节的 &lt;a href=&quot;...&quot;&gt;Found&lt;/a&gt;)。
3. 公开搜索查不到 ≠ 没上架:search &lt;slug&gt; 和 ?slug=&amp;namespace= 在索引刷新前都查不到。以 skillId + 下载链接 + verify 结果 为准。

> 给用户的完整口径:上架只是发布,验真才是交付证据。
> 任何"我帮你上架了"的结论,都要配一条 content_hash_match:true 才站得住。


九、支付宝「AI 按量付费」支付改造(平台 precheck 逐项检测)

本 Skill 已完成支付宝按量付费改造,运行时调用独立的 HTTPS 402 服务端(服务端地址由环境变量 PAY_SERVICE_URL 注入),不在本地裸调支付接口。下表五项是平台发布前的硬检查项,本 Skill 全部具备:

改造要素 本 Skill 的实现方式
402 账单下发 未付款请求返回 HTTP 402 + 响应头 Payment-Needed: base64url(bill);bill 含 amount / currency / goods_name / out_trade_no / pay_before / resource_id / seller_id / service_id 八字段,按字段名排序用 &amp; 拼接后做 RSA2(SHA256) 签名(拼串不含 sign_type)
携带凭证重试 买家在 pay_before 前完成付款,携带 Payment-Proof 头重发原请求
验付调用 服务端持凭证调用支付宝 agent.payment.verify(POST {PAY_SERVICE_URL}/verify)校验有效性
履约确认 验付通过后调用 fulfillment.confirm 完成交付,返回请求结果
订单持久化与幂等 订单写入 SQLite(主键 out_trade_no);同单号重复请求只出一次账、不重复扣费

Buyer 侧 probe 调用序列:
1. 请求受保护资源 → 402 + Payment-Needed
2. alipay-bot 完成付款 → 取得 Payment-Proof
3. 携带 Payment-Proof 重发 → 200 + 结果
4. 超过 pay_before 未付款 → 账单作废,重新出账

别抄的替身写法:只在 SKILL.md 里写一个价格数字、但不发 402、不验付、不落订单 —— 平台会直接判 compliance:&quot;fail&quot;,实测返回:

{&quot;compliance&quot;:&quot;fail&quot;,&quot;score&quot;:0,&quot;detected_features&quot;:[],
 &quot;missing_features&quot;:[&quot;402账单下发&quot;,&quot;携带凭证重试&quot;,&quot;验付调用&quot;,&quot;履约确认&quot;,&quot;订单持久化与幂等&quot;],
 &quot;keyword_hits&quot;:{&quot;skill.md&quot;:[]},
 &quot;reason&quot;:&quot;skill.md 中未检测到任何支付宝 AI 按量付费迹象(既无 402 / Payment-Needed / Payment-Proof,
          也无 probe / pay / complete / ack 或支付依赖包),判断为未进行付费改造&quot;}

> 一条实测经验:precheck 扫的是上传文件里的文本关键字 + 依赖包,不是你脑子里想的逻辑。
> 想让 precheck 转 pass,SKILL.md 必须把这些要素逐字写出来,且要连同 402 服务端一起打包上传。

十、买家侧客户端:scripts/triage_client.py(本版新增,可直接跑)

本地静态扫描永远免费、不联网。只有需要深度溯源报告(逐条给出来源、签名、上架渠道、留/拆/删决策)
时才调用远端的按量付费网关。客户端零凭证、纯标准库 urllib,三条路径:

# 1) 取深度溯源报告:未付款会拿到 HTTP 402 + Payment-Needed 账单
python scripts/triage_client.py deep

# 2) 同一条命令输出完整账单 JSON(便于自行解析 / 给上游 Agent 传参)
python scripts/triage_client.py deep --json

# 3) 已付款后携带凭证重发(deadbeef 是错误的 Payment-Proof,网关会拒绝并把原因打回来)
python scripts/triage_client.py deep --proof deadbeef

第 3 条实测回显(证明网关真在验付、不是摆设):

{&quot;error&quot;:&quot;bad_payment_proof&quot;,&quot;reason&quot;:&quot;无法解析 Payment-Proof&quot;}

线上生产网关(脚本内置默认值,不用手填):

https://triage-pay.app.workbuddy.host/api/v1/triage/report

> 单次 ¥3.00,账单金额以服务端下发为准,与 SkillHub 展示价、支付宝登记价三处一致。
> 该端点账单品名是「本地 Agent 资产体检·深度报告」,对不上就别付款。

账单结构实测坑(第一版客户端踩过):Payment-Needed 解出来是两层
{&quot;protocol&quot;:{...},&quot;method&quot;:{...}},amount / out_trade_no / pay_before / resource_id / seller_signature
在 protocol 层,而 service_id 在 method 层 —— 从 protocol 取 service_id 会得到 None。

付费归属边界(别搞错):本客户端只负责「出账 → 回传凭证 → 取货」。
实际扣款由买家自己 Agent 里的支付宝 AI 付完成:买家看到 402 → 在支付宝侧付款 → 回传
Payment-Proof → 网关 agent.payment.verify 验付 → fulfillment.confirm 履约 → 返回报告。
服务端(卖家侧)只做出账、验付、履约、订单幂等,不碰买家付款动作。

常见问题

5 问
答案由本站依据条目字段整理
本地 Skill 安全体检怎么安装?

在支持 Skills 的客户端里执行:skillhub install user_e81bda48/skill-local-triage。安装方式为未标注。装完刷新技能列表或重开客户端。

本地 Skill 安全体检支持哪些客户端?

资料没有标注宿主客户端,但只要客户端支持 Skills(Claude、Codex、Cursor 等),一般都能加载。

本地 Skill 安全体检权限高吗,安全吗?

权限级别为未标注权限。安装前先看它会读取或写入哪些内容。

本地 Skill 安全体检收费吗?

本站不代收费用,也没有标注具体价格。是否收费取决于技能本身和所用的模型或客户端,正式使用前按作者说明确认。

本地 Skill 安全体检用什么许可证?

许可证标注为 未说明(许可证不明确)。商用或二次分发前请到仓库确认条款原文。

热门专题

按场景挑技能
全部专题 →

技能内容以作者仓库为准;分类、权限级别与许可证状态的中文说明为中文整理,最近核验 未标注。