攻击访问控制
访问控制漏洞的概念非常简单:应用程序允许攻击者执行某种攻击者没有资格执行的操作。
访问控制可分为三大类:垂直访问控制、水平访问控制和上下文访问控制。
垂直访问控制允许各种类型的用户访问应用程序的不同功能。在最简单的情况下,应用程序通过这种控制界定普通用户和管理员。在更加复杂的情况下,垂直访问控制可能需要界定允许其访问特殊功能的各种不同类型的用户,给每个用户分配一个单独的角色,或一组不同的角色。
水平访问控制允许用户访问一组相同类型的、内容及其宽泛的的资源。
上下文相关的访问控制可确保基于应用程序当前的状态,将用户权限仅限于所允许的内容。
许多时候,垂直与水平访问控制相互交叠。
如果用户能够访问他无权限访问的功能和资源,就表示访问控制存在缺陷。主要有三种类型的以访问控制为目标的攻击,分别与三种访问控制相对应。
如果一名用户能够执行某项功能,但分配给他的角色并不具有这种权限,就表示出现垂直权限提升漏洞。例如,如果一名普通用户能够执行管理功能,或者一位会计文员能够支付任意金额的发票,就表示访问控制并不完善。
如果一名用户能够查看或修改它没有资格查看或修改的资源,就表示出现水平权限提升漏洞。例如,如果用户能够使用Web邮件应用程序阅读他人的电子邮件,或者如果一位会计文员可以处理自己所属组织单元以外的单元的发票,那么访问控制也不完善。
如果用户可以利用应用程序状态机中的漏洞获得关键资源的访问权限,就表示出现业务逻辑漏洞。例如,用户能够避开购物结算序列中的支付步骤。
保障访问控制的安全
- 不要认为不知道用于指定应用程序资源的URL或标识符(如账号和文档ID)就无法访问这些资源。假设用户知道每一个应用程序的URL和标识符,确保应用程序的访问控制足以防止未授权访问。
- 不要信任任何用户提交的表示访问权限的参数。
- 不要认为用户将按设定的顺序访问应用程序页面。不要认为因为用户无法访问“编辑用户”页面,它们就不能到达由该页面链接的“编辑用户X”页面。
- 不要相信用户不会篡改通过客户端传送的数据。
以下是一些在Web应用程序中执行有效访问控制的最佳方法。
- 仔细评估并记录每个应用程序功能单元的访问控制要求。这包括谁能合法使用这些功能,以及用户通过这些功能能够访问哪些资源。
- 通过用户会话做出所有访问控制决定。
- 使用一个中央应用程序组件检查访问控制。
- 通过这个组件处理每一个客户端请求,确认允许提出请求的用户访问他请求的功能和资源。
- 使用编程技巧确保前面的方法没有例外。一种有效的方法是规定每个应用程序页面必须采用一个由中央访问控制机制查询的界面。强制开发者将访问控制逻辑代码写入每个页面,不得找借口省略这些代码。
- 对于特别敏感的功能,如管理页面,可以通过IP地址进行进一步限制访问,确保只有特殊网络范围内的用户能够访问这些功能,不管他们是否登录。
- 如果静态内容需要得到保护,有两种方法可提供访问控制。首先,用户可通过向执行相关访问控制逻辑的服务器端动态页面传送一个文件名,间接访问静态文件。其次,可通过使用HTTP验证或应用程序服务器的其他特性隐藏进入的请求,并在允许访问前检查资源许可,控制用户直接访问静态文件。
- 无论何时通过客户端传送,指定用户所希望访问资源的标识符都容易遭到篡改。服务器应知心人完整的服务器端数据。任何时候通过客户端传送这些标识符,都需要对他们进行重新确认,以确保用户拥有访问被请求资源的授权。
- 对于安全性很关键的应用程序功能,考虑对每笔交易执行重复验证和双重授权,进一步确保该动能不会被未授权方使用,这样做可以减轻其他可能的攻击造成的后果。
- 记录每一个访问敏感数据或执行敏感操作的时间。
多层权限模型
编程控制
数据库权限矩阵保存在一个数据库表中,并以编程的形式来做出访问控制决定。对用户角色进行分类可以简化某些访问控制检查,这一任务同样可以通过编程来完成。编程控制可能极其琐碎,并可能在应用程序中建立非常复杂的访问控制逻辑。
自主访问控制
自主访问控制(Discretionary Access Control, DAC)。使用自主访问控制,管理员可将自己的权限分配给其他与拥有特殊资源有关的用户。在封闭型DAC模型中,除非明确许可,否则拒绝访问。管理员还可以锁定或终止某个用户账户。在开放型DAC模型中,除非明确废除许可,否则允许访问。各种应用程序用户有权创建用户账户,并在此应用自主访问控制。
基于角色的访问控制
基于角色的访问控制(Role-Based Access Control,RBAC)。这种控制使用许多命名的角色,每个角色拥有各不相同的特殊权限;每个用户分配有一个这样的角色。这样做可简化不同权限的分配与实施,并有助于管理复杂应用程序中的访问控制。使用角色对用户请求执行“前沿”访问检查有助于实行最少量的处理迅速拒绝许多未授权的请求。对特殊用户可访问的URL路径加以保护就是这种方法的一个典型应用
当设计基于角色的访问控制机制时,有必要限制角色的数量,以对应用程序的权限进行有效管理。如果建立太多琐碎的角色,那么由于不同角色的数目繁多,可能就很难对其进行有效管理。如果建立太少的角色,这些角色就只能对访问进行粗略管理,个体用户分配到的权限将不足以履行他们的职能。
如果使用平台级控制、基于HTTP方法和URL限制对不同应用程序角色的访问,则应将这些控制设计为使用默认拒绝模式,因为这是防火墙规则的最佳做法。这其中应包括各种特定规则,用于将某些HTTP方法和URL分配给特定角色,而且,随后的规则应拒绝不符合前一规则的任何请求。
声明式控制
声明式控制(Declarative Control)。应用程序使用有线的数据库账号访问数据库。它对不停的用户群体使用不同的账户,每个账户分配到执行该群体所允许执行的操作所必需的的最低权限。这种声明式控制从应用程序以外进行声明。这是深层防御原理的一个非常有用的应用,因为权限是由另外一个组件赋予应用程序的。这样,即使一名用户突破在应用程序层面执行的访问控制,企图实施添加新用户之类的敏感操作,他仍然会被组织,因为他使用的数据库账号并未在数据库内获得必要的权限。
另一种情况是在配置应用程序的过程中,通过配置描述符文件在应用程序服务器层面上应用声明式访问控制,但是这种应用一般相对简单,并且无法进行扩展,所以无法管理大型应用程序中种类繁多的权限。