메모리 참조에 사용한 포인터를 메모리 해제 후에 적절히 초기화하지 않아서,
또는 해제한 메모리를 초기화하지 않고 다음 청크에 재할당해주면서 발생하는 취약점
유효하지 않은 메모리 영역을 가리키는 포인터
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)