java.lang.Object java.security.Permission java.security.BasicPermission java.security.SecurityPermission
public final class SecurityPermission
此类用于安全权限。SecurityPermission 包含一个名称(也称为“目标名称”),但没有操作列表;可以使用,也可以不使用指定权限。
目标名称就是安全配置参数的名称(见下表)。目前 SecurityPermission 对象可用来保护对 Policy、Security、Provider、Signer 和 Identity 对象的访问。
下表列出了所有可能的 SecurityPermission 目标名称,并提供了权限所允许的操作的简要说明,还讨论了授予代码该权限的风险。
权限目标名称 | 权限所允许的操作 | 允许此权限所带来的风险 |
---|---|---|
createAccessControlContext | 创建 AccessControlContext | 这允许攻击者使用 DomainCombiner 实例化 AccessControlContext。由于为 DomainCombiner 提供了到当前堆栈上的 ProtectionDomains 的引用,所以如果 DomainCombiner 是恶意的,则这样可能会导致隐私泄漏。 |
getDomainCombiner | 获取 AccessControlContext 的 DomainCombiner | 这样将允许获取 AccessControlContext 的 DomainCombiner 。由于 DomainCombiners 可以包含敏感信息,所以这可能会潜在地导致隐私泄漏。 |
getPolicy | 获取系统级安全策略(具体来说,就是获取当前安装的 Policy 对象) | 这将允许通过 getPermissions 调用来查询策略,这样将泄漏授予指定 CodeSource 的权限。虽然暴露策略并不足以危及系统安全,但它确实为恶意代码提供了更多信息,恶意代码可能会使用这些信息更好地锁定攻击目标。明智之举就是不泄漏不必要的信息。 |
setPolicy | 设置系统级安全策略(具体来说,就是设置 Policy 对象) | 授予此权限相当危险,因为恶意代码会授予自身成功攻击系统所需的所有必要权限。 |
createPolicy.{policy type} | 从提供者获取 Policy 实现的实例 | 授予此权限将允许代码获取 Policy 对象。恶意代码可以查询该 Policy 对象,以确定除其自身以外授予了代码哪些权限。 |
getProperty.{key} | 使用指定的密钥获取安全属性 | 根据已经授予其访问权的特定密钥,代码可以访问安全提供者列表,以及系统级位置和用户安全策略。虽然泄漏此信息并不足以危及系统安全性,但它确实为恶意代码提供了更多信息,恶意代码可能会使用这些信息更好地锁定攻击目标。 |
setProperty.{key} | 使用指定的密钥设置安全属性 | 这包括设置安全提供者或定义系统级安全策略的位置。有权设置新的安全提供者的恶意代码会设置一个恶意提供者,以盗取诸如加密的私钥之类的保密信息。此外,有权设置系统级安全策略的恶意代码还会将此恶意提供者指向安全策略,授予攻击者成功攻击系统所需的全部必要权限。 |
insertProvider.{provider name} | 使用指定的名称添加一个新的提供者 | 这会使用户把可能的恶意提供者(例如,泄漏传递给它的私钥的提供者)当作最高优先级的提供者引入。之所以出现这种情况,是因为 Security 对象(它管理已安装的提供者)目前在接触该提供者之前不检查其完整性和真实性。 |
removeProvider.{provider name} | 移除指定的提供者 | 这可能会更改程序的行为或禁止执行程序的其他部分。如果程序以后请求提供者时该提供者已被移除,则可能导致执行失败。另外,如果程序的其他部分未明确请求已移除的提供者,但是当请求加密服务时通常会选择这一提供者(原因在于其在提供者列表中的位置靠前),这时将另外选择提供者,或者找不到合适的提供者,因而会导致程序失败。 |
setSystemScope | 设置系统标识范围 | 这会允许攻击者使用不受信任的证书来配置系统标识范围,并因此授权使用这些证书签名的 applet 或应用程序代码享有被系统的原始标识范围所拒绝的特权 |
setIdentityPublicKey | 设置标识的公钥 | 如果标识被标记为 "trusted"(受信任),这将允许攻击者引入其他不受系统标识范围信任的公钥(例如,它自己的公钥),因此,将授权使用该公钥签名的 applet 或应用程序代码享有在其他情况下将遭受拒绝的特权。 |
setIdentityInfo | 设置标识的常规信息字符串 | 这将允许攻击者设置对标识的常规信息描述。这会欺骗应用程序使用其他标识而不是本打算使用的标识,或者会阻止应用程序查找特定的标识。 |
addIdentityCertificate | 添加标识证书 | 这允许攻击者为标识的公钥设置证书。这样将非常危险,因为这会影响整个系统的信任关系。与先前相比,此公钥的受信任范围突然变大。 |
removeIdentityCertificate | 移除标识证书 | 这允许攻击者移除标识的公钥证书。这样将非常危险,因为这会影响整个系统的信任关系。与先前相比,此公钥的受信任范围突然变得不如以前。 |
printIdentity | 查看主体名称和可选的使用范围,以及在该范围内是否认为它是“受信任”的 | 输出范围可以是文件名称,在这种情况下它可以传达本机系统信息。例如,此处是一个输出名为 "carol" 标识的示例,在用户的标识数据库中,它被标记为不受信任: carol[/home/luehe/identitydb.obj][not trusted] |
clearProviderProperties.{provider name} | “清除”一个提供者,以使其不再包含用来搜索由提供者实现的服务的属性 | 这将禁用由该提供者实现的服务搜索。因此,正如 "removeProvider.{provider name}" 权限中所描述的那样,这可能会更改正常利用该提供者的程序的行为或禁止程序的其他部分的执行。 |
putProviderProperty.{provider name} | 设置指定提供者的属性 | 每种提供者属性都要指定由该提供者实现的特定服务的名称和位置。通过授予此权限,可以让代码将服务规范替换为另外一种,并据此指定另外一种实现。 |
removeProviderProperty.{provider name} | 从指定的提供者移除属性 | 这将禁用由该提供者实现的服务搜索。由于移除了指定提供者名称和位置的属性,所以无法再访问这些提供者。正如 "removeProvider.{provider name}" 权限中所描述的那样,这可能会更改正常利用该提供者的程序行为或禁止程序其他部分的执行。 |
getSignerPrivateKey | 获取 Signer 的私钥 | 允许访问私钥是非常危险的;一般认为密钥是用来保守秘密的。否则,代码会使用私钥签署各种文件并声称签名来自 Signer。 |
setSignerKeyPair | 设置 Signer 的密钥对(公钥和私钥) | 这将允许攻击者把其他人的(“目标的”)密钥对替换为可能更弱的密钥对(例如,更小密钥大小的密钥对)。这还会允许攻击者侦听目标与其同位体之间加密的通信。目标的同位体可以用目标的“新”公钥包装加密的会话密钥,这将允许攻击者(拥有对应私钥)打开该会话密钥并解密使用该会话密钥加密的通信数据。 |
构造方法摘要 | |
---|---|
SecurityPermission(String name) 创建具有指定名称的新 SecurityPermission。 |
|
SecurityPermission(String name, String actions) 创建具有指定名称的新 SecurityPermission 对象。 |
方法摘要 |
---|
从类 java.security.BasicPermission 继承的方法 |
---|
equals, getActions, hashCode, implies, newPermissionCollection |
从类 java.security.Permission 继承的方法 |
---|
checkGuard, getName, toString |
从类 java.lang.Object 继承的方法 |
---|
clone, finalize, getClass, notify, notifyAll, wait, wait, wait |
构造方法详细信息 |
---|
public SecurityPermission(String name)
name
- SecurityPermission 的名称
NullPointerException
- 如果
name
为
null
。
IllegalArgumentException
- 如果
name
为空。
public SecurityPermission(String name, String actions)
name
- SecurityPermission 的名称
actions
- 其应该为 null。
NullPointerException
- 如果
name
为
null
。
IllegalArgumentException
- 如果
name
为空。