공지사항

Security Insights & Trends

Flooding Dropper 캠페인 npm 악성 패키지 846개 확산

Raoul16 2026. 8. 7. 10:00

 

Flooding Dropper 캠페인, Npm 악성 패키지 846개 확산

 

안녕하세요,

그로메트릭 입니다. 🐸

 

npm 패키지 매니저를 사용하는 개발팀이라면 절대 가볍게 넘겨서는 안 될 소식입니다. 

소나타입(Sonatype) 리서치랩이 'Flooding Dropper'라는 이름의 대규모 악성 패키지 캠페인을 포착했습니다. 

지금까지 확인된 것만 846개에 달하는 npm 패키지가 이 캠페인에 연루돼 있으며, 조사가 진행될수록 그 규모는 계속 늘어나고 있습니다.

이번 공격의 특징은 '자동화'입니다. 공격자는 하나의 계정에서 다량의 악성 패키지를 배포하는 대신, 수많은 npm 계정을 자동으로 생성해 소량의 패키지씩 분산 배포하는 전략을 택했습니다. bigops, bnpl 같은 특정 키워드를 조합한 패키지명과 35.x.y 버전대라는 공통점 외에는 단서가 많지 않아, 탐지와 차단이 유독 까다롭습니다.

패키지가 설치되면 운영체제를 자동 판별해 윈도우·리눅스·macOS용 악성 바이너리를 내려받고, 백그라운드에서 독립적으로 실행됩니다. 특히 윈도우 환경에서는 이벤트 로깅과 보안 검사 기능을 무력화하고, 레지스트리와 예약 작업을 통해 지속성을 확보한 뒤 추가 페이로드를 메모리상에서 실행하는 정교한 2단계 공격까지 확인됐습니다. 

 

개발자 워크스테이션은 물론 CI/CD 파이프라인까지 노출될 수 있는 만큼, 공급망 보안 관점에서 실질적인 비즈니스 리스크로 이어질 수 있는 사안입니다.

 

*아래 글은 소나타입(Sonatype)의 공식 블로그 글을 번역하여 작성되었습니다.

 


npm 덮친 신종 공급망 공격: Flooding Dropper 캠페인

✅ 요약

  • 소나타입 리서치랩이 npm에서 확산 중인 대규모 악성 패키지 캠페인 'Flooding Dropper'를 추적하고 있으며, 현재까지 846개 소프트웨어 컴포넌트가 영향을 받은 것으로 확인됐습니다.
  • 공격자는 npm 계정과 패키지 생성 과정을 자동화한 것으로 보이며, bigops·bnpl 등의 단어를 조합한 패키지명35.x.y대 버전 번호를 반복적으로 사용하고 있습니다.
  • 패키지가 설치되면 2차 페이로드를 다운로드해 실행하며, 공격 성공률을 높이기 위해 여러 전달 경로를 동시에 사용합니다.
  • 소나타입은 이 캠페인을 sonatype-2026-005660으로 추적 중입니다. 영향을 받은 조직은 해당 호스트를 침해된 것으로 간주하고, 패키지 제거·2차 페이로드 실행 여부 조사·지속성 메커니즘 점검을 마친 뒤에만 노출된 자격 증명을 교체해야 합니다.

2026년 8월 5일, 오픈소스 보안 리서치 커뮤니티 OpenSourceMalware는 윈도우·리눅스·macOS 시스템에 플랫폼별 바이너리를 전달하는 악성 npm 패키지 bigops-backend를 처음 보고했습니다. 소나타입 리서치랩의 호르헤 카르도나(Jorge Cardona)는 이 패키지가 훨씬 더 큰 캠페인의 일부라는 사실을 확인했고, 이 글 작성 시점 기준 846개 소프트웨어 컴포넌트가 'Flooding Dropper' 캠페인에 연루된 것으로 파악됐습니다.

 

이 캠페인은 한 명의 게시자에게 의존하지 않고, 여러 npm 계정을 생성해 계정당 소수의 패키지만 게시하는 방식을 씁니다. 패키지 이름에는 bigops, bnpl 같은 단어가 자주 조합되며, 다음과 같은 예시가 확인됐습니다.

  • bigops-api
  • dolyame-boxy-desktop-bnpl-card-gallery

패키지에 담긴 페이로드는 미묘하게 변형돼 있습니다. URL 함수명이나 변수명은 패키지마다 다르지만, 실제 동작 방식은 동일합니다.

이런 방식은 정확한 시그니처 기반 탐지의 효과를 떨어뜨릴 수 있습니다.

 

npm을 노린 'Flooding Dropper' 캠페인의 작동 방식

악성 패키지에는 설치되거나 임포트되는 즉시 실행되는 코드가 담겨 있습니다.

1차 자바스크립트 코드는 여러 전달 경로를 갖춘 크로스플랫폼 로더 역할을 합니다.

 

실행되면 다음과 같은 순서로 동작합니다.

  1. 환경 변수와 로컬 상태 표식을 확인해 실행 여부를 판단합니다.
  2. 호스트의 운영체제와 프로세서 아키텍처를 식별해 윈도우·리눅스·macOS 중 호환되는 페이로드를 선택합니다.
  3. 하드코딩된 여러 원격 호스트 중 무작위로 골라 바이너리 다운로드를 시도합니다.
  4. HTTPS 직접 다운로드가 실패하면 DNS TXT 레코드 방식으로 전환합니다.
  5. DNS로 전달된 페이로드를 재조합하고 디코딩합니다.
  6. 바이너리를 임시 디렉터리에 기록하고, 유닉스 계열 시스템에서는 실행 권한을 부여합니다.
  7. 출력을 숨긴 채 분리된(detached) 백그라운드 프로세스로 바이너리를 실행합니다.

페이로드를 분리된 프로세스로 실행하는 것은 중요한 안전장치입니다. npm 설치 프로세스나 상위 Node.js 프로세스를 종료해도 공격이 반드시 멈추지는 않기 때문입니다. 다운로드된 바이너리는 독립적으로 백그라운드에서 계속 실행될 수 있습니다.

DNS 폴백 방식도 주목할 부분입니다. 다운로드 호스트 하나를 차단하더라도, TXT 레코드 응답으로 페이로드를 재구성할 수 있다면 전달을 막지 못할 수 있습니다.

 

2단계 페이로드: 탐지 회피와 지속성 강화

다운로드된 윈도우 바이너리를 분석한 결과, 이 바이너리 자체가 추가 페이로드를 위한 로더 역할을 하는 것으로 확인됐습니다.

소나타입은 다음과 같은 정교한 다운로더 동작을 관찰했습니다.

  • Windows 이벤트 추적(ETW)과 AMSI(Antimalware Scan Interface) 기능을 패치해 모니터링과 스캔을 방해합니다.
  • 디버거, 가상머신, 샌드박스, 보안 제품을 탐지하고, 사용자의 AppData 디렉터리 하위의 영구 위치로 자신을 복사합니다.
  • 레지스트리 실행(Run) 키와 예약 작업을 모두 활용해 지속성을 확보합니다.
  • 원격 /pkg/update_win.exe 경로에서 암호화된 페이로드를 내려받아 복호화한 뒤, 메모리상에서 리플렉티브 방식으로 실행합니다.

리플렉티브 로딩은 디스크에 일반적인 실행 파일을 기록하고 실행하는 통상적인 과정을 거치지 않고 페이로드를 실행하는 기법입니다. 이 때문에 디스크 기반 보안 통제로는 2단계 페이로드를 탐지하기 어려워질 수 있습니다.

 

자동화가 바꾸는 대응 방식의 문제

대규모로 악성 패키지를 게시하는 방식 자체는 새롭지 않습니다. 

다만 이를 수많은 일회용 계정에 분산시키는 방식은 대응을 훨씬 어렵게 만듭니다.

'Flooding Dropper' 공격자는 무작위로 생성된 것처럼 보이는 계정명을 사용하며, 개별 계정은 소수의 패키지만 게시합니다. 이는 방어자가 "다작 게시자 한 명만 제거하면 캠페인 전체가 사라질 것"이라고 가정할 수 없게 만듭니다.

이는 npm 입장에서도 모더레이션 부담을 키웁니다. 공격자가 계속 새로운 패키지를 생성하는 동안, 각 계정과 패키지를 개별적으로 식별·검토·제거해야 하기 때문입니다.

캠페인의 명명 규칙도 계속 진화하고 있습니다. 

여전히 많은 패키지가 "bigops"나 "bnpl"을 포함하지만, 소나타입 리서치랩은 다른 이름을 사용하는 패키지도 함께 관찰했습니다. 

다수는 35.x.y로 시작하는 버전 번호를 공유하고 있어 또 다른 연관성 판단 기준이 되지만, 이런 특징들은 캠페인이 진화함에 따라 언제든 바뀔 수 있는 만큼 안정적인 탐지 수단은 아닙니다.

자동화는 오픈소스 악성 캠페인의 경제성 자체를 바꾸고 있습니다. 공격자는 수많은 계정을 빠르게 생성하고, 약간씩 변형된 패키지를 게시하며, 단순한 차단 목록(deny list) 방식을 무력화할 만큼의 변주를 손쉽게 만들어낼 수 있습니다.

 

Flooding Dropper 영향을 받았다면: 대응 방법

조직은 먼저 sonatype-2026-005660에 등록된 패키지가 개발자 워크스테이션, CI/CD 러너와 빌드 에이전트, 내부 레포지토리나 캐시, 테스트 시스템, 프로덕션 인접 인프라에 다운로드되거나 설치된 적이 있는지 확인해야 합니다.

 

의존성을 제거하는 것만으로는 충분하지 않습니다. 악성 의존성이 발견될 시점에는 이미 그 패키지 자체가 핵심 문제가 아닐 수 있습니다.

영향을 받은 호스트는 침해된 것으로 간주하고 다음 절차를 따라야 합니다.

  1. 영향을 받은 패키지가 설치된 시스템을 격리하고, 문서화된 지속성 메커니즘과 침해 지표(IoC)를 찾습니다.
  2. 프로세스, DNS, 프록시, 엔드포인트 텔레메트리를 검토해 페이로드 회수 여부를 확인합니다.
  3. Node.js, npm, 임시 디렉터리에서 시작된 분리(detached) 프로세스를 조사합니다.
  4. 후속으로 실행된 실행 파일이나 메모리상 페이로드가 있는지 확인합니다.
  5. 지속성 메커니즘을 제거하고, 필요한 경우 영향을 받은 시스템을 재구축합니다.
  6. 대응이 끝난 뒤 npm, GitHub, 클라우드, CI/CD 등 개발 관련 자격 증명을 교체합니다.
  7. 락파일, 의존성 캐시, 컨테이너 레이어, 내부 미러에 남아 있는 사본이 있는지 검토합니다.
  8. 의도한 대체 패키지를 설치하기 전, 패키지명과 철자를 다시 한번 확인합니다.

소나타입 가이드는 영향을 받은 패키지를 CWE-506으로 분류했으며, CVSS 점수는 8.7입니다.

 

패키지명은 단서일 뿐, 보안 통제 수단이 될 수 없다

초기에 확인된 bigops·bnpl 명명 규칙은 이번 캠페인을 연결 짓는 데 도움을 줬습니다. 하지만 이것이 방어자가 확인해야 할 유일한 지표가 되어서는 안 됩니다.

 

공격자는 악성코드의 목적 자체를 바꾸는 것보다 이름을 바꾸는 편이 훨씬 쉽습니다. 정확한 시그니처 매칭을 피하기 위한 소소한 소스코드 변형도 마찬가지입니다. 알려진 이름으로 만든 차단 목록은 어제의 패키지를 막는 데는 도움이 되지만, 내일의 변주를 찾아내는 데 도움이 되는 것은 행위 기반 분석과 유사성 분석입니다.

 

소나타입 리서치랩은 새로운 패키지, 인프라, 페이로드 정보가 확인되는 대로 sonatype-2026-005660을 계속 업데이트하며 이번 캠페인을 추적할 예정입니다.


출처

소나타입 블로그 : 'Flooding Dropper' Campaign Hits npm With Nearly 850 Malicious Packages