核心目标:构建一个能够自动检测代码安全漏洞、减少安全风险、提高代码安全质量的AI Skill。通过模式匹配、静态分析和上下文理解,在代码开发阶段主动发现问题并提供修复建议,将安全左移,降低修复成本。
一、安全审计Skill的设计
安全审计Skill是整个安全体系的基础模块,其设计哲学是"自动发现、智能分析、精准修复"。与传统的静态应用安全测试(SAST)工具不同,AI驱动的安全审计Skill不仅能识别已知漏洞模式,还能通过上下文理解发现逻辑层面的安全问题,并且可以为每个发现的问题生成可操作的修复建议。
在设计安全审计Skill时,需要从以下几个维度构建能力:
自动检测引擎
基于规则匹配和AI理解的混合检测策略,覆盖OWASP Top 10等常见安全威胁。
上下文分析
不只看单行代码,而是分析数据流、控制流和调用链,发现复杂的逻辑漏洞。
修复建议生成
为每个检测到的问题自动生成经过验证的安全修复代码示例。
报告汇总
按漏洞类型和风险等级分类汇总,提供清晰的审计报告和修复优先级。
Skill的工作流程一般包括:代码输入解析、安全规则匹配、上下文验证、误报过滤、风险评级、修复建议生成、审计报告输出。整个流程应尽可能自动化,减少人工干预的同时保证检测精度。
二、常见Web安全漏洞检测
Web安全漏洞是安全审计中最核心的检测领域。以下是在构建安全审计Skill时需要重点覆盖的漏洞类型及其检测方法。
1. SQL注入检测
SQL注入是最经典的Web安全漏洞,其本质是将用户输入直接拼接到SQL查询语句中。安全审计Skill需要检测字符串拼接构建SQL的模式,并推荐使用参数化查询。
// 不安全的写法 -- 应被检测
String query = "SELECT * FROM users WHERE id = " + userId;
// 安全的写法 -- 应被推荐
String query = "SELECT * FROM users WHERE id = ?";
PreparedStatement ps = conn.prepareStatement(query);
ps.setString(1, userId);
检测重点:检测所有数据库操作代码中是否存在字符串拼接SQL的模式。包括但不限于:JDBC中的+" "+拼接、ORM框架中的原生SQL拼接、MyBatis XML中的${}占位符使用(应使用#{})。
2. XSS(跨站脚本)检测
XSS漏洞发生在用户输入未经过滤直接输出到页面时。安全审计Skill需要检测所有输出点,确认是否进行了充分的转义处理。
// 不安全的写法 -- 直接输出用户输入
out.println("<div>" + userComment + "</div>");
// 安全的写法 -- HTML转义后输出
out.println("<div>" + StringEscapeUtils.escapeHtml4(userComment) + "</div>");
检测覆盖:反射型XSS(URL参数直接输出)、存储型XSS(用户数据存入数据库后在其他页面展示)、DOM型XSS(前端JavaScript操作DOM时的安全风险)。对于前端框架(React/Vue/Angular),还需检测dangerouslySetInnerHTML、v-html等危险API的使用。
3. CSRF(跨站请求伪造)检测
CSRF漏洞利用用户已登录的身份,诱导用户执行非本意的操作。安全审计Skill需要检查所有状态变更请求是否包含有效的CSRF Token验证。
// 检测清单:
1. POST/PUT/DELETE等状态变更请求是否包含CSRF Token
2. Token是否与用户会话绑定且不可预测
3. SameSite Cookie属性是否设置为Lax或Strict
4. 是否存在CORS配置过于宽松的问题
4. SSRF(服务端请求伪造)检测
SSRF漏洞允许攻击者诱导服务器向内部网络发起请求,可能导致内网信息泄露。安全审计Skill需要检测所有服务端发起的URL请求。
检测要点:检查代码中是否存在接收用户输入的URL并直接通过HTTP客户端(如HttpURLConnection、RestTemplate、HttpClient等)发起请求的模式。安全的做法是配置白名单域名/IP列表,或对用户输入的URL进行严格的协议和主机校验。
5. 路径遍历检测
路径遍历漏洞允许攻击者通过../等特殊字符访问服务器上的任意文件。安全审计Skill需要检测文件路径拼接操作。
// 不安全的写法 -- 直接拼接用户输入的文件路径
File file = new File("/var/data/" + fileName);
// 安全的写法 -- 规范化后校验路径
String basePath = "/var/data/";
String canonicalPath = new File(basePath, fileName).getCanonicalPath();
if (!canonicalPath.startsWith(new File(basePath).getCanonicalPath())) {
throw new SecurityException("非法路径访问");
}
三、认证和授权审计
认证和授权是应用安全的第一道防线。安全审计Skill需要从多个维度审查认证和授权逻辑的正确性和安全性。
1. 硬编码密码和密钥检测
代码中硬编码的密码、密钥、Token等敏感信息是严重的安全隐患。安全审计Skill需要检测常见的硬编码模式,包括直接在字符串中写密码、Base64编码后仍可识别的密钥、以及注释中残留的凭据信息。
注意:除了显式的密码字段外,还需检测私钥文件内容、OAuth Client Secret、API Key、JWT Signing Key、数据库连接字符串中的明文密码等。所有凭据应使用环境变量或密钥管理服务(Vault/AWS Secrets Manager)存储。
2. 弱密码策略检查
检查用户注册和密码修改逻辑中是否实施了严格的密码策略。包括密码最小长度、复杂度要求(大小写字母+数字+特殊字符)、常见弱密码黑名单检查、密码历史记录防止重复使用。
3. 会话管理安全
会话管理是Web应用安全的核心环节。安全审计Skill需要审查以下方面:
- 会话Token是否使用安全的随机数生成器创建
- Token过期时间是否设置合理(避免过长的有效期)
- 登出时是否正确销毁会话(清除服务端和客户端Token)
- 密码修改后是否强制要求重新登录
- 会话固定攻击防护是否到位
4. 权限越界检查
权限越界漏洞(Broken Access Control)是最常见的安全问题之一。安全审计Skill需要检测:用户能否访问不属于自己的资源(水平越权)、普通用户能否执行管理员操作(垂直越权)。
// 不安全的写法 -- 只检查用户是否登录,未验证资源所有权
public Order getOrder(Long orderId) {
return orderRepository.findById(orderId); // 缺少 currentUserId 验证
}
// 安全的写法 -- 验证资源所有权
public Order getOrder(Long orderId, Long currentUserId) {
Order order = orderRepository.findById(orderId);
if (!order.getUserId().equals(currentUserId)) {
throw new AccessDeniedException("无权访问该订单");
}
return order;
}
5. 缺乏访问控制检查
检测是否存在API端点或方法缺少权限注解/拦截器配置。常见的模式包括:Controller方法缺少@PreAuthorize注解、Spring Security配置中遗漏了URL保护规则、管理员接口未做角色验证等。
四、敏感信息泄露检测
敏感信息泄露可能导致严重的数据安全事件。安全审计Skill需要系统性地检测可能泄露敏感信息的各种途径。
1. API Key和Token泄露检测
检测代码中是否存在暴露的API密钥、访问令牌、数据库凭据等。这包括源代码文件、配置文件、日志文件、版本控制历史等多个载体。
// 应被检测的模式:
- 正则匹配常见API Key格式:sk-[a-zA-Z0-9]{20,}(OpenAI Key等)
- Base64解码后包含敏感关键词的字符串
- 硬编码的JWT Token
- .env、.config等文件中未忽略的敏感配置
- 提交到Git仓库中的credentials文件
2. 日志中的敏感信息输出
安全审计Skill需要检测日志语句中是否存在输出敏感字段的情况。常见的风险包括:日志中打印用户密码、身份证号、银行卡号、Token、Session ID等。
最佳实践:所有日志框架(Log4j、Logback、SLF4J等)的输出都应经过脱敏处理。可以配置自定义的Converter或Layout,自动将敏感字段替换为[REDACTED]标记。建议在审计规则中加入敏感字段名称的白名单检查(如password、token、secret、credential等关键词)。
3. 配置文件泄露风险
检查项目中的配置文件是否包含敏感信息,以及配置文件本身是否被正确保护。重点关注:
- application.properties/yml中是否存在明文密码
- .gitignore是否正确忽略了敏感配置文件
- Dockerfile和docker-compose.yml中是否硬编码了环境变量值
- CI/CD配置文件中是否包含明文凭据
4. 错误信息泄露堆栈检查
生产环境不应将详细的异常堆栈信息直接暴露给用户。安全审计Skill需要检测:异常处理是否使用了通用的错误页面而非详细的技术错误信息、REST API的异常处理器是否返回了详细的堆栈跟踪而非简洁的错误码。
修复建议:在全局异常处理器中,对外返回统一的错误响应(仅包含错误码和通用提示),将详细的异常信息记录到服务端日志中。同时检查是否在响应头中泄露了服务器版本信息(如Server: Apache/2.4.51)。
五、第三方依赖安全
现代应用开发高度依赖第三方库和框架,第三方依赖的安全问题已成为最大的攻击面之一。安全审计Skill需要覆盖依赖安全的多个方面。
1. 已知漏洞依赖检测(CVE匹配)
安全审计Skill应集成已知漏洞库(如NVD/CVE数据库),自动检查项目依赖的版本号是否匹配已知漏洞。
// 检测逻辑伪代码
for each dependency in project.dependencies:
vulns = cveDatabase.search(dependency.name, dependency.version)
if vulns is not empty:
report(vulns, severity=HIGH)
suggestFix(findSafeVersion(dependency.name, dependency.version))
集成建议:可以集成OWASP Dependency-Check、Snyk、GitHub Dependabot等工具的检测规则。对于Java项目检查pom.xml/build.gradle,对于Node.js项目检查package.json/yarn.lock,对于Python项目检查requirements.txt/Pipfile.lock。
2. 过时的不安全库版本检测
即使没有已知的CVE漏洞,使用过时的库版本也可能存在安全隐患。安全审计Skill应检查依赖版本是否为当前主分支的最新稳定版,以及是否低于项目设定的最低版本要求。特别关注那些已停止维护(EOL)的框架版本,如AngularJS、Python 2.x、Node.js 12.x等。
3. eval/exec等危险函数检查
动态执行代码的函数本身就是巨大的安全风险。安全审计Skill需要检测代码中是否使用了eval()、exec()、setTimeout(string)、Function() constructor、动态require/import等危险函数。
// JavaScript危险函数检测
eval(userInput); // 高危:直接执行用户输入的代码
setTimeout("alert(" + name + ")", 1000); // 高危:字符串形式的setTimeout
new Function("return " + data); // 高危:动态创建函数
require(userInputPath); // 高危:动态加载模块
// Python危险函数检测
exec(userInput); // 高危:执行任意Python代码
eval(userInput); // 高危:执行任意Python表达式
pickle.loads(remoteData); // 高危:反序列化任意对象
__import__(userInput); // 高危:动态导入模块
4. 不安全编码实践检查
除了以上具体问题外,安全审计Skill还应关注一些通用的不安全编码实践:
- 不安全的反序列化:Java ObjectInputStream、Python pickle、PHP unserialize等
- 不安全的加密算法使用:MD5用于密码存储、DES/AES-ECB模式、固定的IV向量
- 不正确的随机数使用:使用Math.random()而非SecureRandom生成安全Token
- 不安全的文件上传:未校验文件类型、未限制文件大小、文件存储在Web可访问目录
- 命令注入:Runtime.exec()中使用用户输入拼接命令行
总结:安全审计Skill的核心价值在于将安全专业知识转化为可自动执行的检测规则,结合AI的上下文理解能力,在开发过程中主动发现并修复安全问题。通过系统化的安全审计,团队可以从被动响应安全事件转变为主动预防安全风险,真正实现"安全左移"的DevSecOps理念。