Module java.base
Package java.security

Class SecurityPermission

所有已实现的接口:
Serializable, Guard

public final class SecurityPermission extends BasicPermission
这个类用于安全权限。一个 SecurityPermission 包含一个名称(也称为“目标名称”),但没有操作列表;你要么有这个命名权限,要么没有。

目标名称是安全配置参数的名称(见下文)。目前,SecurityPermission 对象用于保护对 AccessControlContextPolicyProviderSecuritySignerIdentity 对象的访问。

以下表格列出了标准的 SecurityPermission 目标名称,以及每个目标名称允许的权限描述以及授予代码该权限的风险讨论。

目标名称、权限允许内容和相关风险
权限目标名称 权限允许内容 允许此权限的风险
authProvider.{提供者名称} 允许指定提供者成为登录和注销操作的 AuthProvider。 这允许指定提供者执行登录和注销操作。指定提供者必须扩展 AuthProvider,必须小心授予受信任的提供者,因为登录操作涉及诸如个人识别码和密码等敏感认证信息。
createAccessControlContext 创建 AccessControlContext 这允许某人使用 DomainCombiner 实例化 AccessControlContext。授予此权限时必须极度小心。恶意代码可能创建一个 DomainCombiner,增加授予代码的权限集,甚至授予代码 AllPermission
getDomainCombiner 检索 AccessControlContext 的 DomainCombiner 这允许某人检索 AccessControlContext 的 DomainCombiner。由于 DomainCombiners 可能包含敏感信息,这可能导致隐私泄漏。
getPolicy 检索系统范围的安全策略(具体来说,当前安装的 Policy 对象) 这允许某人通过 getPermissions 调用查询策略,这会透露哪些权限将被授予给给定 CodeSource。虽然透露策略不会危及系统安全,但它会为恶意代码提供额外信息,使其更好地瞄准攻击目标。最好不要透露比必要更多的信息。
setPolicy 设置系统范围的安全策略(具体来说,Policy 对象) 授予此权限极其危险,因为恶意代码可能授予自己成功发动攻击所需的所有必要权限。
createPolicy.{策略类型} 从提供者获取 Policy 实现的实例 授予此权限使代码能够获取 Policy 对象。恶意代码可能查询 Policy 对象,以确定除自身以外的代码被授予了哪些权限。
getProperty.{键} 检索具有指定键的安全属性 根据授予访问的特定键,代码可能访问安全提供者列表,以及系统范围和用户安全策略的位置。虽然透露这些信息不会危及系统安全,但它会为恶意代码提供额外信息,使其更好地瞄准攻击目标。
setProperty.{键} 设置具有指定键的安全属性 这可能包括设置安全提供者或定义系统范围安全策略的位置。具有权限设置新安全提供者的恶意代码可能设置一个窃取机密信息(如加密私钥)的恶意提供者。此外,具有设置系统范围安全策略位置的权限的恶意代码可能将其指向授予攻击者成功发动攻击所需的所有必要权限的安全策略。
insertProvider 添加新提供者 这将允许某人引入一个可能是恶意提供者(例如,一个泄露传递给它的私钥的提供者)作为优先级最高的提供者。这是可能的,因为安全对象(管理已安装的提供者)目前不会在附加提供者之前检查提供者的完整性或真实性。"insertProvider" 权限包含 "insertProvider.{提供者名称}" 权限(有关更多信息,请参见下面的部分)。
removeProvider.{提供者名称} 移除指定提供者 这可能会更改程序的行为或禁用程序的其他部分的执行。如果程序随后请求的提供者已被移除,则执行可能会失败。此外,如果已移除的提供者没有被程序的其余部分明确请求,但在请求加密服务时通常会是程序选择的提供者(由于其在提供者列表中的先前顺序),则将选择其他提供者,或找不到合适的提供者,从而导致程序失败。
clearProviderProperties.{提供者名称} “清除”提供者,使其不再包含用于查找提供者实现的属性 这会禁用查找提供者实现的服务。这可能会更改程序的行为或禁用程序的其他部分的执行,这些部分通常会使用提供者,如在“removeProvider.{提供者名称}”权限下描述的。
putProviderProperty.{提供者名称} 为指定提供者设置属性 提供者属性分别指定提供者实现的特定服务的名称和位置。通过授予此权限,您可以让代码用另一个服务规范替换服务规范,从而指定不同的实现。
removeProviderProperty.{提供者名称} 从指定提供者中移除属性 这会禁用查找提供者实现的服务。由于已移除指定其名称和位置的属性,它们将不再可访问。这可能会更改程序的行为或禁用程序的其他部分的执行,这些部分通常会使用提供者,如在“removeProvider.{提供者名称}”权限下描述的。

以下权限已被新权限取代或与已弃用的类相关联:IdentityIdentityScopeSigner。不建议使用它们。有关更多信息,请参阅适用的类。

目标名称、权限允许的内容和相关风险
权限目标名称 权限允许的内容 允许此权限的风险
insertProvider.{提供者名称} 添加一个新的提供者,使用指定的名称 不鼓励使用此权限,因为可能通过覆盖 Provider.getName() 方法来规避名称限制。此外,授予代码权限以插入具有特定名称或任意选择的提供者存在等同级别的风险。用户应该使用"insertProvider"权限。
setSystemScope 设置系统标识范围 这将允许攻击者配置系统标识范围,使用不应被信任的证书,从而授予使用这些证书签名的小程序或应用程序代码原本由系统原始标识范围拒绝的特权。
setIdentityPublicKey 为标识设置公钥 如果标识标记为“受信任”,这将允许攻击者引入一个不被系统标识范围信任的不同公钥(例如自己的公钥),从而授予使用该公钥签名的小程序或应用程序代码原本被拒绝的特权。
setIdentityInfo 为标识设置一般信息字符串 这允许攻击者设置标识的一般描述。这可能欺骗应用程序使用不同于预期的标识,或者阻止应用程序找到特定的标识。
addIdentityCertificate 为标识添加证书 这允许攻击者为标识的公钥设置证书。这很危险,因为它会影响系统中的信任关系。这个公钥突然变得比原本更受信任。
removeIdentityCertificate 移除标识的证书 这允许攻击者移除标识的公钥证书。这很危险,因为它会影响系统中的信任关系。这个公钥突然被认为比原本不那么可信。
printIdentity 查看主体的名称,以及可选地使用的范围,以及在该范围内是否被视为“受信任” 打印出的范围可能是一个文件名,这可能传达本地系统信息。例如,这是一个名为“carol”的标识的示例打印输出,该标识在用户的标识数据库中被标记为不受信任:
carol[/home/luehe/identitydb.obj][不受信任]
getSignerPrivateKey 检索签名者的私钥 允许访问私钥非常危险;私钥应该保密。否则,代码可以使用私钥签署各种文件,并声称签名来自签名者。
setSignerKeyPair 为签名者设置密钥对(公钥和私钥) 这将允许攻击者用可能更弱的密钥对(例如较小密钥大小的密钥对)替换别人(“目标”)的密钥对。这也将允许攻击者监听目标与其对等方之间的加密通信。目标的对等方可能会使用目标的“新”公钥包装一个加密会话密钥,这将允许攻击者(拥有相应私钥的攻击者)解开会话密钥并解密使用该会话密钥加密的通信数据。
实现说明:
实现可以定义额外的目标名称,但应使用命名约定,如反向域名表示法,以避免名称冲突。
自版本:
1.2
参见:
  • Constructor Details

    • SecurityPermission

      public SecurityPermission(String name)
      创建具有指定名称的新SecurityPermission。名称是SecurityPermission的符号名称。名称的末尾可能会出现一个星号,跟在一个“.”后面,或者单独出现,表示通配符匹配。
      参数:
      name - SecurityPermission的名称
      抛出:
      NullPointerException - 如果namenull
      IllegalArgumentException - 如果name为空。
    • SecurityPermission

      public SecurityPermission(String name, String actions)
      创建具有指定名称的新SecurityPermission对象。名称是SecurityPermission的符号名称,而操作String当前未使用,应为null
      参数:
      name - SecurityPermission的名称
      actions - 应为null
      抛出:
      NullPointerException - 如果namenull
      IllegalArgumentException - 如果name为空。