COMMENTS (0)
댓글은 익명으로 작성되며, 삭제 비밀번호를 설정하면 본인만 삭제할 수 있습니다. 비밀번호를 설정하지 않은 댓글은 누구나 삭제할 수 있습니다.
Check Point Research가 발견한 VoidLink는 AI 코딩 에이전트로 1주 만에 만들어진 88,000줄 Linux 클라우드 악성코드 프레임워크다. 5개 클라우드 자동 탐지, C2 실시간 루트킷 컴파일, 37개 공격 모듈의 아키텍처를 해부한다.
댓글은 익명으로 작성되며, 삭제 비밀번호를 설정하면 본인만 삭제할 수 있습니다. 비밀번호를 설정하지 않은 댓글은 누구나 삭제할 수 있습니다.
2025년 12월, Check Point Research가 이상한 Linux 바이너리 클러스터를 발견했다.
9KB짜리 ELF 파일. 작았다. 하지만 실행되면 1.9MB 임플란트를 메모리에 올리고, 37개 공격 모듈을 로드하고, 커널 루트킷으로 자신을 숨겼다.
이름은 VoidLink.
연구자들이 C2 서버를 추적하자, 개발자의 실수로 열려 있던 디렉토리에서 전체 소스코드와 AI가 생성한 개발 계획서를 발견했다.
88,000줄. Zig, C, Go 3개 언어. 37개 플러그인. 5개 클라우드 환경 자동 탐지.
이 모든 것을 만든 건 1명의 개발자와 AI 코딩 에이전트 하나였다. 소요 시간은 약 1주일.
VoidLink는 디스크 흔적을 최소화하도록 설계되었다.
| 단계 | 설명 |
|---|---|
| Stage 0 (9KB) | Zig로 작성된 최소 로더. XOR 난독화된 C2 설정을 복호화하고 Stage 1을 다운로드한다 |
| Stage 1 (9KB) | HTTP Range 헤더로 최종 임플란트를 분할 다운로드한다 |
| 최종 임플란트 (1.2~1.9MB) | 37개 모듈 + 커널 루트킷 소스코드가 내장된 본체. memfd_create 시스콜로 메모리에서만 실행된다 |
Stage 0의 시스콜 시퀀스는 단 8개다:
fork → prctl → socket → connect → recvfrom → memfd_create → write → execveat
파일을 디스크에 쓰지 않는다. memfd_create로 익명 파일 디스크립터를 생성하고, 메모리에서 직접 실행한다. 포렌식 도구가 디스크를 뒤져도 임플란트 본체는 찾을 수 없다.
VoidLink 코어는 Zig로 작성되었다. 악성코드에서 Zig는 아직 드물다. 그런데 왜?
| 이유 | 설명 |
|---|---|
| 크로스 컴파일 | 단일 환경에서 모든 Linux 아키텍처(x86_64, ARM 등) 바이너리를 빌드할 수 있다 |
| 탐지 회피 | AV 엔진은 C/C++/Go/Rust 바이너리 패턴을 학습했지만, Zig 바이너리 구조는 아직 미인식 |
| 최소 크기 | Stage 0이 9KB. 의존성 없이 어디서든 실행된다 |
| C 호환 | zig cc로 기존 C 코드(루트킷 등)를 그대로 크로스컴파일 가능 |
KPMG가 문서화한 Zig Strike 툴킷도 같은 이유로 Zig를 선택했다. AV/EDR 회피용 페이로드 생성에 Zig의 comptime(컴파일타임 평가)이 셸코드를 동적으로 재구성해 정적 분석을 무력화한다.
VoidLink의 플러그인 시스템은 Cobalt Strike의 BOF(Beacon Object Files)에서 영감을 받았다. 모든 플러그인은 _v3.o 명명 규칙을 따른다.
| 카테고리 | 플러그인 수 |
|---|---|
| 정찰 (시스템/네트워크/프로세스) | 9개 |
| 자격증명 수집 (SSH, 브라우저, 메모리, 키링) | 7개 |
| 지속성 (systemd, cron, LD_PRELOAD) | 3개 |
| 횡적 이동 (SSH 웜, 터널, K8s) | 5개 |
| 컨테이너 탈출 (Docker, K8s) | 2개 |
| 안티포렌식 (로그 삭제, 타임스탬프 변조) | 3개 |
주목할 것은 ssh_worm_v3.o다. 감염된 호스트의 known_hosts를 읽고, 수집한 SSH 키로 다른 서버에 자동 전파한다. 속도 제한(throttling)까지 구현해서 트래픽 급증으로 탐지되는 것을 방지한다.
mimipenguin_lite_v3.o는 Linux 버전 Mimikatz다. 프로세스 메모리를 스캔해서 평문 비밀번호를 추출한다. Windows에서 자격증명 덤핑이 APT 공격의 핵심 단계인 것처럼, VoidLink는 Linux 환경에서 같은 전술을 구현했다.
VoidLink는 클라우드 환경에 "적응"하는 것이 아니라, 클라우드를 기본 전제로 설계되었다.
임플란트가 실행되면 가장 먼저 하는 일은 "내가 어떤 클라우드에 있는가?"를 확인하는 것이다.
| 클라우드 | 탐지 방법 |
|---|---|
| AWS | 169.254.169.254 메타데이터 API 쿼리 |
| Azure | 169.254.169.254 (헤더로 구분) |
| GCP | metadata.google.internal 쿼리 |
| Alibaba Cloud | 169.254.169.254 (응답 패턴으로 구분) |
| Tencent Cloud | metadata.tencentyun.com 쿼리 |
탐지 결과에 따라 행동을 조정한다. AWS에서는 ~/.aws/credentials를, GCP에서는 서비스 계정 토큰을, Kubernetes 환경에서는 /var/run/secrets/kubernetes.io/serviceaccount/를 노린다.
환경변수도 스캔한다. AWS_ACCESS_KEY, GOOGLE_CLOUD_PROJECT 같은 키가 환경변수에 평문으로 들어있는 경우가 많다.
docker_escape_v3.o는 Docker 소켓 마운트 여부, 특권 컨테이너 플래그, cgroup release_agent 남용 가능성을 자동으로 탐색한다. k8s_privesc_v3.o는 과도한 RBAC 권한, 호스트 네임스페이스 접근, 쓰기 가능한 hostPath 마운트를 찾는다.
하나의 컨테이너를 탈출하면 호스트 전체를, 호스트를 장악하면 그 위의 모든 컨테이너를 통제할 수 있다.
VoidLink의 가장 혁신적인 기능은 Sysdig가 "documented malware에서 전례 없는 기법"이라고 표현한 SRC(Server-side Rootkit Compilation)다.
임플란트가 타겟 시스템의 커널 정보를 C2 서버의 /compile 엔드포인트에 POST한다:
커널 버전: 6.1.0-generic
GCC 존재 여부: true
커널 헤더 존재 여부: true
숨길 포트: [4444, 8080]
C2 서버가 이 커널에 맞는 루트킷을 즉석에서 컴파일해서 돌려보낸다.
범용 루트킷은 커널 버전이 다르면 크래시가 난다. VoidLink는 이 문제를 "서버에서 컴파일"이라는 방법으로 해결했다. 타겟이 어떤 커널을 쓰든 맞춤형 루트킷이 동작한다.
| 커널 버전 | 루트킷 모드 |
|---|---|
| 5.5 이상 (5.8+ 선호) | eBPF 모드 — 시스콜을 BPF 프로그램으로 가로챈다 |
| 4.x ~ 5.x | LKM 모드 — 전통적 커널 모듈(vl_stealth.ko, 108KB) |
| 4.0 미만 | LD_PRELOAD 모드 — 유저랜드 후킹으로 우회 |
세 가지 모드 모두 같은 결과를 만든다: 프로세스, 파일, 네트워크 소켓을 숨긴다. ls로 봐도, netstat로 봐도, ps로 봐도 VoidLink는 보이지 않는다.
루트킷 소스코드에는 중국어 주석이 있었다:
// 안정성 강화: 符号查找
// (안정성 강화: 심볼 조회)
// 方式2: 使用 kprobe 直接查找 (5.7+)
Linux 5.7에서 kallsyms_lookup_name 내보내기가 중단된 변경사항을 정확히 인지하고 대응한 코드다. AI가 생성했더라도, 이 부분은 커널 전문 지식이 반영되어 있다.
VoidLink는 12개 이상의 보안 제품을 탐지한다. CrowdStrike(falcon-sensor), SentinelOne(SentinelAgent), Falco, Sysdig, Wazuh, auditd 등.
보안 도구 무력화는 공격자에게 핵심적인 단계다. VoidLink는 무력화 대신 더 정교한 접근을 택했다. EDR이 발견되면 비콘 간격을 늘리고 지터를 30%로 올려 "paranoid 모드"로 전환한다. EDR이 없으면 공격적으로 행동한다.
개발자는 TRAE(ByteDance의 AI IDE)에 내장된 TRAE SOLO에이전트를 사용했다. Check Point가 복구한 문서에 따르면, 개발자는 AI에게 직접 코드를 구현하지 말고 계획만 생성하라고 지시했다. 안전 가드레일을 우회하기 위한 것으로 추정된다.
AI는 3개 팀(Core/Zig, Arsenal/C, Backend/Go)으로 나눈 20주 스프린트 계획을 생성했다. 실제 구현은 1주로 압축되었다.
프로덕션 바이너리에 Phase 1: ~ Phase 8: 라벨이 남아있었다. 그런데:
| 이상 징후 | 의미 |
|---|---|
| Phase 7이 완전히 없다 | 별도 프롬프트에서 생성된 코드가 연속성 검증 없이 합쳐졌다 |
| Phase 5가 두 번 중복된다 | 다른 함수에 같은 Phase 번호가 할당되었다 |
| 디버그 로그가 제거되지 않았다 | "successfully initialized" 같은 메시지가 프로덕션에 남아있다 |
전문 악성코드 개발자라면 이런 흔적을 반드시 제거한다. 남아있다는 것은 AI 출력물에 대한 검토가 최소한이었다는 뜻이다.
Check Point: "스프린트 사양과 복구된 소스코드가 거의 정확히 일치한다." Sysdig: "AI 보조 확률 70~80%(Sysdig TRT 분석 보고서)."
개발자는 C2 서버(Alibaba Cloud, 8.149.128[.]10)에 보호되지 않은 오픈 디렉토리를 남겼다.
그 디렉토리에 있던 것:
| 노출된 자료 | 의미 |
|---|---|
| 전체 소스코드 | 37개 플러그인 + 루트킷 + C2 서버 전체 |
| AI 스프린트 계획서 | 20주 개발 로드맵, 팀 구성, 중국어 문서 |
| TRAE 헬퍼 파일 | AI에게 준 지시사항이 복구됨 |
| 타임스탬프 | 11월 27일 ~ 12월 4일 개발 기간 특정 |
88,000줄의 프레임워크를 만든 기술력과, 오픈 디렉토리를 방치한 실수 사이의 간극이 크다. AI가 코드 작성을 가속했지만, 운영 보안(OPSEC)은 가속하지 못했다.
실전 감염은 아직 확인되지 않았다. 개발 중 단계에서 발각된 것으로 보인다.
VoidLink만의 이야기가 아니다.
| 사례 | AI 활용 |
|---|---|
| FunkLocker (2025) | 제한 없는 LLM으로 악성코드 생성 |
| PROMPTFLUX (2025.06) | Gemini API로 1시간마다 자기 코드를 재작성 |
| VoidLink (2025.12) | TRAE SOLO로 1주 만에 88,000줄 |
CrowdStrike 2025 보고서에 따르면 AI 생성 피싱 이메일의 클릭률은 54%로, 사람이 작성한 12%의 4.5배다. Google/Mandiant의 2026 전망 보고서는 "2026년 중반까지 완전 자율 AI에 의한 주요 기업 침해 최소 1건"을 예측했다.
VoidLink가 보여준 것은 명확하다. 1명이 AI를 활용하면 조직적 위협 그룹 수준의 도구를 만들 수 있다. 진입 장벽이 낮아졌다.
방어 관점에서, Sysdig의 분석은 희망적인 부분도 있다. VoidLink의 정교한 회피 기법에도 불구하고, 시스콜 패턴과 memfd_create 실행은 Falco, Sysdig Secure 같은 런타임 탐지 도구로 잡을 수 있다. 클라우드 환경에서 CSPM(설정 관리)만으로는 부족하고, 런타임 보안이 핵심라는 것을 VoidLink가 증명했다.
VoidLink가 시사하는 점은 AI가 악성코드의 개발 속도를 근본적으로 변화시킨다는 것이다. 88,000줄의 코드를 1주일 만에 생성한 것은 기존의 APT 그룹 개발 주기(수개월~수년)와 비교할 수 없는 속도다. 코드의 구조적 다양성도 높아, 전통적인 시그니처 기반 탐지가 효과적이지 않다.
AI 활용 안내 이 글은 AI(Claude)의 도움을 받아 작성되었습니다. 인용된 통계와 사례는 참고 자료에 명시된 출처에 근거하며, 설명을 위한 일부 표현은 각색되었습니다.
면책 조항 본 글은 보안 인식 제고를 위한 교육 목적으로 작성되었습니다. 언급된 공격 기법을 실제로 시도하는 행위는 「정보통신망법」, 「형법」 등에 따라 처벌받을 수 있으며, 본 블로그는 이에 대한 법적 책임을 지지 않습니다.