Câu chuyện về liferay tưởng chừng như đã đi đến một happy ending và đi vào dĩ vãng,
Mình cũng đã khá là mệt mỏi khi follow thằng này gần 1 năm rồi, …
Câu chuyện lại tiếp diễn khi vào một ngày nọ, đồng nghiệp có nói bâng quơ với mình: “A nghe thanh niên KV ở V* khoe mới tìm đc cái deserialize mới trên liferay kìa …”.
Nghĩ thầm trong bụng: “Cay ko, chẳng lẽ bên V* có PoC RCE liferay mà mình mang tiếng chọc liferay gần 1 năm lại ko có!”
Thế là mình bắt đầu start lại cái project cũ và đâm đầu vào tìm cái 1day này!
Kể đôi chút về cái project cũ kia, nó được gọi là GadgetInspector (https://github.com/JackOfMostTrades/gadgetinspector), mình dùng nó để tìm ra mấy cái gadget trên 1 target khác mà có dịp mình cũng sẽ nói về target này.Cái lúc mình thực hiện trace đống source này thì chưa biết tới Semmle nên việc sử dụng tool này khá hiệu quả (sau này ms biết Semmle cũng ko ăn thua với đống này…).
Tool này thực hiện trace, tìm các CallGraph, TaintTracking, Passthrough …. ở mức BYTECODE (Semmle chưa có cái này) nên rất tiện để analyze nguyên 1 đống library của java mà không cần source, đảm bảo kết quả trả về vẫn rất chính xác (mặc dù thời gian thực thi khá lâu và tài nguyên nó ngốn cũng không kém phần long trọng!!!).
Đợt trà đá hacking vừa rồi mình có apply bài nói nhưng do dính quả bom từ một bên trung gian nào đó nên buộc phải cancel vào phút cuối … Bạn đọc quan tâm có thể tham khảo thêm thông tin chi tiết, cách hoạt động của tool này tại đây (https://paper.seebug.org/1034/).
Ròi đó là câu chuyện của cái tool kia, còn đây là thông tin về cái bug…
Thực ra ban đầu mình hơi nhầm hướng đi một chút, cứ nghĩ deserialize trên java thì mặc định phải là deserialize của java như bao trường hợp bình thường khác …
Điều đó dẫn đến 2 tháng lãng phí của mình, chỉ đâm đầu vào tìm các Sink có gọi đến ObjectInputStream.readObject(), XStream.fromXML() …
Sửa đi sửa lại cái tool không biết bao nhiêu lần mà vẫn chỉ tìm được những cái Chain deserialize đã biết (/api/spring, /api/liferay …).
Sau đó mình quyết định dừng nghiên cứu cái bug quần què này … Mất thời gian .
.
.
.
Và tuần vừa rồi, đồng nghiệp mình có nhận khá nhiều target về liferay, chuyện cũ lại được khơi ra … Vẫn có gì đó cay cay, quyết định tìm cho bằng được cái bug khỉ gió này!
The entrypoints
JSON Deserialize
public Object unmarshall(SerializerState state, Class clazz, Object o) throws UnmarshallException { JSONObject jso = (JSONObject)o;
...
instance = clazz.newInstance();
Method setMethod = (Method)bd.writableProps.get(field);
setMethod.invoke(instance, invokeArgs); ... }
- Có public constructor không có arg
- Không implement Serializable
- Có setter method có thể lợi dụng được!
- Version affect: Liferay <7.x
- Fix: Không dùng liferay 6.x nữa
- https://github.com/JackOfMostTrades/gadgetinspector
- https://paper.seebug.org/1034/
- https://blog.doyensec.com/2019/07/22/jackson-gadgets.html?
- http://xxlegend.com/2017/04/29/title-%20fastjson%20远程反序列化poc的构造和分析/
- https://issues.liferay.com/browse/LPE-16497
- CV xin gởi về: security@vnpt.vn