博客

Coders Conquer Security OWASP API 安全十大风险系列 - 失效的对象级授权

September 9, 2020
Matias Madou 博士

如今的网络安全威胁无处不在且持续不断。情况已经变得非常严峻,以至于在程序部署后才去应对这些威胁几乎是不可能的。然而,在当今 DevSecOps、持续交付以及数据价值空前高涨的时代,精明的组织正在帮助他们的开发人员提升技能,使其成为具备安全意识的超级人才,从而在漏洞进入生产环境之前就将其消除。我们已经探讨过 Web 漏洞,以及我们自己的 Top 8 基础设施即代码 缺陷,现在是时候了解下一个重大的软件安全挑战了。准备好了吗?

接下来的系列博客将重点关注一些与应用程序编程接口(API)相关的最严重的安全性缺陷。这些缺陷非常严重,已被列入开放式 Web 应用程序安全项目(OWASP)的 API 顶级漏洞列表。鉴于 API 对现代计算基础设施的重要性,这些是您必须不惜一切代价防止出现在您的应用程序和程序中的关键问题。

失效的对象级别授权漏洞是为何必须通过代码来强制执行安全性的一个完美例证。当程序员未能明确定义哪些用户可以查看对象和数据,或者未能提供任何形式的验证来查看、更改或执行其他操作以操纵或访问对象时,就会发生这种情况,从而允许攻击者通过 API 端点修改和访问对象及数据。API 端点是一个连接点(通常是 URL),用于 API 本身与另一个系统之间的通信。应用程序之间的连接能力提升了世界上一些最受欢迎的软件,但如果端点不够严密,就会面临暴露多个端点的风险。

当程序员忘记或继承了父类的属性,却未意识到这样做也会导致代码中缺失关键的验证过程时,也可能发生这种情况。通常,对于每一个使用用户输入来访问数据源的函数,都应包含对象级别授权检查。

认为自己已经熟悉这些内容,并且现在就能找到、修复并消除访问控制漏洞了吗?来挑战一下游戏化练习吧:

表现如何?如果您想提升分数,请继续阅读!

失效的对象级别授权漏洞有哪些示例?

对象级别访问控制漏洞允许攻击者执行他们本不应被允许的操作。这可能是本应仅限管理员执行的操作,例如访问或查看敏感数据,或销毁记录。在高度安全的环境中,这甚至可能意味着除非获得明确授权,否则禁止任何人查看记录。
在定义对象级别授权时,您应考虑所有可能的操作。例如,在 Java Spring API 中,一个存在潜在问题的端点可能如下所示:

public boolean deleteOrder(Long id) {
       Order order = orderRepository.getOne(id);
       if (order == null) {
           log.info("No found order");
           return false;
       }
       User user = order.getUser();
       orderRepository.delete(order);
       log.info("Delete order for user {}", user.getId());
       return true;

该 API 端点通过 ID 删除订单,但并未验证该订单是否由当前登录用户创建。这为攻击者利用此漏洞删除其他用户的订单提供了机会。

为了正确实施安全的访问限制,代码应更像这样:

public boolean deleteOrder(Long id) {
       User user = userService.getUserByContext();
       boolean orderExist = getUserOrders().stream()
               .anyMatch(order -> (order.getId() == id));
       if (orderExist) {
           orderRepository.deleteById(id);
           log.info("Delete order for user {}", user.getId());
           return true;
       } else {
           log.info("No found order");
           return false;

消除失效的对象级别授权漏洞

访问控制代码无需过于复杂。以我们的 Java Spring API 环境示例为例,通过严格定义谁可以访问对象即可修复此问题。

首先,必须实施验证过程以识别是谁在发起请求:

User user = userService.getUserByContext();

接下来,我们必须确保对象 ID 存在且属于发起请求的用户:

boolean orderExist = getUserOrders().stream()
               .anyMatch(order -> (order.getId() == id));

最后,我们执行删除对象的操作:

orderRepository.deleteById(id);

请务必确保代码中的授权方式符合贵组织的各项用户策略及数据访问控制要求。为确保代码具备充分的安全性,您应进行相关检查,验证不同权限级别的用户是否仅能访问其工作所需的数据,同时防止其查看或修改任何受限内容。此举有助于发现那些被意外忽略的对象控制漏洞。

这些示例的核心要点在于:首先定义用户对对象可执行的所有操作,然后直接在代码中添加严格的访问控制。最后,切勿依赖继承的父级属性来完成此项工作,也不要将该权限委托给其他地方。相反,应针对每个需要保护的对象类型,在代码中明确定义用户权限和操作。

请查看 Secure Code Warrior 博客页面,深入了解此漏洞,以及如何保护您的组织和客户免受其他安全漏洞的侵害。您还可以 申请演示 Secure Code Warrior 培训平台,以保持您的网络安全技能精进且与时俱进。



标语

在 AI 驱动的开发成果发布前实现有效治理

评估 AI 辅助风险,在提交代码时强制执行安全编码策略,并加速整个软件开发生命周期的安全交付。

预约演示
资源库

探索更多博客

获取有关安全编码、人工智能治理和软件风险管理的专家内容。

浏览全部
案例研究
筛选标签
这是 div 块中的一段文本。

Supercharged Security Awareness: How Tournaments are Inspiring Developers at Erste Group

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse varius enim in eros elementum tristique. Duis cursus, mi quis viverra ornare, eros dolor interdum nulla, ut commodo diam libero vitae erat. Aenean faucibus nibh et justo cursus id rutrum lorem imperdiet. Nunc ut sem vitae risus tristique posuere.

了解更多
案例研究
筛选标签
这是 div 块中的一段文本。

Security as culture: How Blue Prism cultivates world-class secure developers

Learn how Blue Prism, the global leader in intelligent automation for the enterprise, used Secure Code Warrior's agile learning platform to create a security-first culture with their developers, achieve their business goals, and ship secure code at speed

了解更多
案例研究
筛选标签
这是 div 块中的一段文本。

统一的安全文化:Sage 如何打造其安全倡导者项目

了解 Sage 如何通过灵活且以关系为导向的方法提升安全性,成功培养了 200 多名安全倡导者,并实现了显著的风险降低。

了解更多
博客
筛选标签
这是 div 块中的一段文本。

2026年网络安全意识月:理解人工智能安全对企业防御至关重要

目前,大多数顶级人工智能公司已公开呼吁全球放缓人工智能的发展速度,以便安全防护措施能够跟上步伐。然而事实是,严重的安全问题已经显现。随着人工智能实施带来的经济成本和风险不断累积,无数安全领导者和高管团队正处于紧迫的境地。

了解更多
博客
筛选标签
这是 div 块中的一段文本。

赋能要素 8:打造项目品牌

成功的安全编码项目不仅需要优质的内容。赋能要素 8 展示了如何通过品牌化将参与过程转变为一种令人向往、以地位为驱动的体验。

了解更多
博客
筛选标签
这是 div 块中的一段文本。

每一位员工现在都处于 AI 网络安全的最前线

企业技术格局正以一种鲜有人预料到的速度发生剧变,直到为时已晚。我们已正式跨越了从人工编写代码和基础辅助编程,进入“智能体开发生命周期”(ADLC)的时代。虽然自主 AI 智能体有望在多个职能领域实现前所未有的效率,但它们也带来了全新的安全和监管风险。

了解更多

在产品发布前确保 AI 驱动的开发安全

洞察开发风险,执行安全策略,并在整个软件开发生命周期中预防漏洞。

预约演示
未找到相关项目。