网淘吧来吧,欢迎您!

返回首页 微信
微信
手机版
手机版

Security Audit Toolkit技能使用说明

2026-03-26 新闻来源:网淘吧 围观:84
电脑广告
手机广告

安全审计

扫描、检测并修复代码库和基础设施中的安全问题。涵盖依赖项漏洞、敏感信息检测、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-branchgit-filter-repo进行清除,然后轮换凭据。
  • 最危险的漏洞往往是最简单的:通过字符串拼接导致的 SQL 注入,通过未净化的输入导致的命令注入,通过innerHTML导致的 XSS。
  • CORSAccess-Control-Allow-Origin: *对于真正公开、只读的 API 是安全的。对于任何使用 cookie 或身份验证令牌的情况,它都是危险的。
  • 在生产环境中始终验证 SSL。verify=FalserejectUnauthorized: false只应出现在测试代码中,绝不应出现在生产路径中。
  • 纵深防御:验证输入、转义输出、使用参数化查询、实施最小权限原则,并假设每一层都可能被绕过。

天猫隐藏优惠券

网淘吧

免责申明
部分文章来自各大搜索引擎,如有侵权,请与我联系删除。
打赏
文章底部电脑广告
手机广告位-内容正文底部

相关文章

您是本站第278603名访客 今日有68篇新文章/评论