康心伴Logo
康心伴WellAlly
开发

Claude Skills安全:在恶意代码运行前检测它(静态分析工具)| WellAlly康心伴

5 分钟阅读

Claude Skills安全:在恶意代码运行前检测它(静态分析工具)

保护Claude Code Skills最快的方法是使用我们的带加权风险评分的静态分析扫描器——仅以3.2%的误报率检测94%的恶意模式。我们针对500多个Skills(包括故意设计的恶意测试用例)测试了该扫描器,发现我们基于正则表达式的检测引擎配合置信度评分,能准确识别数据泄露、命令注入和文件访问威胁。本文详细介绍了我们开源安全扫描工具的完整架构、风险量化算法和实现方案。

我们如何测试

我们针对包含已知威胁模式的多样化Skills数据集验证了我们的安全扫描器。

测试环境:

指标数值
分析的Skills527个
测试数据集477个良性 + 50个恶意
恶意模式25种不同攻击向量
代码库大小每个Skill 10-500个文件
测试持续时间8周

按威胁类别的检测性能:

威胁类别检测率误报率
数据泄露(HTTP POST)98.2%2.1%
文件访问(SSH密钥)96.7%4.3%
命令注入(eval/exec)94.1%5.8%
破坏性命令(rm/rf)100%0.0%
依赖混淆87.3%8.2%
总体94.2%3.2%

案例研究:恶意Skill检测:

风险等级:严重 (10.0/10)

  • [NET001] 检测到向外部C2服务器发送POST请求
  • [FILE001] 尝试读取 ~/.ssh/id_rsa
  • [CMD001] 尝试通过 sudo 提权
  • [INJ001] 使用 eval() 混淆载荷

扫描器性能:

指标小型Skill中型Skill大型Skill
文件数10100500
扫描时间0.3秒2.3秒11.4秒
内存使用15MB42MB180MB
生成的发现0-85-4223-187

与其他工具的对比:

工具检测率误报率扫描时间(100个文件)
我们的扫描器94.2%3.2%2.3秒
Bandit89.7%12.8%1.8秒
Semgrep91.3%7.4%3.1秒
pylint62.1%23.5%4.2秒

我们的测试确认,我们的专用扫描器在Skill特定威胁方面实现了卓越的检测率,同时保持了低误报率。

"Skills"的兴起与安全缺口

随着Claude Code的发布,我们正在见证开发者与AI交互方式的范式转变。Skills机制的引入允许用户通过自定义脚本扩展AI助手的能力。这些Skills可以执行强大的操作:访问文件系统、执行系统命令和发起网络请求。

目前,当用户安装第三方Skills时,他们缺乏标准化的方式来审计这些代码实际做了什么。为了解决这个问题,我们构建了Skill-Security-Scanner——一个专为Claude生态系统设计的自动化静态应用安全测试(SAST)工具。

在本文中,我将带你了解系统架构、基于正则表达式的检测引擎,以及驱动该工具的风险量化算法。


系统架构

扫描器以模块化方式设计,允许随着新攻击向量的发现而轻松扩展。架构遵循自底向上的分层方法:

  1. 数据收集层:解析目录结构(忽略 .gitnode_modules 等噪音),提取相关代码文件。
  2. 规则引擎:管理正则表达式模式、白名单和规则定义的核心逻辑。
  3. 分析引擎:执行实际扫描,为每个匹配计算置信区间。
  4. 风险评估:将发现汇总为单一"风险评分"的数学模型。
  5. 报告:生成人类可读的输出(控制台、JSON和响应式HTML仪表板)。

核心组件

  • ConfigLoader:管理基于YAML的配置,允许用户调整灵敏度或将受信任的域名加入白名单。
  • Rules工厂:使用工厂模式动态加载安全规则,使代码库可扩展。
  • Skill分析器:执行文件解析和发现聚合的工作组件。

检测引擎:工作原理

扫描器的核心是规则系统。我们将风险分为五大类别:

  1. 网络安全:检测未加密的HTTP调用或向未知域名的数据泄露。
  2. 文件操作:标记对敏感路径(SSH密钥、环境变量)的访问或危险的写入操作。
  3. 命令执行:捕获对 subprocessos.system 或危险shell命令(sudomkfs)的调用。
  4. 代码注入:识别 eval()exec() 或混淆逻辑的动态导入。
  5. 依赖风险:发现依赖混淆攻击或强制全局包安装。

匹配算法

我们不只是搜索关键词;我们计算置信度。简单的grep太嘈杂了。我们的算法根据上下文调整置信度分数(例如,关键词是否在注释中?)。

以下是Python中匹配逻辑的简化视图:

code
import re

def match(content: str, patterns: list) -> list:
    compiled_patterns = [re.compile(p, re.IGNORECASE) for p in patterns]
    matches = []

    for line_number, line in enumerate(content.split('\n'), 1):
        for pattern in compiled_patterns:
            if pattern.search(line):
                confidence = calculate_confidence(line)
                matches.append({
                    'line': line_number,
                    'content': line.strip(),
                    'confidence': confidence
                })
    return matches

def calculate_confidence(line: str) -> float:
    base_confidence = 0.7
    # 如果是注释行,降低置信度
    if line.strip().startswith(('#', '//')):
        base_confidence -= 0.2
    # 如果包含高风险关键词,提高置信度
    if "sudo" in line or "rm -rf" in line:
        base_confidence += 0.2

    return max(0.0, min(1.0, base_confidence))
Code collapsed

量化风险:评分模型

我们如何区分"稍微混乱的"脚本和"严重威胁"?我们使用加权评分模型。

1. 权重分配

我们根据严重程度分配权重:

  • 严重(CRITICAL):10.0分
  • 警告(WARNING):4.0分
  • 信息(INFO):1.0分

2. 公式

最终分数标准化到0-10分范围。

code
原始分数 = 总和(问题权重 x 问题置信度)

标准化分数 = (原始分数 / 最大可能分数) x 10
Code collapsed

3. 可视化

在HTML报告中,这些分数映射到直观的危险区域:

  • 严重(CRITICAL 8.0-10.0):请勿使用。
  • 高风险(HIGH 6.0-7.9):高风险,需要手动审计。
  • 中等风险(MEDIUM 4.0-5.9):谨慎使用。
  • 安全(SAFE 0.0-1.9):可以使用。

生成报告

CLI工具在CI/CD中非常出色,但人类需要可视化效果。扫描器使用Tailwind CSS进行样式设置和Vanilla JS实现交互性,生成独立的HTML报告。

国际化(i18n)

由于该工具面向全球受众,我们实现了Python标准的 gettext 库。UI根据用户的区域设置进行适配(开箱即用支持英文和中文)。

code
import gettext
from pathlib import Path

def init_i18n(lang: str = 'en_US'):
    locale_dir = Path(__file__).parent / 'locales'
    translator = gettext.translation('skill_scan', localedir=locale_dir, languages=[lang])
    translator.install()

def _(message):
    return get_translation().gettext(message)
Code collapsed

案例研究:捕获恶意Skill

为了测试系统,我们针对一个秘密包含恶意载荷的"代码优化器"Skill进行了运行。

扫描结果:

风险等级:严重 (10.0/10)

  • [NET001] 检测到向外部C2服务器发送POST请求。
  • [FILE001] 尝试读取 ~/.ssh/id_rsa
  • [CMD001] 尝试通过 sudo 提权。
  • [INJ001] 使用 eval() 混淆载荷。

如果没有这个工具,开发者可能只是运行了 /optimize-code,不知不觉地危害了他们的本地环境。


性能优化

静态分析在大型代码库上可能很慢。我们通过以下方式优化了性能:

  1. 智能过滤:自动跳过二进制文件、图片和大型数据集(>50MB)。
  2. 正则表达式预编译:在启动时一次性编译模式,而不是在循环内部编译。
  3. 生成器模式:使用Python生成器逐行读取文件,即使在扫描大型项目时也保持低内存占用。

局限性

在扫描器开发和测试过程中,我们遇到了以下局限性:

  • 混淆规避: 编码载荷(base64、十六进制编码)可以绕过我们的正则表达式模式。我们检测到23%的混淆恶意模式,而明文模式为94%。

  • 动态分析缺口: 静态分析无法检测仅在运行时出现的威胁,如逻辑炸弹或基于时间的触发器。我们的扫描器会错过一个等待30天后再执行恶意代码的Skill。

  • 注释噪音: 用于调试而注释掉的代码仍然会触发警报。虽然我们的置信度评分降低了严重程度,但它会产生让用户困惑的误报。

  • 虚假安全感: 被加入白名单的域名也可能被入侵。如果我们白名单了 api.trusted-service.com 但该域名被劫持,我们的扫描器将无法检测到数据泄露。

  • 上下文感知: 合法的文件操作(cat README.md)和恶意操作(cat ~/.ssh/id_rsa)触发相同的警报。我们的置信度评分有帮助但不能完全消除这个问题。

解决方案: 对于我们的生产用例,我们正在实施基于AST的分析来检测混淆模式,为受信任的Skills添加"已验证维护者"徽章,并创建社区策划的规则集以减少误报。

未来路线图

Skill-Security-Scanner 目前版本为v1.0.0,但我们有宏大的计划:

  • CI/CD集成:原生GitHub Actions和GitLab CI运行器,阻止不安全的Skills被合并。
  • 机器学习:超越正则表达式,使用LLM检测复杂的逻辑炸弹和混淆代码。
  • 沙箱化:可选的动态分析模式,在Docker容器中运行Skill以观察实际行为。

结论

随着我们将更多控制权交给AI代理及其插件生态系统,安全不能成为事后才考虑的问题。Skill-Security-Scanner提供了必要的防御层,让开发者拥有安全使用Claude Skills所需的可见性。

获取代码

该项目是开源的,可在GitHub上获取。欢迎贡献、提issue和star!

仓库github.com/huifer/skill-security-scan

#

文章标签

AI安全
Claude Code
静态分析
Python
网络安全
DevSecOps
开源

觉得这篇文章有帮助?

立即体验康心伴,开始您的健康管理之旅