use-after-free 버그

Posted 2010.01.31 23:56 by beistlab
use-after-free 간단한 소개 페이지: http://www.fortify.com/vulncat/ko/vulncat/cpp/use_after_free.html


개인적으로 여태까지 다양한 형태의 버그를 발견해왔지만 use-after-free 버그 류에 대해서 직접 발견해본 적은 아직 없는 것 같습니다. 몇개 있긴 했었는데 실제로는 exploitable하지 않은, 그저 crash만 일어나는 버그였습니다. Idefense VCP에서 만달러 받고 서현역에 있는 더블린이라는 술집에서 기네스를 왕창 마시고 취할 수 있는 기회를 놓친거죠.

음, 어쨌거나 자동화된 분석을 통하여 use-after-free 류의 버그가 일어날 수 있는 가능성을 알아내는 기법은 이미 나와있습니다. (완전히 자동화라고 볼 수는 없고 그냥 보조적인 역할을 해준다고 보시면 됩니다.) 요거에 관해서는 제가 나중에 따로 자세히 알아보는 시간을 갖겠습니다.

그런데 문제는 현재까지 나온 기법들은 explicit하게 free를 하는 (프로그래머가 직접 free를 호출하는 등의) 방식이라면 어느 정도 반자동화 분석이 가능하지만 garbage collection 등으로부터 통해 free(상황에 따라 정확히는 free라는 표현이 안 맞는 경우도 있습니다만 의미를 쉽게 하기 위해 free로 통일하겠습니다.)가 되는 경우에는 기존의 기법이 잘 적용되지 않습니다.

왜냐하면 말 그대로 use-after-free가 일어나는 논리적인 조건들에 대해서 불을 밝혀주는 것들을 프로그래밍을 해야 하는데 이게 힘들기 때문입니다. 버그를 발견하려는 프로그램의 제작자가 명확하게 free를 호출하는 경우라면 흐름을 분석해가면서 조건에 만족될 수 있는 경우를 catch해낼 수 있는데 그거랑은 상관 없이 garbage collection 등을 통해서 free되는 경우라면 이건 완전히 다른 이야기가 됩니다. 이렇게 된다면 단순히 흐름만을 분석해서는 안되고 프로그램의 behavior까지 고려해야 하는 등.. 음.. 뭐 정확히는 모르겠군요.

그래서 아직까지는 이런 류의 버그를 찾기 위해서는 퍼징이 제일 효과적인 방법일거라고 생각합니다. 그냥 제 짐작인데 이번에 중국 해커들이 구글을 공격했을 때 사용한(Aurora Project라고 불리는) 익스플로러 버그도 퍼징을 통해서 찾았을 겁니다.


Exploit 코드: http://www.exploit-db.com/exploits/11167
보는 김에 이것도: http://www.darkreading.com/security/vulnerabilities/showArticle.jhtml?articleID=222301436


다만 이 중국 친구들은 막무가내로 퍼징을 한 것이 아니라 애초에  use-after-free 류의 버그를 찾으려고 목표를 잡았을 겁니다. 증거로는, interval을 두어 garbage collection이 trigger되도록 한 부분이 코드에 있다는 겁니다. 조금 전에 간단한 테스트를 해보았습니다. exploit 코드를 보면 span element와 관련이 되어있길래 이것을 html version 4에 존재하는 모든 다른 elements로 각각 바꾼 후 테스트해보았는데, 결과는? 당연히 아무런 문제가 안 생겼습니다. ㅋㅋ 만약 여기서 문제가 발생했다면 전 microsoft 보안 팀을 엄청 무시했을지도 ㅋㅋ

아무튼 전략적이고 효율적인 방법을 세우기가 아주 쉽진 않은 거 같습니다. fuzzing만이 살 길인데 설계를 잘못하면 한 1년 돌려도 절대 안 나올겁니다. 요즘 특별히 여유가 있는 것도 아니고 (그러면서 술은 많이 마시는거 보면 이 말도 핑계인 것 같지만 모두 각자에게 숨을 쉴만한 공간은 한두개쯤은 주어야 하니깐 ㅋㅋ) 주변에 별 일이 없을 때는 머리 속에 생각하고 있는 것들을 정돈하면서 이런 류의 버그를 찾는 특화된 fuzzer를 제작해보고 싶네요.

오늘 오랜만에 책상을 엄청 깨끗하게 치웠는데 깨끗한 환경에서 뭘 하려니 정신적으로 대미지가 막 쌓이는군요. Lol


Tag : , ,

Write your message and submit
« PREV : 1 : 2 : 3 : 4 : 5 : 6 : 7 : 8 : 9 : 10 : ··· : 40 : NEXT »