
Struts2ã®è匱æ§S2-045, S2-055 ããã³ Jackson ã®èåŒ±æ§ CVE-2017-7525, CVE-2017-15095 ã®èª¿æ»å ±å
èŠç¹ã ããŸãšããèªã¿ããããããµããªèšäºãå ¬éããŸããããŸãæŠèŠãç¥ãããæ¹ããããã¯ãæéã«äœè£ã®ç¡ãæ¹ã«ããããã§ãã
2017幎12æ1æ¥ã«Struts2ã®ã»ãã¥ãªãã£ã¢ããããŒããå ¬éãããŸããã å ¬éåããJackson(Javaã§äººæ°ã®ããJSONã©ã€ãã©ãª)ã®è匱æ§ãé¢é£ããŠããããšãã話ãã¡ãŒãªã³ã°ãªã¹ãã«æµããŠããã瀟å ã·ã¹ãã ãããŒã«ã§Jacksonãå©çšããŠããçè ãå ·äœçã«ã©ã®ãããªå å®¹ãæ°ã«ããŠããŸããã
å®éã«å ¬éãããå 容ãšããŠã¯ã以äž2ç¹ã®ã»ãã¥ãªãã£åé¡ãä¿®æ£ãããŠããŸãããJacksonã®ã³ã³ããŒãã³ãã§ããjackson-databindã®è匱æ§ã圱é¿ããŠããã®ã¯S2-055ã®ã¿ã§ãã
REST plugin ã§ã¯ã以åããJSON-libã䜿ã£ãhandlerãšJacksonã䜿ã£ãhandlerãçµã¿èŸŒãŸããŠããŠãå©çšè åŽã§éžã¹ãããã«ãªã£ãŠããããã§ãã S2-054ã§ã¯ããã©ã«ãhandlerãJacksonã«åãæ¿ããããã«Jacksonã®ããŒãžã§ã³ãå€ãã£ãã®ã S2-055 ã§ææ°ã«ããããšããã®ãä»åã®ä¿®æ£ã®å šå®¹ãšæãããŸãã
ã§ã¯äžäœãCVE-2017-7525ã¯ã©ããªè匱æ§ãªã®ãïŒçè èªèº«ããæ®æ®µJavaã§JSONåŠçããããšãã«Jacksonã䜿ã£ãŠããããšãããã12æ2, 3ã®åæ¥ã䜿ã£ãŠãã®åé¡ã調ã¹ãŠã¿ãã®ãæ¬èšäºã«ãªããŸãã
ãµã³ãã«ã³ãŒãæ€èšŒã«çšããçè ã®ç°å¢ïŒ
Adam Caudillæ°ã®blogã§ãCVE-2017-7525 ã®è§£èª¬ãå ¬éãããŠããŸãã
çè
èªèº«ã®èšèã§ãã£ãããŸãšãããšãjackson-databindã§ã¯JSONãJavaã®ãªããžã§ã¯ãã«ãããã³ã°ããæ©èœ(ObjectMapper ã¯ã©ã¹)ãæäŸããŠããŸãã
ããã§ ObjectMapper.enableDefaultTyping() ãåŒã¶ããšã«ãããJSONäžã«ç¬èªã«åã蟌ãã ã¯ã©ã¹åã§ãããã³ã°ããããšãå¯èœãšãªããŸãã
ãå
¥åJSONäžããã¯ã©ã¹åãæå®å¯èœããšããæç¹ã§å«ãªäºæãæ±ããæ¹ããããšæããŸããããŸãã«ãã®æªãäºæãçäžããã®ã CVE-2017-7525 ãšãªããŸãã
è匱æ§ã®èª¬æã«å ¥ãåã«ããããããªããã®ãããªæ©èœãå®è£ ãããã®ã説æããŸãã
jackson-databind ã«ããdeserializeã®åºæ¬çãªäœ¿ãæ¹ã¯æ¬¡ã®ãµã³ãã«ã³ãŒããã確èªãã ããã(æ¬èšäºã§ã¯Jacksonã®ãµã³ãã«ã³ãŒãã§Groovyã䜿ã£ãŠããŸãã@Grab ã§ jackson-databind ã®ããŒãžã§ã³ãç°¡åã«åãæ¿ããããã®ã䟿å©ã§ãã)
äžèšãµã³ãã«ã³ãŒãã§ã¯åçŽã«"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ããã¥ã¡ã³ããåç
§ããŠãã ããã
å®éã« ObjectMapper.enableDefaultTyping() ã¡ãœããã䜿ã£ããµã³ãã«ã³ãŒããæ¬¡ã«ç€ºããŸãã
以äžèŠãŠããããã«ãã¯ã©ã¹åã«ç¶ããŠãã®ããããã£ãJSONã§äžããããšã§ãããçšåºŠå¶éã¯ãããã®ã®ãä»»æã®ã¯ã©ã¹ãä»»æã®ããããã£ã§çæããããšãå¯èœãšãªããŸãã ãããæªçšããã®ãCVE-2017-7525ã®è匱æ§ã§ããã£ãããšãªã£ãã®ã¯æããæ¬¡ã®ã¬ããŒããšæãããŸãã
Jacksonãªã©Javaã§ãã䜿ãããŠããserialize/deserializeã©ã€ãã©ãªã«ã€ããŠãã¯ã©ã¹åãªã©ã®æäœã§ä»»æã³ãŒãå®è¡ã«ã€ãªããå±éºæ§ãã¬ããŒããããŠãããå®éã«ã©ã®ãããªã¯ã©ã¹ãå±éºãå ·äœçãªã¯ã©ã¹åããªã¹ãã¢ãããããŠããŸãã
ãããåããŠã®ãã®ãåãããŸããããæ¥ä»çã«ã¯äžèšãªããžããªã®1st commitã®çŽåŸã«ãjackson-databind ã§ä»¥äžã®Issueãç«ãŠããã察å¿ãå§ãŸããŸããã
å®éã«ãã®è匱æ§ãçªããããªJSONããŒã¿ãšJavaã³ãŒãã¯ã©ã®ãããªãã®ã§ããããïŒ ãã®Issueã§å¯Ÿå¿ããã jackson-databind 2.8.9 ã®ãã¹ãã³ãŒãã«ãã³ãããããŸã :
ãã®ãã¹ãã³ãŒããå ã«ãåäœç¢ºèªã§ãããã調æŽãããµã³ãã«ã³ãŒããæ¬¡ã«ç€ºããŸãã
@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ã¯ã©ãã§å®è£ ãããŠããã®ãïŒã§ããã以äžã®ã¯ã©ã¹ã«ãªããŸãã
å®ã¯ 2.8.9 ã®æç¹ã§ã¯ãã®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");