一段"完全合规"的代码,和一个危险的漏洞
先看一段代码:
@RestController
@RequestMapping("/api/order")
public class OrderController {
@GetMapping("/{id}")
public Order getOrder(@PathVariable String id) {
return orderRepo.findById(id).orElseThrow();
}
}
这段代码语法完全合规,没有SQL拼接,没有XSS输出,没有命中任何传统安全规则,任何一款SAST工具扫过,都会给出"通过"的结论。但它存在一个严重的安全漏洞:任何已登录用户只需要修改URL中的订单ID,就能访问别人的订单信息。
这就是越权漏洞,代码逻辑上没有"错",但业务安全上存在致命缺陷。
越权漏洞:应用安全的最大威胁面
越权漏洞的本质是"权限校验缺失"。系统在处理用户请求时,没有验证当前用户是否有权访问目标资源,导致用户可以越权操作不属于自己的数据或功能。
越权漏洞通常分为几类:
水平越权是最常见的一种:同一权限级别的用户A可以访问用户B的数据,比如查看他人订单、修改他人资料、获取他人账单。
垂直越权则是低权限用户执行了高权限操作,比如普通用户调用了管理员接口。
还有更隐蔽的业务逻辑越权:支付金额篡改、优惠券重复领取、短信接口轰炸、回调验签绕过,这些漏洞和具体业务强绑定,不存在通用的检测规则。
行业实测数据表明,越权类漏洞占应用安全漏洞的60%–70%,所有逻辑类漏洞的占比高达95%以上。换句话说,你的安全工具每年报出的几千条告警里,绝大多数是注入、XSS这类传统漏洞,而真正最常被攻击者利用、造成损失最大的那些漏洞,可能一条都没有报出来。
为什么SAST检不出越权?
要回答这个问题,需要先理解SAST的工作原理。
传统SAST的核心能力是"模式匹配"。它基于预定义的规则库,在代码中搜索特定的危险模式,比如SQL拼接(SQL注入风险)、未过滤的HTML输出(XSS风险)、不安全的反序列化调用等等。这些规则针对的是"语法层面的危险特征":代码中是否存在一个明确的危险函数调用,或者一条可控的数据流从不安全的输入到达了敏感的sink点。
但越权漏洞完全不在这一套逻辑里。回到开头的OrderController例子,这段代码没有任何危险函数调用,没有SQL拼接,没有HTML输出,数据流也是"正常"的。它的问题不在于"做了什么危险的事",而在于"没做一件该做的事":没有校验当前用户是否是这个订单的属主。
SAST无法理解"应该存在但缺失"的逻辑。它只能检测代码中"存在"的危险模式,无法判断代码中"缺少"了必要的业务校验。这是SAST在原理层面的盲区,不是规则数量的问题,你加再多规则,也无法穷举所有"应该校验但没有校验"的场景。
具体来说,SAST在越权检测上面临三重困难。
第一,越权判断依赖业务语义。
"这个接口是否应该校验用户身份",这个问题的答案不在代码语法里,而在业务规则里。一个订单查询接口需要校验属主,一个公开的商品列表接口不需要,SAST无法区分这两者,因为它不理解"订单"是私密数据、"商品列表"是公开信息。
第二,越权验证需要跨文件追踪。
权限校验逻辑往往不在Controller层,而是在拦截器、过滤器、AOP切面或者中间件里。SAST需要追踪完整的调用链,从请求入口到权限校验点到数据访问层,判断整条链路上是否存在有效的鉴权。一旦调用链跨越多个文件和模块,传统SAST的追踪能力就会大幅下降。
第三,越权漏洞的"攻击路径"需要语义推理。
要确认一个越权漏洞是否真实存在,需要理解:这个接口的输入是什么、数据从哪来、有没有经过权限校验、最终访问了什么资源。这一系列判断需要理解代码的业务含义,而不只是语法结构。
正确的解法:SAST做事实,AI做推理
既然SAST有盲区,纯AI又不够靠谱,成本爆炸、语义幻觉、全局视野缺失。那正确的路线是让两者协同:SAST负责精确构建代码的完整结构,AI负责在结构之上做语义级推理。各自的盲区正好是对方的舒适区。
泛联新安的Omni Security基于这个思路,用SAST底座构建精确的代码元数据,再由AI Agent在结构化事实之上做语义级推理。具体到越权检测,它的推理过程是这样的:
① PathVariable id是用户可控输入;
② 当前Controller路径上未发现owner == currentUser校验;
③ findById直接返回Order实体;
④ 任意已认证用户可访问任意订单。
输出:CWE-639 IDOR,置信度0.94。
同时自动生成PoC:curl /api/order/10086 -H "Authorization: attacker",直接证明漏洞可被触发。
这就是"检测+验证"的闭环:不是告诉你"这里可能有问题",而是给你一条可以直接执行的攻击路径,证明这个问题确实能被触发。
越权检测的实际效果
在某股份制银行的实测中,Omni Security当场对两个代码仓分别检出40+个越权风险,这些问题此前经过多轮人工渗透测试和传统SAST扫描,全部漏掉了。在PoC生成与验证方面,1050份测试报告中仅1份误报,Recall超过95%,单条检测成本仅$0.03。
从发现到修复
发现越权只是第一步。Omni Security的修复Agent会根据漏洞上下文直接生成修复代码,比如在水平越权场景中,自动在数据访问前插入属主校验逻辑,研发审阅后一键应用。同时,Skill机制允许安全团队将敏感接口清单、可信数据源等信息沉淀为配置,AI基于这些配置做检测,越用越贴合业务实际,误报持续降低。
越权漏洞不是新事物,但在AI加速攻击的今天,它的危害正在被放大。当攻击者用AI秒级发现并武器化每一处越权缺陷时,防守方如果还在靠人工渗透和传统规则做检测,这场不对称的较量结局已经可以预见。理解越权漏洞的本质、找到正确的检测方式,是每一个安全团队需要正视的问题。