In Univ? (2024-1) - 1
3 min read
In Seoul
2024년도는 대학에 있었다고 말하기 어려운 해입니다. 대학에 다니긴 했지만 온라인 수업으로 때웠고, 나머지 시간은 모두 풀타임으로 회사에서 일했기 때문이죠.
정직원으로 Theori에 입사한 해이기도 합니다. 그렇다고 인턴이랑 크게 달라진 점은 없었던 것 같네요. 예전과 다른 일을 하는 것도 아니라 단순히 고용 형태만 바뀌었습니다.
동일하게 전 워게임 제작과 강의 작성, 그리고 드림핵 사이트나 Discord로 들어오는 것들을 처리했습니다. 제가 해킹을 처음 공부할 때 사용했던 플랫폼을 이제는 제가 운영하고 있다니... 신기한 느낌이었고, 그렇기에 더욱 드림핵에 애착을 가졌던 것 같습니다.
CVE-2024-41010
Exploit
전 많은 작업들을 V4bel과 했습니다만, 예전부터 알고 지내던 사이는 아니었습니다. 처음 접점이 생긴 때가 24년 4월쯤으로, 당시 현우님이 저한테 신기한 커널 버그를 하나 들고 왔습니다. 이거 익스 할 수 있겠냐고 말이죠.
그 제안이 참으로 고마웠습니다. 저는 버그 익스를 좋아하는 좋아하는 사람이지 찾는 걸 좋아하는 편은 아니었는데, 이렇게 버그를 가져다주고 익스할 권리를 주겠다면 저에게 더할 나위 없는 좋은 조건이죠. 하등 거절할 이유가 없었습니다.
심지어 성공하면 kernelCTF에서 바운티까지 준다고? 하는 정도가 아니고, 반드시 성공해야 했습니다.
문제라고 한다면 익스의 난이도였습니다. 0-day 익스를 처음 해보는 내가 할 수 있을까 걱정이 되긴 했죠. 그래도 여태까지 Kernel 문제 푼 시간이 얼만데, 어떻게든 되지 않을까 싶었습니다. 팀장님껜 2주 정도 익스할 시간을 빼 달라고 부탁드렸죠. 흔쾌히 허락해주셔서 감사했습니다
당시 버그엔 몇 가지 난관이 있었습니다. 메모리에 남아있는 값을 포인터로 해서, [0x20, 0x28) 위치의 오프셋에 우리가 컨트롤 할 수 없는 8 bytes 값을 적는 프리미티브였던걸로 기억하는데 오래되서 정확히는 모르겠습니다. 아무튼 쉽지 않은 프리미티브였던 것만 기억나네요.
여기서 익스를 다 다루면 너무 길어질 것 같으니 일단 이 문서를 참고해주세요. 나중에 시간이 난다면 익스를 자세히 다뤄볼까 싶습니다.
어려운 건 사실이지만 어딘가 CTF에서 한 번 쯤 나올 것만 같은 문제였습니다. 그래서 예전처럼 익스에 쓸만한 객체가 없나 이리저리 pahole를 뒤져보던 중 simple_xattr란 구조체가 6.6으로 올라오면서 rbtree를 사용하도록 바뀐 걸 발견했습니다! 덕분에 list_add()나 list_del() check가 사라지면서 glibc의 잘 알려진 테크닉인 unsafe unlink를 사용할 수 있게 된다는 걸 깨달았죠.
이걸 이용해서 arbitrary free를 만들었습니다. 이 정도면 사실 셸은 무조건 따 놓은 당상이었습니다. 후딱 익스해서 V4bel한테 들고 갔죠.
Submission
그렇게 익스를 성공했지만, 첩첩산중이란걸 그제야 깨달았습니다.
익스는 큰 장벽이 아니었습니다. 오히려 제출이 문제였죠.
kernelCTF는 특정 slot에서 가장 빨리 flag를 딴 1명만 인정해주는 형태입니다. 그렇기에 익스플로잇이 되더라도 이 버그를 제출하기까지 얼마나 걸릴지 모릅니다. 바로 성공할 지, 1달이 걸릴지, 혹은 1년이 걸릴지 모릅니다. 심지어 다른 사람이 우리가 시도하는 버그로 익스를 제출했다면 뺐길 수도 있습니다.
처음엔 둘 다 '설마 제출이 그렇게 오래 걸리겠어?'란 생각을 했습니다만, 그 우려는 곧 현실이 되었습니다. lts-6.6.30, lts-6.6.31, lts-6.6.32... 모두 슬롯을 먹는 데 실패했습니다. 이 쯤 되면 진짜로 불안해질 수 밖에 없었습니다.
그러곤 마침내 lts-6.6.35에서 exploit을 성공했습니다! 성공하고 나서 즉시 security팀에 메일을 보내고 0-day 제출 절차를 밟았으나 마음 속 한 켠에 있던 불길한 느낌은 지울 수 없었습니다.
그리고 그 느낌은 적중했습니다. 누군가 저희와 동일한 버그로 lts-6.6.31을 했던 것이었습니다. 본 링크에 나와 있는 Pedro Pinto -> Hyunwoo Kim and Wongi Lee가 제보했다고 적혀있죠.
절망, 그 자체였습니다. 거진 3달의 노력이 물거품이 되었으니까요.
저희는 룰 북을 읽고 또 읽었습니다. 하지만 독립된 버그로 인정 받는 건 하늘의 별 따기 같아 보였죠. 아주 조금의 모호함과 kernelCTF 담당자의 자애로움만이 저희를 구제해줄 수 있었습니다. 방법이 없으니, 마지막 동아줄을 붙잡는 셈 치고 담당자에게 문자를 넣었습니다.
그리고 조금 뒤...

저희의 간절함이 구글을 감동시킨 걸까요. 이번만 예외적으로 인정해주기로 하였습니다.
'이번 슬롯 받는 거 실패하면 kernelCTF 그만할까?'란 이야기를 하던 와중에 온 답변이었고, 이후로도 계속 kernelCTF를 하게 해 준 원동력이었기에 저에겐 정말로 감사한 결정이었습니다. 누군 끊었던 담배를 피기도 하고... 지금에야 웃으면서 이야기하네요.
역시 인생사 새옹지마입니다.
FIN?
24년도엔 뭔가 사건이 많군요. 4개로 나눠 써야겠습니다 ㅋㅋㅋ.
Comments
Loading...