Struts2 漏洞完全解決辦法

轉自5年前的個人文章,但願還有用,struts 今天又爆安全漏洞了,坑爹啊

====================== 5年前==================== java


Struts2官方已經發布了屢次漏洞補丁,但根源在於OGNL能調用靜態辦法,因此完全解決漏洞的辦法是底層禁止OGNL調用一些特定的java類,如System,Runtime類 spring

咱們底層入手,調用OGNLRuntime靜態方法,設置咱們本身的MethodAccessor類,能禁止OGNL在表達式中調用Runtime,System等類。這已經驗證經過。 安全


 
以下圖從左到右,是action的參數賦值過程,爲了堵住漏洞,一般是在ParameterInteceptor作過濾,但幾年來,都有漏洞,若是咱們在OGNLRuntime那作過濾,由於這是調用java類方法最底層的方法,因此很保險

咱們目前推薦在原有過濾的基礎上,增長一個patch包以對底層調用過濾,隨後,公司內部已經佈一個ongl_patch.jar,基本上引入後,在項目的servlet/struts/spring 任何一個框架的listener裏調用裏面的方法初始化一下,就能夠了 框架

其實質就是作以下初始化: ide

OgnlRuntime.setMethodAccessor(OgnlTest.class, new NoMethodAccessor());
OgnlRuntime.setMethodAccessor(Runtime.class, new NoMethodAccessor());
OgnlRuntime.setMethodAccessor(System.class, new NoMethodAccessor());
OgnlRuntime.setMethodAccessor(ProcessBuilder.class,
new NoMethodAccessor());
OgnlRuntime
.setMethodAccessor(OgnlRuntime.class, new NoMethodAccessor());

 

NoMethodAccessor實現了OGNL的 MethodAccessor,

以下:

public class NoMethodAccessor implements MethodAccessor {

public NoMethodAccessor() {
int i = 1;
}

@Override
public Object callStaticMethod(Map context, Class targetClass,
String methodName, Object[] args) throws MethodFailedException {
throw new MethodFailedException("do not run", "123");
}

@Override
public Object callMethod(Map context, Object target, String methodName,
Object[] args) throws MethodFailedException {
// TODO Auto-generated method stub
throw new MethodFailedException("do not run", "123");
}

}



====================== ui

上面的初始化·能夠在系統啓動的地方使用,實際上,beetl的安全管理器就來自於這個想法,因此,若是你訪問beetl的在線體驗, 你能夠調用@java.util.Collections 下的全部方法,但你不能調用@java.lang.Runtime...... spa

相關文章
相關標籤/搜索