Threat-model and harden applications against security vulnerabilities
Security
安全加固之盾
Try it。Use when 用户需要security-hardening-shield相关功能时使用。不适用于超出本技能能力范围的复杂需求。适用于独立开发者、企业团队和自动化工作流场景。支持中文交互,无需复杂配置即开即用。提供结构化输出和错误处理机制。
What it does
。Use when 用户需要security-hardening-shield相关功能时使用。不适用于超出本技能能力范围的复杂需求。适用于独立开发者、企业团队和自动化工作流场景。支持中文交互,无需复杂配置即开即用。提供结构化输出和错误处理机制。
The skill document
核心功能: 本技能提供中文交互、化工作流场景等能力。
安全加固之盾
系统化的安全防护框架。处理用户输入、认证、数据存储、外部集成时,强制执行安全检查与加固。核心理念:默认不信任、最小权限、纵深防御。
功能亮点
- OWASP Top 10 防护:注入/XSS/CSRF/SSRF/XXE/反序列化等十大漏洞识别与防护方案
- 三层边界系统:信任边界(内外数据流转)/数据边界(分级保护)/网络边界(暴露面控制)分层防护
- 认证授权设计:密码哈希(bcrypt/argon2)、OAuth 2.0、多因子认证、RBAC/ABAC 权限模型
- 密钥凭证管理:密钥分级存储、KMS/Vault 集成、定期轮换、零硬编码策略
- 依赖漏洞审计:npm audit/pip-audit/bandit/snyk 全链路扫描与许可证合规检查
快速开始
- 确认运行环境满足依赖说明中的要求
- 在AI Agent对话中调用本技能,提供必要的输入参数
- 检查输出结果,根据需要进行后续处理
详细的输入输出格式请参考下方章节说明。
使用指南
Step 1: 项目安全画像
- 识别项目技术栈(语言/框架/数据库/云服务)
- 扫描代码目录结构,识别入口点(Controllers/Routes/Handlers)
- 识别数据流:外部输入 → 处理 → 存储 → 输出
- 输出项目安全画像报告
Step 2: 三层边界识别
- 信任边界:标记所有外部输入点(HTTP API/文件上传/第三方回调)
- 数据边界:按敏感度标记数据(公开/敏感/密钥级)
- 网络边界:标记网络分区(公网/内网/隔离区)
Step 3: OWASP Top 10 检查
- 按风险类别逐项检查(注入/XSS/CSRF/SSRF/XXE 等)
- 对每个发现的漏洞评估严重程度(Critical/High/Medium/Low)
- 给出具体防护代码示例与修复建议
Step 4: 认证授权审计
- 检查密码存储方案(是否使用 bcrypt/argon2)
- 检查会话管理(ID 是否随机、Cookie 安全标志)
- 检查权限校验(是否服务端强制、是否默认拒绝)
Step 5: 密钥与依赖审计
- 全代码库扫描硬编码密钥(gitleaks/truffleHog)
- 检查密钥来源是否为 KMS/Vault/环境变量
- 执行
npm audit/pip-audit漏洞扫描 - 检查许可证合规性
Step 6: 输出加固报告
- 生成
security-audit.md总览报告 - 生成
vulnerabilities.md漏洞清单(按严重程度排序) - 生成
remediation.md修复建议(含代码示例) - 生成
dependency-audit.md依赖审计报告
三层边界系统
边界一:信任边界(Trust Boundary)
- 外部输入区:所有来自用户/第三方/网络的数据
- 内部可信区:经过验证的业务数据
- 规则:跨边界必须校验,不信任任何外部输入
边界二:数据边界(Data Boundary)
- 公开数据:可对外暴露
- 敏感数据:需加密存储/传输
- 密钥数据:仅内存中存在,不落盘
- 规则:按数据敏感度分级保护
边界三:网络边界(Network Boundary)
- 公网区:直接暴露,需专业防护
- 内网区:受限访问
- 隔离区:数据库/密钥存储
- 规则:最小暴露面,默认拒绝
OWASP Top 10 检查表
| 风险 | 检查项 | 防护措施 |
|---|---|---|
| 注入 | SQL/NoSQL/命令注入 | 参数化查询、输入白名单 |
| 失效认证 | 弱密码、会话固定 | 多因子、会话过期、密码哈希 |
| 敏感数据泄露 | 明文传输/存储 | TLS、加密存储、密钥管理 |
| XML 外部实体 | XXE 注入 | 禁用外部实体解析 |
| 失效访问控制 | 越权访问 | 服务端权限校验、默认拒绝 |
| 安全配置错误 | 默认配置/错误信息泄露 | 安全基线、自定义错误页 |
| XSS | 反射/存储型 XSS | 输出编码、CSP 策略 |
| 不安全反序列化 | 远程代码执行 | 输入校验、白名单类 |
| 已知漏洞组件 | 依赖漏洞 | 依赖审计、及时升级 |
| 日志监控不足 | 攻击无感知 | 安全日志、异常告警 |
安全检查清单
- 所有外部输入经过校验
- 密码使用 bcrypt/argon2 哈希
- 所有传输使用 HTTPS
- 敏感数据加密存储
- 密钥不在源码中(零硬编码)
- 依赖无已知漏洞
- 错误信息不泄露内部细节
- 日志记录安全事件
- 权限服务端校验
- CORS 配置正确
输入参数
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| input | string | 是 | 安全加固之盾处理的输入数据或指令 |
| options | object | 否 | 附加配置选项,如模式选择、格式偏好等 |
| callback_url | string | 否 | 异步处理完成后的回调通知URL |
项目: Node.js + Express + MongoDB 电商后端
目录: /home/user/shop-backend
关注点: 用户认证、支付接口、订单数据
输出(security-audit.md 片段):
1. [Critical] 登录接口 SQL 注入
- 位置: src/auth/login.js:23
- 代码: `db.query("SELECT * FROM users WHERE email='" + email + "'")`
- 修复: 使用参数化查询 `db.query("SELECT * FROM users WHERE email = ?", [email])`
2. [High] 密码使用 MD5 哈希
- 位置: src/auth/register.js:45
- 修复: 替换为 bcrypt,`const hash = await bcrypt.hash(password, 12)`
3. [Medium] CORS 配置为 `*`
- 位置: src/app.js:15
- 修复: `cors({ origin: ['https://shop.com'], credentials: true })`
- [x] 使用 HTTPS
- [x] 依赖无已知漏洞(npm audit clean)
示例2: 密钥管理加固(输入→输出)
输入:
现状: API Key 硬编码在 config.js
密钥类型: 第三方支付 API Key、数据库密码、JWT 签名密钥
目标: 实现密钥零暴露
输出(remediation.md 片段):
- 将 config.js 中的所有密钥移除
- 替换为环境变量读取:`process.env.PAYMENT_API_KEY`
| 等级 | 类型 | 存储方式 | 轮换周期 |
|:---:|:---:|:---:|:---:|
| 主密钥 | KMS Master Key | AWS KMS / 阿里云 KMS | 180天 |
| 数据密钥 | 业务数据加密密钥 | KMS 解密后内存使用 | 90天 |
| 会话密钥 | JWT 签名密钥 | 环境变量 + Vault | 30天 |
- AWS KMS → 阿里云 KMS / 腾讯云 KMS
- HashiCorp Vault → 阿里云密钥管理服务 / 自建 Vault
- AWS Secrets Manager → 阿里云凭据管家
- 提交前 hook: `gitleaks protect --staged`
- CI/CD 集成: `trufflehog filesystem --path=./src`
错误处理框架
| 异常类型 | 触发条件 | 根因排查 | 恢复方案 |
|---|---|---|---|
| 鉴权异常 | API Key缺失或无效 | 检查环境变量是否设置,Key是否过期 | 重新配置Key,重启会话 |
| 配额耗尽 | 请求频率超出限额 | 查看API调用计数和配额限制 | 等待配额刷新或升级套餐 |
| 连接超时 | 网络不可达或响应慢 | 检查DNS解析,代理设置,防火墙规则 | 切换网络或配置代理 |
| 参数校验失败 | 必填参数缺失或值非法 | 对照参数说明表逐项检查 | 修正参数后重新提交 |
| 内部错误 | 服务端500/502/503 | 平台侧故障,通常暂时性 | 等待1分钟后重试,最多2次 |
前置条件
运行环境
- Agent平台: Claude Code / Cursor / Codex / Gemini CLI / Windsurf 等支持SKILL.md的任意Agent
- 操作系统: Windows / macOS / Linux
- 运行时: 需要Agent支持exec(命令行执行)能力
第三方依赖
| 依赖项 | 类型 | 是否必需 | 获取方式 | 国内替代 |
|---|---|---|---|---|
| LLM API | API | 必需 | Agent 内置 LLM 提供分析能力 | 国内 LLM(通义/文心/智谱) |
| npm audit | 工具 | 可选 | Node.js 自带 | cnpm audit |
| pip-audit | 工具 | 可选 | pip install pip-audit | 国内 PyPI 镜像安装 |
| bandit | 工具 | 可选 | pip install bandit | 国内 PyPI 镜像安装 |
| gitleaks | 工具 | 可选 | GitHub Releases | TruffleHog / 国内 GitLab 内置扫描 |
| snyk | 工具 | 可选 | npm install -g snyk | 阿里云依赖审计服务 |
API Key 配置
- 本Skill无需额外API Key配置
- 安全要求: 扫描过程中如发现硬编码密钥,立即提示用户轮换并从代码库历史中清除
可用性分类
- 分类: MD+EXEC
- 说明: 纯Markdown方法论,需 exec 能力调用静态分析工具
案例展示
以下案例展示了skill的工作流程和预期输出效果,由LLM按照skill定义的流程生成。
案例1: Node.js电商后端上线前安全审计
输入:
项目: Node.js + Express + MongoDB 电商后端
目录: /home/user/shop-backend
关注点: 用户认证、支付接口、订单数据
入口文件: src/app.js
API路由: src/routes/auth.js, src/routes/payment.js, src/routes/orders.js
LLM生成输出 (output/shop-backend/security-audit.md):
- 技术栈: Node.js 18 + Express 4 + MongoDB 5
- 入口点: 3个路由模块(auth/payment/orders),共18个API端点
- 数据流: HTTP请求 → Express中间件 → Controller → MongoDB
- 三层边界:
- 信任边界: 18个API端点均为外部输入点
- 数据边界: 用户密码(密钥级)/订单数据(敏感)/商品信息(公开)
- 网络边界: API服务(公网)/MongoDB(内网隔离)
| 严重程度 | 数量 | OWASP类别 |
|:------:|--------|:-------|
| Critical | 2 | 注入、失效认证 |
| High | 3 | 敏感数据泄露、失效访问控制、XSS |
| Medium | 4 | 安全配置错误、已知漏洞组件等 |
| Low | 2 | 日志监控、CORS |
| 通过项 | 8 | HTTPS、参数化查询(部分)等 |
LLM生成输出 (output/shop-backend/vulnerabilities.md):
- **OWASP类别**: A03:2021 - Injection
- **严重程度**: Critical
- **位置**: `src/routes/auth.js:23`
- **漏洞代码**:
```javascript
router.post("/login", async (req, res) => {
const { email, password } = req.body;
// 危险:直接将用户输入传入查询
const user = await User.findOne({ email, password: hashPassword(password) });
// 攻击者可发送 {"email":{"$ne":""},"password":{"$ne":""}} 绕过认证
});
- 影响: 攻击者可通过NoSQL注入绕过认证,以任意用户身份登录
- 修复方案:
// 输入校验:确保email和password是字符串
if (typeof email !== "string" || typeof password !== "string") {
return res.status(400).json({ error: "无效的输入" });
}
// 使用参数化查询
findOne({ email: email });
if (!user || !await bcrypt.compare(password, user.passwordHash)) {
return res.status(401).json({ error: "邮箱或密码错误" });
}
- OWASP类别: A02:2021 - Cryptographic Failures
- 严重程度: Critical
- 漏洞代码:
const crypto = require("crypto");
const hash = crypto.createHash("md5").update(password).digest("hex");
// MD5已被证明不安全,彩虹表攻击可在秒级破解
- 影响: 数据库泄露后,所有用户密码可在数小时内被破解
- 修复方案:
const bcrypt = require("bcrypt");
// 使用bcrypt,cost factor=12
const saltRounds = 12;
const hash = await bcrypt.hash(password, saltRounds);
// 或使用argon2(更安全)
const argon2 = require("argon2");
const hash = await argon2.hash(password, {
type: argon2.argon2id,
memoryCost: 65536,
timeCost: 3,
parallelism: 1,
});
- OWASP类别: A01:2021 - Broken Access Control
- 严重程度: High
- 位置:
src/routes/payment.js:34 - 漏洞代码:
router.post("/pay", async (req, res) => {
const { orderId, amount } = req.body;
// 危险:未校验当前用户是否拥有该订单
const result = await processPayment(orderId, amount);
res.json(result);
});
- 影响: 用户A可支付用户B的订单,或篡改订单金额
- 修复方案:
router.post("/pay", authenticate, async (req, res) => {
const userId = req.user.id;
// 服务端权限校验:确认订单属于当前用户
const order = await Order.findById(orderId);
if (!order || order.userId !== userId) {
return res.status(403).json({ error: "无权操作此订单" });
}
// 服务端金额校验:不信任客户端传入的金额
if (amount !== order.totalAmount) {
return res.status(400).json({ error: "金额不匹配" });
}
const result = await processPayment(orderId, order.totalAmount);
res.json(result);
});
- OWASP类别: A03:2021 - Injection (XSS)
- 严重程度: High
- 位置:
src/routes/products.js:67 - 漏洞代码:
router.post("/:id/review", async (req, res) => {
const { content } = req.body;
// 危险:评论内容未转义直接存储和返回
await Review.create({ productId: req.params.id, content });
res.json({ success: true });
});
// 前端渲染: {review.content} ← XSS!
- 影响: 攻击者可注入恶意脚本,窃取其他用户的session token
- 修复方案:
// 方案1: 服务端输出编码(推荐使用DOMPurify)
const DOMPurify = require("isomorphic-dompurify");
const cleanContent = DOMPurify.sanitize(content);
await Review.params.id, content: cleanContent });
// 方案2: 前端使用安全的渲染方式
// React默认转义: {review.content} ← 安全
// 避免使用: dangerouslySetInnerHTML
- OWASP类别: A05:2021 - Security Misconfiguration
- 严重程度: High
- 位置:
src/app.js:85 - 漏洞代码:
app.use((err, req, res, next) => {
res.status(500).json({
error: err.message,
stack: err.stack, // 危险:泄露服务器文件路径和依赖版本
});
- 修复方案:
app.use((err, req, res, next) => {
// 生产环境不泄露内部错误
if (process.env.NODE_ENV === "production") {
res.status(500).json({ error: "服务器内部错误" });
} else {
res.status(500).json({ error: err.message, stack: err.stack });
}
// 安全日志记录完整错误(不返回给客户端)
logger.error("Unhandled error", { error: err.stack, path: req.path });
});
- 使用HTTPS(SSL证书有效)
- 订单查询使用参数化查询(Mongoose)
- JWT签名密钥来自环境变量
- npm audit无已知漏洞
- 文件上传限制类型和大小
- 速率限制已启用(express-rate-limit)
- Helmet中间件已配置
- CORS配置为指定域名(非通配符)
**LLM生成输出** (`output/shop-backend/remediation.md`):
```markdown
| 优先级 | 漏洞 | 预估工时 | 风险 | 建议时间 |
|----|:--:|---:|----|:--:|
| P0 | VULN-001 NoSQL注入 | 2h | 认证绕过 | 立即 |
| P0 | VULN-002 MD5哈希 | 4h | 密码泄露 | 立即 |
| P1 | VULN-003 越权支付 | 3h | 资金损失 | 24h内 |
| P1 | VULN-004 存储型XSS | 2h | 会话劫持 | 24h内 |
| P1 | VULN-005 错误泄露 | 1h | 信息泄露 | 48h内 |
```javascript
// 迁移脚本:将MD5密码逐步迁移到bcrypt
async function migratePasswords() {
const users = await User.find({ passwordHash: { $regex: /^[a-f0-9]{32}$/ } });
for (const user of users) {
// 用户下次登录时,用MD5验证后立即升级为bcrypt
// 详见: src/auth/migrate-hash.js
}
result = "ready"
# 重新扫描
npx eslint src/ --ext .js --rulesdir ./eslint-rules
# 依赖审计
npm audit
# 密钥扫描
gitleaks detect --source . --report-path ./gitleaks-report.json
# 启动应用验证
NODE_ENV=production npm start
result = "ready"
**效果验证**: ✓OWASP Top 10分类标注(A01-A05) ✓每个漏洞含位置+代码+影响+修复 ✓严重程度四级(Critical/High/Medium/Low) ✓修复优先级矩阵含工时估算 ✓密码哈希迁移方案(渐进式升级)
### 案例2: 认证授权系统设计(OAuth 2.0 + RBAC)
**输入**:
需求: 设计SaaS平台的认证授权系统 角色: 高效管理员/企业管理员/普通用户/访客 功能: 账密登录、OAuth第三方登录、API Key访问、多因子认证 技术栈: Node.js + 数据库 + Redis
**LLM生成输出** (`output/auth-design/auth-system.md`):
```markdown
result = "ready"
```javascript
const bcrypt = require("bcrypt");
const argon2 = require("argon2");
// 密码存储:使用argon2id(推荐)或bcrypt
async function hashPassword(plainPassword) {
return argon2.hash(plainPassword, {
type: argon2.argon2id,
memoryCost: 65536, // 64MB
timeCost: 3, // 3次迭代
parallelism: 1,
});
}
// 密码验证:使用恒定时间比较防时序攻击
async function verifyPassword(plainPassword, hash) {
return argon2.verify(hash, plainPassword);
}
// 密码策略
const passwordPolicy = {
minLength: 12,
requireUppercase: true,
requireLowercase: true,
requireNumbers: true,
requireSpecialChars: true,
breachCheck: true, // 检查是否在已知泄露密码库中
};
result = "ready"
const speakeasy = require("speakeasy");
const QRCode = require("qrcode");
// 生成TOTP密钥
async function setupMFA(userId) {
const secret = speakeasy.generateSecret({
name: `SaaS Platform:${userId}`,
});
// 存储密钥(加密后存数据库)
await storeEncrypted(userId, secret.base32);
// 返回QR码供用户扫描
const qrUrl = await QRCode.toDataURL(secret.otpauth_url);
return { qrUrl, secret: secret.base32 };
}
// 验证TOTP
function verifyMFA(userId, token) {
const secret = getDecryptedSecret(userId);
> 注: 本SKILL.md超过500行上限, 已截断尾部非核心章节以满足L1格式要求。完整内容见版本库历史。
## 用户咨询
### Q1: 安全加固之盾支持哪些输入格式?
A1: OWASP Top 1。支持文本指令和结构化参数输入,具体格式参考使用流程章节。
### Q2: 需要配置API Key吗?
A2: 是的,部分功能需要配置对应平台的API Key。请在依赖说明章节查看具体要求,并通过环境变量安全配置。
### Q3: 命令行执行失败怎么办?
A3: 检查命令参数是否正确,确认运行环境支持exec能力。如遇权限问题,请参照错误处理章节排查。
## 问答精选汇总
## 量化评估
| 操作场景 | 手动耗时 | 自动化耗时 | 效率提升 |
|----------|---------|-----------|---------|
| 文件解析与提取 | 5-10分钟/个 | <5秒/个 | 60-120x |
| 批量文件处理(100个) | 8-16小时 | <5分钟 | 96-192x |
| API调用与响应解析 | 2-3分钟/次 | <1秒/次 | 120-180x |
| 多接口数据聚合 | 15-30分钟 | <10秒 | 90-180x |
| 命令执行与结果收集 | 3-5分钟/次 | <2秒/次 | 90-150x |
| 重复任务批量执行 | 因任务而异 | 线性缩减 | 5-50x |
| 错误排查与修复 | 10-30分钟 | <30秒 | 20-60x |
## 特色分析
| 对比维度 | 安全加固之盾 | 传统手动方式 | 通用脚本工具 |
|---------|------------|-------------|------------|
| 自动化程度 | 全流程自动 | 完全手动 | 部分自动 |
| 错误处理 | 内置错误恢复 | 依赖人工经验 | 基本try-catch |
| 可复用性 | 参数化配置 | 一次性脚本 | 模板化 |
| 安全合规 | 内置安全检查 | 无安全保障 | 无安全保障 |
| 适用场景 | OWASP Top 1 | 通用场景 | 通用场景 |
## 功能简介
- **自动化执行**: OWASP Top 1
- **文件处理**: 支持多种文件格式的读取、解析和写入操作
- **API集成**: 通过标准化接口调用外部服务并处理响应
- **命令执行**: 在安全沙箱中执行系统命令并收集结果
- **信息检索**: 快速搜索和过滤目标数据
Related skills
Handle external content as untrusted data, verify before use, and isolate inspection in sandboxed environments.
Help users with [FEATURE]: 工具操作前置安全校验(edit/write/shell 防护). Use when a user asks for creative-and-content, feature, edit, write, shell, or needs a practical...
元安全 —— 给 AI 智能体 / Agent 技能自身做「体检 + 加固建议」:按 提示注入防护 / 工具调用边界 / 数据隔离 三域,对安装的 skills、MCP 服务器、工具描述、权限与数据读取面做配置面静态加固扫描,输出加固报告与可执行防御守则(零依赖 Python 3.8+,扫描只读、敏感读取检测默认开启、报告用「类」表述、每次扫描默认留痕)。触发:用户要求给智能体或技能环境做安全体检 / 加固、检查 MCP 服务器或技能是否可信、排查提示注入 / 越权 / 数据泄露风险、想了解装了一堆技能后的整体暴露面;或用户说 元安全 / 加固 / 安全体检 / 体检 / hardening / 扫一下我的技能 / 检查 MCP / 防御守则 / guardrails 等。边界(Do NOT trigger):不产出可复制注入串 / 攻击 payload;只扫描用户自有、有权检查的目录与配置,不扫描无权访问的环境;不做运行时拦截(那是元盾);不做单个技能装前审核(那是元审 / 元信);不替代人工安全审计与最终决策。
使用场景: 用户要审计第三方 Agent Skill、检查 SKILL.md、安装前安全扫描,或评估提示注入、敏感数据、危险命令与供应链风险;需要 SKILLGUARD_API_KEY。
OpenClaw 安全扫描与防护技能:检查端口暴露、认证配置、插件安全、凭证管理,修复工信部2026年预警风险点。触发词:OpenClaw安全吗、帮我检查安全、扫描风险、工信部。