
2026년 들어 소프트웨어 공급망 공격이 더욱 거세지고 있습니다. npm, PyPI 등 오픈소스 패키지 저장소를 악용한 공격은 이제 단순한 타이포스쿼팅(typosquatting)을 넘어, 정교한 다단계 C2 체인과 인포스틸러 기능을 갖춘 본격적인 위협으로 진화하고 있습니다.
이러한 공격이 위험한 이유는 명확합니다. 개발자가 npm install이라는 익숙한 명령어 하나로 악성코드를 실행하게 되고, 감염은 개발 환경을 넘어 CI/CD 파이프라인, 클라우드 인프라, 심지어 기업의 데이터 처리 플랫폼까지 확산되고 있습니다. 이 모든 과정이 AI를 통해 손쉽게 만들어지기 때문에 소프트웨어 공급망 공격이 대량으로 진행되고 있습니다.
ESRC는 최근 npm 사용자 biz44가 업로드한 9개의 악성 패키지를 발견하고, AI를 활용한 자동화 분석 체계를 통해 패키지 다운로드부터 C2 인프라 전체 매핑까지 단일 세션에서 대응을 완료했습니다.
npm과 같은 오픈소스 패키지 저장소는 개발 생산성을 높이는 중요한 기반입니다. 하지만 동시에 많은 개발자가 신뢰하고 사용하는 패키지 배포 환경이 공격자에게는 매력적인 공격 지점이 될 수 있습니다.

이번 공격에서는 정상적인 유틸리티를 연상시키는 이름의 패키지가 짧은 기간 동안 연속적으로 게시됐습니다.
| 패키지명 | 버전 | 등록일 |
| @biz44/id44-client | 1.1.44 | 2026-09-12 |
|
id79-client
|
1.1.79 | 2026-09-12 |
| @biz44/id95-client | 1.1.96 | 2026-09-12 |
| @biz44/id99-client | 1.1.100 | 2026-09-12 |
| @biz44/id10-client | 1.1.11 | 2026-09-12 |
| @biz44/id12-client | 1.1.13 | 2026-09-12 |
| @biz44/id79-client | 1.1.80 | 2026-09-12 |
| @biz44/process-runtime-utils | 1.1.10 | 2026-09-14 |
| @biz44/runtime-utils | 1.1.11 | 2026-09-14 |
[표 1] 패키지 리스트
공격 패키지는 크게 두 그룹으로 확인됐습니다. 그룹 A는 idXX-client 계열 7개 패키지로 2026년 9월 12일 집중적으로 게시됐으며, 그룹 B는 runtime-utils 계열 2개 패키지로 9월 14일 새롭게 게시됐습니다. 두 그룹은 서로 다른 npoint.io 엔드포인트를 사용했지만 index.js, init.js, loader.js의 핵심 악성 로직은 C2 주소와 일부 주석을 제외하면 동일했습니다.
특히 그룹 B에서는 기존 패키지에서 사용하던 remote-execution, system-monitoring 등의 의심스러운 키워드를 제거하고 README를 크게 간소화했으며, GitHub 저장소 링크도 제거했습니다. 패키지명과 버전을 변경하면서 짧은 시간에 여러 버전을 게시한 점도 확인됐습니다.
모든 패키지들은 외견상 정상적인 유틸리티 패키지처럼 보이지만, 9개 모두 동일한 3단계 악성 실행 체인을 내장하고 있었습니다.

이번 공격에서 특히 주목되는 부분은 악성 패키지가 별도의 사용자 동작을 요구하지 않는다는 점입니다.
패키지의 index.js에서는 다음과 같이 초기화 함수를 바로 호출합니다.

따라서 다음과 같이 패키지를 import하는 것만으로 악성 프로세스가 생성됩니다.

init.js는 node loader.js를 부모 프로세스와 분리된 상태로 실행하고, windowsHide: true를 통해 콘솔 창을 숨깁니다. child.unref()까지 적용돼 부모 Node.js 애플리케이션이 종료된 이후에도 생성된 프로세스가 유지될 수 있도록 구성돼 있습니다.
또한 .pid 파일에 프로세스 ID를 저장해 이미 실행 중인 프로세스가 있는지 확인합니다.
loader.js에서는 Module.prototype.require를 후킹합니다. 이를 통해 child_process 모듈을 사용하는 코드에 windowsHide: true를 강제로 적용하고, execSync 호출 역시 cmd.exe /c 형태로 실행되도록 변경합니다. 이 방식은 C2에서 내려받은 페이로드에 별도의 창 은닉 코드를 포함하지 않아도 동일한 효과가 적용되도록 합니다.
해당 패키지는 사용자가 별도의 함수를 호출하거나 실행 파일을 직접 실행하지 않아도 Node.js의 모듈 평가 과정에서 악성 코드가 동작하는 구조입니다.
이번 사례에서 또 하나 주목할 부분은 악성 패키지에 최종 페이로드를 모두 포함하지 않고, 외부 서비스를 통해 원격으로 코드를 내려받는 구조입니다.
loader.js는 api.npoint.io에 HTTPS GET 요청을 보내 다음과 같은 JSON 형태의 응답을 받습니다.
받은 데이터는 Buffer.from(code, "base64")를 통해 디코딩된 후 new Function()으로 실행됩니다.
즉, npm 패키지에 포함된 초기 로더와 실제 악성 기능을 분리한 것입니다. 공격자는 npm 패키지를 다시 배포하지 않고도 npoint.io에 저장된 페이로드를 변경할 수 있습니다.
실제 분석에서는 그룹 A와 그룹 B가 각각 다른 npoint.io 엔드포인트를 사용했으며, 그룹 B 페이로드는 다시 npoint.io의 별도 설정 주소를 조회해 실제 C2 서버 주소를 받아오는 다단계 구조로 확인됐습니다.

페이로드는 실행 직후 시스템 정보를 수집하고 C2로 전송합니다. 컴퓨터명, 사용자명, 운영체제, CPU, 메모리, 네트워크 인터페이스, 공인 IP, 위치 정보 등을 수집하며, 이후 Chrome 사용자 데이터 경로를 탐색해 각 프로필의 Local Extension Settings를 수집합니다.
특히 Chrome 확장 프로그램 데이터에는 암호화폐 지갑이나 비밀번호 관리자 등과 관련된 정보가 저장될 수 있어 추가적인 정보 탈취로 이어질 가능성이 있습니다.
C2 명령에 따라 클립보드와 키보드 입력을 모니터링하는 기능도 구현돼 있습니다. 클립보드 모니터링은 변경된 내용만 C2로 전송하도록 구성됐으며, 키로거는 Windows 환경에서 PowerShell과 C# 인라인 컴파일을 이용해 SetWindowsHookEx 기반의 전역 키보드 후킹을 수행합니다.

패키지 분석 이후 C2 서버를 대상으로 추가 분석을 수행한 결과, 공격자가 관리하는 것으로 추정되는 C2 환경과 피해 시스템 목록까지 확인됐습니다.
C2 서버는 Express.js 기반으로 동작했으며, "Chrome Monitor - Live Dashboard"라는 대시보드를 운영하고 있었습니다.

이를 통해 피해 시스템 목록과 시스템 정보, 클립보드 수집 데이터, 키보드/마우스 모니터링 상태 등을 확인할 수 있었습니다.
분석 과정에서 총 16개 시스템이 확인됐으며, 이 가운데 실제 개발/클라우드 환경으로 판단되는 시스템도 다수 포함돼 있었습니다.

추가적으로 공격자의 개발 시스템으로 강하게 의심되는 시스템의 클립보드 수집 데이터에서는 C2 페이로드와 함께 AI 코딩 어시스턴트의 출력 내용이 확인됐습니다.
2026년 9월 10일에는 C2에 업로드하기 위한 Base64 인코딩 페이로드가 클립보드에 반복적으로 복사된 흔적이 확인됐고, 약 26분 후에는 C2 서버의 Chrome 관련 코드를 수정하는 AI 코딩 어시스턴트의 출력 내용이 수집됐습니다.
AI 어시스턴트는 exec("start chrome.exe ...")로 Chrome을 실행할 때 CMD 창이 노출되는 문제를 분석하고, 다음과 같이 spawn()과 windowsHide: true를 사용하는 방법을 제안했습니다.

따라서 이번 사례에서는 공격자가 AI 코딩 어시스턴트를 이용해 C2 서버의 기능을 개발/디버깅하고, 그 과정에서 사용한 프로세스 은닉 기법과 유사한 코드가 악성 패키지에도 적용된 정황이 확인됐습니다.
공격자가 AI를 활용하면서 악성 인프라 개발과 문제 해결에 필요한 시간을 줄이고 있는 것입니다.
이번 사례에서 공격자는 정상적인 패키지명으로 위장한 npm 패키지를 짧은 기간에 다수 배포하고, import 만으로 악성 프로세스가 실행되도록 구성했습니다. 이후 정상적인 외부 서비스를 이용해 원격 페이로드를 내려받고, 시스템 정보와 Chrome 확장 프로그램 데이터, 클립보드, 키보드 입력 등을 수집할 수 있도록 기능을 확장했습니다.
또한 공격자의 개발 환경에서는 AI 코딩 어시스턴트를 이용해 C2 서버의 기능을 개발/수정한 정황까지 확인됐습니다.

ESRC는 이처럼 공격자가 AI와 자동화를 활용해 개발 및 배포 속도를 높이는 위협 환경에 대응하기 위해 다양한 위협 정보를 자동으로 수집/분석하고, 새롭게 확인되는 악성코드와 공격 기법을 신속하게 탐지 및 대응할 수 있도록 위협 대응 역량을 강화하고 있습니다.
IoC
| Indicator | Type | Description | Detection Name |
|---|---|---|---|
| B7F170ACF3C3674E3B8999C38A09F839 | MD5 | id79-client-1.1.79.tgz | Trojan.Infostealer.Gen |
| D98104CC0822D188DF1E9CA072369B45 | MD5 | biz44-id10-client-1.1.11.tgz | Trojan.Infostealer.Gen |
| D59CE7CFE339C1159D699DD88007103B | MD5 | biz44-id12-client-1.1.13.tgz | Trojan.Infostealer.Gen |
| D2797234FA48DD5434E73FA5FEF5D1FE | MD5 | biz44-id44-client-1.1.44.tgz | Trojan.Infostealer.Gen |
| 0AB67D9A5B8141EF06246EB8AF2A55F5 | MD5 | biz44-id79-client-1.1.80.tgz | Trojan.Infostealer.Gen |
| C72B21BAF3C49BCBC62B8BBFB04D2BD9 | MD5 | biz44-id95-client-1.1.96.tgz | Trojan.Infostealer.Gen |
| 0ED8F07E351B34B5EC1288BC2DD100A4 | MD5 | biz44-id99-client-1.1.100.tgz | Trojan.Infostealer.Gen |
| 5ED7C5EA7AED02898574476BC740AE86 | MD5 | biz44-process-runtime-utils-1.1.10.tgz | Trojan.Infostealer.Gen |
| 9282FDD8BCBC5F68678FED5B13A248E7 | MD5 | biz44-runtime-utils-1.1.11.tgz | Trojan.Infostealer.Gen |
| D916BDDFCD04990B1FD1BCD0777DA72E | MD5 | loader.js | Trojan.Script.Agent |
| 44B2B250E8BB4E1EE3ED35DCD0CF7B59 | MD5 | loader.js | Trojan.Script.Agent |
| 국내 의료기관을 노린 RDP 기반 Beast(GodDamn) 랜섬웨어 공격 (0) | 2026.09.14 |
|---|---|
| 기능별 C2 서버를 운용하는 Kimsuky 그룹의 새로운 LNK 악성코드 등장 (0) | 2026.09.09 |
| 상품 파손 사칭 메일로 유포되는 다단계 정보탈취 악성코드 주의 (1) | 2026.08.04 |
| 세무 위반 통지 사칭 피싱 메일을 통한 원격제어 악성코드 유포 주의 (0) | 2026.07.13 |
| Chai.js 플러그인으로 위장한 북한발 npm 악성 패키지 'chai-as-init' 분석 (0) | 2026.06.16 |
댓글 영역