本节书摘来异步社区《Java编码指南:编写安全可靠程序的75条建议》一书中的第1章,第1.19节,作者:【美】Fred Long(弗雷德•朗), Dhruv Mohindra(德鲁•莫欣达), Robert C.Seacord(罗伯特 C.西科德), Dean F.Sutherland(迪恩 F.萨瑟兰), David Svoboda(大卫•斯沃博达),更多章节内容可以访问云栖社区“异步社区”公众号查看。

指南19:对细粒度的安全定义自定义安全权限

默认的SecurityManager会检查给定方法的调用者是否具有足够的继续执行动作的权限。动作定义在Java安全架构的访问级别,需要特定的权限才能执行。例如,java.io.FilePermission类的动作是读、写、执行和删除[API 2013]。“权限描述和风险”指南(Permission Descriptions and Risks guide)[Oracle 2011d]列举了默认的权限和为Java代码授予这些权限有关的风险。

有时候,我们需要的限制比默认安全管理器所能提供的还要强。当不存在对应的默认权限且未能提供自定义的权限时,可能会导致特权升级漏洞,从而允许不可信的调用者执行限制操作或动作。

本指南讨论了过多权限的问题,有关解决这个问题的另外一个办法,参见指南16。

违规代码示例

下面的违规代码示例包含一个特权代码块,用来执行两个敏感操作:加载一个库;设置默认异常处理程序。

class LoadLibrary {private void loadLibrary() {AccessController.doPrivileged(new PrivilegedAction() {public Object run() {// Privileged codeSystem.loadLibrary("myLib.so");// Perform some sensitive operation like// setting the default exception handlerMyExceptionReporter.setExceptionReporter(reporter);return null;}});}
}```
使用时,默认的安全管理器会禁止库的加载,除非RuntimePermission loadLibrary.myLib在策略文件中已被授权。然而,安全管理器不会自动防护调用者的第二个敏感操作的执行,即设置默认异常处理程序,因为该操作的权限不是默认的,因此,安全管理器此时不会生效。这个安全弱点可以被利用,例如,编程并安装一个能泄露信息的异常处理程序,泄露那些合法处理程序会过滤掉的信息。####合规解决方案
下面的合规解决方案定义了一个自定义的权限ExceptionReporterPermission,与目标exc.reporter,用以禁止非法调用者设置默认异常处理程序。这可以通过子类化BasicPermission来实现,它允许二进制风格的权限(允许或不允许)。该解决方案然后使用安全管理器,检查调用者是否拥有必要的设置异常处理程序的权限。如果检查失败,代码会抛出SecurityException异常。自定义权限类ExceptionReporterPermission还定义了所需的两个构造函数。

class LoadLibrary {
 private void loadLibrary() {
  AccessController.doPrivileged(
   new PrivilegedAction() {
    public Object run() {
     // Privileged code
     System.loadLibrary("myLib.so");

     // Perform some sensitive operation like
     // setting the default exception handler
     MyExceptionReporter.setExceptionReporter(reporter);
     return null;
    }
   });
 }
}

final class MyExceptionReporter extends ExceptionReporter {
 public void setExceptionReporter(ExceptionReporter reporter) {
  SecurityManager sm = System.getSecurityManager();
   if(sm != null) {
    sm.checkPermission(
     new ExceptionReporterPermission("exc.reporter"));
   }
   // Proceed to set the exception reporter
  }

  // ... Other methods of MyExceptionReporter
}

final class ExceptionReporterPermission extends BasicPermission {
 public ExceptionReporterPermission(String permName) {
  super(permName);
 }

 // Even though the actions parameter is ignored,
 // this constructor has to be defined
 public ExceptionReporterPermission(String permName,
               String actions) {
  super(permName, actions);
 }
}`
策略文件需要授予两个权限:将ExceptionReporterPermission权限授予exc.reporter;将RuntimePermission权限授予loadlibrary.myLib。以下策略文件假设上述资源位于Windows系统的c:package目录下。

grant codeBase "file:/c:/package" {//For *nix, file:${user.home}/package/permission ExceptionReporterPermission "exc.reporter";permission java.lang.RuntimePermission "loadLibrary.myLib";
};```
默认情况下,不能使用BasicPermission将权限定义为支持动作,如果需要的话,可以在ExceptionReporterPermission的子类中自由地实现这些动作。BasicPermission是一个抽象类,尽管它不包含抽象方法;它声明了所有从Permission类继承的方法。BasicPermission类的自定义子类必须定义两个构造函数,调用最合适的(单参数或双参数)超类构造函数(因为超类没有默认构造函数)。双参数构造函数也接受一个动作,即使基本权限不会使用它。从策略文件中构造权限对象时,需要这种行为。注意,BasicPermission类的自定义子类要被声明成final类。####适用性

《Java编码指南:编写安全可靠程序的75条建议》—— 指南19:对细粒度的安全定义自定义安全权限...相关推荐

  1. 《Java编码指南:编写安全可靠程序的75条建议》—— 指南20:使用安全管理器创建一个安全的沙盒...

    本节书摘来异步社区<Java编码指南:编写安全可靠程序的75条建议>一书中的第1章,第1.20节,作者:[美]Fred Long(弗雷德•朗), Dhruv Mohindra(德鲁•莫欣达 ...

  2. 《Java编码指南:编写安全可靠程序的75条建议(英文版)》—— 2.7 修复错误...

    本节书摘来异步社区<Java编码指南:编写安全可靠程序的75条建议(英文版)>一书中的第2章,第2.7节,作者:[美]Fred Long(弗雷德•朗),Dhruv Mohindra(德鲁• ...

  3. 《Java编码指南:编写安全可靠程序的75条建议》—— 指南16:避免授予过多特权...

    本节书摘来异步社区<Java编码指南:编写安全可靠程序的75条建议>一书中的第1章,第1.16节,作者:[美]Fred Long(弗雷德•朗), Dhruv Mohindra(德鲁•莫欣达 ...

  4. Java //PP2.6 编写一个应用程序,将英里转换为千米(1英里等于1.60935千米)。以浮点数类型读取用户输入的英里数

    Java程序设计教程(第七版) John Lewis & William Loftus 电子工业出版社 PP2.6 编写一个应用程序,将英里转换为千米(1英里等于1.60935千米).以浮点数 ...

  5. 如何有效编写软件的75条建议

    1. 你们的项目组使用源代码管理工具了么?   应该用.VSS.CVS.PVCS.ClearCase.CCC/Harvest.FireFly都可以.我的选择是VSS. 2. 你们的项目组使用缺陷管理系 ...

  6. 【转】初学入门:如何有效编写软件的75条建议

    1. 你们的项目组使用源代码管理工具了么?  应该用.VSS.CVS.PVCS.ClearCase.CCC/Harvest.FireFly都可以.我的选择是VSS. 2. 你们的项目组使用缺陷管理系统 ...

  7. Java实验:编写网络聊天程序(图形界面)

    课程名称 高级Java程序设计 实验项目 Java网络编程 实验目的: 使用客户机/服务器模式.基于TCP协议编写一对多"群聊"程序.其中客户机端单击"连接服务器&quo ...

  8. 我密集面试了若干位Java后端的候选人,给广大程序员的一点建议

    摘要 在上周,我密集面试了若干位Java后端的候选人,工作经验在3到5年间.我的标准其实不复杂: 第一能干活: 第二Java基础要好: 第三最好熟悉些分布式框架. 我相信其它公司招初级开发时,应该也照 ...

  9. 编写一个游戏程序(如连连看、五子棋、2048、扫雷、泡泡堂、太鼓)或其他你觉得有意思的程序。

    JAVA程序设计: 编写一个游戏程序(如连连看.五子棋.2048.扫雷.泡泡堂.太鼓)或其他你觉得有意思的程序. /// 完成内容如下: (1)可以顺利编译的项目源码: (2)可以直接运行的.exe文 ...

最新文章

  1. 自动打包linux,使用Jenkins如何自动打包部署linux
  2. 【Markdown/typora】程序员写博客2分钟简单入门
  3. strchr与strstr函数
  4. linux推箱子脚本,【编程例题】标准C语言实现推箱子游戏!附解析!
  5. 高等数学(七)- 多元函数微分学(2)【多元函数极值问题】
  6. vivo S9无法激活手机了vivoS9e怎么解锁平台刷机教程屏幕锁不记得了可以用这个方法教程重装系统固件软件S9手机如果已忘记密码可以自己学习升级降级USB操作了
  7. 微型计算机控制技术小论文,微型计算机控制技术结课论文.doc
  8. 微波炉控制器的设计(EDA课程设计)
  9. Java毕业设计-疫情防控系统
  10. Unity中实现解析XML文件
  11. 写给前端程序员的英文学习指南
  12. 初中几何知识复习,已知直角三角形角度和邻边长求对边长
  13. java嵌套for循环基础练习 -班级平均分
  14. 简短加密_神经网络训练中回调的简短实用指南
  15. 数模--0-1规划问题~Matlab中 intlinprog函数用法简介
  16. Cesium粒子系统、火焰粒子、喷水粒子
  17. pgsql创建用户并赋予权限
  18. 如何让百度搜到我的网站或博客-百度seo
  19. H3C的RRPP配置注意祥解
  20. 基于Matlab/simulink的VSG虚拟同步机控制

热门文章

  1. 量化感知训练_如何评估训练质量?常被训练者忽视的内部负荷
  2. word手写字体以假乱真_轻松制作个人“电子版手写签名”
  3. 我最喜欢的科目是计算机课英语,初一英语作:my favorite subject(我最喜欢的科目)要求写美术课(art),80词以上,拜托啦!...
  4. linux rmp命令安装包在哪里_一文带你了解阿里云Linux服务器的基本操作
  5. java filter加时间戳_java filter加时间戳
  6. mac 10.12.6 Fiddler的安装
  7. Vue3学习笔记01:使用NPM方法安装Vue3
  8. 大数据学习笔记27:MR案例——多输入源处理成绩
  9. Java Web学习笔记12:CKEditor在线编辑器
  10. c语言 python java_C语言、C++、Java,Python之间的区别,哪个更有前景,哪个更难 ?...