Coders Conquer Security OWASP Top 10 API Series - 破解对象级授权

发表于2020年9月9日
作者:马蒂亚斯-马杜,博士
案例研究

Coders Conquer Security OWASP Top 10 API Series - 破解对象级授权

发表于2020年9月9日
作者:马蒂亚斯-马杜,博士
查看资源
查看资源

如今,网络安全的威胁无处不在,而且无情。它已经变得如此糟糕,以至于在程序部署后试图跟上它们几乎成为不可能。然而,在这个DevSecOps、持续交付和比以往任何时候都更多的数据的时代,精明的组织正在帮助他们的开发人员提高技能,成为安全意识的超级明星,在他们进入生产之前协助消除常见的漏洞。我们已经解决了网络漏洞,加上我们自己的8大基础设施即代码的错误,现在是时候熟悉下一个大的软件安全挑战了。你准备好了吗?

接下来的一系列博客将集中讨论一些最糟糕的安全漏洞,因为它们与应用编程接口(API)有关。这些漏洞是如此糟糕,以至于它们被列入了开放网络应用安全项目(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 = userService.getUserByContext()。

接下来,我们必须确保该对象的ID存在,并且属于提出请求的用户。

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

最后,我们继续删除该对象。

orderRepository.deleteById(id)。

请记住,你需要确保你的代码中的授权方法与你组织的用户政策和数据访问控制相一致。作为确保你的代码完全安全的一种方式,你应该进行检查,以验证具有不同权限级别的用户是否可以访问他们执行工作所需的数据,但被阻止查看或改变任何应该限制他们的东西。这样做可能会发现不小心被忽略的对象控制漏洞。

从这些例子中得到的主要启示是,首先要定义用户对一个对象可能采取的每一个动作,然后直接在代码中添加强大的访问控制。最后,永远不要相信继承的父属性可以完成这项工作,也不要把这个权力委托给其他地方。相反,在代码中为你需要保护的每个对象类型明确定义用户权限和操作。

请查看 Secure Code Warrior博客页面,了解有关这一漏洞的更多见解,以及如何保护你的组织和客户免受其他安全缺陷的蹂躏。你也可以尝试一下 Secure Code Warrior 培训平台的演示,以保持你所有网络安全技能的磨练和更新。



查看资源
查看资源

作者

马蒂亚斯-马杜博士

马蒂亚斯是一名研究员和开发人员,拥有超过15年的软件安全实践经验。他曾为Fortify Software和他自己的公司Sensei Security等公司开发解决方案。在他的职业生涯中,马蒂亚斯领导了多个应用安全研究项目,并将其转化为商业产品,他拥有超过10项专利。当他离开办公桌时,Matias曾担任高级应用安全培训courses ,并定期在全球会议上发言,包括RSA会议、黑帽、DefCon、BSIMM、OWASP AppSec和BruCon。

马蒂亚斯拥有根特大学的计算机工程博士学位,在那里他研究了通过程序混淆来隐藏应用程序的内部工作的应用安全。

想要更多吗?

在博客上深入了解我们最新的安全编码见解。

我们广泛的资源库旨在增强人类对安全编码技术提升的方法。

查看博客
想要更多吗?

获取关于开发者驱动的安全的最新研究

我们广泛的资源库充满了有用的资源,从白皮书到网络研讨会,让你开始使用开发者驱动的安全编码。现在就去探索它。

资源中心

Coders Conquer Security OWASP Top 10 API Series - 破解对象级授权

发表于2020年9月9日
作者:马蒂亚斯-马杜,博士

如今,网络安全的威胁无处不在,而且无情。它已经变得如此糟糕,以至于在程序部署后试图跟上它们几乎成为不可能。然而,在这个DevSecOps、持续交付和比以往任何时候都更多的数据的时代,精明的组织正在帮助他们的开发人员提高技能,成为安全意识的超级明星,在他们进入生产之前协助消除常见的漏洞。我们已经解决了网络漏洞,加上我们自己的8大基础设施即代码的错误,现在是时候熟悉下一个大的软件安全挑战了。你准备好了吗?

接下来的一系列博客将集中讨论一些最糟糕的安全漏洞,因为它们与应用编程接口(API)有关。这些漏洞是如此糟糕,以至于它们被列入了开放网络应用安全项目(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 = userService.getUserByContext()。

接下来,我们必须确保该对象的ID存在,并且属于提出请求的用户。

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

最后,我们继续删除该对象。

orderRepository.deleteById(id)。

请记住,你需要确保你的代码中的授权方法与你组织的用户政策和数据访问控制相一致。作为确保你的代码完全安全的一种方式,你应该进行检查,以验证具有不同权限级别的用户是否可以访问他们执行工作所需的数据,但被阻止查看或改变任何应该限制他们的东西。这样做可能会发现不小心被忽略的对象控制漏洞。

从这些例子中得到的主要启示是,首先要定义用户对一个对象可能采取的每一个动作,然后直接在代码中添加强大的访问控制。最后,永远不要相信继承的父属性可以完成这项工作,也不要把这个权力委托给其他地方。相反,在代码中为你需要保护的每个对象类型明确定义用户权限和操作。

请查看 Secure Code Warrior博客页面,了解有关这一漏洞的更多见解,以及如何保护你的组织和客户免受其他安全缺陷的蹂躏。你也可以尝试一下 Secure Code Warrior 培训平台的演示,以保持你所有网络安全技能的磨练和更新。



我们希望得到您的许可,向您发送有关我们产品和/或相关安全编码主题的信息。我们将始终以最谨慎的态度对待您的个人资料,绝不会将其出售给其他公司用于营销目的。

要提交表格,请启用 "分析 "cookies。完成后,请随时再次禁用它们。