인사이트
이번 보안동향보고서에서는 PUMAKIT 루트킷의 은닉 기법, 악성코드 수집·유형별 변화와 보이스피싱 통계 및 모바일 보안 탐지 현황을 비롯해 주요 국내외 보안 동향을 살펴봅니다. 또한 악성 PDF 피싱과 딥시크 개인정보 이슈 등 주요 사례를 통해 변화하는 위협 양상과 주요 대응 포인트를 확인해보세요.
Declawing PUMAKIT
PUMAKIT은 고급 스텔스 메커니즘을 사용하여 자신의 존재를 숨기고 명령 및 제어 서버와의 통신을 유지하는 정교한 LKM(로드 가능한 커널 모듈) 루트킷입니다.
PUMAKIT은 정교한 악성코드로, VirusTotal에서 일상적인 위협 헌팅 중에 처음 발견되었으며 바이너리 내에서 발견된 문자열의 이름을 따서 명명되었습니다. 이 루트킷은 드로퍼(cron), 두 개의 메모리 상주 실행 파일(/memfd:tgt 및 /memfd:wpn), LKM 루트킷 모듈 및 공유 객체(SO) 유저랜드 루트킷으로 구성되어 있습니다.
악성코드 제작자가 "PUMA"라고 참조하는 이 루트킷 구성 요소는 내부 Linux 함수 추적기(ftrace)를 사용하여 18개의 다른 시스템 호출과 여러 커널 함수를 연결하여 핵심 시스템 동작을 조작할 수 있도록 합니다. 권한상승을 위한 rmdir() 시스템 호출과 구성 및 런타임 정보 추출을 위한 특수 명령어를 사용하는 등 고유한 방법을 사용하여 PUMA와 상호 작용합니다. 단계적 배포를 통해 LKM 루트킷은 보안 부팅 검사 또는 커널 심볼 가용성과 같은 특정 조건이 충족될 때만 활성화되도록 합니다. 이러한 조건은 Linux 커널을 검사하여 확인되며, 필요한 모든 파일은 드로퍼 내에 ELF 바이너리로 포함되어 있습니다.
커널 모듈의 주요 기능에는 권한 상승, 파일 및 디렉터리 숨기기, 시스템 도구로부터 숨기기, 디버깅 방지 조치, 명령 및 제어(C2) 서버와의 통신 설정 등이 있습니다.
요약:
- 드로퍼: 초기 진입점으로 cron을 통해 실행됩니다.
- 메모리 상주 프로그램: /memfd:tgt, /memfd:wpn
- 루트킷: 커널 모듈(LKM) 및 사용자 영역 공유 라이브러리 형태
- 주요 특징:
·시스템 감시/조작: 18개 시스템 호출 감시, ftrace 사용
·은닉 기능: 파일과 디렉터리 숨김, 시스템 모니터링 도구에서 자신 숨김
·권한 상승: rmdir() 시스템 콜로 관리자 권한 획득
·스마트한 설치: 보안 부팅 상태 및 커널 심볼 사용 가능 여부 확인해 설치 진행
·C2 서버 연결: 원격 공격자와 통신하여 명령 수신/실행
VirusTotal에서 일상적인 위협 헌팅을 하던 중, cron이라는 흥미로운 바이너리를 발견, 이 바이너리는 2024년 9월 4일에 처음 업로드 되었으며 탐지 횟수가 0회여서 잠재적인 은닉성에 대한 의심을 불러일으켰습니다. 추가 조사 결과, 같은 날 업로드 된 또 다른 관련 artifact인 /memfd:wpn (deleted)71cc6a6547b5afda1844792ace7d5437d7e8d6db1ba995e1b2fb760699693f24도 0개의 탐지가 발견되었습니다.

Figure 1 VirusTotal Hunting
관심을 끌었던 것은 이 바이너리에 포함된 별개의 문자열로, /boot/의 vmlinuz 커널 패키지가 조작될 수 있음을 암시하는 것이었습니다. 이로 인해 샘플에 대한 심층 분석이 시작되었고, 그 결과 그 동작과 목적에 대한 흥미로운 발견을 하게 되었습니다.
내장된LKM 루트킷 모듈(악성코드 제작자가 "PUMA"라고 명명)과 SO 유저영역 루트킷인 Kitsune의 이름을 딴 PUMAKIT은 실행 체인을 시작하는 드로퍼부터 시작하여 Multi-stage아키텍처를 사용합니다. 이 프로세스는 메모리 상주 실행 파일 두 개를 생성하는 크론 바이너리로 시작됩니다: /memfd:tgt(삭제됨) 및 /memfd:wpn(삭제됨). memfd:tgt가 정상 Cron 바이너리 역할을 하는 반면, /memfd:wpn은 루트킷 로더 역할을 합니다. 로더는 시스템 상태를 평가하고 임시 스크립트(/tmp/script.sh)를 실행하며 궁극적으로 LKM 루트킷을 배포하는 역할을 담당합니다. LKM 루트킷에는 사용자 공간에서 루트킷과 상호 작용하기 위해 내장된 SO 파일인 Kitsune이 포함되어 있습니다. 이 실행 체인은 아래와 같습니다.

Figure 2 PUMAKIT infection chain이러한 구조적 설계를 통해 PUMAKIT은 특정 기준이 충족될 때만 페이로드를 실행하여 은밀성을 보장하고 탐지 가능성을 줄입니다. 프로세스의 각 단계는 메모리 상주 파일과 대상 환경에 대한 정밀한 검사를 활용하여 존재를 숨기도록 세심하게 제작되었습니다.
이 섹션에서는 여러 단계에 대한 코드 분석을 자세히 살펴보고, 이 정교한 다단계 멀웨어를 가능하게 하는 구성 요소와 그 역할을 살펴봅니다.
크론 바이너리는 드롭퍼 역할을 합니다. 아래 함수는 푸마킷 악성코드 샘플에서 주요 로직 핸들러 역할을 합니다. 주요 목표는 다음과 같습니다:A.특정 키워드("Huinder")에 대한 명령줄 인수를 확인합니다.B.발견되지 않으면 숨겨진 페이로드를 파일 시스템에 드롭하지 않고 메모리에서 완전히 임베디드 되어 실행합니다.C.발견되면 특정 "추출" 인수를 처리하여 임베드된 구성 요소를 디스크에 덤프한 다음 정상적으로 종료합니다.
요컨대, 멀웨어는 은밀함을 유지하려고 합니다. 특정 인수 없이 정상적으로 실행되는 경우, 디스크에 흔적을 남기지 않고 숨겨진 ELF 바이너리를 실행하여 정상적인 프로세스(예: 크론)로 가장할 수 있습니다
인자 중에 문자열 Huinder를 찾을 수 없으면 if (!argv_) 내부의 코드가 실행됩니다:
writeToMemfd(...): 이것은 fileless (전통적인 파일 기반 악성코드와 달리, 컴퓨터의 메모리에서 직접 작동하는 악성 코드) 실행의 특징입니다. memfd_create를 사용하면 바이너리가 메모리에만 존재할 수 있습니다. 이 악성코드는 내장된 페이로드(tgtElfp 및 wpnElfp)를 디스크에 저장하지 않고 익명의 파일디스크립트 또는 파일 핸들에 씁니다.
포크() 및 실행(): 이 악성코드는 자식과 부모 프로세스로 포크합니다. 자식은 로그를 남기지 않기 위해 표준 출력과 오류를 /dev/null로 리디렉션한 다음, execveat()를 사용하여 "공격코드" 페이로드(wpnElfp)를 실행합니다. 부모는 자식을 기다린 다음 "대상" 페이로드(tgtElfp)를 실행합니다. 두 페이로드 모두 디스크의 파일이 아닌 메모리에서 실행되므로 탐지 및 포렌식 분석이 더 어려워집니다.
파일 디스크립트가 참조하는 프로그램을 실행할 수 있는 새로운 시스템 호출인 execveat()의 선택은 흥미롭습니다. 이는 이 멀웨어의 fileless 의 실행 특성을 더욱 뒷받침합니다.
tgt 파일은 정상적인 크론 바이너리인 것으로 확인되었습니다. 이 파일은 메모리에 로드되고 루트킷 로더(wpn)가 실행된 후 실행됩니다.
실행 후 바이너리는 호스트에서 활성 상태로 유지됩니다.

아래는 이 프로세스에 대한 파일 설명자 목록입니다. 이러한 파일 디스크립터는 드롭퍼가 생성한 메모리 상주 파일을 보여줍니다.

참조를 따라가면 샘플에 로드된 바이너리를 볼 수 있습니다. 오프셋과 크기를 사용하여 추가 분석을 위해 바이트를 새 파일에 복사하기만 하면 됩니다.
압축을 풀면 다음 두 개의 새 파일을 찾을 수 있습니다.
· Wpn: cb070cc9223445113c3217f05ef85a930f626d3feaaea54d8585aaed3c2b3cfe
· Tgt: 934955f0411538eebb24694982f546907f3c6df8534d6019b7ff165c4d104136
이제 두 메모리 파일의 덤프가 생겼습니다.
Stage 2: Memory-resident executables overviewmemfd:tgt ELF 파일을 살펴보면 이것이 기본 Ubuntu Linux Cron 바이너리임을 알 수 있습니다. 바이너리에는 수정 사항이 없는 것으로 보입니다.
LKM 루트킷 로딩을 담당하는 바이너리인 /memfd:wpn 파일이 더 흥미롭습니다. 이 루트킷 로더는 /usr/sbin/sshd 실행 파일로 모방하여 자신을 숨기려고 시도합니다. 보안 부팅이 활성화되어 있는지, 필요한 심볼을 사용할 수 있는지 등 특정 전제 조건을 확인하고 모든 조건이 충족되면 커널 모듈 루트킷을 로드합니다.
Kibana에서 실행을 살펴보면, 프로그램이 dmesg를 쿼리하여 보안 부팅이 활성화되어 있는지 여부를 확인하는 것을 볼 수 있습니다. 올바른 조건이 충족되면 /tmp 디렉터리에 script.sh라는 셸 스크립트가 드롭되어 실행됩니다.
이 스크립트에는 압축 형식에 따라 파일을 검사하고 처리하는 로직이 포함되어 있습니다.
이 함수의 기능은 다음과 같습니다:
- c() 함수는 file 명령을 사용하여 파일을 검사하여 ELF 바이너리인지 확인합니다. 그렇지 않은 경우 이 함수는 오류를 반환합니다.
- d() 함수는 지원되는 압축 형식의 서명을 기반으로 gunzip, unxz, bunzip2 등 다양한 유틸리티를 사용하여 지정된 파일의 압축 해제를 시도합니다. 이 스크립트는 특정 압축 세그먼트를 찾아서 추출하기 위해 grep과 tail을 사용합니다.
- 이 스크립트는 파일($i)을 /tmp/vmlinux에서 찾아서 처리하려고 시도합니다.
tmp/script.sh를 실행한 후 /boot/vmlinuz-5.10.0-33-cloud-amd64 파일을 입력으로 사용합니다. tr 명령은 gzip의 매직넘버(\037\213\010)를 찾는 데 사용됩니다. 그 후, 바이트 오프셋 +10957311에서 시작하는 파일의 일부가 tail을 사용하여 추출되고, gunzip으로 압축이 풀린 후 /tmp/vmlinux로 저장됩니다. 그런 다음 결과 파일을 확인하여 유효한 ELF 바이너리인지 확인합니다.
이 시퀀스는 스크립트 내의 모든 항목이 함수 d()로 전달될 때까지 여러 번 반복됩니다 d().
'\037\213\010' xy gunzipd '\3757zXZ\000' abcde unxzd 'BZh' xy bunzip2d '\135\0\0\0' xxx unlzmad '\211\114\132' xy 'lzop -d'd '\002!L\030' xxx 'lz4 -d'd '(\265/\375' xxx unzstdThis process is shown below.
이 프로세스는 아래와 같습니다.
스크립트의 주요 목적은 특정 조건이 충족되는지 확인하고 충족되는 경우 커널 객체 파일을 사용하여 루트킷을 배포하기 위한 환경을 설정하는 것입니다.
위 이미지에서 볼 수 있듯이 로더는 Linux 커널 파일에서 __ksymtab 및 __kcrctab 심볼을 찾아 오프셋을 저장합니다.여러 문자열을 보면 루트킷 개발자가 드로퍼 내에서 자신의 루트킷을 "PUMA"라고 지칭하고 있음을 알 수 있습니다. 이 프로그램은 조건에 따라 다음과 같은 메시지를 출력합니다:
PUMA %s[+] PUMA is compatible[+] PUMA already loaded
또한 커널 객체 파일에는 .puma-config라는 섹션이 포함되어 있어 루트킷과의 연관성을 강화합니다.
이 섹션에서는 커널 모듈의 기본 기능을 이해하기 위해 커널 모듈을 자세히 살펴봅니다. 특히 심볼 조회 기능, 후킹 메커니즘, 목표를 달성하기 위해 수정하는 주요 시스템 호출에 대해 살펴봅니다.
LKM 루트킷 개요: 심볼 조회 및 후킹 메커니즘시스템 동작을 조작하는 LKM 루트킷의 기능은 심볼 확인을 위해 syscall 테이블을 사용하고 kallsyms_lookup_name()에 의존하는 것에서 시작됩니다. 커널 버전 5.7 이상을 대상으로 하는 최신 루트킷과 달리, 이 루트킷은 kprobes를 사용하지 않으므로 이전 커널용으로 설계되었음을 나타냅니다.
이 선택은 커널 버전 5.7 이전에는 적절한 라이선스가 없는 모듈에서도 쉽게 활용할 수 있도록 kallsyms_lookup_name()을 내보냈기 때문에 중요한 의미를 가집니다.2020년 2월, 커널 개발자들은 권한이 없거나 악의적인 모듈에 의한 오용을 방지하기 위해 kallsyms_lookup_name()의 내보내기 해제에 대해 논의했습니다. 일반적인 수법에는 라이선스 검사를 우회하기 위해 가짜 MODULE_LICENSE("GPL") 선언을 추가하여 이러한 모듈이 내보내지 않은 커널 함수에 액세스할 수 있도록 하는 것이 포함되었습니다. LKM 루트킷은 문자열에서 알 수 있듯이 이 동작을 보여줍니다:name=감사라이선스=GPL
이렇게 GPL 라이선스를 부정하게 사용하면 루트킷이 kallsyms_lookup_name()을 호출하여 함수 주소를 확인하고 커널 내부를 조작할 수 있습니다.
심볼 확인 전략 외에도 커널 모듈은 후크를 설정하기 위해 ftrace() 후킹 메커니즘을 사용합니다. 루트킷은 ftrace()를 활용하여 시스템 호출을 효과적으로 가로채고 해당 핸들러를 사용자 정의 hook으로 대체합니다.
위의 코드 스니펫에서 볼 수 있듯이 unregister_ftrace_function 및 ftrace_set_filter_ip를 사용하는 것이 그 증거입니다.
LKM 루트킷 개요: 후킹된 시스템 호출 개요루트킷의 시스템 호출 후킹 메커니즘을 분석하여 PUMA가 시스템 기능에 미치는 간섭 범위를 파악했습니다. 다음 표에는 루트킷에 의해 후킹된 시스템 호출, 해당 후킹된 함수 및 잠재적 목적이 요약되어 있습니다.cleanup_module() 함수를 보면, unregister_ftrace_function() 함수를 사용하여 ftrace() 후킹 메커니즘을 되돌리고 있는 것을 볼 수 있습니다. 이렇게 하면 콜백이 더 이상 호출되지 않습니다. 그 후 모든 시스콜은 후킹된 시스콜이 아닌 원래 시스콜을 가리키도록 반환됩니다. 이렇게 하면 후킹된 모든 사이스콜에 대한 깔끔한 개요를 확인할 수 있습니다.
다음 섹션에서는 몇 가지 후킹된 시스콜에 대해 자세히 살펴보겠습니다.
LKM 루트킷 개요: rmdir_hook()커널 모듈의 rmdir_hook()은 루트킷의 기능에서 중요한 역할을 하며, 은폐 및 제어를 위해 디렉토리 제거 작업을 조작할 수 있게 해줍니다. 이 후크는 단순히 rmdir() 시스템 호출을 가로채는 것에 국한되지 않고 권한 상승을 시행하고 특정 디렉터리에 저장된 구성 세부 정보를 검색하도록 기능을 확장합니다.
이 hook에는 몇 가지 검사가 있습니다. Hook은 rmdir() syscall의 첫 번째 문자가 zarya일 것으로 예상합니다. 이 조건이 충족되면 hook 함수는 실행되는 명령어인 6번째 문자를 확인합니다. 마지막으로 실행 중인 명령에 대한 프로세스 인수를 포함할 수 있는 8번째 문자를 확인합니다. 구조는 다음과 같습니다: zarya[char][command][char][argument]. zarya와 명령어 및 인수 사이에는 어떤 특수 문자라도 넣을 수 있습니다(또는 아무것도 넣지 않을 수 있음).
As of the publication date, we have identified the following commands:

루트킷이 초기화되면 rmdir() syscall 후크를 사용하여 루트킷이 성공적으로 로드되었는지 확인합니다. 이 작업은 t 명령을 호출하여 수행합니다.

존재하지 않는 디렉터리에서 rmdir 명령을 사용하면 "해당 파일 또는 디렉터리가 없습니다"라는 오류 메시지가 반환됩니다. zarya.t에서 rmdir을 사용하는 경우 커널 모듈이 성공적으로 로드되었음을 나타내는 출력이 반환되지 않습니다.두 번째 명령은 실행 중인 루트킷의 버전을 가져오는 데 사용되는 v입니다.

'디렉토리'를 제거하지 못했습니다." 오류에 zarya.v가 추가되는 대신 루트킷 버전 240513이 반환됩니다.
세 번째 명령은 루트킷의 구성을 출력하는 c입니다.

페이로드가 널 바이트로 시작하기 때문에 rmdir 셸 명령을 통해 zarya.c를 실행하면 아무런 출력도 반환되지 않습니다. 시스템 호출을 래핑하고 헥스/ASCII 표현을 인쇄하는 작은 C 프로그램을 작성하면 반환되는 루트킷의 구성을 확인할 수 있습니다.
대부분의 루트킷이 루트 권한을 얻기 위해 kill() syscall을 사용하는 대신, 이 루트킷은 이 목적으로도 rmdir() syscall을 활용합니다. 이 루트킷은 prepare_creds 함수를 사용하여 자격 증명 관련 ID를 0(루트)으로 수정하고, 이 수정된 구조에서 commit_creds를 호출하여 현재 프로세스 내에서 루트 권한을 얻습니다.
이 함수를 트리거하려면 6번째 문자를 0으로 설정해야 합니다. 이 훅의 주의할 점은 호출자 프로세스 루트 권한을 부여하지만 유지하지는 않는다는 것입니다. zarya.0을 실행할 때는 아무 일도 일어나지 않습니다. 그러나 C 프로그램에서 이 훅을 호출하고 현재 프로세스의 권한을 출력하면 결과가 표시됩니다. 사용된 래퍼 코드의 스니펫은 아래와 같습니다


함수를 실행하면 다음과 같은 출력을 얻을 수 있습니다:

이 훅을 활용하기 위해 rmdir zarya.0 명령을 실행하고 이제 /etc/shadow 파일에 액세스할 수 있는지 확인하는 작은 C 래퍼 스크립트를 작성했습니다.


With success.

rmdir() 함수에서 사용할 수 있는 명령은 더 많지만 지금은 다음 단계로 넘어가고 향후 게시글에 추가할 수 있습니다.
루트킷의 getdents_hook() 및 getdents64_hook()은 디렉토리 목록 시스템 호출을 조작하여 파일과 디렉터리를 사용자에게 숨기는 역할을 합니다.getdents() 및 getdents64() 시스콜은 디렉터리 항목을 읽는 데 사용됩니다. 루트킷은 이 함수를 연결하여 특정 조건과 일치하는 모든 항목을 필터링합니다. 특히 접두사가 zov_인 파일과 디렉토리는 디렉토리의 내용을 나열하려는 모든 사용자로부터 숨겨집니다.
For example:

여기서 zov_hidden 파일은 전체 경로를 사용하여 직접 액세스할 수 있습니다. 그러나 ls 명령을 실행하면 디렉토리 목록에 나타나지 않습니다.
여기서 zov_hidden 파일은 전체 경로를 사용하여 직접 액세스할 수 있습니다. 그러나 ls 명령을 실행하면 디렉토리 목록에 나타나지 않습니다.
루트킷을 더 자세히 조사하는 동안 커널 객체 파일 내에서 또 다른 ELF 파일이 확인되었습니다. 이 바이너리를 추출한 결과, /lib64/libs.so 파일이라는 것을 발견했습니다. 조사 결과, Kitsune PID %ld와 같은 문자열에 대한 참조가 여러 번 발견되었습니다. 이는 개발자가 이 SO를 Kitsune이라고 부른다는 것을 암시합니다. Kitsune은 루트킷에서 관찰된 특정 동작에 대한 책임이 있을 수 있습니다. 이러한 참조는 루트킷이 LD_PRELOAD를 통해 사용자 공간 상호 작용을 조작하는 방법에 대한 광범위한 컨텍스트와 일치합니다.이 SO 파일은 이 루트킷의 핵심인 지속성 및 스텔스 메커니즘을 달성하는 데 중요한 역할을 하며, 공격 체인 내에 통합되어 있는 것은 이 루트킷의 설계가 얼마나 정교한지를 보여줍니다. 이제 공격 체인의 각 부분을 탐지 및/또는 방지하는 방법을 살펴보겠습니다.
이 섹션에서는 PUMAKIT 실행 체인의 여러 부분을 방지하고 탐지할 수 있는 다양한 EQL/KQL 규칙과 YARA 서명을 표시합니다.
Stage 1: Cron드로퍼가 실행되면 흔하지 않은 이벤트가 syslog에 저장됩니다. 이 이벤트는 프로세스가 실행 스택으로 시작되었음을 나타냅니다. 이는 흔치 않은 일이지만 흥미롭게 지켜볼 수 있습니다:
[ 687.108154] process '/home/ruben_groenewoud/30b26707d5fb407ef39ebee37ded7edeea2890fb5ec1ebfa09a3b3edfc80db1f' started with executable stack
다음 쿼리를 통해 검색할 수 있습니다:
process where host.os.type == "linux" and event.type == "start" and event.action == "exec" and process.parent.executable like "/dev/fd/*" and not process.parent.command_line == "runc init"
이 파일 설명자는 프로세스가 종료될 때까지 드롭퍼의 부모로 유지되므로 이 부모 프로세스를 통해 여러 파일도 실행됩니다:
비정상적인 파일 디스크립터 실행을 바로 확인할 수 있습니다. 이는 다음 EQL 쿼리를 통해 감지할 수 있습니다:process where host.os.type == "linux" and event.type == "start" and event.action == "exec" and process.parent.executable like "/dev/fd/*" and not process.parent.command_line == "runc init"
이 파일 설명자는 프로세스가 종료될 때까지 드롭퍼의 부모로 유지되므로 이 부모 프로세스를 통해 여러 파일도 실행됩니다:

위의 쿼리를 통해 /tmp/script.sh가 삭제된 후에는 다음과 같은 방법으로 실행을 감지할 수 있습니다.파일 속성 검색 및 보관 취소 활동을 쿼리하여 실행을 감지할 수 있습니다:

이 스크립트는 tail 명령을 통해 Linux 커널 이미지의 메모리를 계속 찾습니다. 이는 다른 메모리 탐색 도구와 함께 다음 쿼리를 통해 감지할 수 있습니다:

tmp/script.sh 실행이 완료되면 /memfd:tgt(삭제됨) 및 /memfd:wpn(삭제됨)이 만들어집니다. tgt 실행 파일은 정상 Cron 실행 파일로 /run/crond.pid 파일을 만듭니다. 이는 악의적인 것은 아니지만 간단한 쿼리를 통해 탐지할 수 있는 아티팩트입니다.
file where host.os.type == "linux" and event.type == "creation" and file.extension in ("lock", "pid") andfile.path like ("/tmp/*", "/var/tmp/*", "/run/*", "/var/run/*", "/var/lock/*", "/dev/shm/*") and process.executable != null
모든 조건이 충족되면 wpn 실행 파일은 LKMrootkit을 로드합니다.
Stage 3: Rootkit kernel module커널 모듈 로딩은 다음 구성을 적용하여 Auditd 매니저를 통해 감지할 수 있습니다:-a always,exit -F arch=b64 -S finit_module -S init_module -S delete_module -F auid!=-1 -k modules-a always,exit -F arch=b32 -S finit_module -S init_module -S delete_module -F auid!=-1 -k modules
그리고 다음 쿼리를 사용합니다:
driver where host.os.type == "linux" and event.action == "loaded-kernel-module" and auditd.data.syscall in ("init_module", "finit_module")
Linux 탐지 엔지니어링 환경을 개선하기 위해 Auditd를 Elastic Security와 함께 활용하는 방법에 대한 자세한 내용은 Elastic Security Labs 사이트에 게시된 Auditd를 사용한 Linux 탐지 엔지니어링 연구를 참조하세요.초기화 시, LKM은 커널이 서명되지 않았기 때문에 커널을 오염시킵니다.
audit: module verification failed: signature and/or required key missing - tainting kernel
다음 KQL 쿼리를 통해 이 동작을 감지할 수 있습니다:
host.os.type:linux and event.dataset:"system.syslog" and process.name:kernel and message:"module verification failed: signature and/or required key missing - tainting kernel"
또한 LKM에 결함이 있는 코드가 있어 여러 번 세그폴트를 일으킵니다. 예를 들어
Dec 9 13:26:10 ubuntu-rk kernel: [14350.711419] cat[112653]: segfault at 8c ip 00007f70d596b63c sp 00007fff9be81360 error 4Dec 9 13:26:10 ubuntu-rk kernel: [14350.711422] Code: 83 c4 20 48 89 d0 5b 5d 41 5c c3 48 8d 42 01 48 89 43 08 0f b6 02 41 88 44 2c ff eb c1 8b 7f 78 e9 25 5c 00 00 c3 41 54 55 53 <8b> 87 8c 00 00 00 48 89 fb 85 c0 79 1b e8 d7 00 00 00 48 89 df 89
이는 kern.log 파일에서 세그 오류를 쿼리하는 간단한 KQL 쿼리를 통해 감지할 수 있습니다.
host.os.type:linux and event.dataset:"system.syslog" and process.name:kernel and message:segfault
커널 모듈이 로드되면 kthreadd 프로세스를 통해 명령 실행의 흔적을 볼 수 있습니다. 루트킷은 특정 명령을 실행하기 위해 새로운 커널 스레드를 생성합니다. 예를 들어, 루트킷은 짧은 간격으로 다음 명령을 실행합니다:
cat /dev/nulltruncate -s 0 /usr/share/zov_f/zov_latest
다음과 같은 쿼리를 통해 이러한 명령어 및 기타 잠재적으로 의심스러운 명령을 탐지할 수 있습니다:

또한 비정상적인 UID/GID 변경에 대한 rmdir 명령을 분석하여 루트킷의 권한 상승 방법을 탐지할 수도 있습니다.
process where host.os.type == "linux" and event.type == "change" and event.action in ("uid_change", "guid_change") and process.name == "rmdir"실행 체인에 따라 다른 여러 동작 규칙도 트리거될 수 있습니다.
PUMAKIT(드로퍼(cron), 루트킷 로더(/memfd:wpn), LKM 루트킷 및 Kitsune 공유 개체 파일을 식별하기 위해 YARA 시그니처를 생성했습니다. 서명은 아래와 같습니다:

PUMAKIT은시스콜 후킹, 메모리 상주 실행, 고유한 권한 상승 방법과 같은 고급 기술을 사용하는 복잡하고 은밀한 위협입니다. 다중 아키텍처 설계는 Linux 시스템을 표적으로 삼는 멀웨어가 점점 더 정교해지고 있음을 강조합니다.
국내외 수집 채널을 통한 2024년 12월 악성 앱 수집 건수는 2042건으로 전월 대비 약 7.06% 증가한 수치입니다. 24년 12월 패턴 반영 건수는 1364건입니다.

표 1. 악성 앱 수집 현황

그림 1. 수집 및 반영 흐름
2024년 12월 악성 코드 유형별 수집 내용 및 전월 대비 비교입니다.(비교 수집 건 수가 아닌 반영 건 수로 통계)

그림 2. 악성코드 유형

표 2. 유형별 수집 현황

그림 3. 전월 대비 악성 코드 비율
악성코드 유형별 분석 (11월~12월 변화율 기반)
11월: 506건 → 12월: 632건 (+19.94% 증가)분석:o가장 많은 사례가 보고된 유형으로, 꾸준한 증가세를 보임.o연말이 가까워질수록 금융 및 사회공학적 공격이 활발해지는 경향과 일치..o전화 및 문자 기반의 금융 사기 피해 예방이 중요
11월: 236건 → 12월: 277건 (+14.80% 증가)분석:o비교적 낮은 증가율을 보이지만 여전히 주요 위협 요소.o주로 백도어, 정보 탈취형 악성코드가 많으며, 감염 후 지속적인 피해 가능성.o기업 및 개인의 보안 소프트웨어 업데이트 및 의심 파일 실행 주의 필요.
11월: 162건 → 12월: 243건 (+33.33% 증가)분석:o정상적인 소프트웨어로 위장한 악성코드의 확산.o사용자의 부주의로 인해 설치될 가능성이 높음.o신뢰할 수 없는 프로그램 다운로드 주의 및 보안 정책 강화 필요.
11월: 10건 → 12월: 36건 (+72.22% 증가)분석:o해커들이 시스템 침투 및 취약점 공격에 사용하는 도구가 증가하는 추세.o내부 보안 취약점을 노린 공격이 많아질 가능성이 있음.o기업 및 기관에서 해킹 도구 탐지 및 대응 강화 필요.
11월: 2건 → 12월: 34건 (+94.12% 증가)분석:o취약점 공격 사례가 급격히 증가.o특정 소프트웨어나 시스템의 보안 취약점을 악용하는 공격이 증가한 것으로 보임.o최신 보안 업데이트 적용 및 취약점 점검이 필수적.
11월: 78건 → 12월: 120건 (+35.00% 증가)분석:o광고성 프로그램을 이용한 악성코드 확산 지속.o주로 브라우저 리디렉션, 불필요한 광고 노출 등이 주요 특징.o사용자의 불필요한 프로그램 설치 방지 및 정기적인 시스템 점검 필요.
11월: 8건 → 12월: 22건 (+63.64% 증가)분석:o기타 분류된 악성코드도 증가 추세.o새로운 유형의 위협이 발생했을 가능성 있음.o다양한 보안 위협에 대비한 종합적인 대응 필요.
전체적인 증가세:o11월 1,002건 → 12월 1,364건으로 26.54% 증가o연말을 맞아 금융 사기(VoicePhishing)와 취약점 공격(Exploit)의 급증이 두드러짐.가장 큰 증가율을 보인 유형:oExploit (94.12%), Hacktool (72.22%), 기타 유형 (63.64%)o시스템 및 소프트웨어 취약점을 악용한 공격 증가.대응 방안:o최신 보안 패치 및 업데이트 적용 필수.o의심스러운 파일 다운로드 및 실행 자제.o피싱 공격 예방을 위한 사용자 교육 강화.o보안 솔루션을 활용한 실시간 탐지 및 차단.
금융보안원으로부터 보이스피싱 악성 앱 정보와 사기 정보(사칭기관, 보이스피싱 콜센터 전화번호 등) 수집 건수는 다음과 같습니다.


12월 에뮬레이터별 루팅 탐지 유무 테스트를 진행한 결과는 다음과 같습니다.
라온시큐어에서 관리하는 루팅 우회 앱과 도구 정보는 다음과 같습니다.
에뮬레이터별 최신 업데이트 버전 정보 목록은 다음과 같습니다. (24.12.30 기준)
12월 원격 기능을 제공하는 앱을 대상으로 자사 백신에서 원격제어 앱 감지 유무 테스트를 진행한 결과는 다음과 같습니다.
3줄 요약
1. 공격자에게도 편리하고 유용한 PDF
2. 악성 PDF 활용한 대단위 피싱 캠페인 발견됨
3. PDF나 피싱 모두 흔하다는 걸 악용한 게 핵심
[보안뉴스 문가용 기자] PDF는 현대 업무 환경에서 이미 필수 요소다. 최근 보안 업체 짐페리움(Zimperium)에서 이런 PDF를 활용한 새로운 유형의 피싱 공격을 발견했다. ‘PDF는 안전하다’는 사용자들의 보편적인 인식을 파고든 것으로, 특히 모바일 기기들이 위험한 것으로 분석됐다. “모바일 환경에서는 파일 내용을 미리 확인하는 게 까다로운 편입니다. 그런데다가 PDF에 대한 신뢰도는 높죠. 둘을 합치면 ‘모바일에서는 PDF를 확인하지 않고 열어본다’는 행동 결과가 나옵니다. 공격자들이 노리는 지점이 바로 여깁니다.”
PDF를 악용한 최신 피싱 기법을 조사하면서 짐페리움은 악성 PDF 파일 20개 이상, 피싱 페이지 630개 이상을 발견했다. 이 정도 규모면 “대규모 캠페인이 진행 중이라는 뜻”이라고 짐페리움은 설명한다. 추적을 이어간 결과 악성 인프라의 존재가 확인됐는데, 무려 50개 이상 국가에 걸쳐 형성돼 있었다. “게다가 공격자들은 이전에 한 번도 발견된 적 없는 난독화 기술을 사용하고 있기까지 합니다. 현존하는 엔드포인트 보안 솔루션 대부분은 이 공격에 연루된 악성 링크를 제대로 분석하지 못하고 있습니다.”
공격자가 PDF 문서를 미끼로 사용했을 때의 좋은 점은 무엇일까? “기업 환경에서 대체 불가능한 도구로 자리 잡았기 때문에 널리 사용됩니다. 플랫폼과 기기를 넘나들며, 신뢰도 또한 높습니다. 작성자가 의도한 형식이 언제나 그대로 유지되며, 사용하기도 편리합니다. 텍스트는 물론 이미지, 하이퍼링크, 영상, 3D 모델, 디지털 서명 등을 최초 모습과 위치 그대로 품을 수 있기도 합니다. 변조가 불가능하다는 인식이 있을 정도로 편집이 까다롭습니다.”
이러한 특징들은 공격자들에게 다음과 같은 의미가 된다.1) 기업 환경에서 대체 불가능 : 널리 사용된다, 즉 누구나 잠재적 공략 대상자가 될 수 있다.2) 플랫폼과 기기를 넘나듦 : 공격을 기획할 때 특정 OS나 환경, 기기를 덜 고려해도 된다.3) 신뢰도가 높음 : 피해자들을 속이기 쉽다.
4) 각종 요소들과 호환됨 : 다양한 요소들을 악용할 수 있다.5) 무결성 인식이 팽배함 : 신뢰도가 높으므로 피해자들을 속이기 쉽다.
이번 캠페인은 먼저 한 문자메시지로부터 시작된다. “발신자는 미국 우체국(USPS)을 사칭하고 있으며, 메시지에는 PDF 파일이 첨부되어 있습니다. 피해자가 이 파일을 열면 가짜 웹사이트로 우회 접속됩니다. “이 악성 PDF 파일에는 링크가 포함되어 있습니다. 링크는 주로 /URI라는 태그를 사용하는데, PDF를 로딩할 리더 혹은 뷰어 프로그램이 특정 URL로 이동하도록 만듭니다.” /URI 태그는 주로 /URI(http://www.example.com)과 같은 형식이라고 하며, 괄호 안에 있는 주소로 우회 접속되는 게 보통이라고 짐페리움은 설명한다.
특이한 건 이 /URI 태그가 일반적인 형태를 가지고 있지 않다는 것이다. “공격자들은 표준 /URI 태그 대신 클릭 가능한 링크를 삽입했습니다. 그래서 분석 과정에서 악성 주소를 추출하는 게 더 어려워집니다.” 반대로 짐페리움의 연구원들이 동일한 악성 주소를 표준 /URI 태그로 표현했을 때는 잘 탐지됐다고 한다. 해당 기법이 탐지 기능을 효과적으로 회피한다는 사실이 확인된 것이다.
“클릭 가능한 링크가 /URI 태그 형태로 숨겨져 있다는 것”만이 이번 악성 PDF 파일의 비밀 전부가 아니다. URL 내에 엑스오브젝트(XObject)가 삽입되어 있다는 것도 중요한 발견이라고 짐페리움은 강조한다. “이런 기법을 사용해 공격자들은 PDF 내에 사용자가 클릭할 수 있는 버튼을 하나 만들어냈습니다. 피해자가 클릭하면 피싱 웹사이트로 우회 접속됩니다. 다만 PDF 뷰어 프로그램으로 어떤 걸 쓰느냐에 따라 이 공격은 통할 수도 있고 안 통할 수도 있습니다.”
결국 한 피싱 사이트로 유도하기 위한 장치들이 PDF 안에 두 가지나 마련되어 있다는 뜻이다. 이 피싱 사이트는 미국 우체국의 웹 페이지 중 하나처럼 생겼으며, 피해자는 제일 먼저 배송에 문제가 있는 듯한 내용의 메시지를 보게 된다. 이를 해결하려면 이름, 주소, 이메일, 전화번호 등 개인정보를 입력해야 한다는 알림도 같이 뜬다. 배송을 서두르려는 마음이 큰 피해자라면 이런 정보를 입력하는 데 큰 주저함이 없다.
피해자가 여기까지 진행한다면 두 번째 양식이 화면에 뜬다. 추가 정보(주로 신용카드 정보)를 입력해야만 한다는 것으로, 해당 정보는 암호화 되어 공격자가 운영하는 C&C 서버로 전송된다. 동시에 피해자의 브라우저에도 저장된다. 이 피싱 페이지는 다국어를 지원하기도 한다. “공격자들이 여러 국가들로부터 사용자들의 정보를 취득하고 있기 때문인 것으로 보입니다.”
‘피싱’과 ‘PDF’에는 공통점이 있다. ‘흔하다’는 것이다. 흔한 것에 대해 사람들은 ‘익숙하다’고 착각하기가 쉽다. 실제 익숙한 게 사실일 수도 있다. 하지만 공격자들은 지속적인 변화를 가미함으로써 익숙한 것을 빠르게 낯선 것으로 변환한다. “어떤 것이라도 익숙하다고 간과하는 순간 공격을 허용할 가능성이
높아집니다. 현대 사이버 환경에서는 익숙했던 것들도 금방 불편하고 어려운 것들로 변한다는 걸 인지하는 게 더 중요합니다. ‘익숙한 것’이 아니라 ‘어제까지는 익숙했던 것’으로 생각을 바꿔야 합니다.”
짐페리움은 “PDF 파일이라도 무결성이 보장되지 않으며, 얼마든지 공격용으로 조작될 수 있다는 걸 기억하고 있어야 한다”고 강조한다. “PDF 내에도 악성 링크나 악성 버튼이 포함될 수 있습니다. 공격자들이 조금만 PDF 구조를 비틀면 보안 솔루션들이 그 악성 요소들을 탐지하지 못할 가능성이 높아지기도 하고요. 우리에게 좋은 도구는 공격자들에게도 유용할 때가 많다는 건 꾸준히 증명되고 있는 사실입니다.”
[출처][국제부 문가용 기자(globoan@boannews.com)]https://www.boannews.com/media/view.asp?idx=135774
3줄 요약
1. 미국 이어 국내 앱스토어 1위 차지한 중국발 AI 돌풍
2. 딥시크 둘러싼 개인정보 과다 수집 논란, 사용자 주의
3. 기술 경쟁력과 신뢰도 확보 균형 없으면 성장 한계
[보안뉴스 김경애 기자, 조재호 기자] 중국판 챗GPT ‘딥시크’를 두고, 개인정보 과다수집 논란이 일고 있다. 광범위한 개인정보 수집이나 프라이버시 침해 가능성 등에 대해, 각별한 사용자 주의가 필요하다.

▲ 딥시크 AI 서비스 [이미지=딥시크 홈페이지 캡쳐]
미국 무료 앱 순위 1위인 딥시크는 국내에서도 앱스토어 1위를 차지, 사용자들의 관심을 받고있다. 그러나 개인정보 과다수집이 제기되며, 파장이 일고 있다.
28일 하정우 네이버클라우드 AI 이노베이션 센터장은 소셜미디어를 통해 “수집하는 정보가 매우 광범위하게 많다”며 “수집한 사용자 정보는 중국 내 보안 서버에 저장된다”고 프라이버시 약관을 들어 사용자들의 주의를 당부했다.
이는 단순히 과다수집만의 문제가 아니란 얘기다. 수집된 개인정보가 중국 서버로 처리, 저장될 경우 프라이버시 침해, 컴플라이언스 준수 여부 등으로 피해 역시 커질 수 있단 해석이다.
염흥열 순천향대 교수는 “딥시크가 사용자의 개인정보를 수집해 중국에 있는 서버에서 처리한다면, 프라이버시 침해 가능성이 크다”며 “우리나라 입장에서는 딥시크의 개인정보 처리방침을 면밀히 분석해 컴플라이언스 준수 여부를 살펴봐야 할 것으로 보이며, 이용자의 주의가 요구되는 시점”이라고 밝혔다.
한 정보보호 최고책임자(CISO)는 “개인정보 수집 과정에서 투명성과 신뢰를 유지할 수 있어야 한다”며 “사용자가 데이터 정책을 이해, 동의할 수 있도록 정보제공 방식을 명확히 해야 한다”고 강조했다.
특히 개인정보 신뢰성과 투명성 확보, 개인정보보호, 국가 간 데이터 규제 문제 등을 심도있게 다뤄야 한다. 따라서 기술 개발과 데이터 보호를 균형 있게 발전시키는 것이, 앞으로 각 국가와 기업들에겐 매우 중요한 과제가 된다.
익명을 요구한 보안 전문가는 “이번 이슈는 기술 개발과 데이터 보호를 균형 있게 발전시키는 것이 중요하다”며 “기업의 기술 경쟁력과 함께 개인정보 수집 과정의 투명성과 신뢰도 확보에 실패한다면 성장에 한계가 있을 것”이라고 전망했다.
[출처][김경애·조재호 기자(sw@boannews.com)]https://www.boannews.com/media/view.asp?idx=135778&mkind=5