[보안뉴스 문가용 기자] 리눅스 생태계를 위협하는 새로운 룻키트가 발견됐다. 이름은 푸마킷(PumaKit)인데, 고급 스텔스 기능을 사용하여 스스로를 숨기고 C&C 서버와의 통신을 유지하는 정교한 기능을 보여주고 있다. 그만큼 사이버 공격자들의 리눅스 지식과 공략 실력이 높아지고 있다는 뜻으로, 리눅스 생태계의 보호책이 보다 강력해져야 할 필요가 있음을 시사한다.
[이미지 = gettyimagesbank]
엘라스틱의 연구원들은 늘 하던대로 바이러스토탈을 둘러보다가 흥미로운 바이너리를 하나 발견했다. 이름은 크론(cron)이었다. “2024년 9월 4일에 처음 업로드 되었던 바이너리로, 탐지율이 0%인 것으로 나타났습니다. 스텔스 기능이 매우 훌륭할 것으로 추측이 되었습니다. 그래서 조사를 이어갔는데, 추가 조사 결과 같은 날 업로드 된 아티팩트도 탐지율이 0%인 것을 알아냈습니다. 그러면서 심층 분석이 시작됐습니다. 그러면서 더 흥미로운 결과들이 나타나기 시작했습니다.”
이 바이너리에 ‘푸마킷’이라는 이름을 붙인 데에는 이유가 있다. 악성코드를 만든 작성자 자신이 구성 요소 중 하나인 LKM 룻키트 모듈을 푸마(PUMA)라고 명명했고, 또 다른 구성 요소인 ‘사용자 영역 룻키트’에서 키추네(Kitsune)라는 문자열이 나왔기 때문이다. 이 둘을 합쳐서 적절히 끊어낸 게 ‘푸마킷’이다. 이 푸마킷의 공격은 제일 처음 드로퍼인 크론으로부터 시작되는 것으로 분석됐다.
“크론 바이너리는 드로퍼의 기능을 가지고 있습니다. 이 바이너리의 주요 목표는 다음과 같이 정리할 수 있습니다.”
1) 명령줄에서 특정 키워드(Huinder)를 확인한다.
2) 해당 키워드가 없을 경우 페이로드를 파일 시스템에 기록하지 않고 오로지 메모리에서만 실행한다.
3) 키워드가 있을 경우, 포함된 구성 요소를 디스크에 덤프하고 정상적으로 종료한다.
즉 캠페인의 첫 단계에서부터 스스로를 감추려는 공작을 시도하는 것이라고 할 수 있다.
Huinder라는 문자열이 발견되지 않을 경우 if(!argv_)라는 조건문 내부의 코드가 발동되면서 다음 단계의 공격에 필요한 파일 두 개가 추출된다. Wpn과 Tgt다. 이 두 파일의 주요 목표는 악성 스크립트 하나를 로딩하는 것이다. “바로 script.sh라는 셸 스크립트입니다. 이 스크립트의 주요 로직은 다음과 같습니다.”
1) c() 함수 : file 명령어를 사용해 파일이 EFL 바이너리인지 아닌지를 확인한다. 아닐 경우 오류 값을 내보낸다.
2) d() 함수 : 특정 압축 형식의 시그니처를 기반으로 다양한 압축 유틸리티를 사용해 파일의 압축을 해제한다. 그리고 grep과 tail을 활용함으로써 특정 압축 세그먼트를 찾아내 추출하기도 한다.
3) 파일 처리 : 스크립트의 모든 항목이 실행되면 스크립트 파일과 관련 폴더가 삭제된다.
이 스크립트가 성공적으로 실행되면 LKM 룻키트가 실행된다.
LKM 룻키트란, 로더블 커널 모듈 룻키트(loadable kernel modules rootkit)의 준말이다. 로더블 커널 모듈, 즉 LKM은 리눅스 커널에 동적으로 로딩될 수 있는 코드 조각들로, 커널을 다시 컴파일링 하거나 시스템을 재부팅하지 않고도 기능성을 확장할 수 있게 해 준다. 예를 들어 커널에서 지원하지 않는 새로운 유형의 파일시스템을 처리해야 할 때, 특정 커널 모듈을 잠깐 로딩함으로써 문제를 해결하는 게 가능하다. 공격자들이 이런 강력한 ‘기능성 확장 기능’을 악용하기 위해 만든 도구가 LKM 룻키트라고 할 수 있다.
푸마킷의 LKM 룻키트는 어떻게 피해자의 시스템을 조작할까? 기본적으로는 시스템 호출 테이블(syscall table)과 kallsyms_lookup_name()라는 함수가 그 바탕이 된다. 후자인 kallsyms_lookup_name() 함수는 심볼을 확인하는 기능을 가지고 있다. 하지만 최신 버전의 커널(즉 5.7 이상)에서는 이 kallsyms_lookup_name() 함수를 적절한 라이선싱 없이는 사용하는 게 불가하다. 2020년부터 변경된 내용인데, 이는 kallsyms_lookup_name()을 라이선싱 없이도 사용할 수 있을 때 악용 사례가 증가했기 때문이다. “푸마킷의 개발자가 kallsyms_lookup_name() 함수를 사용했다는 건 애초에 5.7 이전의 커널 버전들을 노렸다는 걸 의미합니다. 오래된 커널을 대상으로 한 공격 도구라는 것이죠.”
LKM 룻키트를 통해 ‘커널 영역’을 침해했다면 사용자 영역은 어떨까? (리눅스 시스템은 크게 사용자 영역과 커널 영역으로 나뉘어져 있다. 사용자 영역은 말 그대로 사용자가 직접 다루고 조작할 수 있는 공간을 말한다. 커널은 보다 하위에 있는 중요 층위로, 여기에서는 시스템이 동작하는 데 필요한 모든 기능이나 권한들이 관리된다. 그래서 보통 ‘리눅스를 공격한다’고 하면 커널을 건드린다는 걸 의미한다. 하지만 사용자 영역에 대한 공격 시도도 꾸준히 일어나는 편이다.) “푸마킷에는 사용자 영역을 노리는 도구도 포함되어 있습니다.”
엘라스틱시큐리티 측은 이런 푸마킷의 교묘하면서 은밀한 공격을 식별 및 탐지하는 데 도움이 될 야라(YARA) 서명을 만드는 데 성공했다고 하며, 이를 공개했다. “푸마킷은 고급 기술로 구성된, 복잡하고 은밀한 위협입니다. 다양한 시스템 호출 후킹 기능, 메모리 상에서만 실행되는 특성, 독특한 권한 상승 공격 등을 전부 동원해 리눅스 생태계를 공략합니다. 게다가 x86과 ARM64 등 다양한 아키텍처를 대상으로 멀웨어가 설계되어 있기도 합니다. 그만큼 공격자들이 리눅스 공략에 진심이라는 걸 알 수 있습니다. 현재까지는 위에 언급된 야라 서명으로 공격을 빠르게 탐지하는 게 최선의 방어 전략입니다.”
3줄 요약
1. 리눅스 생태계에 거대한 위협이 새롭게 등장.
2. 이 위협은 일종의 룻키트인데, 각종 스텔스 기능이 탑재되어 있다는 게 특징.
3. 리눅스 생태계를 노리는 공격자들의 지식과 실력이 나날이 깊어지고 있음.
*푸마킷 룻키트에 대한 보다 상세한 기술 분석 정보와 야라 서명은 이번 주 목요일(19일)에 발간되는 주간 프리미엄 리포트를 통해 공개됩니다.
[국제부 문가용 기자(globoan@boannews.com)]
<저작권자: 보안뉴스(www.boannews.com) 무단전재-재배포금지>