轉自5年前的個人文章,但願還有用,struts 今天又爆安全漏洞了,坑爹啊
====================== 5年前==================== java
Struts2官方已經發布了屢次漏洞補丁,但根源在於OGNL能調用靜態辦法,因此完全解決漏洞的辦法是底層禁止OGNL調用一些特定的java類,如System,Runtime類 spring
咱們底層入手,調用OGNLRuntime靜態方法,設置咱們本身的MethodAccessor類,能禁止OGNL在表達式中調用Runtime,System等類。這已經驗證經過。 安全
咱們目前推薦在原有過濾的基礎上,增長一個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