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) 的结合。

  1. 输入点 (Source): AnyConnect 的某些组件(如 ServiceController)通过 Android 的 Intent 机制接收外部数据。当应用尝试从 Intent 的 Extras 中获取序列化对象,并调用 ObjectInputStream.readObject() 时,便触发了反序列化流程。
  2. 利用链 (Gadget Chain): AnyConnect 客户端由于业务需要,内部集成了易受攻击的 Apache Commons Collections (ACC) 库。攻击者利用该库中的 InvokerTransformer 类,通过精心构造的序列化对象(如 AnnotationInvocationHandler 装饰的 LazyMap),可以串联多个反射调用。
  3. 触发逻辑: 在 Android 系统中,组件间通信 (IPC) 经常使用序列化对象。若某个导出的 Activity、Service 或 Receiver 接收了不可信的序列化数据并进行反序列化,且当前进程的 Classpath 中存在 ACC,攻击即刻生效。

0x02 POC (Proof of Concept)

利用著名的反序列化工具 ysoserial,可以轻松生成针对此漏洞的 Payload。

1. 生成攻击 Payload

使用 CommonsCollections1 链生成在 Android 系统中执行命令的二进制序列化文件:

# 生成在 Android 系统中执行 touch 命令的序列化文件
java -jar ysoserial.jar CommonsCollections1 "touch /data/local/tmp/pwned" > payload.bin

2. 攻击实施 (Android 环境)

在 Android 中,可以通过 adb 命令模拟恶意 App 发送 Intent 进行攻击(假设漏洞组件为 com.cisco.anyconnect.vpn.android.avf/.ServiceController):

# 将 payload.bin 转换为 Base64 或直接通过文件传递给 Intent
adb shell am startservice -n com.cisco.anyconnect.vpn.android.avf/.ServiceController \
    --es "data_key" "$(cat payload.bin | base64)"

(注意:实际利用中需要逆向分析 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.URLHttpURLConnection,将窃取到的敏感数据编码后通过 HTTP 请求发送至攻击者控制的 C2 服务器。

0x04 应急排查与日志痕迹分析

1. Logcat 日志痕迹分析

  • 异常堆栈:使用 adb logcat 过滤 AnyConnect 的进程,搜索包含 java.io.ObjectInputStreamorg.apache.commons.collections 关键字的报错日志。
  • 典型报错
    • java.lang.ClassCastException:当反序列化成功执行了代码,但最终对象转型为 AnyConnect 预期的类型失败时产生。
  • 敏感操作:关注由 AnyConnect 进程发起的异常系统调用记录,如 chmod, exec, su 等不符合正常 VPN 客户端行为的操作。

2. 流量与文件系统排查

  • 流量特征:如果在流量中抓包,寻找十六进制特征码 AC ED 00 05(Java 序列化对象头部魔数)。
  • 文件检查:检查 /data/local/tmp/ 目录下是否有异常命名的二进制文件或脚本,以及检查 AnyConnect 私有目录下的文件时间戳是否被非预期篡改。

0x05 参考资料