리눅스 커널 강화하는 인공지능, 곧 공개
- 리눅스 커널 생태계에서 기록된 20년치 버그 분류 및 분석
- 5가지 종류의 버그는 쉽게 발견되지 않아
- 대체적으로 탐지 시간 줄어들고 있어 희망적
리눅스 커널을 강화하려는 한 보안 전문가의 노력이 화제다. 이 전문가의 이름은 제니 콰니 쿠(Jenny Guanni Qu)로, 지난 20년 동안 깃에 기록돼 있는 커밋을 전부 수집해 분석했다고 한다. 과연 그 동안 리눅스 커널에서 어떤 오류들이 발견됐고, 어떤 식으로 개선됐는지 빠짐없이 알아냄으로써 앞으로 생길 수 있는 문제들을 더 높은 확률로 예측할 수 있게 됐을까?
쿠가 블로그를 통해 밝힌 내용에 따르면 그가 제일 먼저 한 일은 2005년 4월부터 남겨진 리눅스 커널 커밋들을 죄다 수집한 것이었다. 이 과정에만 총 6시간이 소요됐다고 한다. 그 중 125,183건이 버그 수정과 관련된 내용이었고, 쿠는 몇 가지 질문을 가지고 이 커밋들을 꼼꼼하게 살폈다. 질문은 ‘버그는 보통 얼마나 오랜 기간 발견되지 않은 채 잠복해 있는가?’, ‘어떤 종류의 버그가 더 오래 살아남는가?’, ‘반복되는 패턴이 있는가?’ 등이었다.
깃(Git)은 코드 변경 내용을 저장하는 곳이다. 2005년 4월에 출범했다. 커밋(commit)은 그 깃 안에 남겨진 실제 기록을 말한다. 둘 다 ‘코드 변경’과 관련이 있는 개념이라 헷갈릴 수 있는데, 커밋은 실제 변경과 관련된 데이터(코드 변경 내용, 변경을 가한 사람, 변경의 이유 등)를 말하고, 깃은 그런 커밋들이 여러 개 저장되어 있는 ‘저장소’ 그 자체다. 깃이 좀 더 큰 개념이라고 할 수 있다.
20년치 버그를 분석했더니
희망적인 소식부터 전하자면, 20년치 버그 중 절반 이상이 1년 이내에 발견됐다는 것이다. “2022년 기준 버그의 69%가 1년 안에 발견됐습니다. 이건 놀라운 수치입니다. 2010년에만 해도 이런 버그는 0개였거든요. 2025년 전체 버그의 평균 생존 기간은 불과 0.7년이었습니다. 우리는 버그를 발견해 알리는 데 점점 더 익숙해지고 있다고 볼 수 있습니다.”
그럼에도 상당 기간 알려지지 않은 채 남아 있는 버그들 역시 적은 수가 아니었다고 한다. “5년 이상 숨어 있던 버그가 무려 5400개나 발견됐습니다. 현재 저희는 이 버그들을 손보고 있는 중입니다.” 전체 버그 중 이렇게 오래된 것들(즉 5년 이상 된 것)은 13.5%를 차지하고 있었다. 많다고 하면 많을 수 있지만, 이미 발견됐고 손보고 있으니 줄어들 것이라고도 할 수 있다.
“전체적으로는 리눅스 커널에서 나타나는 버그들이 빠르게 모습을 드러내는 추세가 이어지고 있다고 할 수 있을 만한 결론이었습니다. 이는 리눅스 커널 코드를 검토하는 기여자 수가 늘어났기 때문이라고 저는 생각합니다. 여기에 더해 코드를 점검하는 도구들의 품질도 높아지고, 사용하는 비율도 늘어난 것도 관련이 있다고 봅니다. 대표적인 리눅스 커널 분석 도구에는 2015년에 나온 사이즈콜러(Syzkaller)라는 퍼저와 카산(KASAN), 케이엠산(KMSAN), 케이씨산(KCSAN) 등이 있습니다.”
현재까지 깃에 남아 있는 ‘버그 픽스’의 기록들을 근거로 했을 때 리눅스 커널 버그는 평균 2.1년 후에 발견되는 것으로 종합 집계됐다. 최근 들어 버그 탐지 시간이 줄어들고 있긴 하지만, 초창기에는 버그의 생존 시간이 무척 길었기 때문에 아직 평균 시간이 짧지만은 않다고 그는 덧붙였다. “지금의 추세가 이어진다면 리눅스 커널 버그의 생존율은 꾸준히 줄어들 것입니다.”
유독 잘 살아남는 버그가 있더라
모든 버그가 잘 발견되어 처리된다면 다행인데, 문제는 오래 살아남는 버그들이 적지 않게 있다는 것이다. 다행히 이 질긴 버그들 사이에서 패턴이 발견됐다고 쿠는 알렸다. “유독 잘 살아남는 버그들이 있었는데, 1) 경쟁 상태(race condition), 2) UaF(Use-after-Free), 3) 참조 세기(reference counting) 관련, 4) 널(NULL) 확인 관련, 5) 정수 오버플로우(integer overflow)였습니다. 그 중에서도 경쟁 상태 버그는 압도적 1위를 기록했습니다.”
이 다섯 가지 버그가 가장 질긴 버그로 기록된 건 일단 ‘발견이 어렵기 때문’이라고 한다. “이번 연구에서는 가장 찾기 어려운 버그가 바로 ‘경쟁 상태’였습니다. 항상 같은 상황에서 발동되는 것이지 않고, 특정 조건이 갖춰진 특정 시기에만 나타나기 때문입니다. 그러니 퍼징과 같은 테스트에서는 걸리지 않을 때도 많습니다.” 그래서인지 경쟁 상태 버그는 평균 생존 기간이 5.1년인 것으로 나타났다. 일부 20년 넘게 방치된 것들도 있었다고.
UaF 버그도 비슷하다. 코드 상으로는 멀쩡해 보이는 경우가 많다. 즉 정적 분석만으로는 잡아내기 힘들 수 있다는 것이다. “특정 실행 경로에서만 문제가 나타납니다. 리뷰할 때도 눈에 안 띌 때가 많고요.” ‘참조 세기’와 관련된 버그의 경우, 로직이 여러 함수에 흩어져 있어 전체 흐름을 봐야만 발견된다는 특징을 가지고 있어 잡아내기가 힘들다고 쿠는 설명했다. 널 확인 관련 버그는 대부분의 경우 정상 작동 하다가 예외 상황에서만 문제가 발생하기에 탐지가 까다로우며, 정수 오버플로우는 코드 리뷰 과정에서 잘 잡히지 않는다고 한다.
이 다섯 개 유형의 버그들은 기술적으로 너무나 미묘하거나 까다로워서 계속해서 발굴되는 게 아니라고 쿠는 강조했다. “진짜 문제는 이런 취약점들을 내포하고 있는 코드 구조가 개발자들 사이에서는 너무나 평범하고 늘 볼 수 있는 것들이라는 겁니다. 그렇기 때문에 ‘문제가 있다’고 느낄 수가 없어요. 해커들의 경우 이런 취약점만 찾아다니니까 비슷한 코드만 봐도 본능적으로 냄새를 맡을 수 있지만요. 너무 익숙해서 개발자들은 이상함을 못 느끼고, 해커들은 그 지점을 아주 능숙하게 파고들 수 있다는 것이지요.”
연구의 결과물, 벌버트
그렇다면 누군가 해커의 눈을 가지고 평범한 코드를 바라보고 의심하기 시작하면 그 다섯 개의 취약점도 쉽게 탐지할 수 있는 것 아닐까? 그래서 쿠는 이번 분석 결과를 바탕으로 리눅스 커널 버그 탐색 인공지능을 개발했다고 한다. 이름은 벌버트(VulnBERT)로, 버그 가능성이 높은 커밋을 예측하는 기능을 가지고 있다. “저희가 발굴한 12만 개의 커밋으로 훈련시켰습니다. 그랬기에 커밋을 통해 코드가 패치 전과 후 어떻게 변경됐는지 분석하고, 그 변경 내용을 바탕으로 취약점이 내포됐을 가능성을 계산할 수 있게 됐습니다.”
벌버트를 실제 현장에서 활용하기도 했었다. “그랬을 때 실제 버그가 있는 커밋을 92.2%의 확률로 찾아냈습니다. 오탐도 물론 있었지만 그 비율은 1.2%에 불과했습니다. 벌버트가 위험하다고 한 92.2%의 경우, 실제 위험 요소가 내포돼 있던 경우는 98.7였고요. 벌버트가 커밋을 통해 오류를 식별할 가능성이 꽤나 높다는 것이죠.”
이 벌버트는 아직 공개되지 않았다. 상용으로 판매될 계획도 아직은 없다고 쿠는 밝혔다. “오픈소스로 공개할 예정입니다. 다만 아직은 좀 더 검증이 될 필요가 있고, 그래서 이 단계를 꼼꼼하게 거쳐가야 합니다. 다 끝나면 추론 코드까지도 무료로 공개할 것입니다. 리눅스 커널을 살펴보는 모든 참여자들은 물론 보안 커뮤니티 전체의 자산으로서 활용되기를 바랍니다.” 공개까지 수주 정도가 남아 있다고 쿠는 설명했다. 정확한 공개일은 아직 나오지 않은 상황이다.
벌버트는 일반 사용자들을 위한 물건이 아닐 것이라고 한다. “개발자와 보안 연구자들이 전문적으로 사용해야 할 도구입니다. 사용자가 편리한 인터페이스를 통해 취약점을 찾아내거나 분석할 수 있는 그런 도구는 아닌 것이죠. 커널 코드와 C 메모리 모델 등을 잘 이해하고 있어야만 사용할 수 있을 겁니다.” 물론 일반인이라도 학습 기간을 거친다면 벌버트를 들고 리눅스 커널 강화에 일조할 수 있다.
명확히 예고된 건 아니지만 벌버트는 깃허브와 허깅페이스를 통해 공개될 확률이 가장 높아 보인다. 벌버트의 일부 버전은 이미 허깅페이스에 올라와 있기도 하다. 쿠의 블로그나 SNS 계정에도 안내가 나올 수 있을 것으로 점쳐진다.🆃🆃🅔
by 문가용 기자(anotherphase@thetechedge.ai)
Related Materials
- Kernel bugs hide for 2 years on average. Some hide for 20. (VulnBERT로 커밋 단계에서 취약 커밋 탐지) - Pebblebed 블로그, 2024년
- There Are Kernel Bugs in Your System That Won't Be Found for 20 Years (VulnBERT 연구 요약) - FAUN DevOpsLinks, 2024년
- Vul-RAG: Enhancing LLM-based Vulnerability Detection via Knowledge-level RAG (Linux 커널 신규 취약점 10개 발견, 6개 CVE 부여) - arXiv, 2024년
- Vulnerability detection using BERT based LLM model with transparency obligations - ScienceDirect, 2024년
