보안 제품정보


리눅스 커널 내에서 또! 루트 권한 넘겨주는 취약점 나와 2018.10.01

리눅스 커널 3.16~4.18.8 버전 내의 메모리 관리 기능에 있는 취약점
안드로이드는 아직 패치 나오지 않아...적용만 하면 해결 되는 문제


[보안뉴스 문가용 기자] 리눅스 커널에서 또 다른 심각한 취약점이 발견됐다. 이 취약점을 악용할 경우 공격자가 루트 권한을 가져갈 수 있게 된다고 한다. 이로써 이번 주에만 발견된 리눅스 커널 취약점이 두 개가 됐다.

[이미지 = iclickart]


이번에 발견된 버그는 CVE-2018-17182로, 리눅스 커널 3.16~4.18.8 버전 내의 메모리 관리 기능에서 발견됐다. 익스플로잇 방법은 여러 가지가 있는데, 이를 발견한 구글 프로젝트 제로팀의 잔 혼(Jann Horn)에 의하면 “꽤나 강력하게 샌드박스 처리가 된 환경에서도 익스플로잇 할 수 있다”고 한다.

혼은 이 사실을 9월 18일에 리눅스 팀에만 보고했고, 리눅스 팀은 그로부터 이틀 후에 이 문제를 해결했다. 혼은 “다른 소프트웨어 벤더들에 비해 꽤나 빠른 조치”라고 말했다. 하지만 데비안(Debian)과 우분투(Ubuntu) 16.04와 18.04 버전에서는 패치가 아직 진행되지 않았다. 안드로이드 사용자들도 여전히 위험에 노출되어 있다.

혼은 “안드로이드는 보안 업데이트를 한 달에 한 번만 진행한다”며 “보안에 있어 대단히 중요한 픽스가 나왔다고 하더라도 실제로 적용되는 데에 수주가 걸릴 때도 있다”고 경고했다. “대대적으로 공개되지 않은 경우라면 이 시간은 더 길어질 때도 많습니다.”

취약점
혼에 의하면 이번에 발견된 버그는 일종의 오버플로우 문제라고 한다. “리눅스 커널이 페이지에서 발생한 오류를 다루기 위해 가상 메모리 영역(VMA)에 접근할 때, 올바른 답을 찾기 위해 코드 내 모든 VMA를 크롤링 하는 과정이 발생합니다. 근데 이 과정이 매우 느리고 효율이 낮습니다. 컴퓨터 자원을 많이 잡아먹기도 하고요. 그래서 코더들은 보다 빠른 대체 방안을 탑재했어요.”

그건 바로 ‘캐싱(caching)’을 활용하는 것이었다. 그러나 효율이 높아진 대신 다른 문제가 발생했다. “VMA가 사용된 이후에는, 모든 쓰레드의 VMA 캐시들을 무효화시켜야 합니다. 그렇지 않으면 다음 VMA 검색 혹은 사용 시 댕글링 포인트(dangling pointer)를 따라가게 됩니다. 그러나 한 프로세스에도 많은 쓰레드가 있을 수 있으므로 모든 쓰레드의 VMA 캐시들을 반복 처리하는 것만으로도 시스템 퍼포먼스에 문제가 생길 수 있습니다.”

그렇다면 이를 어떻게 해결해야 할까? 쓰레드들에 시퀀스 번호를 붙여 구분하는 절차가 필요하다. 하지만 이 시퀀스 번호라는 건 32비트라는 제한점이 있다. “그래서 오버플로우가 발생하게 되는 겁니다. 그래서 3.16 버전에서는 오버플로우 처리 로직이 추가됐는데요, 이는 UaF 취약점을 유발시킵니다. 이게 바로 CVE-2018-17182입니다.”

UaF 취약점이란, 사용이 끝난 메모리 공간에 접근하려는 시도를 지칭한다. 이 때문에 프로그램이 다운되고 시스템이 마비될 수도 있다. UaF는 일종의 메모리 변형 오류로, 어떤 프로그램이 어떤 메모리 영역에 대한 해제 책임을 가지고 있는지에 대한 혼선이 발생함으로써 야기된다. 그리고 이번에 발견된 취약점의 경우, 루트 접근과 임의 코드 실행까지도 이어진다.

사용자들로서는 리눅스 버전을 4.18.9, 4.14.71, 4.9.128, 4.4.157, 3.16.58 버전으로 업그레이드 시키면 이 위험에서 벗어날 수 있다. “VMA 시퀀스 번호를 64비트로 바꿨습니다. 그러므로 오버플로우가 아예 발생하지 않게 한 것이죠. 따라서 오버플로우 처리 로직을 삭제할 수 있었습니다.”

한편 혼은 우분투 18.04 버전에 적용 가능한 개념증명을 개발해 공개하기도 했다. 시스템에 오랜 시간 접근할 수 있는 경우(약 한 시간), 루트 권한을 얻어낼 수 있게 해주는 것이었다. 이는 이 페이지(https://bugs.chromium.org/p/project-zero/issues/detail?id=1664)에서 열람이 가능하다.

“이 버그는 오버플로우를 일으킬 만큼 충분히 긴 시간 동안 실행이 가능하며, mmap()/munmap(), clone() 등을 사용할 수 있는 프로세스를 통해서 악용하는 게 가능합니다. MAP_FIXED가 사용 가능하다면 이는 약 한 시간 정도 됩니다.”

3줄 요약
1. 이번 주, 두 번째 리눅스 커널 내 취약점 발견.
2. 오버플로우 취약점 해결하려다가 생긴 UaF 취약점. CVE-2018-17182.
3. 데비안, 우분투 일부 버전 빼고는 패치 나옴. 적용하면 해결 가능.

[국제부 문가용 기자(globoan@boannews.com)]

<저작권자: 보안뉴스(www.boannews.com) 무단전재-재배포금지>