转载

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

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

这个漏洞可以被恶意应用或者重新打包的应用利用。漏洞影响的系统版本包括Android 4.0 (Ice Cream Sandwich)到Lollipop(5.x),下一代的Android M已经修复了这个漏洞。

漏洞详情

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

126       for (sym = symtab;

127            sym  symtab_end;

128            sym = (Elf_W (Sym) *) ((char *) sym + syment_size))

129         {

130           if (ELF_W (ST_TYPE) (sym->st_info) == STT_FUNC

131           && sym->st_shndx != SHN_UNDEF)

132         {

133           if (tdep_get_func_addr (as, sym->st_value, &val)  0)

134             continue;

135           if (sym->st_shndx != SHN_ABS)

136             val += load_offset;

137           Debug (16, "0x%016lx info=0x%02x %s/n",

138              (long) val, sym->st_info, strtab + sym->st_name);

139

140                   /* ANDROID support update */

141                   if ((Elf_W (Addr)) (ip - val)  *min_dist

142                       && (Elf_W (Addr)) (ip - val)  sym->st_size)

143                   /* End of ANDROID update */

144             {

145               *min_dist = (Elf_W (Addr)) (ip - val);

146               strncpy (buf, strtab + sym->st_name, buf_len);  //st_name的地址可能被恶意ELF轻易控制

147               buf[buf_len - 1] = '';

148               ret = (strlen (strtab + sym->st_name) >= buf_len

149                  ? -UNW_ENOMEM : 0);

150             }

151         }

152         }

想重现漏洞,就要用到一个能够导致崩溃的ELF文件。我们可以通过修改符号偏移做到。ELF被放入APK后,它就会被循环执行。之后就会触发漏洞,见下图:

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

在Android旧版本中也可以发现类似的问题(特别是4.x版本,如Ice Cream Sandwich, Jelly Bean和KitKat)。在这些版本中用的不是libunwind第三方库。在Android 4.0中,漏洞存在于system/core/debuggerd/symbol_table.c:

155     int j = 0;

156     if (dynsym_idx != -1) {

157         // …and populate them

[1]  [2] [3]  下一页

正文到此结束
Loading...