百家讲坛 | 肖文棣:API安全与实践(上)

admin 2023年4月26日18:33:23评论26 views字数 5589阅读18分37秒阅读模式

百家讲坛 | 肖文棣:API安全与实践(上)

百家讲坛 | 肖文棣:API安全与实践(上)

肖文棣,OWASP中国广东分会负责人、网安加社区特聘专家,现任某外企安全架构师,负责应用安全设计、管理和评审等工作。

背景

OWASP在2019年发布了OWASP API Top 10 2019版本,现在是2023年,OWASP计划在今年十月份发布最新的OWASP API Top 10 2023版本,本文将根据现在预览状态的OWASP API Top 10 2023版本针对API安全进行说明,并且给出一些实践的建议。

OWASP API Top 10 2023版本包括以下内容:

1. 失效的对象级授权

2. 失效的认证

3. 失效的对象属性级授权

4. 不受限制的资源消耗

5. 失效的功能级别授权

6. 服务器端请求伪造

7. 安全性错误配置

8. 缺乏对自动化威胁的保护

9. 资产管理不当

10. API的不安全使用

针对上面的风险,本文将从描述、例子、测试用例、开源解决方案等方面进行说明。由于篇幅有限,将分成两次来进行分析。

API 1 失效的对象级授权

描述

攻击者可以利用失效的对象级别授权的API端点,通过操纵在请求中发送的对象访问未经授权的敏感数据。

这个问题在基于API的应用程序中极为常见,因为服务器组件通常不完全跟踪客户端的状态,而是更多地依赖于从客户端发送的对象ID等参数来决定对象的访问。

示例场景

在线商店的电子商务平台提供了一个列表页面,其中包含其托管商店的收入图表。检查浏览器请求,攻击者可以识别用作这些图表及其模式的数据源的API端点/shops/{shopName}/revenue_data.json。

使用另一个API端点,攻击者可以获得所有托管商店名称的列表。

攻击者通过一个简单的脚本来操纵列表中的名称,替换{shopName},就可以访问数千家电子商务商店的销售数据。

建议
  • 实施依赖于用户策略和层次结构的适当的授权策略。

  • 使用授权机制检查登录用户是否有权访问通过URL指定的资源。

  • 使用随机或者不可预测的值作为记录ID,如GUID。

  • 编写测试用例来评估授权机制的漏洞,不要发布测试失败的变更。
测试用例

1. 测试未经授权的用户是否可以访问他们不允许访问的对象。

2. 测试未经授权的用户是否可以修改不允许他们修改的对象。

3. 测试访问控制规则是否在应用程序的所有层都得到执行。

开源解决方案

开发者使用JSON Web Tokens (JWT)用于简化API身份验证。JWT可以用于实现对象级别的身份验证和授权。

Spring Security是一个强大的开源安全框架,可以用于保护Java应用程序和REST API。Spring Security提供了一系列的安全过滤器和授权机制,可以轻松地实现基于角色或基于资源的授权控制。此外,Spring Security还提供了基于OAuth2的安全解决方案,可以用于保护API端点和资源服务器。

Auth0是一款云原生的身份验证和授权平台,可以用于保护API端点和Web应用程序。Auth0提供了一系列的身份验证和授权机制,包括基于角色的访问控制、属性级访问控制等。此外,Auth0还提供了社交登录、多因素身份验证等功能,可以大大提高应用程序的安全性。

API 2 失效的认证

描述

API中的身份认证通常比较复杂。人们可能对身份认证的边界以及如何正确进行身份认证存在误解。此外,身份认证都是公开的,这导致身份认证很容易成为攻击者的目标。

公开的API在以下情况很容易受到攻击:

  • 允许凭据填充,其中攻击者使用暴力破解有效的用户名和密码列表。

  • 允许攻击者对同一用户帐户执行暴力攻击,而无需提供验证码/帐户锁定机制。

  • 允许弱密码。

  • 发送敏感的身份验证详细信息,例如URL中的身份验证令牌和密码。

  • 允许用户更改自己的电子邮件地址、当前密码或执行任何其他敏感操作而无不需要密码确认。

  • 不验证令牌的真实性。

  • 接受未签名或者弱签名的JWT令牌,如( {"alg":"none"})。

  • 不验证JWT到期日期。

  • 使用纯文本、未加密或弱哈希密码,如MD5。

  • 使用弱加密密钥,如DES。
示例场景

为了执行用户身份认证,客户端必须使用用户凭据发出API请求:

百家讲坛 | 肖文棣:API安全与实践(上)

如果凭据有效,则返回一个授权令牌,该令牌应在后续请求中提供以识别用户。登录尝试受到严格的速率限制:每分钟只允许三个请求。

为了对受害者的帐户进行暴力破解,攻击者利用GraphQL查询批处理绕过请求速率限制:

百家讲坛 | 肖文棣:API安全与实践(上)
建议
  • 确保了解清楚所有可能的进行API身份认证的流程,包括移动、网络、实现一键式身份验证的深层链接等。

  • 了解身份验证机制。确保了解身份认证的用途和使用方式。

  • 不要在身份验证、令牌生成或密码存储方面重新发明轮子,而应该使用标准的方法。

  • 在暴力破解、速率限制和锁定保护方面,凭证恢复和忘记密码应作为登录端点进行限制。

  • 要求对敏感操作重新进行二次身份认证,例如更改帐户所有者电子邮件地址或者更改多因素认证中的电话号码等。

  • 参考OWASP Authentication Cheat Sheet检查认证过程。

  • 尽可能实施多因素认证。

  • 实施反暴力破解机制,以降低对身份验证的凭据填充、字典攻击和暴力破解攻击。这种机制应该比API上的常规速率限制机制更严格,特别要防止类似Graph QL的批量查询。

  • 实施帐户锁定和验证码机制以防止针对特定用户的暴力攻击。实施弱密码检查。

  • API密钥不应用于用户身份验证,而应该只用于API客户端身份验证。
测试用例

1. 测试身份验证凭据是否以纯文本或散列格式存储。

2. 测试验证令牌是否正确存储和处理。

3. 测试是否跨应用程序的不同级别强制执行身份验证。

开源解决方案

开发者可以使用OpenID Connect协议增强身份认证。OpenID可以用于处理多种身份认证,如设备身份认证,多因素身份认证和智能卡身份认证。

Keycloak是一个开源的身份和访问管理解决方案,支持多种认证和授权协议,如 OAuth 2.0、OpenID Connect、SAML和LDAP等。它提供了Web界面和 REST API,可以方便地进行配置和管理。

Apache Shiro是一个轻量级的安全框架,提供了身份验证、授权、密码加密、会话管理等功能。它支持多种身份验证方式,如基于表单的身份验证、基于HTTP Basic和Digest认证、CAS认证等。

API 3 失效的对象属性级授权

描述

攻击者可以利用失效的对象属性级别授权的API端点来读取或更改不应该访问的对象属性的值。

在以下情况下,API端点容易受到攻击:

  • API端点公开了一个对象的属性,这些属性被认为是敏感的,用户不应访问的。

  • API端点允许用户更改、添加或删除用户不应访问的敏感对象属性的值。
示例场景

一个基于短视频的社交网络,强制执行限制性内容过滤和审查。即使上传的视频被屏蔽,用户也可以使用以下API请求更改视频的描述:

百家讲坛 | 肖文棣:API安全与实践(上)

攻击者可以重播合法请求并添加以下恶意负载:

百家讲坛 | 肖文棣:API安全与实践(上)

API端点容易受到攻击,因为没有验证用户是否有权访问内部对象属性“blocked”,并且用户可以将值从“true”更改为“false”并解锁自己被阻止的内容。

建议
  • 使用API端点公开对象时,请始终确保用户应该有权访问公开的对象的属性。

  • 避免使用通用方法返回结果,例如to_json()和to_string()。相反,需要根据请求要求,返回特定对象属性,可以参考最小权限原则,只返回需要的。

  • 尽可能避免使用自动将客户端输入绑定到代码变量、内部对象或对象属性的函数。

  • 只允许更改应由客户端更新的对象属性。

  • 实施基于模式的响应验证机制作为额外的安全层。作为此机制的一部分,定义并强制执行所有API方法返回的数据。

  • 根据端点的业务和功能要求,返回的数据结构应符合最小限度的原则。
测试用例

1. 测试未授权用户是否可以修改他们不允许的对象。

2. 测试应用程序是否在所有层执行属性级授权规则。

3. 测试未经授权的用户是否可以访问他们不允许访问的属性。

开源解决方案

开发者可以使用基于属性的访问控制(ABAC)来管理用户访问权限和实现属性级别的授权。例如,可以使用ABAC来确定哪些用户可以访问特定属性的特定数据。

Django Guardian是一个基于Django的授权框架,提供了细粒度的访问控制。它支持基于角色和权限的访问控制,以及基于对象的访问控制。Django Guardian还提供了管理界面和API。

同样也可以考虑上文的Spring Security和Apache Shiro。

API 4 不受限制的资源消耗

描述

开发者只需要简单的API请求,就可以从单个本地计算机或使用云计算资源执行多个并发请求。

API请求需要网络带宽、CPU、内存和存储等资源。资源有时候由服务提供商通过API集成提供,并按请求付费,例如发送电子邮件/短信/电话、生物识别验证等。

如果缺少限制或限制设置不当(例如太低/太高),则API很容易受到攻击:

  • 执行超时时间。

  • 最大可分配内存。

  • 最大文件描述符数。

  • 最大进程数。

  • 最大上传文件大小。

  • 在单个API客户端请求中执行的操作数(例如GraphQL 批处理)。

  • 在单个请求-响应中返回的每页记录数。

  • 第三方服务商消费限额。
示例场景

服务提供商允许客户使用其API下载任意大的文件。这些文件存储在云对象存储中,并且不会经常更改。服务提供商依靠缓存服务来获得更好的服务率并保持较低的带宽消耗。缓存服务最多只能缓存15GB的文件。

当其中一个文件更新时,其大小增加到18GB。所有服务客户端立即开始拉取新版本。由于没有消费成本提醒,也没有云服务的最高成本限制,下一个月的账单就会大幅增加,给公司带来必要的经济损失。

建议
  • 使用基于容器的解决方案,可以轻松限制内存、CPU、重启次数、文件描述符和进程数。

  • 定义并强制执行所有传入参数和有效负载的最大数据大小,例如字符串的最大长度、数组中元素的最大数量以及上传文件的最大大小(无论是存储在本地还是云存储中)。

  • 限制客户端在定义的时间范围内与API交互的频率(速率限制)。

  • 应根据业务需求微调速率限制。某些API端点可能需要更严格的策略。

  • 限制单个API客户端或者用户执行单个操作的次数或频率(例如,OTP验证或请求密码验证等)。

  • 为查询字符串和请求正文参数添加适当的服务器端验证,特别是控制要在响应中返回的记录数的参数。

  • 为所有服务提供商的API集成配置设置支出限额。当无法设置支出限额时,应改为配置账单提醒。
测试用例

1. 测试应用程序是否限制单个用户的资源使用。

2. 测试应用程序是否限制一组用户的资源使用。

3. 测试应用程序是否限制了整个组织的资源使用。

开源解决方案

开发者可以使用限制资源消耗(RCE)来对API请求进行限制,可用于限制API的资源消耗。例如,可以限制每个API请求的最大内存使用量,最大时间等。

API Rate Limiter限制API的请求速率,防止某些用户或攻击者发送大量请求。

Fail2ban监视日志文件并禁止恶意IP地址的访问。

Snort是一个开源入侵检测系统(IDS),可用于检测和防止DoS和DDoS攻击。

API 5 失效的功能级别授权

描述

利用漏洞,攻击者可以通过合法的API调用访问他们不应访问的API端点。这些端点可能会暴露给匿名用户或普通的非特权用户。API应用中的这些问题更容易发现,因为API更加结构化,并且很容易预测访问某些功能的方式,例如,将HTTP 方法从GET替换为PUT,或将URL中的“users”字符串更改为“admins”。

查找失效的功能级别授权问题的最佳方法是对授权机制进行深入分析,同时牢记用户层次结构、应用程序中的不同角色或组,并提出以下问题:

  • 普通用户可以访问管理端点吗?

  • 用户是否可以通过简单地更改HTTP方法(例如从GET到PUT)来执行他们不应访问的敏感操作(例如创建、修改或删除)?

  • X组的用户是否可以通过简单地猜测端点URL和参数来访问只应向Y组的用户公开的功能/api/v1/users/export_all?
示例场景

在只允许受邀用户加入的应用程序的注册过程中,移动应用程序会触发API调用 GET/api/invites/{invite_guid}方法。响应包含一个JSON,其中包含有关邀请的详细信息,包括用户的角色和用户的电子邮件。

攻击者复制请求并将HTTP方法和端点操纵到POST/api/invites/new,此端点只能由使用管理控制台的管理员访问。端点不实施功能级授权检查。

攻击者利用该问题并发送具有管理员权限的新邀请:

百家讲坛 | 肖文棣:API安全与实践(上)

随后,攻击者使用恶意制作的邀请为自己创建管理员帐户并获得对系统的完全访问权限。

建议

应用程序应该有一个统一的授权模块,该模块用于所有业务功能。通常,这种保护是由应用程序代码外部的一个或多个组件提供的。

  • 默认情况下,应拒绝所有访问,要求明确授予特定角色以访问每个功能。

  • 针对功能级授权缺陷检查API端点,同时牢记应用程序和组层次结构的业务逻辑。

  • 确保所有管理控制器都继承自管理抽象控制器,该控制器根据用户的组或者角色实施授权检查。

  • 确保常规控制器内的管理功能根据用户的组和角色实施授权检查。
测试用例

1. 测试未经授权的用户是否可以访问他们不允许访问的功能。

2. 测试未授权用户是否可以修改他们不允许的功能。

3. 测试应用程序是否在所有层执行功能级授权规则。

开源解决方案

开发者可以使用基于角色的访问控制(RBAC)来管理用户访问权限和实现函数级别的授权。例如,可以使用RBAC来确定哪些用户可以访问特定函数的特定数据。

Open Policy Agent(OPA)是一个通用的政策引擎,可以用于编写和执行各种访问控制政策,包括基于角色的授权、基于属性的授权、基于数据分类的授权等。可以与任何应用程序集成,提供强大的API保护功能。

同样也可以考虑Spring Security和Keycloak等方案。

总结

由于篇幅关系,本文对OWASP API Top 10 2023版本的前五大风险进行了分析,后续的文章会继续对后五个风险进行分析。

原文始发于微信公众号(KK安全说):百家讲坛 | 肖文棣:API安全与实践(上)

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年4月26日18:33:23
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   百家讲坛 | 肖文棣:API安全与实践(上)https://cn-sec.com/archives/1692756.html

发表评论

匿名网友 填写信息