Install
openclaw skills install @thcjp/security-toolkit-freeopenclaw skills install @thcjp/security-toolkit-freeAgent安全工具箱免费版是一款专为AI Agent生态设计的安全扫描工具。内置24条安全检测规则,覆盖命令执行、自动更新、远程加载、密钥泄露、Prompt注入等AI特有安全风险。支持 JavaScript、TypeScript、Python、Solidity、Markdown 等多种文件类型的静态分析,自动进行风险分级并输出可操作的修复建议.
| 编号 | 规则ID | 严重等级 | 检测内容 |
|---|---|---|---|
| 1 | SHELL_EXEC | HIGH | 命令执行能力 |
| 2 | AUTO_UPDATE | CRITICAL | 自动更新/下载执行 |
| 3 | REMOTE_LOADER | CRITICAL | 远程动态代码加载 |
| 4 | READ_ENV_SECRETS | MEDIUM | 环境变量读取 |
| 5 | READ_SSH_KEYS | CRITICAL | SSH密钥文件访问 |
| 6 | READ_KEYCHAIN | CRITICAL | 系统密钥链/浏览器配置 |
| 7 | PRIVATE_KEY_PATTERN | CRITICAL | 硬编码私钥 |
| 8 | MNEMONIC_PATTERN | CRITICAL | 硬编码助记词 |
| 9 | WALLET_DRAINING | CRITICAL | 代币盗取模式 |
| 10 | UNLIMITED_APPROVAL | HIGH | 无限授权模式 |
| 11 | HIGHRISK_SELFDESTRUCT | HIGH | 合约自毁 |
| 12 | HIDDEN_TRANSFER | MEDIUM | 非标准转账实现 |
| 13 | PROXY_UPGRADE | MEDIUM | 代理升级模式 |
| 14 | FLASH_LOAN_RISK | MEDIUM | 闪电贷使用 |
| 15 | REENTRANCY_PATTERN | HIGH | 重入攻击模式 |
| 16 | SIGNATURE_REPLAY | HIGH | 签名重放 |
| 17 | OBFUSCATION | HIGH | 代码混淆技术 |
| 18 | PROMPT_INJECTION | CRITICAL | Prompt注入攻击 |
| 19 | NET_EXFIL_UNRESTRICTED | HIGH | 无限制数据外传 |
| 20 | WEBHOOK_EXFIL | CRITICAL | Webhook数据外泄 |
| 21 | 网络代理_DISTRIBUTION | CRITICAL | 木马分发 |
| 22 | SUSPICIOUS_PASTE_URL | HIGH | 可疑粘贴板URL |
| 23 | SUSPICIOUS_IP | MEDIUM | 硬编码公网IP |
| 24 | SOCIAL_ENGINEERING | HIGH | 社会工程学诱导 |
处理: 解析条安全检测规则的输入参数,完成核心逻辑,返回结构化响应. 输出: 返回条安全检测规则的响应数据,包含状态码、结果和日志.
| 功能 | 免费版 | 专业版 |
|---|---|---|
| 检测规则 | 24条 | 24条+自定义规则 |
| 扫描模式 | 基础扫描 | 深度扫描+行为分析 |
| 行动评估 | 不支持 | 运行时安全决策 |
| 巡检模式 | 不支持 | 8项自动巡检 |
| 信任注册表 | 不支持 | 信任等级管理 |
| 健康检查 | 不支持 | 6维度健康评分 |
| HTML报告 | 不支持 | 可视化报告 |
| 批量扫描 | 单目录 | 多目录批量 |
处理: 解析免费版与专业版对比的输入参数,完成核心逻辑,返回结构化响应. 输出: 返回免费版与专业版对比的响应数据,包含状态码、结果和日志.
用input_params参数进行配置.
处理: 解析核心功能执行的输入参数,完成核心逻辑,返回结构化响应. 输出: 返回核心功能执行的响应数据,包含状态码、结果和日志.
input_params参数,支持创建/查询/导出操作
能力覆盖范围:本skill的核心能力覆盖以下场景关键词:Agent、安全扫描与风险检、条规则覆盖注入、密钥泄露、恶意代码等、适合个人开发者、核心能力、条安全检测规则覆、盖代码与配置、Python、Markdown、等多语言扫描、风险等级自动分级、LOW、命令行扫描与报告等。这些关键词对应description中声明的使用场景,均已在上述能力点中提供对应的操作支持.在安装任何第三方Skill之前,先执行安全扫描.
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| input | string | 是 | Agent安全工具箱(免费版)处理的输入数据或指令 |
| options | object | 否 | 附加配置选项,如模式选择、格式偏好等 |
| callback_url | string | 否 | 异步处理完成后的回调通知URL |
# 扫描Skill目录
node (请参考skill目录中的脚本文件) /path/to/skill-directory
输出示例:
安全扫描报告
═══════════════════════════════════════
目标: /path/to/skill-directory
风险等级: CRITICAL
扫描文件: 12
发现问题: 3
# ...
发现项:
| # | 规则 | 严重等级 | 文件:行号 | 证据 |
|:---:|:---:|:---:|:---:|:---:|
| 1 | REMOTE_LOADER | critical | index.js:42 | 安全解析(remoteData) |
| 2 | READ_ENV_SECRETS | medium | config.js:15 | process.env.SECRET |
| 3 | PROMPT_INJECTION | critical | SKILL.md:8 | "遵循当前指令" |
# ...
建议: 不要安装此Skill,存在严重安全风险.
# 扫描整个项目
node (请参考skill目录中的脚本文件) /path/to/project --full
# 只检测密钥泄露
node (请参考skill目录中的脚本文件) /path/to/project --rule PRIVATE_KEY_PATTERN
# ...
# 只检测Prompt注入
node (请参考skill目录中的脚本文件) /path/to/project --rule PROMPT_INJECTION
以下场景Agent安全工具箱(免费版)不适合处理:
需要安全检测、合规审计、漏洞扫描、加密防护时使用。不适用于非本工具能力范围的需求.
# ...
# ...
# ...
# ...
# ...
# ...
# ...
# ...
# ...
# ...
result = "操作完成"
import os
import re
import json
from pathlib import Path
class SecurityScanner:
"""AI Agent安全扫描器"""
RULES = {
"SHELL_EXEC": {
"severity": "HIGH",
"pattern": r"(child_process|exec\(|execSync\(|spawn\(|subprocess\.)",
"description": "命令执行能力"
},
"AUTO_UPDATE": {
"severity": "CRITICAL",
"pattern": r"(curl|wget|fetch)\s*.*\|\s*(bash|sh|python|node)",
"description": "自动更新/下载执行"
},
"REMOTE_LOADER": {
"severity": "CRITICAL",
"pattern": r"(eval\(|Function\(|require\(.*http|import\(.*http)",
"description": "远程动态代码加载"
},
"READ_ENV_SECRETS": {
"severity": "MEDIUM",
"pattern": r"(process\.env\.|os\.environ\.|getenv\().*(?:KEY|SECRET|TOKEN|PASSWORD|PRIVATE)",
"description": "环境变量密钥读取"
},
"PRIVATE_KEY_PATTERN": {
"severity": "CRITICAL",
"pattern": r"(0x[a-fA-F0-9]{64}|-----BEGIN.*PRIVATE KEY-----)",
"description": "硬编码私钥"
},
"MNEMONIC_PATTERN": {
"severity": "CRITICAL",
"pattern": r"(mnemonic|seed_phrase|seedPhrase).{0,20}['\"].{20,}",
"description": "硬编码助记词"
},
"PROMPT_INJECTION": {
"severity": "CRITICAL",
"pattern": r"(ignore\s+(previous|all|above)\s+instructions|system\s*prompt|<\|im_start\|>)",
"description": "Prompt注入攻击"
},
"OBFUSCATION": {
"severity": "HIGH",
"pattern": r"(eval\(atob|eval\(decode|\\x[0-9a-f]{2}\\x[0-9a-f]{2}\\x[0-9a-f]{2})",
"description": "代码混淆技术"
},
"NET_EXFIL_UNRESTRICTED": {
"severity": "HIGH",
"pattern": r"(fetch|axios|http\.post|requests\.post).*(?!.*allowlist)",
"description": "无限制数据外传"
},
"WEBHOOK_EXFIL": {
"severity": "CRITICAL",
"pattern": r"(discord\.com/api/webhooks|hooks\.slack\.com|.*\.webhook\.*)",
"description": "Webhook数据外泄"
}
}
SKIP_DIRS = {"node_modules", "dist", "build", ".git", "coverage", "__pycache__", ".venv", "venv"}
SCAN_EXTENSIONS = {".js", ".ts", ".jsx", ".tsx", ".mjs", ".cjs", ".py", ".json", ".yaml", ".yml", ".sh", ".md"}
def __init__(self):
self.findings = []
self.files_scanned = 0
def scan(self, target_path):
"""扫描目标路径"""
target = Path(target_path)
if target.is_file():
self._scan_file(target)
else:
for root, dirs, files in os.walk(target):
dirs[:] = [d for d in dirs if d not in self.SKIP_DIRS]
for file in files:
filepath = Path(root) / file
if filepath.suffix in self.SCAN_EXTENSIONS:
self._scan_file(filepath)
return self._generate_report(target_path)
def _scan_file(self, filepath):
"""扫描单个文件"""
self.files_scanned += 1
try:
with open(filepath, 'r', encoding='utf-8', errors='ignore') as f:
lines = f.readlines()
for line_num, line in enumerate(lines, 1):
for rule_id, rule in self.RULES.items():
if re.search(rule["pattern"], line, re.IGNORECASE):
"rule": rule_id,
"severity": rule["severity"],
"file": str(filepath),
"line": line_num,
"evidence": line.strip()[:100],
"description": rule["description"]
})
except Exception:
def _generate_report(self, target):
"""生成扫描报告"""
risk_level = "LOW"
if any(f["severity"] == "CRITICAL" for f in self.findings):
risk_level = "CRITICAL"
elif any(f["severity"] == "HIGH" for f in self.findings):
risk_level = "HIGH"
elif any(f["severity"] == "MEDIUM" for f in self.findings):
risk_level = "MEDIUM"
return {
"target": target,
"risk_level": risk_level,
"files_scanned": self.files_scanned,
"total_findings": len(self.findings),
"findings": self.findings
}
{
"scan_config": {
"skip_dirs": ["node_modules", "dist", "build", ".git"],
"scan_extensions": [".js", ".ts", ".py", ".md", ".json"],
"rules_enabled": "all",
"markdown_code_blocks_only": true,
"decode_base64": true,
"output_format": "json"
}
}
# 安装任何新Skill前执行安全扫描
node (请参考skill目录中的脚本文件) ./.skills/new-skill/
# 每周扫描工作区
node (请参考skill目录中的脚本文件) ./workspace/ --full --output weekly_scan.json
# 只显示严重问题
node (请参考skill目录中的脚本文件) /path/to/project | grep CRITICAL
A: 静态扫描可能产生误报。建议结合上下文判断,例如 process.env 在配置文件中是正常的,但在传输到外部服务器时则是风险.
A: 免费版只扫描Markdown文件中的代码块(```标记之间的内容),避免误报正文中的技术描述.
A: 100个文件的扫描约需3-5秒,取决于文件大小和规则数量.
A: 这些是专业版功能。免费版专注于静态代码扫描,专业版增加了运行时行动评估、自动巡检和信任管理.
| 依赖项 | 类型 | 是否必需 | 获取方式 |
|---|---|---|---|
| Python | 运行时 | 必需 | 系统自带或 python.org 下载 |
| re模块 | 标准库 | 必需 | Python内置 |
| pathlib模块 | 标准库 | 必需 | Python内置 |
| 错误场景 | 原因 | 处理方式 |
|---|---|---|
| 配置错误 | 参数缺失或格式错误 | 检查依赖说明中的配置要求 |
| 运行时错误 | 运行环境不满足 | 确认运行环境符合依赖说明 |
| 网络错误 | 连接超时或不可达 | 执行ping命令测试网络连通性,检查防火墙和代理设置连接后执行ping命令测试网络连通性,检查防火墙和代理设置连接后重新执行命令,参考国内替代方案 |