메모리 콘텐츠를 노출시킬 수 있는 안드로이드 취약점 발견
안드로이드 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/)에 해당 취약점에 대한 패치가 공개되었습니다.
참고:
[해외보안동향] 애드웨어, 광고 노출을 위해 감염 PC의 FLASH 최신버전으로 업데이트 (0) | 2015.07.07 |
---|---|
[해외보안동향] 영국, 다양한 사회공학적 기법을 사용한 토렌트락커 급증 (0) | 2015.07.06 |
[해외보안동향] 메르스 관련 뉴스, 일본 언론사 타겟 공격에 악용 (0) | 2015.06.30 |
[해외보안동향] LG 앱 업데이트 시 SSL 인증서 확인하지 않는 것으로 밝혀져 (0) | 2015.06.30 |
[해외보안동향] 구글, 사용자 동의 없이 음성 녹음 수집 (0) | 2015.06.25 |
댓글 영역