CVE-2015-6420: Cisco AnyConnect Android 反序列化漏洞分析
0x00 漏洞背景与详情
- 漏洞名称:Cisco AnyConnect Android 客户端任意代码执行漏洞
- CVE 编号:CVE-2015-6420
- 影响组件:Cisco AnyConnect Secure Mobility Client for Android
- 受影响版本:
- 4.0.x 版本 < 4.0.05032
- 4.1.x 版本 < 4.1.00010
- 漏洞类型:Java 反序列化 (CWE-502)
- 危险等级:高危 (CVSS 8.8)
Cisco AnyConnect Android 客户端在处理特定 Intent 或网络请求发送的序列化 Java 对象时,由于未进行充分的安全校验,允许远程/本地攻击者通过构造恶意序列化数据,利用内置的 Apache Commons Collections 库执行任意代码。
0x01 漏洞原理分析
该漏洞的核心在于 不安全的 IPC 数据传递 与 易受攻击的类库 (Gadget Chain) 的结合。
- 输入点 (Source):
AnyConnect 的某些组件(如
ServiceController)通过 Android 的 Intent 机制接收外部数据。当应用尝试从 Intent 的Extras中获取序列化对象,并调用ObjectInputStream.readObject()时,便触发了反序列化流程。 - 利用链 (Gadget Chain):
AnyConnect 客户端由于业务需要,内部集成了易受攻击的 Apache Commons Collections (ACC) 库。攻击者利用该库中的
InvokerTransformer类,通过精心构造的序列化对象(如AnnotationInvocationHandler装饰的LazyMap),可以串联多个反射调用。 - 触发逻辑: 在 Android 系统中,组件间通信 (IPC) 经常使用序列化对象。若某个导出的 Activity、Service 或 Receiver 接收了不可信的序列化数据并进行反序列化,且当前进程的 Classpath 中存在 ACC,攻击即刻生效。
0x02 POC (Proof of Concept)
利用著名的反序列化工具 ysoserial,可以轻松生成针对此漏洞的 Payload。
1. 生成攻击 Payload
使用 CommonsCollections1 链生成在 Android 系统中执行命令的二进制序列化文件:
2. 攻击实施 (Android 环境)
在 Android 中,可以通过 adb 命令模拟恶意 App 发送 Intent 进行攻击(假设漏洞组件为 com.cisco.anyconnect.vpn.android.avf/.ServiceController):
(注意:实际利用中需要逆向分析 App,确定具体的 Intent 键名和导出的组件名。)
0x03 高级利用姿势
在受限的 Android 沙箱环境中,单纯的 exec() 可能无法获取有效成果,红队通常会采用以下高级利用姿势:
1. 内存动态加载与间谍插件
- ClassLoader 注入:通过反序列化链反射调用
DexClassLoader,动态加载存放在网络或本地的.dex或.apk恶意字节码文件。 - 这种方式可以直接在 AnyConnect 的进程内存中运行复杂的间谍插件,避免在 Android 文件系统上留下可疑的二进制实体,实现无文件攻击。
2. 劫持 VPN 会话与凭证窃取
- 利用执行权限,读取 AnyConnect 的私有数据目录
/data/data/com.cisco.anyconnect.vpn.android.avf/。 - 窃取 VPN 配置文件、CA 证书、以及当前用户的登录会话 (Session Token),从而在外部设备上仿冒受害者接入企业内网。
3. 反序列化回显 (Echo) 与带外传输
- Logcat 回显:利用
android.util.Log.e("HACK", result)将执行结果写入系统日志,随后通过其他权限较弱的恶意 App 读取 Logcat 日志。 - 带外传输 (OOB):在执行链中反射调用
java.net.URL和HttpURLConnection,将窃取到的敏感数据编码后通过 HTTP 请求发送至攻击者控制的 C2 服务器。
0x04 应急排查与日志痕迹分析
1. Logcat 日志痕迹分析
- 异常堆栈:使用
adb logcat过滤 AnyConnect 的进程,搜索包含java.io.ObjectInputStream或org.apache.commons.collections关键字的报错日志。 - 典型报错:
java.lang.ClassCastException:当反序列化成功执行了代码,但最终对象转型为 AnyConnect 预期的类型失败时产生。
- 敏感操作:关注由 AnyConnect 进程发起的异常系统调用记录,如
chmod,exec,su等不符合正常 VPN 客户端行为的操作。
2. 流量与文件系统排查
- 流量特征:如果在流量中抓包,寻找十六进制特征码
AC ED 00 05(Java 序列化对象头部魔数)。 - 文件检查:检查
/data/local/tmp/目录下是否有异常命名的二进制文件或脚本,以及检查 AnyConnect 私有目录下的文件时间戳是否被非预期篡改。