为什么注入攻击从2017年的第1名掉到2025年的第5名,而失效的访问控制从第5名升到2021年的第1名,到2025年还是第1名?
这是作者本人的观点,不是OWASP的官方结论。差别在于:注入拿到了通用防御手段——参数化查询、ORM和框架默认配置,让最常见的注入形式很难再被误触发。
访问控制没法用同样的方式解决。“谁可以对什么做什么”是一个高度具体的问题,每个平台的处理方式都不一样。没有哪个库知道你的规则,扫描器也不知道某个检查本该存在,自然无法判断它缺失了。
所以它一直隐形,直到出事。而安全预算往往跟着泄露事件走。
Capital One的账单
2019年,攻击者穿过一道配置错误的防火墙(广泛报道为SSRF,OWASP 2025年报告已把这一缺陷并入访问控制类别),拿到了该防火墙云角色的密钥,进而打开了大量存储数据的大门。
监管机构对该银行处以罚款,董事会不得不提交一份整改风险管理的计划。
一个案例证明不了什么,但它提醒人们:一个权限过宽的身份能造成多大破坏。
两点说明。排名是相对的,这不能证明注入消失了,只能说明它不再是头号问题,而访问控制仍然是。另外,2025年版把SSRF并入了这一类别,范围被拓宽,但访问控制在2021年就已经是第1名。
OWASP的建议
防护建议是默认拒绝,并使用一套集中式的访问控制机制,而不是把逻辑散落在各个处理程序里。
没有工具能知道你的规则,但它们可以提供放置规则的地方。团队的做法通常有几种:共享库、身份令牌中的角色、数据库行级安全、云IAM。
下面用一个虚构的足球俱乐部,梳理专用授权引擎的常见路径。门卫就是工具,区别只在于门卫从哪里拿到事实。
三种给门卫递事实的方式
方式一:季票持有者名单。门卫手里有一份短名单——爱丽丝持有季票,季票可入场联赛和杯赛。她来看联赛,门卫沿着“爱丽丝→季票→联赛”的线索走,放行。几天后她来看欧联杯,季票不覆盖,线索断了,请回售票处。
这就是谷歌Zanzibar的思路:把小事实放在名单上,然后沿着线索走。技术名称是关系元组和图检查。谷歌2019年的论文描述Zanzibar服务于日历、云、Drive、地图、相册和YouTube,扩展到数万亿条访问控制列表和每秒数百万次请求。
难点在于让每道门卫手里的名单保持最新。爱丽丝的票在5点59分被取消,消息只传到部分门卫,6点时拿着旧名单的门卫仍会放她进去。Zanzibar的规则是:当你查询刚更新过的内容时,答案必须来自不早于该次更新的名单,这一规则通过名为zookie的令牌强制执行。
优点是适配嵌套、共享的对象,比如团队、文件夹和分享链接。代价是名单本身就是“谁和谁相连”的记录,应用必须和自己的数据库同步维护,两边不一致就会做出错误判断。相关工具包括OpenFGA、SpiceDB、Ory Keto、Permify、Warrant。
方式二:规则手册。门卫没有名单,只有规则:持票人可免费带一名7岁以下儿童;开赛前90分钟开门。爱丽丝提前一小时带6岁孩子到场,门卫核对票是否有效、孩子多大、现在几点,全部通过,两人入场。下一场她带9岁孩子,超过7岁,需要单独购票,同样的成年人,答案不同。如果她提前3小时到,门还没开。
门卫什么都不记,每个答案都来自眼前的信息,用一次就忘。真实系统里,是你的应用去查这些信息,从自己的数据库取出票和年龄,每次提问时一并交给引擎。
优点是依赖当下时刻的规则容易写,应用仍是记录源头,没有副本需要同步。代价是门卫只知道被展示的内容,年龄或票给错了,答案就错了,应用每次都必须传对事实。规则本身也需要版本管理和发布。相关工具包括Cerbos、Cedar。
方式三:规则手册加一份剪贴板副本。门卫用同一本规则手册,但不等着被展示事实,而是保留一份售票处记录的副本,对照着查。决策很快,因为一切都在手边。
问题在于副本会过期。球迷5点59分买了票,6点门卫的剪贴板上还没有,人被拒之门外。优点是决策使用本地已有数据,每次检查无需再取。代价是副本可能滞后,且必须有东西负责更新它。相关工具包括OPA加OPAL、Topaz(社区维护)。
关于OPA需要补充一句:它本质上是门卫,不是方式。取决于你如何向它提供事实,OPA也可以按方式二工作。
非人类身份的清账问题
足球例子里门卫只检查人,但现实中大量访客不是人类:服务账号、API密钥、构建机器人、AI代理。三种方式对它们同样适用,因为门卫不关心是谁在请求访问。区别在于清理。员工离职时,有人会关掉他的权限;机器人所在项目结束时,没人做这件事,它的访问往往一直有效。
OWASP针对非人类身份的独立Top 10,把这一点列为第1名,名称是“不当离职处理”。
选哪种,取决于你愿意背哪种成本
三种方式都不知道你的规则,规则仍然要你自己写。区别只在于门卫去哪里查事实:一份名单、门口当场出示的信息,还是手边的一份副本。所以选择实际上是选择承担哪种成本:
- 保持名单同步;
- 每次检查都传对事实;
- 接受一份可能滞后的副本。
没有哪个工具的工作方式完全相同,选型时要看具体实现和取舍。但具体选哪个,不如先做出选择本身。访问控制之所以在这么多应用里反复出现,是因为在东西坏掉之前,没人必须回答“谁可以对什么做什么”,而预算往往在泄露之后才到。
把决策放在一个地方,默认拒绝,在代价还低的时候把这场对话进行掉。
热门跟贴