-
Notifications
You must be signed in to change notification settings - Fork 0
/
cve-2017-15095-check.groovy
44 lines (40 loc) · 2.23 KB
/
cve-2017-15095-check.groovy
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
/* original source:
* @see https://github.com/FasterXML/jackson-databind/blob/jackson-databind-2.8.10/src/test/java/com/fasterxml/jackson/databind/interop/IllegalTypesCheckTest.java
*/
//@Grab('com.fasterxml.jackson.core:jackson-databind:2.8.9')
//@Grab('com.fasterxml.jackson.core:jackson-annotations:2.8.9')
// 2.8.10 がCVE-2017-15095修正版
@Grab('com.fasterxml.jackson.core:jackson-databind:2.8.10')
@Grab('com.fasterxml.jackson.core:jackson-annotations:2.8.10')
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.annotation.*;
class PolyWrapper {
// 元のテストコードでは @JsonTypeInfo アノテーションを付けています。
// これにより、ObjectMapper.enableDefaultTyping()を呼ばずともJSONに含まれる追加のクラス名情報を認識できるようになります。
@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.WRAPPER_ARRAY)
public Object v;
}
// Object v フィールドが、先頭要素がクラス名、二番目にその中身(scalar)という配列構成のJSON
String json = """
{
"v" : [
"java.util.logging.FileHandler",
"/tmp/foobar.txt"
]
}
""";
mapper = new ObjectMapper();
try {
def r = mapper.readValue(json, PolyWrapper.class);
} catch (com.fasterxml.jackson.databind.JsonMappingException e) {
if (e.message.startsWith('Invalid type definition for type Ljava/util/logging/FileHandler;: Illegal type (java.util.logging.FileHandler) to deserialize: prevented for security reasons')) {
// 修正版の 2.8.10 では、クラス名の black list チェックによる例外が発生し、危険なコードは実行されない。
println 'your jackson version IS SAFE to CVE-2017-15095';
} else {
// 未修正版ではクラス名に基づいてインスタンス化される。
// フィールド名に副作用のあるgetterを指定するなどでgadgetを動かし、任意コード実行につなげることが可能。
// 本テストケースではそこまでは到達できず、実行しようとしたが失敗した例外を確認できるにとどまる。
println 'your jackson version MAY NOT BE SAFE to CVE-2017-15095';
println e.printStackTrace();
}
}