Install
openclaw skills install @thcjp/vulnerability-scanner-tool-free基于OWASP 2025的免费静态分析工具,支持供应链安全、密钥检测、高危代码模式识别及风险优先级排序。
openclaw skills install @thcjp/vulnerability-scanner-tool-free漏洞扫描器免费版是一款面向开发者和安全工程师的静态安全分析工具。基于 OWASP Top 10:2025 最新标准,覆盖供应链安全(新增A03)、异常条件处理(新增A10)、密钥检测、代码模式分析等核心检测能力。采用4阶段扫描方法论(侦察/发现/分析/报告),结合CVSS+EPSS双维度风险优先级排序,帮助用户聚焦真正重要的安全风险.
| 编号 | 类别 | 检测要点 |
|---|---|---|
| A01 | 访问控制失效 | IDOR、SSRF、权限验证 |
| A02 | 安全配置错误 | 默认配置、云/容器配置 |
| A03 | 供应链安全(新) | 依赖审计、锁文件完整性、CI/CD |
| A04 | 加密失败 | 弱加密、密钥暴露 |
| A05 | 注入 | SQL/命令/NoSQL注入 |
| A06 | 不安全设计 | 架构缺陷 |
| A07 | 认证失败 | 会话管理、凭证管理 |
| A08 | 完整性失败 | 未签名更新、数据篡改 |
| A09 | 日志监控不足 | 审计盲点 |
| A10 | 异常条件(新) | 错误处理、Fail-Open |
处理: 解析OWASP Top 10:2025 检测的输入参数,完成核心逻辑,返回结构化响应. 输出: 返回OWASP Top 10:2025 检测的响应数据,包含状态码、结果和日志.
| 功能 | 免费版 | 专业版 |
|---|---|---|
| 扫描类型 | 静态分析 | 静态+动态+SCA |
| OWASP覆盖 | Top 10 | Top 10+ASVS |
| 扫描脚本 | 基础Python | 全功能引擎 |
| 报告格式 | 文本 | HTML/PDF/SARIF |
| CVE关联 | 不支持 | CVE+EPSS数据库 |
| CI/CD集成 | 不支持 | 流水线集成 |
| 自定义规则 | 不支持 | 自定义规则引擎 |
处理: 解析免费版与专业版对比的输入参数,完成核心逻辑,返回结构化响应. 输出: 返回免费版与专业版对比的响应数据,包含状态码、结果和日志.
用input_params参数进行配置.
处理: 解析核心功能执行的输入参数,完成核心逻辑,返回结构化响应. 输出: 返回核心功能执行的响应数据,包含状态码、结果和日志.
input_params参数,支持创建/查询/导出操作
能力覆盖范围:本skill的核心能力覆盖以下场景关键词:含供应链安全、密钥检测、代码模式分析与风、险优先级排序、核心能力、静态安全分析、供应链安全检查、硬编码密钥与凭证、高危代码模式识别、XSS、反序列化、CVSS、风险优先级排序等。这些关键词对应description中声明的使用场景,均已在上述能力点中提供对应的操作支持.| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| input | string | 是 | 漏洞扫描器(免费版)处理的输入数据或指令 |
| options | object | 否 | 附加配置选项,如模式选择、格式偏好等 |
| callback_url | string | 否 | 异步处理完成后的回调通知URL |
# 全量扫描项目
python (请参考skill目录中的脚本文件) /path/to/project
# ...
# 指定扫描类型
python (请参考skill目录中的脚本文件) /path/to/project --scan-type all
python (请参考skill目录中的脚本文件) /path/to/project --scan-type deps
python (请参考skill目录中的脚本文件) /path/to/project --scan-type secrets
python (请参考skill目录中的脚本文件) /path/to/project --scan-type patterns
python (请参考skill目录中的脚本文件) /path/to/project --scan-type config
# ...
# 输出摘要
python (请参考skill目录中的脚本文件) /path/to/project --output summary
# 依赖说明
# 检查项:
# - 依赖包是否来自可信源
# - 锁文件是否已提交
# - CI/CD管道是否有权限控制
# - 是否存在typosquatting(拼写欺骗)
# ...
import json
from pathlib import Path
# ...
class SupplyChainChecker:
"""供应链安全检查器"""
# ...
KNOWN_TYPOSQUATS = {
"reqeusts": "requests",
"nodemon": "nodemon",
"cross-env": "cross-env",
"lodash-es": "lodash-es"
}
# ...
def check_dependencies(self, project_path):
"""检查依赖安全"""
findings = []
# ...
# 检查package-lock.json
lockfile = Path(project_path) / "package-lock.json"
if not lockfile.exists():
findings.append({
"severity": "MEDIUM",
"issue": "缺少锁文件(package-lock.json)",
"fix": "执行 npm install 生成锁文件并提交到版本控制"
})
# ...
# 检查requirements.txt
reqfile = Path(project_path) / "requirements.txt"
if reqfile.exists():
with open(reqfile) as f:
for line in f:
package = line.split("==")[0].split(">=")[0].strip().lower()
if package in self.KNOWN_TYPOSQUATS:
"severity": "HIGH",
"issue": f"可能的typosquatting: {package}",
"fix": f"检查是否应为: {self.KNOWN_TYPOSQUATS[package]}"
})
# ...
# 检查固定版本
if reqfile.exists():
with open(reqfile) as f:
for line in f:
if "==" not in line and line.strip() and not line.startswith("#"):
"severity": "MEDIUM",
"issue": f"未固定版本: {line.strip()}",
"fix": "使用 == 固定版本号"
})
# ...
return findings
import re
# ...
class SecretDetector:
"""硬编码密钥检测器"""
# ...
SECRET_PATTERNS = [
(r"AKIA[0-9A-Z]{16}", "AWS Access Key ID", "CRITICAL"),
(r"gh[pousr]_[A-Za-z0-9_]{36}", "GitHub Token", "CRITICAL"),
(r"sk-[A-Za-z0-9]{48}", "OpenAI API Key", "CRITICAL"),
(r"-----BEGIN.*PRIVATE KEY-----", "Private Key", "CRITICAL"),
(r"AIza[0-9A-Za-z_\-]{35}", "Google API Key", "HIGH"),
(r"eyJ[A-Za-z0-9_\-]*\.eyJ[A-Za-z0-9_\-]*\.[A-Za-z0-9_\-]*", "JWT Token", "HIGH"),
(r"password\s*[:=]\s*['\"][^'\"]{8,}['\"]", "Hardcoded Password", "HIGH"),
(r"api[_-]?key\s*[:=]\s*['\"][^'\"]{20,}['\"]", "API Key", "HIGH"),
(r"secret\s*[:=]\s*['\"][^'\"]{16,}['\"]", "Secret", "HIGH"),
(r"token\s*[:=]\s*['\"][^'\"]{20,}['\"]", "Token", "HIGH"),
]
# ...
def scan_file(self, filepath):
"""扫描文件中的密钥"""
findings = []
with open(filepath, 'r', encoding='utf-8', errors='ignore') as f:
content = f.read()
lines = content.split('\n')
# ...
for line_num, line in enumerate(lines, 1):
for pattern, name, severity in self.SECRET_PATTERNS:
matches = re.finditer(pattern, line, re.IGNORECASE)
for match in matches:
"file": filepath,
"line": line_num,
"type": name,
"severity": severity,
"evidence": match.group()[:50]
})
return findings
class CodePatternAnalyzer:
"""高危代码模式分析器"""
# ...
HIGH_RISK_PATTERNS = {
"sql_injection": {
"pattern": r"SELECT.*FROM.*\$\{.*\}|SELECT.*FROM.*%s.*%|SELECT.*FROM.*\+.*",
"severity": "CRITICAL",
"description": "SQL注入: 字符串拼接查询"
},
"command_injection": {
"pattern": r"exec\(.*\$\{.*\}|system\(.*input|subprocess\.call\(.*shell=True",
"severity": "CRITICAL",
"description": "命令注入: 用户输入直接执行"
},
"code_injection": {
"pattern": r"eval\(.*input|Function\(.*input|setTimeout\(.*input",
"severity": "CRITICAL",
"description": "代码注入: 动态代码执行"
},
"unsafe_deserialization": {
"pattern": r"pickle\.loads|yaml\.load\(|unserialize\(|JSON\.parse\(.*input",
"severity": "HIGH",
"description": "不安全反序列化"
},
"path_traversal": {
"pattern": r"\.\./\.\./|readFile\(.*input|open\(.*input",
"severity": "HIGH",
"description": "路径遍历"
},
"xss": {
"pattern": r"dangerouslySetInnerHTML|innerHTML\s*=.*input|document\.write\(.*input",
"severity": "HIGH",
"description": "XSS: 未消毒的HTML渲染"
},
"disabled_security": {
"pattern": r"verify\s*=\s*False|SSL_VERIFY|rejectUnauthorized\s*:\s*false|--insecure",
"severity": "MEDIUM",
"description": "安全验证被禁用"
}
}
# ...
def analyze(self, filepath):
"""分析代码模式"""
findings = []
with open(filepath, 'r', encoding='utf-8', errors='ignore') as f:
# ...
for line_num, line in enumerate(lines, 1):
for pattern_id, rule in self.HIGH_RISK_PATTERNS.items():
if re.search(rule["pattern"], line, re.IGNORECASE):
"pattern": pattern_id,
"severity": rule["severity"],
"file": filepath,
"line": line_num,
"code": line.strip()[:80],
"description": rule["description"]
})
return findings
#!/usr/bin/env python3
"""安全扫描器 - OWASP 2025静态分析"""
# ...
import os
import re
import json
import argparse
from pathlib import Path
from datetime import datetime
# ...
class SecurityScanner:
"""安全扫描器主类"""
# ...
SKIP_DIRS = {"node_modules", ".git", "dist", "build", "__pycache__", ".venv", "venv"}
SCAN_EXTENSIONS = {".js", ".ts", ".jsx", ".tsx", ".py", ".java", ".go", ".php", ".rb", ".json", ".yaml", ".yml", ".env"}
# ...
def __init__(self):
self.findings = []
self.files_scanned = 0
# ...
def scan(self, target_path, scan_type="all"):
"""执行安全扫描"""
target = Path(target_path)
# ...
if target.is_file():
self._scan_file(target, scan_type)
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, scan_type)
# ...
return self._generate_report(target_path)
# ...
def _scan_file(self, filepath, scan_type):
"""扫描单个文件"""
self.files_scanned += 1
# ...
if scan_type in ("all", "secrets"):
detector = SecretDetector()
self.findings.extend(detector.scan_file(str(filepath)))
# ...
if scan_type in ("all", "patterns"):
analyzer = CodePatternAnalyzer()
self.findings.extend(analyzer.analyze(str(filepath)))
# ...
def _generate_report(self, target):
"""生成扫描报告"""
critical = sum(1 for f in self.findings if f.get("severity") == "CRITICAL")
high = sum(1 for f in self.findings if f.get("severity") == "HIGH")
medium = sum(1 for f in self.findings if f.get("severity") == "MEDIUM")
# ...
risk_level = "CRITICAL" if critical > 0 else "HIGH" if high > 0 else "MEDIUM" if medium > 0 else "LOW"
# ...
return {
"scan_time": datetime.now().isoformat(),
"target": str(target),
"files_scanned": self.files_scanned,
"risk_level": risk_level,
"summary": {"CRITICAL": critical, "HIGH": high, "MEDIUM": medium},
"total_findings": len(self.findings),
"findings": self.findings
}
# ...
if __name__ == "__main__":
parser = argparse.ArgumentParser(description="OWASP 2025安全扫描器")
parser.add_argument("path", help="扫描目标路径")
parser.add_argument("--scan-type", choices=["all", "deps", "secrets", "patterns", "config"],
default="all", help="扫描类型")
parser.add_argument("--output", choices=["summary", "full", "json"], default="full")
# ...
args = parser.parse_args()
# ...
scanner = SecurityScanner()
report = scanner.scan(args.path, args.scan_type)
# ...
if args.output == "json":
print(json.dumps(report, indent=2, ensure_ascii=False))
elif args.output == "summary":
print(f"风险等级: {report['risk_level']}")
print(f"扫描文件: {report['files_scanned']}")
print(f"发现问题: {report['total_findings']}")
print(f" CRITICAL: {report['summary']['CRITICAL']}")
print(f" HIGH: {report['summary']['HIGH']}")
print(f" MEDIUM: {report['summary']['MEDIUM']}")
else:
print(json.dumps(report, indent=2, ensure_ascii=False, default=str))
风险 = 可能性 × 影响
# ...
高影响 + 高可能性 → CRITICAL (立即修复)
高影响 + 低可能性 → HIGH (优先修复)
低影响 + 高可能性 → MEDIUM (计划修复)
低影响 + 低可能性 → LOW (稍后处理)
# ...
优先级决策树:
是否被积极利用(EPSS > 0.5)?
├── 是 → CRITICAL: 立即行动
└── 否 → 检查CVSS
├── CVSS ≥9.0 → HIGH
├── CVSS 7.0-8.9 → 考虑资产价值
└── CVSS <7.0 → 计划稍后修复
| 严重程度 | 标准 | 示例 |
|---|---|---|
| Critical | RCE、认证绕过、大规模数据泄露 | SQL注入、硬编码私钥 |
| High | 数据泄露、权限提升 | XSS、路径遍历 |
| Medium | 有限范围、需要特定条件 | 配置错误、弱加密 |
| Low | 信息性、最佳实践 | 缺少安全头、日志不足 |
| 原则 | 应用 |
|---|---|
| 假设已被入侵 | 设计时就假设攻击者已在内部 |
| 零信任 | 永不信任,始终验证 |
| 纵深防御 | 多层防护,无单点故障 |
| 最小权限 | 仅授予最低所需权限 |
| 安全失败 | 出错时拒绝访问 |
1. 侦察(Reconnaissance)
├── 理解技术栈
├── 识别入口点
└── 映射数据流
# ...
2. 发现(Discovery)
├── 配置审查
├── 依赖分析
└── 代码模式搜索
# ...
3. 分析(Analysis)
├── 消除误报
├── 风险评分
└── 攻击链映射
# ...
4. 报告(Reporting)
├── 清晰的复现步骤
├── 业务影响分析
└── 修复指导建议
| 不要 | 应该 |
|---|---|
| 不理解就扫描 | 先映射攻击面 |
| 每个CVE都告警 | 按可利用性+资产优先级排序 |
| 忽略误报 | 维护已验证的基线 |
| 只修症状 | 解决根本原因 |
| 部署前扫描一次 | 持续扫描 |
| 盲信第三方依赖 | 验证完整性,审计代码 |
A: 不能。静态分析专注源代码,无法发现运行时漏洞。需要动态分析(DAST)补充。编译后的二进制文件不适用.
A: 结合上下文判断。例如 process.env 在配置文件中正常,在传输到外部时则是风险。维护已验证的基线,标记已知的安全模式.
A: 100个文件约需5-10秒。大型项目(1000+文件)约需30-60秒。可通过 --scan-type 指定扫描类型加速.
A: 免费版提供静态分析。专业版增加动态扫描(DAST)、软件组合分析(SCA)、CVE+EPSS数据库关联和CI/CD集成.
| 依赖项 | 类型 | 是否必需 | 获取方式 |
|---|---|---|---|
| Python | 运行时 | 必需 | 系统自带 |
| re模块 | 标准库 | 必需 | Python内置 |
| os模块 | 标准库 | 必需 | Python内置 |
| pathlib模块 | 标准库 | 必需 | Python内置 |
| argparse模块 | 标准库 | 必需 | Python内置 |
| 错误场景 | 原因 | 处理方式 |
|---|---|---|
| 配置错误 | 参数缺失或格式错误 | 检查依赖说明中的配置要求 |
| 运行时错误 | 运行环境不满足 | 确认运行环境符合依赖说明 |
| 网络错误 | 连接超时或不可达 | 执行ping命令测试网络连通性,检查防火墙和代理设置连接后执行ping命令测试网络连通性,检查防火墙和代理设置连接后重新执行命令,参考国内替代方案 |
{
"success": true,
"data": {
"result": "漏洞扫描器(免费版)处理结果",
"execution_time": "0.5s",
"metadata": {
"version": "1.0",
"processor": "vulnerability scanner"
}
},
"execution_log": ["解析输入参数", "执行核心处理", "格式化输出结果"],
"error": null
}