《Java安全编码标准》一1.8 最低权限原则

1.8 最低权限原则

根据最低权限原则,系统的每一个程序和用户只应赋予能够完成它们操作所需要的最低权限[Saltzer 1974,Saltzer 1975] 。“构建安全的网站”(Build Security In Website)[DHS 2006]?这篇文章补充说明了这个原则。以最低权限运行可以降低因为代码中的安全漏洞而带来的安全问题的严重性。
体现最低权限原则的规则如下所示:

定义权限的所谓安全策略必须有严格的控制。当Java程序有安全管理器时,通过默认的安全策略文件进行权限控制;然而,Java灵活的安全模型允许用户赋予应用更多的权限,这可以通过自定义安全策略来完成。
Java代码若想提高权限的话,需要使用代码签名。很多安全策略允许具备签名的代码以提高后的权限来执行。只有那些需要提升权限的代码需要签名,对其他代码来说,是不需要签名的(请参考规则ENV00-J。)
在同一个JAR文件内,已签名的代码会与未签名的类共存。建议将所有的特权代码打成一个包(详情请参考规则ENV01-J)。此外,根据安全策略,可以基于代码或签名器为代码赋予特定权限。
特权操作权限应该只提供给那些最少的需要特权的代码。Java的AccessController机制允许只有需要的代码可以获得权限提升。当一个类需要主张其权限时,在?doPrivileged()?代码块中,执行特权代码即可。AccessController?机制需要与安全策略一起发挥作用。由于用户可能不清楚安全模型的相关细节,所以并不能根据它们的需求正确配置安全策略,在doPrivileged()代码块中出现的特权代码必须是最少的,从而避免出现安全漏洞。

时间: 2024-09-26 05:10:20

《Java安全编码标准》一1.8 最低权限原则的相关文章

《Java安全编码标准》一导读

前 言 在Java编程语言中,关键的安全编码要素是采用良好的文档和强制的编码规范.本书提供了在Java语言中的一系列安全编码规则.这些规则的目标是消除不安全的编码实践,因为这些不安全的因素会导致可利用的漏洞.如果应用这些安全编码标准,可以帮助设计出安全的.可靠的.健壮的.有弹性的.可用性和可维护性高的高质量系统,并且这些安全编码规范还可作为评估源代码质量特性的一个指标(不管使用的是手动的还是自动化的过程).对于使用Java编程语言开发的软件系统,这个编码规范具有广泛的影响. 目 录 第1章 概述

《Java安全编码标准》一1.11 小结

1.11 小结 尽管作为一种相对安全的语言,Java语言及其类库还是在很大程度上存在着一些编程问题,从而造成系统安全漏洞.如果假设Java本身提供的功能特性可以减少一般的软件问题,并足够Java程序安全得不需要进行进一步检测,那么我们就大错特错了.因为任何在软件实现中出现的缺陷都会产生严重的安全影响,绷紧安全性这根弦是非常关键的,这样,当我们进行系统开发和部署时,就可以避免出现软件的安全漏洞问题.为了减少因为编程错误所带来的安全漏洞的可能性,Java开发人员应当遵循本编码标准中的安全编码规则,并

《Java安全编码标准》一1.9 安全管理器

1.9 安全管理器 SecurityManager?是Java中定义安全策略的类.当一个程序在没有安装安全管理器的环境中运行时,它是不受限制的,它可以使用任何Java API提供的类和方法.当使用安全管理器时,它会明确哪些不安全和敏感的操作是允许的.任何违反安全策略的操作都会导致抛出SecurityException异常,代码可以向安全管理器查询某些动作是否允许.同时,安全管理器可以控制受信的Java API能够执行的功能.当非受信的代码不允许读取系统类的时候,应该赋予这些类最低的权限,以防止特

《Java安全编码标准》一1.5 拒绝服务

1.5 拒绝服务 拒绝服务攻击试图使计算机的资源不可获得,或者对需要使用该计算机资源的用户来说,会造成资源不足的情况.通常这种攻击是持续服务的服务器系统需要重点关注的,它与桌面应用程序有很大区别:然而,拒绝服务的问题可以出现在所有类别的应用上. 1.5.1 资源耗尽型的拒绝服务 拒绝服务可能出现在,相对于输入数据需要的资源消耗来说,使用比例上更为巨大的资源.通过客户端软件检查资源是否被过度消耗,并希望用户来处理与资源相关的问题是不合理的.但是,存在这样的客户端软件,它们可以检查那些可能会导致持久

《Java安全编码标准》一2.11 IDS10-J不要拆分两种数据结构中的字符串

2.11 IDS10-J不要拆分两种数据结构中的字符串 在历史遗留系统中,常常假设字符串中的每一个字符使用8位(一个字节,Java中的byte).而Java语言使用16位表示一个字符(Java中的Char类型).遗憾的是,不管是Java的byte类型还是char类型数据,都不能表示所有的Unicode字符.许多字符串使用例如UTF-8编码的方式存储和通信,而在这种编码中,字符长度是可变的. 当Java字符串以字符数组的方式存储时,它可以用一个字节数组来表示,字符串里的一个字符可以用两个连续的或更

《Java安全编码标准》一2.1 IDS00-J净化穿越受信边界的非受信数据

2.1 IDS00-J净化穿越受信边界的非受信数据 许多程序会接受来自未经验证的用户数据.网络连接,以及其他来自于非受信域的不可信数据,然后它们会将这些数据(经过修改或不经修改)穿过受信边界送到另一个受信域中.通常,这些数据是以字符串的形式出现的,并且它们会有既定的内部数据结构,这种数据结构必须能够被子系统所解析.同时,必须净化这些数据,因为子系统可能并不具备处理恶意输入信息的能力,这些未经净化数据输入很有可能包含注入攻击. 值得注意的是,程序必须对传递给命令行解释器或者解析器的所有字符串数据进

《Java安全编码标准》一1.3 敏感数据泄露

1.3 敏感数据泄露 系统的安全策略需要确定哪些信息是敏感的.敏感数据可能包括用户信息,比如社会保障或信用卡号码.密码或私钥.在不同等级受信域的组件中共享数据的时候,我们称这些数据是跨越受信边界的.因为在Java环境中,允许在同一个程序中的处在不同受信域的两个组件进行数据通信,从而会出现那些跨受信边界的数据传输.所以,如果在域中存在一个授权用户,而该用户没有数据接收权限,那么系统必须保证这些数据不会发送给处于该域的组件.如果有可能的话,这种处理只简单地禁止数据传输,也有可能对穿越受信边界的数据进

《Java安全编码标准》一2.13 IDS12-J在不同的字符编码中无损转换字符串数据

2.13 IDS12-J在不同的字符编码中无损转换字符串数据 在String对象之间进行转换时,如果涉及不同的编码类型,可能会导致数据丢失. 根据Java API[API 2006] 对?String.getBytes(Charset)方法的描述: 该方法总会替代那些错误格式的输入和不可映射的字符序列,把它们替换成这些字符的字节数组. 当必须将一个String转化为字节数组时,例如写入一个文件,并且在这个字符串中含有不可映射的字符序列的时候,就必须进行正确的字符编码. 2.13.1 不符合规则的

《Java安全编码标准》一2.7 IDS06-J从格式字符串中排除用户输入

2.7 IDS06-J从格式字符串中排除用户输入 对Java格式字符串的解释要比对在像C语言这样的语言中更严格[Seacord 2005].当任何转换参数不能匹配相应的格式符时,标准类库实现会抛出一个相应的异常.这种方法降低了被恶意利用的可能性.然而,恶意用户输入可以利用格式字符串,并且造成信息泄露或者拒绝服务.因此,不能在格式字符串中使用非受信来源的字符串. 2.7.1 不符合规则的代码示例 这个不符合规则的代码示例展示了可能出现信息泄露的问题.它将信用卡的失效日期作为输入参数并将其用在格式字