영문을 읽을 줄 아시는 분은 그냥 WP-Hariri-Zuckerbraun-Gorenc-Abusing_Silent_Mitigations.pdf 읽으시는거 추천
memory protection은 ms14-037에 소개됫는데 대강 요약하면 이런거임
일단 wait list라는게 있음. 이게 free가 될 메모리 주소들을 걍 모아놓은 공간이라고 생각하면 됨. 이 메모리 주소라는건 그냥 편의상 블록이라고 부르겠음.
heapfree를 수행하면 내부에서 protectedfree 함수가 호출이 되는데 우선 이 wait list를 검사해서 꽉 차 있는지 체크함. 만약 꽉 차있으면 reclamation sweep이라는 과정을 진행함.
reclamation sweep은 wait list를 특정 방식으로 재 배열하는 작업을 의미한다. 이는 대기 리스트에 배치된 순서와 동일한 순서로 free시키기 위해 수행한다(주소의 순서가 아님).
꽉 안차있고 여유가 있는 상태라면 마지막 reclamation sweep을 거친 이후 wait list에 있는 블록들의 사이즈(free 대상의 크기)를 검사해서 10만이 넘어가는지 체크함.
만약 10만이 넘어간다면 reclamation sweep을 진행함. 진행하고나면 대상이 되는 블록을 wait list에 추가함. 크기 10만이 넘어가지 않는 경우에는 reclamation sweep을 진행하지 않고 그냥 wait list에 추가함.
이후 해당 블록의 free할 크기만큼 zero fill을 수행하며 protectedfree함수를 종료한다.
과정을 살펴보면 reclamation sweep을 되게 자주하는데(wait list 추가 전에 수행한다던가) 안꼬이려고 자주하는건가? 암튼 이러한 정규적인(?) heapfree과정 외에도 WndProc 함수가 호출되는 경우에 reclamation sweep을 수행하는 것을 확인할 수 있다.
머 window 함수를 호출할때를 제일 들기 쉬운 예로 보면 되려나?
이 말이 무슨말이냐하면 위에 과정을 보면 알겠지만 reclamation sweep을 수행하고 나면 heap manager로 wait list를 던져줘서 전부 free를 시킴. 그니까 10만이라는 크기가 누적되지 않아도 free를 시킨다는 말임.
근데 이게 맨첨에 언급한 white paper를 봐도 알 수 있겠지만 memory protection에 대한 mitigation을 할 때 이 점을 응용하는 것을 확인할 수 있음. wndproc을 호출하여 일부러 free를 유발할 수 있기 때문에..
'공부 > vuln' 카테고리의 다른 글
html meta tag에 따른 다른 렌더링 엔진 사용 (0) | 2016.05.13 |
---|---|
javascript collectgarbage (0) | 2016.05.02 |
gflags page heap (0) | 2016.05.02 |