메모리 참조에 사용한 포인터를 메모리 해제 후에 적절히 초기화하지 않아서,
또는 해제한 메모리를 초기화하지 않고 다음 청크에 재할당해주면서 발생하는 취약점
유효하지 않은 메모리 영역을 가리키는 포인터
malloc
함수는 할당한 메모리의 주소를 반환- 메모리를 동적 할당할 때는 포인터를 선언하고, 그 포인터에 메모리의 주소를 저장, 참조
free
함수는 메모리를 해제할 때 사용
- 청크를
ptrmalloc
에 반환할 뿐 청크의 주소를 담고 있던 포인터를 초기화하지 않음free
의 호출 이후 포인터를 초기화하지 않으면, 포인터는 해제된 청크를 가리키는
Dangling Pointer가 됨
예제 코드
- 예제에서 청크를 해제한 후, 청크를 가리키던
ptr
변수를 초기화하지 않는다.ptr
을 할당하고 해제하면,ptr
은 이전에 할당한 청크의 주소를 가리키는 dangling pointer가 된다.ptr
을 한번 더 해제하면, 이를 Double Free Bug라고 한다. (심각한 보안 위협 취약점)- 최신 버전의 운영체제에서는 Double Free Bug를 잡아내 오류를 발생시킨다.
- Kali Linux
- Ubuntu 16.04
- 해제된 메모리에 접근할 수 있을 때 발생하는 취약점
malloc
과free
함수는 할당 또는 해제할 메모리를 초기화하지 않으므로, 프로그래머가 명시적으로 이를 초기화하지 않으면, 메모리에 남아있던 데이터가 유출되거나 사용될 수 있다.예제 코드
Name으로 secret_info의 문자열이 출력되고,
값을 입력한 적 없는 함수 포인터가 0x1337을 가리키고 있다.
분석
ptrmalloc2
는 새로운 할당 요청이 들어왔을 때, 요청된 크기와 비슷한 청크가
bin
이나tcache
에 있는지 확인한다.- 만약 있다면, 해당 청크를 꺼내어 재사용한다. (예제에서
Nametag
와Secret
은 같은 크기)- 앞서 할당한
secret
을 해제하고nametag
를 할당하면
nametag
는secret
과 같은 메모리 영역을 사용하게 된다.free
는 해제한 메모리의 데이터를 초기화하지 않으므로,nametag
에는secret
의
일부가 남아있다.- heap 명령어 : 할당 및 해제된 청크들의 정보를 조회
secret
이free
된 직후의 heap
- 해제된 메모리의 데이터가 초기화되지 않아,
free
를 했음에도 데이터가 남아 있다.
nametag
가 할당된 직후의 heap (Free된 영역이 그대로 사용되고 있음)
- 초기화한적 없는 값들이 들어있음 (
nametag->name
,nametag->func
)