首页
社区
课程
招聘
Android调试器存在漏洞,可获取设备内存数据
发表于: 2015-6-29 21:06 1241

Android调试器存在漏洞,可获取设备内存数据

2015-6-29 21:06
1241
新闻链接:http://www.freebuf.com/news/71157.html
新闻时间:2015-06-29
新闻正文:趋势科技近日发现了Android调试器Debuggerd中的漏洞,该漏洞可以获取设备内存中的数据,影响系统包括Android 4.0冰淇淋三明治(冰淇淋三明治)到棒棒糖(棒棒糖)。

url.jpg

一个构造精巧的精灵(可执行、可链接格式)文件可以导致调试器崩溃,然后通过墓碑文件和对应的logd日志文件暴露内存内容。这可以被用于拒绝服务攻击,可以帮助绕过将来执行恶意代码。仅仅利用这个漏洞是无法进行代码执行的。但是通过这个漏洞暴露的信息可以和其他漏洞结合用于代码执行。

这个漏洞可以被恶意应用或者重新打包的应用利用。漏洞影响的系统版本包括Android 4.0(冰淇淋三明治)到棒棒糖(5。 x),下一代的Android米已经修复了这个漏洞。

漏洞详情

导致漏洞的原因是在执行字符串复制命令时,Debuggerd会使用符号- > st_name作为抵消,而不进行错误检查。这个值可以轻易被恶意的精灵文件控制,它可以将抵消值指向不可读取的内存,Debuggerd就会崩溃。如果不断崩溃就会造成拒绝服务攻击。如果精心构造抵消就会使Debuggerd暴露相应的内存内容,Debuggerd会将它们存入转储和日志文件中。
对于Android 5.0 - -5.1,漏洞出现在外部/ libunwind / src / elfxx.c:

    126年       为 (信谊= symtab;
    127年信谊< symtab_end;
    128年信谊= (Elf_W (信谊) *) ((字符 *)信谊+ syment_size))
    129年         {
    130年           如果 (ELF_W (ST_TYPE) (信谊- >st_info) = = STT_FUNC
    131年           & &时信谊- >st_shndx ! = SHN_UNDEF)
    132年         {
    133年           如果 (tdep_get_func_addr (作为,信谊- >st_value, &瓦尔) < 0)
    134年             继续;
    135年           如果 (信谊- >st_shndx ! = SHN_ABS)
    136年瓦尔+ = load_offset;
    137年           调试 (16, “0 x % 016 lx信息= 0 x % 2 x % s \ n”,
    138年              (长)瓦尔,信谊- >st_info, strtab +信谊- >st_name);
    139年
    140年                   / * * / ANDROID支持更新
    141年                   如果 ((Elf_W (Addr)) (知识产权- - - - - -瓦尔) < *min_dist
    142年                       & &时 (Elf_W (Addr)) (知识产权- - - - - -瓦尔) <信谊- >st_size)
    143年                   * / / * ANDROID年底更新
    144年             {
    145年               *min_dist = (Elf_W (Addr)) (知识产权- - - - - -瓦尔);
    146年               strncpy (但, strtab +信谊- >st_name, buf_len);  / / st_name的地址可能被恶意精灵轻易控制
    147年但(buf_len - - - - - - 1] = & #039年& #;039年;;
    148年受潮湿腐烂= (strlen (strtab +信谊- >st_name) > = buf_len
    149年                  吗? - - - - - -UNW_ENOMEM : 0);
    150年             }
    151年         }
    152年         }
想重现漏洞,就要用到一个能够导致崩溃的精灵文件。我们可以通过修改符号偏移做到.ELF被放入APK后,它就会被循环执行。之后就会触发漏洞,见下图:

debugger1tb.png

在Android旧版本中也可以发现类似的问题(特别是4。 x版本,如冰淇淋三明治,果冻豆和KitKat)。在这些版本中用的不是libunwind第三方库。在Android 4.0中,漏洞存在于系统/核心/ debuggerd / symbol_table.c:

    155年     int j = 0;
    156年     如果 (dynsym_idx ! = - - - - - -1) {
    157年         / /…和填充
    158年         为(我= 0;我< dynnumsyms;我+ +) {
    159年             如果(dynsyms(我]。st_shndx ! = SHN_UNDEF) {
    160年表- >符号(j]。的名字=strdup分配(dynstr + dynsyms(我]。st_name);/ / st_name没有经过检查就被使用了
    161年表- >符号(j]。addr = dynsyms(我]。st_value;
    162年表- >符号(j]。大小= dynsyms(我]。st_size;
    163年                 XLOG2(“的名字: %年代, addr: %x,大小: %x \ n”,
    164年表- >符号(j]。的名字,表- >符号(j]。addr,表- >符号(j]。大小);
    165年                 j+ +;
    166年             }
    167年         }
    168年     }
    169年
    170年     如果 (sym_idx ! = - - - - - -1) {
    171年         / /…和填充
    172年         为(我= 0;我< numsyms;我+ +) {
    173年             如果((信谊(我]。st_shndx ! = SHN_UNDEF) & &时
    174年                 (strlen(str+信谊(我]。st_name)) & &时
    175年                 (信谊(我]。st_value ! = 0) & &时 (信谊(我]。st_size ! = 0)) {
    176年表- >符号(j]。的名字=strdup分配(str +信谊(我]。st_name);/ / st_name没有经过检查就被使用了
    177年表- >符号(j]。addr =信谊(我]。st_value;
    178年表- >符号(j]。大小=信谊(我]。st_size;
    179年                 XLOG2(“的名字: %年代, addr: %x,大小: %x \ n”,
    180年表- >符号(j]。的名字,表- >符号(j]。addr,表- >符号(j]。大小);
    181年                 j+ +;
    182年             }
    183年         }
    184年     }
而在Android 4.1 - -4.4中,漏洞存在于系统/核心/ libcorkscrew / symbol_table.c:

    150年     size_t symbol_index = 0;
    151年     如果 (dynsym_idx ! = - - - - - -1) {
    152年         / /…和填充
    153年         为 (int我= 0;我< dynnumsyms;我+ +) {
    154年             如果 (dynsyms(我]。st_shndx ! = SHN_UNDEF) {
    155年表- >符号(symbol_index]。的名字=strdup分配(dynstr + dynsyms(我]。st_name);/ / st_name没有经过检查就被使用了
    156年表- >符号(symbol_index]。开始= dynsyms(我]。st_value;
    157年表- >符号(symbol_index]。结束= dynsyms(我]。st_value + dynsyms(我]。st_size;
    158年                 ALOGV(“  (%维] ' %年代” 0 x%08年x- - - - - -0 x%08年x (动态)”,
    159年                         symbol_index,表- >符号(symbol_index]。的名字,
    160年表- >符号(symbol_index]。开始,表- >符号(symbol_index]。结束);
    161年                 symbol_index + = 1;
    162年             }
    163年         }
    164年     }
    165年
    166年     如果 (sym_idx ! = - - - - - -1) {
    167年         / /…和填充
    168年         为 (int我= 0;我< numsyms;我+ +) {
    169年             如果 (信谊(我]。st_shndx ! = SHN_UNDEF
    170年                     & &时 str(信谊(我]。st_name]
    171年                     & &时信谊(我]。st_value
    172年                     & &时信谊(我]。st_size) {
    173年表- >符号(symbol_index]。的名字=strdup分配(str +信谊(我]。st_name);/ / st_name uint32_t类型不被检查
    174年表- >符号(symbol_index]。开始=信谊(我]。st_value;
    175年表- >符号(symbol_index]。结束=信谊(我]。st_value +信谊(我]。st_size;
    176年                 ALOGV(“  (%维] ' %年代” 0 x%08年x- - - - - -0 x%08年x”,
    177年                         symbol_index,表- >符号(symbol_index]。的名字,
    178年表- >符号(symbol_index]。开始,表- >符号(symbol_index]。结束);
    179年                 symbol_index + = 1;
    180年             }
    181年}
    182年     }
debugger2tb.png

趋势科技的研究员已经在今年4月27日将漏洞提交给了Google.5月15日Android的开放源码项目(AOSP)代码中发布了一个针对这个漏洞的补丁。

[课程]Linux pwn 探索篇!

收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//