天天看點

《Java編碼指南:編寫安全可靠程式的75條建議》—— 指南19:對細粒度的安全定義自定義安全權限

本節書摘來異步社群《java編碼指南:編寫安全可靠程式的75條建議》一書中的第1章,第1.19節,作者:【美】fred long(弗雷德•朗), dhruv mohindra(德魯•莫欣達), robert c.seacord(羅伯特 c.西科德), dean f.sutherland(迪恩 f.薩瑟蘭), david svoboda(大衛•斯沃博達),更多章節内容可以通路雲栖社群“異步社群”公衆号檢視。

預設的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 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);

}<code>`</code>

政策檔案需要授予兩個權限:将exceptionreporterpermission權限授予exc.reporter;将runtimepermission權限授予loadlibrary.mylib。以下政策檔案假設上述資源位于windows系統的c:package目錄下。