-
-
Android调试器存在漏洞,可获取设备内存数据
-
发表于: 2015-6-29 21:06 1284
-
新闻链接: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)代码中发布了一个针对这个漏洞的补丁。
新闻时间: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)代码中发布了一个针对这个漏洞的补丁。
赞赏
看原图
赞赏
雪币:
留言: