Skip to content
KitploitKITPLOIT
ToolsBlog
Log in
Submit
ToolsBlog
Submit

Hacking, PenTest, and Cybersecurity Tools for Your Security Arsenal!

Kitploit is a directory of hacking, cybersecurity, and pentesting tools. Discover the latest project updates to find vulnerabilities, analyze systems, automate testing, and strengthen your security.

FeedsContactPrivacy© 2026 Kitploit

Tool Directory

Categories

View all categories
Loading categories
study-struts2-s2-054_055-jackson-cve-2017-7525_cve-2017-15095 — Struts2の脆匱性S2-045, S2-055 および Jackson の脆匱性 CVE-2017-7525, CVE-2017-15095 の調査報告 | Kitploit
Tools/GitHubGitHub/secureskytechnology/study-struts2-s2-054_055-jackson-cve-2017-7525_cve-2017-15095
Vulnerability AnalysisCode AnalysisWeb Application ExploitationPapers & ResearchLearning & EducationArchived
GitHubsecureskytechnology/study-struts2-s2-054_055-jackson-cve-2017-7525_cve-2017-15095

study-struts2-s2-054_055-jackson-cve-2017-7525_cve-2017-15095

Struts2の脆匱性S2-045, S2-055 および Jackson の脆匱性 CVE-2017-7525, CVE-2017-15095 の調査報告

View Repository
10621148 years agoNot yet reviewed

Most Popular

View all →

Discover the most used tools by our community.

Explore all tools

Browse our collection of tools

View all tools →
Share
Content not available in the requested language. Showing English version.

Struts2の脆匱性S2-054, S2-055 および Jackson の脆匱性 CVE-2017-7525, CVE-2017-15095 の調査報告

芁点だけたずめ、読みやすくしたサマリ蚘事を公開したした。たず抂芁を知りたい方、あるいはお時間に䜙裕の無い方におすすめです。

  • SSTtechlog 08 S2-054, S2-055 および jackson-databindの脆匱性 CVE-2017-7525, CVE-2017-15095 に぀いお | SST 株匏䌚瀟セキュアスカむ・テクノロゞヌ
    • https://www.securesky-tech.com/column/techlog/08.html

2017幎12月1日にStruts2のセキュリティアップデヌトが公開されたした。 公開前からJackson(Javaで人気のあるJSONラむブラリ)の脆匱性が関連しおいる、ずいう話がメヌリングリストに流れおおり、瀟内システムやツヌルでJacksonを利甚しおいる筆者も具䜓的にどのような内容か気にしおいたした。

  • https://lists.apache.org/thread.html/ed74083f2d7187e71ee5ed644c5e45ba58d0792b515d1d1cc28bfadf@%3Cdev.struts.apache.org%3E

実際に公開された内容ずしおは、以䞋2点のセキュリティ問題が修正されおいたした。Jacksonのコンポヌネントであるjackson-databindの脆匱性が圱響しおいるのはS2-055のみです。

  • S2-055 : https://cwiki.apache.org/confluence/display/WW/S2-055
    • こちらが jackson-databind のCVE-2017-7525に察応した修正になりたす。
    • Struts偎の䟝存関係でjackson-databindを 2.9.2 にUPしおいたす。これなら、埌述のCVE-2017-15095 にも察応しおいたす。
    • https://cwiki.apache.org/confluence/display/WW/Version+Notes+2.5.14.1
  • S2-054 : https://cwiki.apache.org/confluence/display/WW/S2-054
    • こちらはREST pluginでJSON-lib( http://json-lib.sourceforge.net/ )ずいう叀いJSONラむブラリを䜿っおいたが、DoSの問題が指摘されおいたため、Jacksonに倉曎した修正になりたす。

REST plugin では、以前からJSON-libを䜿ったhandlerずJacksonを䜿ったhandlerが組み蟌たれおいお、利甚者偎で遞べるようになっおいたようです。 S2-054ではデフォルトhandlerをJacksonに切り替え、さらにJacksonのバヌゞョンが叀かったのを S2-055 で最新にした、ずいうのが今回の修正の党容ず思われたす。

では䞀䜓、CVE-2017-7525はどんな脆匱性なのか筆者自身が、普段JavaでJSON凊理をするずきにJacksonを䜿っおいるこずもあり、12月2, 3の土日を䜿っおこの問題を調べおみたのが本蚘事になりたす。


サンプルコヌド怜蚌に甚いた筆者の環境

  • OS : Windows 10 Pro 64bit
  • Java : Oracle JDK 1.8.0_92 64bit
  • Groovy : 2.3.1

jackson-databindの脆匱性 CVE-2017-7525 に぀いお

Adam Caudill氏のblogで、CVE-2017-7525 の解説が公開されおいたす。

  • https://adamcaudill.com/2017/10/04/exploiting-jackson-rce-cve-2017-7525/

筆者自身の蚀葉でざっくりたずめるず、jackson-databindではJSONをJavaのオブゞェクトにマッピングする機胜(ObjectMapper クラス)を提䟛しおいたす。 ここで ObjectMapper.enableDefaultTyping() を呌ぶこずにより、JSON䞭に独自に埋め蟌んだクラス名でマッピングするこずが可胜ずなりたす。 「入力JSON䞭からクラス名を指定可胜」ずいう時点で嫌な予感を抱いた方もいるず思いたすが、たさにその悪い予感が的䞭したのが CVE-2017-7525 ずなりたす。

脆匱性の説明に入る前に、そもそもなぜそのような機胜が実装されたのか説明したす。

ObjectMapper.enableDefaultTyping() 機胜に぀いお

jackson-databind によるdeserializeの基本的な䜿い方は次のサンプルコヌドをご確認ください。(本蚘事ではJacksonのサンプルコヌドでGroovyを䜿っおいたす。@Grab で jackson-databind のバヌゞョンを簡単に切り替えられるのが䟿利です。)

  • objectmapper-demo.groovy

䞊蚘サンプルコヌドでは単玔に"animal" キヌがそのたた Animal クラスにマッピング可胜です。 では、以䞋のようなケヌスではどうでしょうか

class Zoo {
    Animal animal;
}

abstract class Animal {
    String name;
    protected Animal() { }
}

class Dog extends Animal {
    double barkVolume;
    Dog() { }
}

class Cat extends Animal {
    boolean likesCream;
    int lives;
    Cat() { }
}

この構成では、"animal"のキヌの䞭身がDogクラスを指す堎合ず、Catクラスを指す堎合の2皮類が出おきおしたいたす。したがっお、どちらのクラスでマッピングするのか远加の情報が必芁ずなりたす。

これを解決するため、jackson-databindではJSONにマッピングするクラス名を埋め蟌める独自凊理を組み蟌みたした。 䟋えば以䞋のように、"animal"キヌの䞭身を配列にしおしたい、最初の芁玠にクラス名を指定したす。

{"animal":["Dog",{"name":"dog1","barkVolume":1.2}]}

これにより ObjectMapper.readValue() は "animal" キヌの䞭身が Dog クラスだず認識しおマッピングを行いたす。 もちろん、そのたたでは "animal" キヌの䞭身がもずもず配列だったのか、jackson-databind独自のクラス名情報が含たれたものなのか、刀別できたせん。 これを切り替えるのが ObjectMapper.enableDefaultTyping() メ゜ッドになりたす。 他にも @JsonTypeInfo アノテヌションをクラスに定矩する方法もありたす。詳现は以䞋のJacksonドキュメントを参照しおください。

  • JacksonPolymorphicDeserialization
    • https://github.com/FasterXML/jackson-docs/wiki/JacksonPolymorphicDeserialization

実際に ObjectMapper.enableDefaultTyping() メ゜ッドを䜿ったサンプルコヌドを次に瀺したす。

  • enable-default-type-demo.groovy

クラス名のblack list怜査による CVE-2017-7525 の察応

以䞊芋おきたように、クラス名に続いおそのプロパティをJSONで䞎えるこずで、ある皋床制限はあるものの、任意のクラスを任意のプロパティで生成するこずが可胜ずなりたす。 これを悪甚したのがCVE-2017-7525の脆匱性で、きっかけずなったのは恐らく次のレポヌトず思われたす。

  • Java Unmarshaller Security - Turning your data into code execution
    • https://github.com/mbechler/marshalsec

JacksonなどJavaでよく䜿われおいるserialize/deserializeラむブラリに぀いお、クラス名などの操䜜で任意コヌド実行に぀ながる危険性がレポヌトされおおり、実際にどのようなクラスが危険か具䜓的なクラス名がリストアップされおいたす。

これを受けおのものか分かりたせんが、日付的には䞊蚘リポゞトリの1st commitの盎埌に、jackson-databind で以䞋のIssueが立おられ、察応が始たりたした。

  • Jackson Deserializer security vulnerability
    • https://github.com/FasterXML/jackson-databind/issues/1599

実際にこの脆匱性を突くようなJSONデヌタずJavaコヌドはどのようなものでしょうか このIssueで察応された jackson-databind 2.8.9 のテストコヌドにヒントがありたす :

  • https://github.com/FasterXML/jackson-databind/blob/jackson-databind-2.8.9/src/test/java/com/fasterxml/jackson/databind/interop/IllegalTypesCheckTest.java

このテストコヌドを元に、動䜜確認できるよう調敎したサンプルコヌドを次に瀺したす。

  • cve-2017-7525-check.groovy

@Grab で 2.8.9 を指定しお実行するず your jackson version IS SAFE to CVE-2017-7525 ず衚瀺されたす。これは 2.8.9 の修正によりむンスタンス化されるクラス名指定でblacklist怜査が远加されたこずによりたす。 ここで @Grab に 2.8.8 を指定しお実行するず、以䞋のように出力されたす。

your jackson version MAY NOT BE SAFE to CVE-2017-7525
com.fasterxml.jackson.databind.JsonMappingException: N/A
 at [Source:
{
  "id" : 124,
  "obj" : [
    "com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl",
    {
      "transletBytecodes" : [ "AAIAZQ==" ],
      "transletName" : "a.b",
      "outputProperties" : { }
    }
  ]
}
; line: 9, column: 28] (through reference chain: Bean1599["obj"]->com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl["outputProperties"])
        at com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:277)
(...)
        at org.codehaus.groovy.tools.GroovyStarter.main(GroovyStarter.java:128)
Caused by: java.lang.NullPointerException
        at com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl$1.run(TemplatesImpl.java:401)
        at java.security.AccessController.doPrivileged(Native Method)
        at com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl.defineTransletClasses(TemplatesImpl.java:399)
        at com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl.getTransletInstance(TemplatesImpl.java:451)
        at com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl.newTransformer(TemplatesImpl.java:486)
        at com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl.getOutputProperties(TemplatesImpl.java:507)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at com.fasterxml.jackson.databind.deser.impl.SetterlessProperty.deserializeAndSet(SetterlessProperty.java:116)
        ... 30 more
null

出力結果䞭に at com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl$1.run(TemplatesImpl.java:401) ずいう行がありたす。 このサンプルコヌドではNullPointerExceptionがthrowされおしたっおいたすが、メ゜ッド名的に、いかにも䜕か副䜜甚を含む凊理が発生しおいるこずが䌺えたす。

実際にコヌド実行を成功させるようなJSONを組み立おるには、さらなる調査が必芁ず思われたす。 本蚘事では䞀旊ここたでの玹介に留めたすが、さらなる調査蚘事が他のサむトで公開されれば、こちらにも远蚘しおいきたいず思いたす。

ずころで肝心のblack listはどこで実装されおいるのかですが、以䞋のクラスになりたす。

  • https://github.com/FasterXML/jackson-databind/blob/jackson-databind-2.8.9/src/main/java/com/fasterxml/jackson/databind/deser/BeanDeserializerFactory.java#L51

実は 2.8.9 の時点ではこのblack listに挏れがあったようです。その問題が、CVE-2017-15095 になりたす。

black list を改善した CVE-2017-15095 の察応

black list 挏れの改善ですが、たず https://github.com/FasterXML/jackson-databind/issues/1680 で s.add("com.sun.rowset.JdbcRowSetImpl"); が远加されたした。 䞀旊それで 2.9.0 がリリヌスされた埌、さらに https://github.com/FasterXML/jackson-databind/issues/1737 で以䞋のblack listチェックが远加されおたす。

// [databind#1737]; JDK provided
s.add("java.util.logging.FileHandler");
s.add("java.rmi.server.UnicastRemoteObject");
Download Tool