malware · cryptomining · rootkit · linux · kernel · monero · privilege-escalation · cve-2026-31431 · container-escape

Rootpacket: 커널에 숨는 Linux 크립토재킹 툴킷

Kinryū Labs는 Rootpacket을 분석했다. 이 Linux 크립토재킹 툴킷은 CPU와 메모리 사용량을 위조하는 커널 루트킷을 싣고, CVE-2026-31431(컨테이너에서 호스트로도 탈출하는 AF_ALG 페이지 캐시 결함)을 통해 root로 상승하며, Intel 드라이버로 위장하고, 경쟁 채굴기가 들어오는 데 쓰는 바로 그 노출된 서비스를 비활성화한다.

작성자 Davis Zheng·

CVE
CVE-2026-31431
CVSS
7.8 (CVSS:3.1/AV:L/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H)

TLP:CLEAR. 일반 공개 승인됨. 이것은 정적 분석만이다. 어떤 샘플도 실행하지 않았고, 모든 결론은 문자열 추출, 디스어셈블, 소스 검토에서 나온다. 공격자의 모네로 지갑, 풀, 인프라는 방어 지표로 공개한다.

핵심 요약

  • ~45%100% 가까이 돌아가는 동안 top이 보여 주는 CPU
  • 3가지 지속성 메커니즘
  • 7.8CVSS, CVE-2026-31431 (AF_ALG 페이지 캐시 LPE)
  • 호스트비특권 컨테이너에서 얻는 root

Rootpacket은 여러 구성 요소로 이루어진 Linux용 크립토재킹 툴킷이다. 은닉을 위한 커널 수준 루트킷, Linux AF_ALG 암호 인터페이스의 CVE-2026-31431을 노리는 권한 상승 익스플로잇, xrandom으로 개명된 UPX 패킹 XMRig 6.26.0 모네로 채굴기, 그리고 경쟁자 제거 스크립트를 묶는다. 코드는 대체로 터키어로 쓰여 있어(변수명, 주석, 상태 문자열), 터키어를 쓰는 운영자를 가리킨다.

툴킷은 두 가지 모드 중 하나로 돈다. root 모드에서는 intel_uncore_freq_aux로 위장한 로드 가능한 커널 모듈(LKM) 루트킷을 적재하고, 커널 업그레이드를 견디도록 DKMS를 통해 설치하며, systemd 서비스를 등록하고, 기계에서 경쟁자를 일소한다. root를 얻지 못하면, crontab으로 지속하고 채굴기를 데몬으로 돌리는 사용자 영역 모드로 폴백한다. 채굴기는 stratum+sslpool.supportxmr.com:443에 연결하고 RandomX로 모네로를 채굴한다.

곱씹어 볼 가치가 있는 구성 요소는 루트킷이다. 채굴기가 프로세서를 100퍼센트 가까이 붙들고 있는 동안, 루트킷은 /proc/stat을 다시 써서 tophtop이 차분한 40~50퍼센트를 보고하게 하고, jiffies로 그 수치를 흔들어 부하가 한 값에 붙어 있지 않고 진짜처럼 움직이게 한다. /proc/meminfo에도 같은 일을 하고, 디렉터리 목록을 걸러 자신의 프로세스와 파일을 숨긴다.

핵심 판단

  • 목적은 크립토재킹(높은 확신). 툴킷은 XMRig 6.26.0, 하드코딩된 모네로 지갑, pool.supportxmr.com 채굴 구성을 싣고, XMRig 개발자 기부를 꺼서 모든 수익이 운영자에게 가게 한다.
  • 권한 상승은 CVE-2026-31431(“Copy Fail”), Linux AF_ALG algif_aead 경로의 결정적 페이지 캐시 쓰기다(CVSS 7.8, 2026년 4월 공개). 페이지 캐시는 호스트 전역으로 공유되므로, 같은 쓰기가 컨테이너에서 탈출해 호스트의 root를 잡는다. 따라서 감염된 컨테이너는 침해된 호스트다(높은 확신).
  • 운영자는 전형적인 “떨구고 채굴” 무리보다 한참 위다(높은 확신). ftrace 훅을 갖춘 커스텀 LKM 루트킷, 새 커널마다 자동 재빌드하는 DKMS 지속성, 작동하는 CVE-2026-31431 페이지 캐시 익스플로잇, 그리고 systemd/DKMS/cron 다층 지속성은 대부분의 크립토재커가 결코 닿지 못하는 공학 수준이다.
  • 운영자는 터키어를 쓸 가능성이 높다(중간 확신). 터키어 변수명, 주석, 그리고 ROOT ele gecirildi! 같은 상태 메시지가 툴킷 전체를 관통한다.
  • Rootpacket은 호스트를 독점적으로 소유하고 지키도록 만들어졌다. 그 killservice.sh는 경쟁 채굴기를 제거한 뒤, 크립토재커가 초기 접근에 쓰는 외부 노출 서비스를 비활성화하는데, 여기에는 2375/2376의 Docker API가 포함된다. 우리가 RedTail 글에서 기록한 바로 그 벡터다. 이 무리들은 같은 잘못 설정된 기계를 두고 싸우고 있다.

툴킷 구조

Rootpacket은 모듈식 드로퍼다. 그 조각들:

setup.sh         진입점. 권한 수준을 확인하고 배포 모드를 고른다.
getroot          권한 상승. CVE-2026-31431(AF_ALG)을 노려 로컬 root를 얻는다.
xrandom          UPX 패킹 XMRig 6.26.0, 이름 기반 탐지를 피하려 개명.
kernel/
  stealth.c      LKM 루트킷, DKMS로 컴파일, Intel 드라이버로 위장.
  install.sh     DKMS 지속성 엔진.
killservice.sh   경쟁자 제거와 "강화".
rootpacket.tar.gz  툴킷 전체의 내부 복사본, 재배포용으로 패키징.

root 모드. setup.sh는 아직 root가 아니면 getroot를 실행하고, xrandom/opt/kernel-kd/로 복사하며, systemd 서비스를 만들고, kernel/install.sh를 실행해 DKMS로 루트킷을 컴파일·적재하고, killservice.sh를 실행해 경쟁을 일소하며, 채굴기를 지속적인 서비스로 시작한다.

사용자 영역 폴백. root가 손에 닿지 않으면, setup.shxrandom~/.xrandom/으로 복사하고, PID 잠금이 있는 런처를 쓰며, 재부팅 시와 매분 발화하는 crontab 항목을 설치하고, 부모 셸이 끝나도 살아남도록 setsid로 채굴기를 시작한다.

기능root 모드사용자 영역 모드
채굴기 위치/opt/kernel-kd/xrandom~/.xrandom/xrandom
지속성systemd (kernel-kd.service)crontab (@reboot + */1 * * * *)
루트킷예 (DKMS 경유 LKM)아니오
경쟁자 죽이기예 (killservice.sh)아니오
실행 주체root (systemd)현재 사용자 (setsid 데몬)

getroot: CVE-2026-31431, 페이지 캐시 훼손을 통한 root

getrootgetroot.c에서 빌드된, 정적 링크에 strip되지 않은 ELF64 x86-64 바이너리다. CVE-2026-31431(“Copy Fail”)을 노리는데, 이는 2026년 4월 29일 공개된 Linux 커널 AF_ALG algif_aead 인터페이스의 논리 결함이다(CVSS 7.8). 이 버그는 공격자가 제어하는 결정적 4바이트 쓰기를 커널 페이지 캐시에 주며, getroot는 그것으로 SUID 바이너리를 메모리에서 패치하고 root로 걸어 나온다.

속성
종류ELF 64-bit LSB executable, x86-64, 정적 링크, strip 안 됨
CVECVE-2026-31431 “Copy Fail” (CVSS 7.8, AV:L/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H)
서브시스템AF_ALG algif_aead, AEAD 템플릿 authencesn(hmac(sha256),cbc(aes))
영향 범위Linux 4.14~6.19.11 (결함은 2017년, 커밋 72548b093ee3에서 유입); 6.18.22, 6.19.12, 7.0+에서 수정
표적/usr/bin/su — 메모리 상의 .text가 페이지 캐시에서 패치됨
신뢰성결정적, 경쟁 상태 없음
사용 / 폴백./getroot <cmd> [args...]; 익스플로잇이 명중하지 않으면 현재 권한으로라도 명령을 실행

메커니즘. 2017년 AEAD 코드의 제자리 최적화가 splice된 페이지 캐시 페이지를 소스와 대상 scatterlist 양쪽에 그대로 남겨 두었다. authencesn 템플릿이 공격자가 고른 오프셋 assoclen + cryptlen에 4바이트 ESN 임시 값을 쓰면, 그 쓰기는 사용자가 읽을 수 있는 파일의 페이지 캐시 페이지 안에 착지한다. 그러면 HMAC 검사가 실패하고 recvmsg()EBADMSG를 반환하지만, 커널은 그 쓰기를 결코 롤백하지 않는다. getroot/usr/bin/su의 ELF 헤더를 파싱해 진입점의 파일 오프셋을 계산한 뒤, 셸코드의 4바이트 청크마다 한 번씩 splicesendmsg(쓸 4바이트를 AAD에 실어) → recvmsg를 반복하며 페이지 캐시 안에서 /usr/bin/su를 패치한다. 그다음 /usr/bin/suexecve한다. 커널이 이제 훼손된 페이지를 적재하고, 셸코드가 SUID-root로 실행되며, getroot는 운영자의 명령을 실행하기 전에 getuid() == 0을 확인한다(그리고 터키어 [+] ROOT ele gecirildi!를 출력한다). 디스크 상의 파일은 결코 건드리지 않으므로, 파일 무결성 모니터링은 아무것도 보지 못한다.

호스트로의 컨테이너 탈출. Linux 페이지 캐시는 호스트 전역이며, 컨테이너는 자기 것을 갖지 않는다. 비특권 컨테이너 안의 프로세스가 호스트의 /usr/bin/su를 splice하면 호스트의 캐시된 복사본을 훼손하므로, execve는 컨테이너 안이 아니라 호스트에서 root를 낸다. 따라서 감염된 컨테이너는 침해된 호스트이며, setup.sh는 더 나아가 커널 루트킷을 호스트에 적재한다. 컨테이너를 멈추고 제거하는 것으로는 충분하지 않다. 호스트를 재구축해야 한다.

우리는 격리된 VM(Kali, 커널 6.6.15)에서 getroot를 한 번 실행했다. 전체 AF_ALG 순서를 실행했으나 그 빌드에서는 root를 얻지 못하고 비특권으로 명령을 실행하는 폴백에 떨어졌는데, 이는 특정 커널 레이아웃을 노리는 익스플로잇과 들어맞는다. 채굴기는 실행하지 않았다.

xrandom: 채굴기

xrandom은 오픈소스 모네로 채굴기 XMRig 6.26.0을 개명하고 UPX로 패킹한 복사본이다.

속성
실체XMRig 6.26.0
패킹UPX 4.2.4 (패킹 2.8 MB, 언패킹 10.1 MB)
알고리즘RandomX (rx/0)
stratum+ssl 경유 pool.supportxmr.com:443
지갑46NVDFL6v5STw5Qw4j77PoBSHRTYnHZGZ8WRoGvHmpaMX7ZyhNUP2u24TLV9pNgncz1bZF2Vm8KkaNTzU7SXqrnFUx5zgHQ
기부 수준0 (XMRig 개발자 기부 비활성화)

443 포트 + TLS 채굴은 트래픽이 언뜻 평범한 HTTPS에 섞이게 한다. 다만 stratum 핸드셰이크는 자세히 보는 이에게는 다른 TLS 지문을 가진다.

stealth.c: 커널 루트킷

이것이 툴킷에서 가장 정교하게 만들어진 부분이다. ftrace 함수 훅을 써서 커널 함수에 끼어들어 멀웨어의 흔적을 지우는 LKM 루트킷이며, 시종일관 Intel 하드웨어 드라이버로 위장한다.

속성
모듈명intel_uncore_freq_aux
가짜 메타데이터MODULE_AUTHOR("Intel Corporation"), MODULE_DESCRIPTION("Intel Uncore Frequency Control Driver"), MODULE_VERSION("1.2.0")
훅 방식kallsyms_lookup_name 경유 ftrace (5.7 이후 커널에서는 kprobe로 해석)
제어/sys/kernel/intel_uncore_freq/의 sysfs (enabled, cpu_lo, cpu_hi, mem_lo, mem_hi, hide_tag)

무엇을 훅하고 왜인가:

  • CPU 위장. show_stat을 훅해 /proc/stat을 다시 쓰며, 설정 가능한 범위(기본 40~50퍼센트)로 사용률을 위조하고 jiffies로 흔들어 숫자가 평평하게 앉아 있지 않고 진짜 부하처럼 움직이게 한다.
  • 메모리 위장. meminfo_proc_show를 훅해 /proc/meminfo를 다시 쓰며 MemFree, MemAvailable, Buffers, Cached, Active, Inactive를 위조한다.
  • 프로세스 은닉. iterate_dir을 훅해 /proc 목록을 걸러, 하드코딩된 집합과 이름이 일치하는 PID를 숨긴다: stealth, masscan, sshruns, ransomx, cpumask, xrandom, cpm_, kcpm, mask_helper, ftrhook, kintel_aux. 운영자는 /sys/kernel/intel_uncore_freq/hide_tag를 통해 런타임에 이름을 더할 수 있다.
  • 파일 은닉. stealth, cpumask, kintel_aux, intel_uncore_freq_aux와 일치하는 경로, 그리고 sysfs 디렉터리 자체를 숨긴다.
  • 자기 은닉. 적재 시 list_del_init으로 자신을 /proc/modules/sys/module/에서 제거하고, 자신의 sysfs kobject를 삭제하며, try_module_get으로 자기 참조 카운트를 늘려 rmmod가 언로드하지 못하게 한다.

그 은닉 목록 또한 단서다. 채굴기와 나란히 masscan, sshruns, ransomx를 숨기므로, 운영자는 스캐너를 돌리고 있을 가능성이 높고 키트에 채굴기 이상의 것이 있을 수 있다.

실제 효과는 이렇다. top을 보는 관리자는 바쁘지만 정상인 기계를 보고, 불량 프로세스를 찾지 못하며, 거짓말을 하고 있는 커널 모듈을 볼 수 없다. 단서는 물리적이고 대역 외다. 기계가 뜨거워지고, 팬이 돌고, 전력 소모가 오른다. 그 어느 것도 루트킷은 위조할 수 없다.

지속성: 모드별로 나뉜 세 가지 메커니즘

Rootpacket의 지속성은 착지한 모드에 달려 있다. root 모드에서는 서로를 보강하는 두 메커니즘을 쌓고, 사용자 영역 모드에서는 세 번째로 폴백한다.

#메커니즘모드세부
1systemd 서비스rootkernel-kd.service, Type=simple, Restart=always, RestartSec=3
2DKMS 모듈root루트킷을 /lib/modules/$(uname -r)/extra/ 아래 설치; 커널 업그레이드를 견딤
3crontabuser@reboot에 더해 매분(* * * * *), PID 잠금과 setsid 포함

DKMS 항목이 고집스러운 쪽이다. 루트킷을 커널 자체의 모듈 빌드 시스템을 통해 설치하므로, 일상적인 커널 업그레이드가 그것을 제거하기는커녕 재빌드하고 재무장한다.

killservice.sh: 기계를 비우고 잠그기

스크립트는 배너에서 자신을 “cryptojacker hardening”(크립토재커 강화)이라 부르며, 운영자 관점에서 그 설명은 정확하다. 세 단계로 돈다.

1단계: 노출된 서비스 끄기. 0.0.0.0에서 수신하는, 흔한 크립토재킹 진입점인 서비스를 노려, 각각을 멈추고 비활성화하고 마스킹하며, 바이너리에 chmod 000을 설정하고 iptables DROP 규칙을 추가한다.

서비스포트
Redis6379
Docker2375/2376
PostgreSQL5432
MongoDB27017
Elasticsearch9200/9300
Memcached11211
Hadoop YARN8088
Jenkins8080
Confluence8090

Docker 줄은 우리의 RedTail 보고서로 이어지는 연결 조직이다. Rootpacket은 RedTail이 통과하는 바로 그 2375/2376 문을 닫는다. 먼저 착지한 운영자는 호스트를 채굴한 뒤 다음 무리를 밖으로 잠가, 그들이 썼을 기법에 맞서 기계를 강화한다.

2단계: 경쟁 채굴기 제거. 프로세스를 죽이고, 파일을 삭제하며, cron 작업을 청소하고, 알려진 크립토재킹 계열에 묶인 SSH 키를 일소한다. 대상에는 XMRig, Kinsing(kdevtmpfsi), TeamTNT(tntrecht, mdrfckr), sustes, watchdogs, minerd, 그리고 masscan, pnscan, zgrab 같은 스캐너가 포함된다.

3단계: 사용자 영역 루트킷 제거. 알려진 악성 LD_PRELOAD 항목(libprocesshider.so, libjdk.so, libpamx.so, 가짜 libselinux.so.3, 그리고 xhide)을 /etc/ld.so.preload에서 떼어 내고 그 라이브러리를 삭제하여, 자신을 방해할 수 있는 경쟁자의 사용자 영역 루트킷을 치운다.

귀속

툴킷의 터키어 변수명, 주석, 상태 문자열(예: ROOT ele gecirildi!, “root 획득됨”)은 중간 확신으로 터키어를 쓰는 운영자를 가리킨다. 우리는 Cloudflare Pages에 호스팅된 linuxutil5.pages[.]dev에서 배포 또는 스테이징 URL을 찾았는데, 이는 무료이고 평판 있는 인프라에 페이로드를 스테이징해 섞여 드는 패턴에 들어맞는다. 내부 rootpacket.tar.gz, 즉 툴킷 전체의 자기 완결적 복사본은, 운영자에게 다음 호스트로 밀어 넣을 준비된 패키지를 준다.

침해 지표

네트워크

지표맥락
pool.supportxmr.com / pool.supportxmr.com:443주 모네로 채굴 풀, stratum+ssl
linuxutil5.pages[.]dev배포 / 스테이징 (Cloudflare Pages)
api.xmrig.com, randomx.xmrig.com:443XMRig API 및 벤치마크 엔드포인트
donate.v2.xmrig.com, donate.ssl.xmrig.comXMRig 개발자 기부 풀 (존재, 기부 비활성화)
443 포트로의 stratum+ssl://외향 TLS 채굴 트래픽

모네로 지갑: 46NVDFL6v5STw5Qw4j77PoBSHRTYnHZGZ8WRoGvHmpaMX7ZyhNUP2u24TLV9pNgncz1bZF2Vm8KkaNTzU7SXqrnFUx5zgHQ

파일 (SHA-256)

파일SHA-256MD5
rootpacket.tar.gz (외부)e2d0dab6b29df89d123fe8581047a03ac9b89ae8fa0d1f334b5aefbb93152857
getrootdda96d8a4bcc39dc7679347a4386bf1024152d2ccc46d333725ad0cda855d952
xrandom (패킹)ec3ef3dce99fa6cbc480f0f0b0c292676afed68704c44396271c7dc6afea2937

Build ID: getroot 148d8d902efd93ed892a541972fbcea3a99d05a3, xrandom d7a91225bdd2e3ab67cabded9d7809bcc724401f.

호스트 아티팩트

경로맥락
/opt/kernel-kd/xrandom채굴기 바이너리 (root 모드)
~/.xrandom/xrandom, ~/.xrandom/run.sh채굴기와 런처 (사용자 영역 모드)
/tmp/.xrandom.lockPID 잠금 (사용자 영역 모드)
/etc/systemd/system/kernel-kd.service악성 systemd 유닛
/usr/src/intel_uncore_freq_aux-1.2.0/루트킷의 DKMS 소스
/sys/kernel/intel_uncore_freq/루트킷 sysfs 제어 인터페이스
/lib/modules/*/extra/intel_uncore_freq_aux.ko컴파일된 루트킷 모듈

행위 기반

  • root 또는 현재 사용자로 도는 xrandom이라는 이름의 프로세스.
  • 하드웨어 성능 카운터(perf stat), 또는 팬 속도와 전력 소모와 어긋나는 /proc/stat의 CPU 수치.
  • systemd 서비스 kernel-kd(활성, Type=simple, Restart=always).
  • # xrandom-userland-autostart로 태그된 cron 항목.
  • 부팅 시 적재되지만 lsmod에는 없는 커널 모듈 intel_uncore_freq_aux.

탐지

루트킷이 로드되지 않은 경우

systemctl status kernel-kd.service
ls -la /opt/kernel-kd/ ~/.xrandom/
dkms status | grep intel_uncore_freq
crontab -l | grep xrandom
lsmod | grep intel_uncore

루트킷이 로드된 경우

사용자 영역 뷰는 침해되었으므로, 탐지는 루트킷의 아래나 옆에서 와야 한다:

  • perf stat으로 /proc/stat의 CPU를 하드웨어 카운터와 비교하라. 큰 간극이 단서다.
  • show_stat, meminfo_proc_show, iterate_dir의 ftrace 훅을 살피라.
  • 보고된 CPU와 실제 전력·열·팬 속도 사이의 불일치를 강한 신호로 다루라.

권한 상승 포착하기

  • 알려진 암호 도구(cryptsetup, openssl, gpg, systemd-cryptsetup)가 아닌 프로세스가 여는 AF_ALG, SOCK_SEQPACKET 소켓이 핵심 단서다. 전체 순서는 socket(AF_ALG)bindsetsockopt(SOL_ALG)acceptpipesplicesendmsgsplicerecvmsg(반복), 그다음 execve(/usr/bin/su).
  • 각 SUID 바이너리의 디스크 상 바이트를 그 페이지 캐시 뷰와 비교하라. sha256sum은 캐시를 통해 읽어 훼손된 복사본을 보여 주므로, dd if=<file> iflag=direct로 디스크를 직접 읽어 해시하고 차이를 비교하라. SUID 바이너리에서의 불일치는 페이지 캐시 훼손이다.

후보 YARA

rule Rootpacket_Cryptojacker
{
    meta:
        description = "Rootpacket Linux cryptojacking toolkit"
        reference   = "Kinryu Labs CTI 2026-06-16"
    strings:
        $wallet = "46NVDFL6v5STw5Qw4j77PoBSHRTYnHZGZ8WRoGvHmpaMX7ZyhNUP2u24TLV9pNgncz1bZF2Vm8KkaNTzU7SXqrnFUx5zgHQ" ascii
        $svc    = "kernel-kd" ascii
        $cron   = "xrandom-userland-autostart" ascii
        $mod    = "intel_uncore_freq_aux" ascii
    condition:
        $wallet or 2 of ($svc, $cron, $mod)
}

복구

  1. 알려진 깨끗한 상태에서 루트킷을 제거하라. 라이브 또는 복구 매체로 부팅하라. /lib/modules/*/extra/intel_uncore_freq_aux.ko*를 삭제하고 dkms remove intel_uncore_freq_aux/1.2.0 --all을 실행한 뒤, /usr/src/intel_uncore_freq_aux-1.2.0/를 삭제하고 initramfs를 재빌드하라(update-initramfs -u, dracut -f, 또는 mkinitcpio -P). DKMS 항목은 없애지 않으면 재빌드된다.
  2. 서비스 제거: systemctl stop kernel-kd; systemctl disable kernel-kd; rm /etc/systemd/system/kernel-kd.service; systemctl daemon-reload.
  3. 채굴기 제거: rm -rf /opt/kernel-kd/ ~/.xrandom/ /tmp/.xrandom.lock, 그다음 pkill -9 -f xrandom.
  4. cron 청소, # xrandom-userland-autostart 줄 제거.
  5. killservice.sh가 망가뜨린 것을 복원하라. 그것은 Redis, Docker, PostgreSQL, MongoDB 등 바이너리에 chmod 000을 설정하고 iptables DROP 규칙을 추가한다. 영향받은 패키지를 재설치하고 방화벽을 검토하라.
  6. 측면으로 사냥하라. 내부 rootpacket.tar.gz는 재배포용으로 만들어졌으므로, 다른 호스트에서 같은 지표를 확인하고, killservice.sh의 서비스가 악용된 흔적을 로그에서 검토해 침입 경로를 찾으라.
  7. CVE-2026-31431을 막으라. 수정된 커널(6.18.22, 6.19.12, 7.0+, 또는 배포판의 백포트)로 패치하라. 한 번에 패치할 수 없는 곳에서는 취약한 인터페이스를 비활성화하라: echo 'install algif_aead /bin/false' > /etc/modprobe.d/disable-algif-aead.conf 그다음 rmmod algif_aead. 컨테이너에 대해서는 seccomp 프로파일에서 AF_ALG(family 38)를 막으라.
  8. 컨테이너로부터의 호스트 침해를 전제하라. 페이지 캐시 쓰기가 컨테이너 경계를 넘으므로, setup.sh를 실행한 호스트는 — 컨테이너 내부에서였더라도 — 완전히 침해된 것으로 다루라. 컨테이너를 제거하는 데 그치지 말고 호스트를 재구축하라.

MITRE ATT&CK 매핑

전술기법
Initial AccessT1190 Exploit Public-Facing Application (Redis, Docker, MongoDB, Elasticsearch, Jenkins, Hadoop YARN, 암시적)
ExecutionT1059.004 Unix Shell
Privilege EscalationT1068 Exploitation for Privilege Escalation (CVE-2026-31431, AF_ALG algif_aead); T1611 Escape to Host (공유 페이지 캐시)
PersistenceT1543.002 Systemd Service; T1053.003 Cron; T1547.006 Kernel Modules (DKMS)
Defense EvasionT1014 Rootkit; T1036.005 Masquerading: Match Legitimate Name; T1027.002 Software Packing (UPX); T1070.004 File Deletion; T1564.001 Hidden Files
DiscoveryT1057 Process Discovery (경쟁자 사냥)
Lateral MovementT1570 Lateral Tool Transfer (내부 재배포 패키지)
ImpactT1496 Resource Hijacking (모네로 채굴)

방법론과 분석가 노트

  • 분석은 주로 정적(문자열 추출, 디스어셈블, 소스 검토, 구조 분석)이었고 Kali Linux x86-64에서 했다. 행위를 관찰하기 위해 격리된 VM(커널 6.6.15)에서 getroot를 한 번 실행하기도 했다. AF_ALG 순서를 시도했으나 그 빌드에서는 root를 얻지 못하고 비특권으로 명령을 실행하는 폴백에 떨어졌다. 채굴기는 실행하지 않았고, 아무것도 업로드하지 않았다.
  • 권한 상승 구성 요소는 CVE-2026-31431로 판정했다. 근거는 AF_ALG 소켓에 묶인 authencesn(hmac(sha256),cbc(aes)) 템플릿, /usr/bin/su라는 페이지 캐시 표적, 그리고 바이너리 안의 splice/sendmsg/recvmsg 쓰기 루프다.
  • 샘플(툴킷과 그 구성 요소)은 다른 연구자와 방어자에게 요청 시 제공한다. 당신이 누구이고 무엇에 필요한지 짧게 적어 [email protected]로 메일을 보내라.
How to cite
Kinryū Labs (2026). Rootpacket: 커널에 숨는 Linux 크립토재킹 툴킷. https://kinryu.sh/ko/reports/rootpacket-linux-cryptojacking-rootkit/