Permalink
Switch branches/tags
Nothing to show
Find file Copy path
944c977 Dec 4, 2017
1 contributor

Users who have contributed to this file

57 lines (51 sloc) 2.56 KB
/* original source:
* @see https://github.com/FasterXML/jackson-databind/blob/jackson-databind-2.8.9/src/test/java/com/fasterxml/jackson/databind/interop/IllegalTypesCheckTest.java
*/
//@Grab('com.fasterxml.jackson.core:jackson-databind:2.8.8')
// 2.8.9 がCVE-2017-7525修正版
@Grab('com.fasterxml.jackson.core:jackson-databind:2.8.9')
import com.fasterxml.jackson.databind.ObjectMapper;
class Bean1599 {
public int id;
public Object obj;
}
// Object obj フィールドが、先頭要素がクラス名、二番目にその中身(map)という配列構成のJSON
String json = """
{
"id" : 124,
"obj" : [
"com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl",
{
"transletBytecodes" : [ "AAIAZQ==" ],
"transletName" : "a.b",
"outputProperties" : { }
}
]
}
""";
ObjectMapper mapper = new ObjectMapper();
// enableDefaultTyping()を呼んでいないと、単に配列そのままにdeserializeされる。
def r = mapper.readValue(json, Bean1599.class);
assert r.id == 124;
assert r.obj.class == java.util.ArrayList.class;
assert r.obj[0] == "com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl";
assert r.obj[1].transletBytecodes[0] == 'AAIAZQ==';
assert r.obj[1].transletName == 'a.b';
assert r.obj[1].outputProperties.size() == 0;
mapper = new ObjectMapper();
// enableDefaultTyping()を呼ぶことで、先頭のクラス名を認識してそのインスタンスとして生成するようになる。
mapper.enableDefaultTyping();
try {
r = mapper.readValue(json, Bean1599.class);
} catch (com.fasterxml.jackson.databind.JsonMappingException e) {
if (e.message.startsWith('Invalid type definition for type Lcom/sun/org/apache/xalan/internal/xsltc/trax/TemplatesImpl;: Illegal type (com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl) to deserialize: prevented for security reasons')) {
// 修正版の 2.8.9 では、クラス名の black list チェックによる例外が発生し、危険なコードは実行されない。
println 'your jackson version IS SAFE to CVE-2017-7525';
} else {
// 未修正版ではクラス名に基づいてインスタンス化される。
// フィールド名に副作用のあるgetterを指定するなどでgadgetを動かし、任意コード実行につなげることが可能。
// 本テストケースではそこまでは到達できず、実行しようとしたが失敗した例外を確認できるにとどまる。
println 'your jackson version MAY NOT BE SAFE to CVE-2017-7525';
println e.printStackTrace();
}
}