상세 컨텐츠

본문 제목

[해외보안동향] 메모리 콘텐츠를 노출시킬 수 있는 안드로이드 취약점 발견

국내외 보안동향

by 알약(Alyac) 2015. 7. 2. 09:50

본문

메모리 콘텐츠를 노출시킬 수 있는 안드로이드 취약점 발견


안드로이드 4.0~5.x 에서 메모리 콘텐츠를 노출시키는 취약점이 발견되었습니다. 특히 조작된 ELF 문서는 디버거의 충돌을 일으키고 tombstone 문서 및 이와 관련된 logd 문서를 통해 메모리 내용을 유출시킬 수 있습니다. 이는 서비스 거부공격에 사용될 수도 있으며 ASLR 을 우회하여 악성코드를 실행시킬 수도 있습니다. 해당 취약점만으로는 악성코드를 실행시킬 수는 없습니다. 하지만 이 취약점을 이용하여 유출된 정보와 다른 취약점을 사용하면 악성코드를 실행시킬 수 있습니다. 해당 취약점은 악성 앱 혹은 리패키징 앱에서 악용될 수 있으며, 안드로이드 4.0 (아이스크림 샌드위치)부터 롤리팝(5.x) 까지 영향을 받을 수 있습니다. (최신 버전인 안드로이드 M에서는 패치된 상태입니다.)

 


취약점 상세묘사


해당 취약점은 문자열 복사 명령시 sym->st_name을 offset으로 사용하는데, 이때 오차 검증을 하지 않아 발생하는 것입니다. 이 값은 악성 ELF 문서에 의해 쉽게 변조될 수 있습니다. 읽을 수 없는 메모리로 offset 값을 변조했을 때 디버거에서 오류가 발생하게 되며, 만일 지속적으로 오류가 발생한다면 서비스 거부 공격이 발생할 수도 있습니다. 또한, 정교하게 offset을 변조한 경우, 디버거는 관련 메모리의 내용을 유출시켜 dump 및 log문서에 해당 내용을 저장합니다.


Android 5.0~5.1, external/libunwind/src/elfxx.c에 취약점 존재


for (sym = symtab;

            sym < symtab_end;

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

         {

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

           && sym->st_shndx != SHN_UNDEF)

         {

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

             continue;

           if (sym->st_shndx != SHN_ABS)

             val += load_offset;

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

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


                   /* ANDROID support update */

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

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

                   /* End of ANDROID update */

             {

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

               strncpy (buf, strtab + sym->st_name, buf_len);  //the address st_name may be easily controlled by malformed  ELF

               buf[buf_len - 1] = '';

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

                  ? -UNW_ENOMEM : 0);

             }

         }

         }


충돌을 일으킬 수 있는 ELF 문서를 사용하면 취약점을 재현할 수 있습니다. 부호의 offset값을 수정했으며, ELF는 APK에 임베디드 된 후, 주기적으로 실행됩니다.  


※ 취약점 트리거

안드로이드 구 버전에서도 위의 취약점과 유사한 문제를 확인할 수 있습니다. (특히 4.x버전대 버전으로 Ice Cream Sandwich, Jelly Bean 및 KitKat)해당 버전들은 타사의 libunwind를 사용하지 않습니다. 

          

안드로이드 4.0 중에서 system/core/debuggerd/symbol_table.c에 취약점 존재


int j = 0;

     if (dynsym_idx != -1) {

         // …and populate them

         for(i = 0; i < dynnumsyms; i++) {

             if(dynsyms[i].st_shndx != SHN_UNDEF) {

                 table->symbols[j].name = strdup(dynstr + dynsyms[i].st_name);//st_name is not carefully checked before using

                 table->symbols[j].addr = dynsyms[i].st_value;

                 table->symbols[j].size = dynsyms[i].st_size;

                 XLOG2(“name: %s, addr: %x, size: %x\n”,

                     table->symbols[j].name, table->symbols[j].addr, table->symbols[j].size);

                 j++;

             }

         }

     }


     if (sym_idx != -1) {

         // …and populate them

         for(i = 0; i < numsyms; i++) {

             if((syms[i].st_shndx != SHN_UNDEF) &&

                 (strlen(str+syms[i].st_name)) &&

                 (syms[i].st_value != 0) && (syms[i].st_size != 0)) {

                 table->symbols[j].name = strdup(str + syms[i].st_name);//st_name is not checked before using

                 table->symbols[j].addr = syms[i].st_value;

                 table->symbols[j].size = syms[i].st_size;

                 XLOG2(“name: %s, addr: %x, size: %x\n”,

                     table->symbols[j].name, table->symbols[j].addr, table->symbols[j].size);

                 j++;

             }

         }

     }


안드로이드 4.1~4.4 에서는 system/core/libcorkscrew/symbol_table.c에 취약점 존재


size_t symbol_index = 0;

     if (dynsym_idx != -1) {

         // …and populate them

         for (int i = 0; i < dynnumsyms; i++) {

             if (dynsyms[i].st_shndx != SHN_UNDEF) {

                 table->symbols[symbol_index].name = strdup(dynstr + dynsyms[i].st_name);//st_name is not checked before using

                 table->symbols[symbol_index].start = dynsyms[i].st_value;

                 table->symbols[symbol_index].end = dynsyms[i].st_value + dynsyms[i].st_size;

                 ALOGV(”  [%d] ‘%s’ 0x%08x-0x%08x (DYNAMIC)”,

                         symbol_index, table->symbols[symbol_index].name,

                         table->symbols[symbol_index].start, table->symbols[symbol_index].end);

                 symbol_index += 1;

             }

         }

     }


     if (sym_idx != -1) {

         // …and populate them8         for (int i = 0; i < numsyms; i++) {

             if (syms[i].st_shndx != SHN_UNDEF

                     && str[syms[i].st_name]

                     && syms[i].st_value

                     && syms[i].st_size) {

                 table->symbols[symbol_index].name = strdup(str + syms[i].st_name);//st_name is type of uint32_t not be checked

                 table->symbols[symbol_index].start = syms[i].st_value;

                 table->symbols[symbol_index].end = syms[i].st_value + syms[i].st_size;

                 ALOGV(”  [%d] ‘%s’ 0x%08x-0x%08x”,

                         symbol_index, table->symbols[symbol_index].name,

                         table->symbols[symbol_index].start, table->symbols[symbol_index].end);

                 symbol_index += 1;

             }

}

     }


해당 취약점을 발견한 연구원들은 올해 4월 27일 해당 취약점에 대한 내용을 구글 측에 전달하였으며, 5월 15일 

Android Open Source Project (AOSP) (https://android-review.googlesource.com/#/c/150831/)에 해당 취약점에 대한 패치가 공개되었습니다. 



참고:

http://blog.trendmicro.com/trendlabs-security-intelligence/trend-micro-discovers-android-vulnerability-that-can-lead-to-exposure-of-device-memory-content/



관련글 더보기

댓글 영역