09.18 경제 신문 스크랩
수치화
인사이트
정종길 기자 입력 2025.09.09 19:13 댓글 0
5분 내 공격 탐지했지만 2시간 반 노출…“암호화폐 지갑 탈취 목적”
[아이티데일리] npm 생태계 역사상 최대 규모의 공급망 공격이 발생했다. 피싱 이메일에 속은 한 개발자의 계정이 탈취되면서 전 세계에서 주간 26억 건 이상 다운로드된 핵심 자바스크립트 패키지 18개가 악성코드에 감염됐다. 공격자들은 브라우저에서 암호화폐 거래를 가로채 사용자 자금을 탈취하려는 목적으로 정교한 악성코드를 삽입했다.
보안업체 아이키도시큐리티(Aikido Security)에 따르면, 9월 8일 오후 1시 16분(UTC) npm 저장소에서 대규모 악성 패키지 배포가 감지됐다. 피해 패키지는 ‘chalk(주간 3억 다운로드)’, ‘debug(주간 3억 5,760만 다운로드)’, ‘ansi-styles(주간 3억 7,141만 다운로드)’ 등 자바스크립트 개발의 핵심 구성요소들로, 전체 다운로드 수를 합치면 주간 총 26억 건을 넘어 역대 최대 파급력을 자랑한다.
공격은 npm 계정 ‘qix’를 관리하는 개발자 조시 주논(Josh Junon)이 정교한 피싱 이메일에 속으면서 시작됐다. 공격자들은 ‘support@npmjs.help’라는 가짜 이메일 주소를 사용해 2단계 인증 업데이트가 필요하다며 속였다. 이 도메인은 공격 3일 전에 등록된 것으로, 정당한 npm 지원 주소로 위장하기 위해 사전에 준비됐다.
조시 주논은 탈중앙화 소셜미디어 플랫폼인 블루스카이를 통해 “2단계 인증 재설정 이메일이 매우 합법적으로 보였다”며 “스트레스가 많은 한 주였고 모바일에서 평소처럼 주의를 기울이지 않았다”고 공격 경위를 설명했다. 그는 또 “공식 홈페이지에 직접 접속하지 않고 링크를 클릭한 것이 실수였다”고 토로했다.
이번에 npm 패키지를 통해 배포된 악성코드의 공격 목표는 암호화폐 거래 탈취였다. 삽입된 코드는 브라우저에서만 실행되는 특성을 갖고 있어 운영체제나 파일시스템을 직접 감염시키지는 않지만, 웹 애플리케이션 사용자들의 암호화폐 자산을 노렸다. 악성코드는 메타마스크(MetaMask), 팬텀(Phantom) 등 주요 암호화폐 지갑 API에 연결해 거래 데이터를 변조하고, 사용자 인터페이스에는 정상적인 수신자 주소를 표시하지만 실제로는 공격자가 제어하는 주소로 자금을 전송하도록 했다
특히 해당 악성코드는 이더리움, 비트코인, 솔라나, 트론, 라이트코인, 비트코인 캐시 등 다중 블록체인을 지원하며, 네트워크 트래픽과 애플리케이션 호출을 가로채 주소 형식을 인식한 후 유사하게 보이는 공격자 주소로 바꾸는 정교한 기능을 구현했다. 이러한 동작은 브라우저와 API 레벨 양쪽에서 작동하기 때문에 사기성 전송도 합법적으로 보이게 만들었던 것으로 분석된다.
아이키도의 찰리 에릭센(Charlie Eriksen) 연구원은 “악성 업데이트가 배포된 지 5분 만에 공격을 탐지하고 1시간 내에 대중에게 공개했다”고 밝혔다. 하지만 현지 외신 보도에 따르면 악성 패키지들은 미국 동부시간 기준 오전 9시부터 11시 30분까지 약 2시간 반 동안 npm에 노출됐던 것으로 알려졌다.
다만 이번 공격의 피해는 아직까지 미미한 수준인 것으로 파악된다. 공격자들이 사용한 이더리움 주소(0xFc4a4858bafef54D1b1d7697bfb5c52F4c166976)를 추적한 결과, 실제 암호화폐 탈취 피해액은 50달러(약 7만 원)에 불과한 것으로 나타났다. 이는 악성 패키지의 노출 시간이 짧았던 데다 글로벌 커뮤니티가 빠른 대응을 한 덕분인 것으로 분석된다.
npm측은 사건 발생 당일 오후 5시 17분(UTC) 침해 사실을 인정하고 악성 패키지 제거 작업에 착수했다고 발표했다. 오후 7시 59분에는 영향받은 모든 패키지 버전이 제거됐다고 보고했다. 현재 조시 주논의 npm 계정은 접근이 차단된 상태며, 일부 패키지는 여전히 복구 작업이 진행 중이다.
이번 사건은 올해 7월 발생한 ‘eslint-config-prettier’ 패키지 해킹 사건과 8월의 ‘Nx’ 패키지 침해에 이어 계속해서 발생하고 있는 대규모 npm 공급망 공격 중 하나로 기록될 전망이다. 특히 7월 사건에서도 피싱 이메일을 통한 계정 탈취가 공격 수법으로 사용됐다는 점을 기억해야 한다. 보안 전문가들은 npm 생태계의 구조적 취약성을 지적하는 한편, 특히 패키지 관리자들이 보안 인식을 강화할 필요성이 있다고 지적하고 있다.
핵심 용어 정리
npm : Node Package Manager의 약자로, Node.js 환경에서 자바스크립트 패키지(모듈)를 설치하고 관리하는 도구
역사상 최대 규모의 npm 공급망 공격이 발생했습니다. 피싱 이메일에 속은 개발자의 계정이 탈취되면서 주간 26억 건 이상 다운로드되는 핵심 JavaScript 패키지 18개가 악성코드에 감염되었습니다.
공격자들은 개발자 Josh Junon의 'qix' 계정을 표적으로 삼았습니다.
전 세계에서 주간 26억 건 이상 다운로드된 핵심 자바스크립트 패키지 18개가 악성코드에 감염됐다.
공격자들은 ‘support@npmjs.help’라는 가짜 이메일 주소를 사용해 2단계 인증 업데이트가 필요하다며 속였다. 이 도메인은 공격 3일 전에 등록된 것으로, 정당한 npm 지원 주소로 위장하기 위해 사전에 준비됐다.
이번에 npm 패키지를 통해 배포된 악성코드의 공격 목표는 암호화폐 거래 탈취였다. 삽입된 코드는 브라우저에서만 실행되는 특성을 갖고 있어 운영체제나 파일시스템을 직접 감염시키지는 않지만, 웹 애플리케이션 사용자들의 암호화폐 자산을 노렸다.
“악성 업데이트가 배포된 지 5분 만에 공격을 탐지하고 1시간 내에 대중에게 공개했다”고 밝혔다. 하지만 현지 외신 보도에 따르면 악성 패키지들은 미국 동부시간 기준 오전 9시부터 11시 30분까지 약 2시간 반 동안 npm에 노출됐던 것으로 알려졌다.
특히 7월 사건에서도 피싱 이메일을 통한 계정 탈취가 공격 수법으로 사용됐다는 점을 기억해야 한다. 보안 전문가들은 npm 생태계의 구조적 취약성을 지적하는 한편, 특히 패키지 관리자들이 보안 인식을 강화할 필요성이 있다고 지적하고 있다.
[데이터넷] 크라우드스트라이크 NPM 패키지를 악용한 공급망 공격이 발생했다.
소프트웨어 공급망 보안 기업 소켓(Socket)에 따르면 NPM에 게시된 여러 크라우드스트라이크 NPM 패키지가 손상된 것이 발견됐다. 소켓은 타이니컬러(Tinycolor) 공급망 공격인 ‘샤이 할루드(Shai-Halud)’의 연장선이라고 설명했다.
타이니컬러는 색상을 변환시키는 자바스크립트 라이브러리로, 주간 다운로드 수 220만건에 이르는 인기있는 패키지다. ‘샤이 할루드’ 공급망 공격은 타이니컬러 NPM 패키지를 손상시켜 40개 이상 패키지에 영향을 미친 것으로, 크라우드스트라이크 NPM 역시 이 공격의 일환으로 보인다.
소켓에서 게시한 크라우드스트라이크 공급망 공격 경고
악성 패키지는 합법적인 비밀 스캐너인 트러플호그(TruffleHog)를 다운로드하고 실행한 후 토큰 및 클라우드 자격 증명을 위해 호스트 시스템을 검색한다. 검색된 개발자 및 CI 자격 증명을 검증하고, 저장소 내에서 승인되지 않은 깃허브 액션 워크플로를 생성한다. 그리고 하드코딩된 웹훅 엔드포인트로 민감한 데이터를 유출한다.
감염된 NPM 즉시 제거되었지만, 이미 다운로드 받은 패키지로 인한 공격이 진행될 가능성이 있으므로, 영향받는 버전을 설치한 환경을 감사하며, 무단 게시 혹은 자격증명 도용이 있는지 확인한다. 특히 CI/CD 에이전트, 개발자 노트북 등을 빠짐없이 조사하며, 패키지 게시 자격증명이 있는 컴퓨터는 NPM 토큰과 비밀번호를 변경한다. 비정상적인 이벤트, NPM 퍼블리싱, 패키지 수정 이벤트가 있는지 모니터링하고, 안전한 버전을 유지한다.
“크라우드스트라이크 NPM 패키지 악용 공급망 공격 발생”
npm 패키지를 사용할 때 latest
태그나 범위 지정자(^
, ~
)를 피하고 정확한 버전을 명시해야 합니다. 이번 공격에서 볼 수 있듯이 악성코드가 포함된 새로운 버전이 자동으로 설치되는 것을 방지할 수 있습니다.
// 위험한 방식
"dependencies": {
"chalk": "latest",
"debug": "^4.0.0"
}
// 안전한 방식
"dependencies": {
"chalk": "5.3.0",
"debug": "4.3.4"
}
package-lock.json
파일을 버전 관리 시스템에 포함하여 모든 개발자와 배포 환경에서 동일한 버전의 의존성을 보장합니다.
패키지 업데이트 시 즉시 프로덕션에 반영하지 않고 다음 단계를 거쳐야 합니다.
npm audit
, Snyk
등을 통한 취약점 검사CI/CD 파이프라인에 보안 검증 단계를 포함하여 악성 패키지 설치를 사전에 차단합니다.
# GitHub Actions 예시
- name: Security audit
run: npm audit --audit-level=moderate
- name: License check
run: npx license-checker --summary
Docker Compose와 Dockerfile에서도 정확한 버전을 명시하여 예측 가능한 환경을 구성합니다.
# docker-compose.yml
version: '3.8'
services:
web:
image: node:18.17.1-alpine # latest 대신 정확한 버전
build:
context: .
dockerfile: Dockerfile
database:
image: postgres:15.4-alpine # 정확한 버전 명시
# Dockerfile
FROM node:18.17.1-alpine
# 베이스 이미지도 정확한 버전 지정
RUN apk add --no-cache python3=3.11.5-r0 make=4.4.1-r1
Docker 이미지의 해시값을 확인하여 변조되지 않은 이미지임을 보장합니다.
services:
web:
image: node:18.17.1-alpine@sha256:f77a1aef2da8d83e45ec990f45df906f7a8c4de32a30529c92b9e44d2c8c32c1