本節書摘來異步社群《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目錄下。