首页
社区
课程
招聘
[原创]fastjson漏洞是否影响安卓
发表于: 2024-2-27 23:01 3020

[原创]fastjson漏洞是否影响安卓

2024-2-27 23:01
3020

fastjson有一些已知的严重RCE漏洞,例如CVE-2017-18349和CVE-2022-25845。一般其影响范围在服务器端,多为Spring Boot框架的服务,而在安卓的影响却没有搜到任何资料。我们来分析一下,如果一个安卓客户端应用使用了老版本的fastjson库,是否可以被攻击。

在查看fastjson 1.1.53.android的maven网页时,发现其标注了存在已知CVE漏洞。

Just a moment...

mvnrepository.com/artifact/com.alibaba/fastjson/1.1.53.android

查看fastjson的github修复公告,却表示安卓环境不涉及此漏洞(CVE-2017-18349)。除此之外,没有找到更多的fastjson漏洞在安卓上的分析。

https://github.com/alibaba/fastjson/wiki/security_update_20170315

github.com/alibaba/fastjson/wiki/security_update_20170315

尽管fastjson出过好几次RCE的漏洞,但是本质上原理相同,仅仅是安全检查绕过的方法不同,因此我们本文先研究最初被发现的RCE,CVE-2017-18349。

分析思路

经过一些搜索,找到了网上一些关于此漏洞的信息,但是没有找到为什么安卓版本不涉及此漏洞。

我发现fastjson发布的版本号中,除了普通的版本还有安卓版本,后缀为“.android”。安卓版是主要针对安卓环境进行优化,除此之外没有特殊改动。

https://github.com/alibaba/fastjson/wiki/Android%E7%89%88%E6%9C%AC

github.com/alibaba/fastjson/wiki/Android%E7%89%88%E6%9C%AC

Android版本

https://github.com/alibaba/fastjson/wiki/Android%E7%89%88%E6%9C%AC

github.com/alibaba/fastjson/wiki/Android%E7%89%88%E6%9C%AC

部分fastjson安卓版的差异

以目前的信息,可以得到以下两个猜测:

  • 猜测1:fastjson的安卓版本和普通版本有区别,导致安卓版本不受此漏洞影响。
  • 猜测2:安卓运行环境不同,不受此漏洞影响。

为了分析fastjson在安卓上的影响,我们搭建3个环境。

  • 第一个是已知脆弱的环境,其服务为Spring Boot,尝试复现,然后用于比较。
  • 第二个是类似第一个的环境,但是把fastjson的依赖库版本加上“.android”后缀,以测试安卓版本在Spring Boot中是否脆弱。
  • 第三个环境是正常的安卓客户端应用,使用安卓版本的fastjson,除此之外尽可能模仿第一个环境的应用层逻辑。

尝试复现

使用vulhub上的样例可以成功复现,具体参考其wiki。

https://github.com/vulhub/vulhub/tree/master/fastjson/1.2.24-rce

github.com/vulhub/vulhub/tree/master/fastjson/1.2.24-rce

但是这个样例是docker容器,其中包含的jar文件,没有源码。为了能好地分析,我们需要用源码搭建一套复现环境。要找到源码,可以尝试从docker中复制出来然后反编译。

运行其容器后,使用以下命令将里面的jar拷贝到本地宿主机。

docker cp <container-id>:<src-path> <dest-path>

然后用jadx打开,找到相关json反序列化入口

可见此poc使用的是一个spring boot框架下的普通的json反序列化,没有特殊条件。后续我们将用 JSON.parseObject(<json-str>) 的方式来复现

我们本地也构造这样一个环境试试。首先尝试新建一个spring boot工程,使用较新的jdk 17和spring boot 3.2.2版本,但是老的fastjson 1.2.24。

请注意当前的https://start.spring.io/默认初始模板中的依赖是错误的。如果你是用的是其初始模板,需要将build.gradle中“org.springframework.boot:spring-boot-starter”需要改成“org.springframework.boot:spring-boot-starter-web”,否则会编译失败。

使用一个简单的反序列化payload, 在服务器根路径收到get请求时触发

在请求localhost:8080后,发现服务器报错

java.lang.reflect.InaccessibleObjectException: Unable to make public com.sun.rowset.JdbcRowSetImpl() accessible: module java.sql.rowset does not "exports com.sun.rowset" to unnamed module

搜索此报错,看到如下github issue。

https://github.com/dbgee/fastjson-rce/issues/2

github.com/dbgee/fastjson-rce/issues/2

看上去jdk 17是无法构造RCE的,因此尝试换成jdk 1.8 (8u202)。

这样修改后编译是失败的,因为spring boot 3.2.2不兼容。由于依赖的环境版本比较老,所以有一些配置需要修改才能正常跑起来。

根据这篇Stack Overflow回答,我们去找spring boot 2.7

https://stackoverflow.com/questions/76467522/cant-compile-spring-boot-on-java-1-8

stackoverflow.com/questions/76467522/cant-compile-spring-boot-on-java-1-8

按照spring boot 2.7的gradle设置,重新修改build.gradle。

https://docs.spring.io/spring-boot/docs/2.7.18/gradle-plugin/reference/htmlsingle/#getting-started

docs.spring.io/spring-boot/docs/2.7.18/gradle-plugin/reference/htmlsingle/#getting-started

这是我的最终build.gradle。注意第22行不能加,否则在当前的环境中跑不起来。

与此同时,如果没有jdk 1.8,去oracle官网创建一个账号,然后下载。

由于我是用gradlew启动的程序,所以在其bash脚本中进行修改,无脑使用了java 1.8

在启动nc监听的情况下,再次访问该网页,复现成功。可见右侧的监听收到了rmi的请求。为了更简便地分析调试,我们这里不必使用完整的PoC,而是在收到请求之后就确定是有问题的。

我们先尝试一下安卓版本能否复现这个bug。由于描述上写的fastjson版本小于1.2.25都存在这个问题,所以我这里用了1.1.52.android这个版本。现在我们把build.gradle中的fastjson版本修改后重新编译并运行服务器。

然后使用同样的payload,发现服务器依然会去请求jndi。如果我们打断点,是可以看到这次调用栈进入的是1.1.52.android版本的fastjson。

那么排除fastjson的安卓版有不同于普通版的地方,所以安卓版是安全的的这个假设。

经过一些搜索,我们可以看到安卓是不支持jndi的。

类似fastjson,log4shell也是在安卓不受影响。其同样利用了jndi的方式进行了RCE。可以看到这篇文章分析得出安卓不影响,原因是安卓不支持jndi。

Just a moment...

support.nowsecure.com/hc/en-us/articles/4417200289421-Log4Shell-and-Its-Impact-on-Mobile-Security

由于我们尝试的poc是依赖jndi的,因此安卓的老版本确实无法用相同的方式攻击。

我们搭建一个kotlin的安卓项目,并使用fastjson 1.1.52.android,其余均为默认值。

尝试在安卓应用中使用相同的payload,在activity的onCreate的时候直接运行反序列化。得到以下报错:类无法找到

理解此漏洞

由于老版本fastjson在反序列化时,可以指定任意类进行反序列化。在反序列化时也会调用其get、set、constructor等方法,也就相当于代码执行。

任何可以被fastjson反序列化攻击的类称为fastjson gadget,而我们最熟知的便是jndi的类。攻击者能用fastjson执行的代码,仅限于fastjson gadget。具体的反序列化分析不在本文中讨论。

安卓版本不能使用jndi的gadget,但是其他的很多gadget可以使用,也存在很多Spring Boot没有的gadget。目前已知的安卓fastjson gadget中,没有能造成实际影响的。

结论

目前已知的PoC无法攻击安卓应用,因为使用的fastjson gadget是jndi,且安卓不支持jndi。攻击者可以利用fastjson进行代码执行,但是目前(2024-02-26)没有发现可以在安卓上造成实际影响的fastjson gadget。

本次研究的fastjson的安卓版本(后缀为“.android”)和普通版本在服务器端使用都存在RCE漏洞,攻击方式相同。



[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 4
支持
分享
最新回复 (1)
雪    币: 3004
活跃值: (30866)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
感谢分享
2024-2-28 09:45
1
游客
登录 | 注册 方可回帖
返回
//