fastjson<1.2.60
发现
https://github.com/alibaba/fastjson/commit/995845170527221ca0293cf290e33a7d6cb52bf7
分析
问题出现在
src/main/java/com/alibaba/fastjson/parser/JSONLexerBase.java
1 | public final void scanString() { |
问题产生很简单,解析十六进制时出问题了
正常的\x十六进制写法应该是
1 | [{"a":"a\xAA"}] |
x1 = A
x2 = A
如果这么写呢
1 | [{"a":"a\x] |
x1 = ]
x2 = EOI
这个时候已经读完了,但是看看判断是否读完的isEOF实现:
1 | public boolean isEOF() { |
ch=EOI,只是这时候指针bp已经在max len之后一位了,isEOF 永为false
所有会一直putChar((char) EOI),直到产生OOM
POC
1 | import com.alibaba.fastjson.JSON; |