Security Audit Toolkit技能使用说明
2026-03-26
新闻来源:网淘吧
围观:83
电脑广告
手机广告
安全审计
扫描、检测并修复代码库和基础设施中的安全问题。涵盖依赖项漏洞、敏感信息检测、OWASP十大安全风险、SSL/TLS验证、文件权限和安全编码模式。
使用时机
- 扫描项目依赖项中的已知漏洞
- 检测源代码中的硬编码密钥、API密钥或凭据
- 审查代码中的OWASP十大漏洞(注入、XSS、CSRF等)
- 验证端点的SSL/TLS配置
- 审计文件和目录权限
- 检查身份验证和授权模式
- 为安全审查或合规审计做准备
依赖项漏洞扫描
Node.js
# 内置 npm audit
npm audit
npm audit --json | jq '.vulnerabilities | to_entries[] | {name: .key, severity: .value.severity, via: .value.via[0]}'
# 在可能的情况下自动修复
npm audit fix
# 仅显示高和严重级别
npm audit --audit-level=high
# 检查特定包
npm audit --package-lock-only
# 替代方案:使用 npx 扫描而无需安装
npx audit-ci --high
Python
# pip-audit(推荐)
pip install pip-audit
pip-audit
pip-audit -r requirements.txt
pip-audit --format=json
# safety(替代方案)
pip install safety
safety check
safety check -r requirements.txt --json
# 检查特定包
pip-audit --requirement=- <<< "requests==2.25.0"
Go
# 内置漏洞检查器
go install golang.org/x/vuln/cmd/govulncheck@latest
govulncheck ./...
# 检查特定二进制文件
govulncheck -mode=binary ./myapp
Rust
# cargo-audit
cargo install cargo-audit
cargo audit
# 包含修复建议
cargo audit fix
通用:Trivy(可扫描任何项目)
# 安装:https://aquasecurity.github.io/trivy
# 扫描文件系统
trivy fs .
# 扫描特定语言
trivy fs --scanners vuln --severity HIGH,CRITICAL .
# 扫描 Docker 镜像
trivy image myapp:latest
# JSON 输出
trivy fs --format json -o results.json .
秘密检测
手动 grep 模式
# AWS 密钥
grep -rn 'AKIA[0-9A-Z]\{16\}' --include='*.{js,ts,py,go,java,rb,env,yml,yaml,json,xml,cfg,conf,ini}' .
# 通用 API 密钥和令牌
grep -rn -i 'api[_-]\?key\|api[_-]\?secret\|access[_-]\?token\|auth[_-]\?token\|bearer ' \
--include='*.{js,ts,py,go,java,rb,env,yml,yaml,json}' .
# 私钥
grep -rn 'BEGIN.*PRIVATE KEY' .
# 配置文件中的密码
grep -rn -i 'password\s*[:=]' --include='*.{env,yml,yaml,json,xml,cfg,conf,ini,toml}' .
# 包含凭据的连接字符串
grep -rn -i 'mongodb://\|mysql://\|postgres://\|redis://' --include='*.{js,ts,py,go,env,yml,yaml,json}' . | grep -v 'localhost\|127.0.0.1\|example'
# JWT 令牌 (由点分隔的三个 base64 段)
grep -rn 'eyJ[A-Za-z0-9_-]*\.eyJ[A-Za-z0-9_-]*\.' --include='*.{js,ts,py,go,log,json}' .
使用 git 进行自动化扫描
# 扫描 git 历史记录以查找秘密 (不仅仅是当前文件)
# 使用 git log + grep
git log -p --all | grep -n -i 'api.key\|password\|secret\|token' | head -50
# 提交前检查暂存文件
git diff --cached --name-only | xargs grep -l -i 'api.key\|password\|secret\|token' 2>/dev/null
用于检测秘密的预提交钩子
#!/bin/bash
# .git/hooks/pre-commit - 阻止包含潜在秘密的提交
PATTERNS=(
'AKIA[0-9A-Z]{16}'
'BEGIN.*PRIVATE KEY'
'password\s*[:=]\s*["\x27][^"\x27]+'
'api[_-]?key\s*[:=]\s*["\x27][^"\x27]+'
'sk-[A-Za-z0-9]{20,}'
'ghp_[A-Za-z0-9]{36}'
'xox[bpoas]-[A-Za-z0-9-]+'
)
STAGED_FILES=$(git diff --cached --name-only --diff-filter=ACM)
[ -z "$STAGED_FILES" ] && exit 0
EXIT_CODE=0
for pattern in "${PATTERNS[@]}"; do
matches=$(echo "$STAGED_FILES" | xargs grep -Pn "$pattern" 2>/dev/null)
if [ -n "$matches" ]; then
echo "BLOCKED: 检测到与模式匹配的潜在秘密:$pattern"
echo "$matches"
EXIT_CODE=1
fi
done
if [ $EXIT_CODE -ne 0 ]; then
echo ""
echo "如需继续,请执行:git commit --no-verify"
echo "如需移除秘密:请替换为环境变量"
fi
exit $EXIT_CODE
.gitignore 审计
# 检查敏感文件是否被跟踪
echo "--- 可能应该被 gitignore 的文件 ---"
for pattern in '.env' '.env.*' '*.pem' '*.key' '*.p12' '*.pfx' 'credentials.json' \
'service-account*.json' '*.keystore' 'id_rsa' 'id_ed25519'; do
found=$(git ls-files "$pattern" 2>/dev/null)
[ -n "$found" ] && echo " 已跟踪:$found"
done
# 检查 .gitignore 是否存在并包含常见模式
if [ ! -f .gitignore ]; then
echo "警告:未找到 .gitignore 文件"
else
for entry in '.env' 'node_modules' '*.key' '*.pem'; do
grep -q "$entry" .gitignore || echo " .gitignore 中缺失:$entry"
done
fi
OWASP Top 10 代码模式
1. 注入(SQL、命令、LDAP)
# SQL注入:查询中的字符串拼接
grep -rn "query\|execute\|cursor" --include='*.{py,js,ts,go,java,rb}' . | \
grep -i "f\"\|format(\|%s\|\${\|+ \"\|concat\|sprintf" | \
grep -iv "parameterized\|placeholder\|prepared"
# 命令注入:shell命令中的用户输入
grep -rn "exec(\|spawn(\|system(\|popen(\|subprocess\|os\.system\|child_process" \
--include='*.{py,js,ts,go,java,rb}' .
# 检查参数化查询(良好实践)
grep -rn "\\$[0-9]\|\\?\|%s\|:param\|@param\|prepared" --include='*.{py,js,ts,go,java,rb}' .
2. 失效的身份认证
# 弱密码哈希(对密码使用MD5、SHA1)
grep -rn "md5\|sha1\|sha256" --include='*.{py,js,ts,go,java,rb}' . | grep -i "password\|passwd"
# 硬编码凭据
grep -rn -i "admin.*password\|password.*admin\|default.*password" \
--include='*.{py,js,ts,go,java,rb,yml,yaml,json}' .
# URL中的会话令牌
grep -rn "session\|token\|jwt" --include='*.{py,js,ts,go,java,rb}' . | grep -i "url\|query\|param\|GET"
# 检查认证端点的速率限制
grep -rn -i "rate.limit\|throttle\|brute" --include='*.{py,js,ts,go,java,rb}' .
3. 跨站脚本攻击
# 模板中未转义的输出
grep -rn "innerHTML\|dangerouslySetInnerHTML\|v-html\|\|html(" \
--include='*.{js,ts,jsx,tsx,vue,html}' .
# 模板注入
grep -rn "{{{.*}}}\|<%=\|<%-\|\$\!{" --include='*.{html,ejs,hbs,pug,erb}' .
# Document.write
grep -rn "document\.write\|document\.writeln" --include='*.{js,ts,html}' .
# 使用用户输入的eval
grep -rn "eval(\|new Function(\|setTimeout.*string\|setInterval.*string" \
--include='*.{js,ts}' .
4. 不安全的直接对象引用
# 路由中直接使用ID而未进行授权检查
grep -rn "params\.id\|params\[.id.\]\|req\.params\.\|request\.args\.\|request\.GET\." \
--include='*.{py,js,ts,go,java,rb}' . | \
grep -i "user\|account\|profile\|order\|document"
5. 安全配置错误
# CORS通配符
grep -rn "Access-Control-Allow-Origin.*\*\|cors({.*origin.*true\|cors()" \
--include='*.{py,js,ts,go,java,rb}' .
# 生产配置中的调试模式
grep -rn "DEBUG\s*=\s*True\|debug:\s*true\|NODE_ENV.*development" \
--include='*.{py,js,ts,yml,yaml,json,env}' .
# 暴露给客户端的详细错误信息
grep -rn "stack\|traceback\|stackTrace" --include='*.{py,js,ts,go,java,rb}' . | \
grep -i "response\|send\|return\|res\."
SSL/TLS 验证
检查端点 SSL
# 完整 SSL 检查
openssl s_client -connect example.com:443 -servername example.com < /dev/null 2>/dev/null | \
openssl x509 -noout -subject -issuer -dates -fingerprint
# 检查证书过期时间
echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null | \
openssl x509 -noout -enddate
# 检查支持的 TLS 版本
for v in tls1 tls1_1 tls1_2 tls1_3; do
result=$(openssl s_client -connect example.com:443 -$v < /dev/null 2>&1)
if echo "$result" | grep -q "Cipher is"; then
echo "$v: 支持"
else
echo "$v: 不支持"
fi
done
# 检查密码套件
openssl s_client -connect example.com:443 -cipher 'ALL' < /dev/null 2>&1 | \
grep "Cipher :"
# 检查弱密码
openssl s_client -connect example.com:443 -cipher 'NULL:EXPORT:DES:RC4:MD5' < /dev/null 2>&1 | \
grep "Cipher :"
验证证书链
# 下载并验证完整链
openssl s_client -connect example.com:443 -showcerts < /dev/null 2>/dev/null | \
awk '/BEGIN CERTIFICATE/,/END CERTIFICATE/{print}' > chain.pem
# 验证链
openssl verify -CAfile /etc/ssl/certs/ca-certificates.crt chain.pem
# 检查证书详情
openssl x509 -in chain.pem -noout -text | grep -A2 "Subject:\|Issuer:\|Not Before\|Not After\|DNS:"
从代码中检查 SSL
# 验证代码中未禁用 SSL
grep -rn "verify\s*=\s*False\|rejectUnauthorized.*false\|InsecureSkipVerify.*true\|CURLOPT_SSL_VERIFYPEER.*false\|NODE_TLS_REJECT_UNAUTHORIZED.*0" \
--include='*.{py,js,ts,go,java,rb,yml,yaml}' .
文件权限审计
# 查找全局可写文件
find . -type f -perm -o=w -not -path '*/node_modules/*' -not -path '*/.git/*' 2>/dev/null
# 查找不应为可执行的文件
find . -type f -perm -u=x -not -name '*.sh' -not -name '*.py' -not -path '*/node_modules/*' \
-not -path '*/.git/*' -not -path '*/bin/*' 2>/dev/null
# 检查敏感文件权限
for f in .env .env.* *.pem *.key *.p12 id_rsa id_ed25519; do
[ -f "$f" ] && ls -la "$f"
done
# 查找设置了 SUID/SGID 位的文件 (Linux)
find / -type f \( -perm -4000 -o -perm -2000 \) 2>/dev/null | head -20
# 检查 SSH 密钥权限
if [ -d ~/.ssh ]; then
echo "--- SSH 目录权限 ---"
ls -la ~/.ssh/
echo ""
# 应为: 目录=700, 私钥=600, 公钥=644, 配置文件=600
[ "$(stat -c %a ~/.ssh 2>/dev/null || stat -f %Lp ~/.ssh)" != "700" ] && echo "警告: ~/.ssh 应为 700"
fi
完整项目安全审计脚本
#!/bin/bash
# security-audit.sh - 对项目进行全面的安全检查
set -euo pipefail
PROJECT_DIR="${1:-.}"
cd "$PROJECT_DIR"
echo "========================================="
echo "安全审计: $(basename "$(pwd)")"
echo "日期: $(date -u '+%Y-%m-%dT%H:%M:%SZ')"
echo "========================================="
echo ""
ISSUES=0
warn() { echo " [!] $1"; ((ISSUES++)); }
ok() { echo " [OK] $1"; }
section() { echo ""; echo "--- $1 ---"; }
# 1. 密钥检测
section "密钥检测"
for pattern in 'AKIA[0-9A-Z]\{16\}' 'BEGIN.*PRIVATE KEY' 'sk-[A-Za-z0-9]\{20,\}' \
'ghp_[A-Za-z0-9]\{36\}' 'xox[bpoas]-'; do
count=$(grep -rn "$pattern" --include='*.{js,ts,py,go,java,rb,env,yml,yaml,json,xml}' . 2>/dev/null | \
grep -v 'node_modules\|\.git\|vendor\|__pycache__' | wc -l)
if [ "$count" -gt 0 ]; then
warn "发现 $count 个匹配项,模式为: $pattern"
fi
done
grep -rn -i 'password\s*[:=]\s*["'"'"'][^"'"'"']*["'"'"']' \
--include='*.{js,ts,py,go,yml,yaml,json,env}' . 2>/dev/null | \
grep -v 'node_modules\|\.git\|example\|test\|mock\|placeholder\|changeme\|xxxx' | \
while read -r line; do warn "硬编码密码: $line"; done
# 2. 依赖项审计
section "依赖项漏洞"
if [ -f package-lock.json ] || [ -f package.json ]; then
npm audit --audit-level=high 2>/dev/null && ok "npm: 无高/严重漏洞" || warn "npm audit 发现问题"
fi
if [ -f requirements.txt ]; then
pip-audit -r requirements.txt 2>/dev/null && ok "pip: 无已知漏洞" || warn "pip-audit 发现问题"
fi
if [ -f go.sum ]; then
govulncheck ./... 2>/dev/null && ok "Go: 无已知漏洞" || warn "govulncheck 发现问题"
fi
# 3. Gitignore 检查
section ".gitignore 覆盖范围"
if [ ! -f .gitignore ]; then
warn "没有 .gitignore 文件"
else
for entry in '.env' 'node_modules' '*.key' '*.pem' '.DS_Store'; do
grep -q "$entry" .gitignore 2>/dev/null && ok ".gitignore 包含 $entry" || warn ".gitignore 缺少: $entry"
done
fi
# 4. SSL 验证禁用
section "SSL 验证"
disabled=$(grep -rn "verify\s*=\s*False\|rejectUnauthorized.*false\|InsecureSkipVerify.*true" \
--include='*.{py,js,ts,go,java,rb}' . 2>/dev/null | \
grep -v 'node_modules\|\.git\|test\|spec\|mock' | wc -l)
[ "$disabled" -gt 0 ] && warn "在 $disabled 个位置禁用了 SSL 验证" || ok "未发现 SSL 绕过"
# 5. CORS 通配符
section "CORS 配置"
cors=$(grep -rn "Access-Control-Allow-Origin.*\*\|cors({.*origin.*true" \
--include='*.{py,js,ts,go,java,rb}' . 2>/dev/null | \
grep -v 'node_modules\|\.git' | wc -l)
[ "$cors" -gt 0 ] && warn "在 $cors 个位置发现 CORS 通配符" || ok "未发现 CORS 通配符"
# 6. 调试模式
section "调试/开发设置"
debug=$(grep -rn "DEBUG\s*=\s*True\|debug:\s*true" \
--include='*.{py,yml,yaml,json}' . 2>/dev/null | \
grep -v 'node_modules\|\.git\|test\|jest\|vitest' | wc -l)
[ "$debug" -gt 0 ] && warn "在 $debug 个位置启用了调试模式" || ok "未发现调试标志"
echo ""
echo "========================================="
echo "审计完成。发现的问题数: $ISSUES"
echo "========================================="
[ "$ISSUES" -eq 0 ] && exit 0 || exit 1
安全编码快速参考
使用环境变量代替硬编码的密钥
# 错误做法:在源代码中硬编码
API_KEY="sk-abc123..."
# 正确做法:从环境变量获取
API_KEY="${API_KEY:?错误:未设置 API_KEY}"
# 正确做法:从 .env 文件获取(启动时加载,永不提交)
# .env
API_KEY=sk-abc123...
# .gitignore
.env
输入验证清单
- [ ] 所有用户输入均已验证(类型、长度、格式)
- [ ] SQL查询使用参数化语句(避免字符串拼接)
- [ ] shell命令绝不直接包含用户输入
- [ ] 文件路径已验证(无路径遍历:../)
- [ ] URL已验证(无SSRF:限制访问预期域名)
- [ ] HTML输出已转义(无XSS:使用框架自动转义)
- [ ] JSON解析包含错误处理(对畸形输入不会导致崩溃)
- [ ] 文件上传已检查(类型、大小、无可执行内容)
HTTP安全头部
# 检查URL的安全头部
curl -sI https://example.com | grep -i 'strict-transport\|content-security\|x-frame\|x-content-type\|referrer-policy\|permissions-policy'
# 预期头部:
# Strict-Transport-Security: max-age=31536000; includeSubDomains
# Content-Security-Policy: default-src 'self'
# X-Frame-Options: DENY
# X-Content-Type-Options: nosniff
# Referrer-Policy: strict-origin-when-cross-origin
# Permissions-Policy: camera=(), microphone=(), geolocation=()
提示
- 运行
npm 审计/pip 审计/govulncheck在每次拉取请求的 CI 中运行,而不仅仅是偶尔运行。 - Git 历史中的秘密检测很重要:即使秘密已从 HEAD 中删除,它仍存在于 Git 历史中。使用
git filter-branch或git-filter-repo进行清除,然后轮换凭据。 - 最危险的漏洞往往是最简单的:通过字符串拼接导致的 SQL 注入,通过未净化的输入导致的命令注入,通过
innerHTML导致的 XSS。 - CORS
Access-Control-Allow-Origin: *对于真正公开、只读的 API 是安全的。对于任何使用 cookie 或身份验证令牌的情况,它都是危险的。 - 在生产环境中始终验证 SSL。
verify=False或rejectUnauthorized: false只应出现在测试代码中,绝不应出现在生产路径中。 - 纵深防御:验证输入、转义输出、使用参数化查询、实施最小权限原则,并假设每一层都可能被绕过。
文章底部电脑广告
手机广告位-内容正文底部
上一篇:finance技能使用说明
下一篇:Feishu Bridge技能使用说明


微信扫一扫,打赏作者吧~