Memory Corruption : Use After Free

곽무경·2022년 7월 14일
0

System Hacking

목록 보기
22/27

Use-After-Free

메모리 참조에 사용한 포인터를 메모리 해제 후에 적절히 초기화하지 않아서,
또는 해제한 메모리를 초기화하지 않고 다음 청크에 재할당해주면서 발생하는 취약점

Dangling Pointer

유효하지 않은 메모리 영역을 가리키는 포인터

  • malloc 함수는 할당한 메모리의 주소를 반환
  • 메모리를 동적 할당할 때는 포인터를 선언하고, 그 포인터에 메모리의 주소를 저장, 참조
  • free 함수는 메모리를 해제할 때 사용
    • 청크를 ptrmalloc에 반환할 뿐 청크의 주소를 담고 있던 포인터를 초기화하지 않음
    • free의 호출 이후 포인터를 초기화하지 않으면, 포인터는 해제된 청크를 가리키는
      Dangling Pointer가 됨

Double Free Bug

예제 코드

  • 예제에서 청크를 해제한 후, 청크를 가리키던 ptr 변수를 초기화하지 않는다.
  • ptr을 할당하고 해제하면, ptr은 이전에 할당한 청크의 주소를 가리키는 dangling pointer가 된다.
  • ptr을 한번 더 해제하면, 이를 Double Free Bug라고 한다. (심각한 보안 위협 취약점)
  • 최신 버전의 운영체제에서는 Double Free Bug를 잡아내 오류를 발생시킨다.
  • Kali Linux
  • Ubuntu 16.04

Use After Free

  • 해제된 메모리에 접근할 수 있을 때 발생하는 취약점
  • mallocfree 함수는 할당 또는 해제할 메모리를 초기화하지 않으므로, 프로그래머가 명시적으로 이를 초기화하지 않으면, 메모리에 남아있던 데이터가 유출되거나 사용될 수 있다.

예제 코드


Name으로 secret_info의 문자열이 출력되고,
값을 입력한 적 없는 함수 포인터가 0x1337을 가리키고 있다.

분석

  • ptrmalloc2는 새로운 할당 요청이 들어왔을 때, 요청된 크기와 비슷한 청크가
    bin이나 tcache에 있는지 확인한다.
  • 만약 있다면, 해당 청크를 꺼내어 재사용한다. (예제에서 NametagSecret은 같은 크기)
  • 앞서 할당한 secret을 해제하고 nametag를 할당하면
    nametagsecret과 같은 메모리 영역을 사용하게 된다.
  • free는 해제한 메모리의 데이터를 초기화하지 않으므로, nametag에는 secret
    일부가 남아있다.
  • heap 명령어 : 할당 및 해제된 청크들의 정보를 조회
  • secretfree된 직후의 heap
  • 해제된 메모리의 데이터가 초기화되지 않아, free를 했음에도 데이터가 남아 있다.
  • nametag가 할당된 직후의 heap (Free된 영역이 그대로 사용되고 있음)
  • 초기화한적 없는 값들이 들어있음 (nametag->name, nametag->func)

0개의 댓글