정보보안 ·
eslint-config-prettier NPM 패키지 해킹, 전 세계 개발자 7천 8백만 명 피해
인기 오픈소스 패키지 계정 탈취로 스캐빈저 악성코드 유포...윈도우 시스템 표적
[한국정보기술신문] 주간 다운로드 3천 1백만 건을 기록하는 인기 NPM 패키지 'eslint-config-prettier'가 피싱 공격으로 계정이 탈취되어 악성코드가 유포되는 대규모 공급망 공격이 발생했다. 이번 사건으로 전 세계 개발자들이 사용하는 패키지의 주간 다운로드 수가 총 7천 8백만 건에 달하는 것으로 확인됐다.
SafeDep의 보안 연구팀에 따르면 7월 18일(현지시간) 해커들이 NPM 패키지 관리자 JounQin의 계정을 피싱 공격으로 탈취한 후, eslint-config-prettier를 포함한 여러 패키지에 악성코드를 삽입했다고 발표했다.
피싱 공격으로 시작된 계정 탈취
이번 공격의 시작점은 NPM 웹사이트를 모방한 가짜 로그인 페이지를 이용한 피싱 공격이었다. 공격자들은 타이포스쿼팅 도메인을 사용해 NPM 패키지 관리자를 속였으며, 이를 통해 JounQin의 계정에 무단 접근했다.
JounQin은 7월 19일 자신의 X(전 트위터) 계정을 통해 "이메일 피싱 공격에 속아 공격자들이 내가 관리하는 다양한 NPM 프로젝트에 악성코드를 게시할 수 있는 권한을 얻었다"고 공개했다. 탈취된 계정은 주간 다운로드 1억 8천만 건에 달하는 패키지들에 접근할 수 있는 권한을 보유하고 있었다.
악성 버전 6개와 추가 패키지 피해
공격자들은 eslint-config-prettier의 6개 버전(8.10.1, 9.1.1, 10.1.6, 10.1.7)에 악성코드를 삽입했으며, 추가로 3개의 다른 패키지도 감염시켰다. 피해를 입은 패키지들의 주간 다운로드 수는 다음과 같다.
eslint-plugin-prettier는 주간 2천 1백만 다운로드를 기록하는 패키지로 4.2.2와 4.2.3 버전이 감염됐다. snyckit(0.11.9 버전)은 주간 2천 1백만, @pkgr/core(0.2.8 버전)는 1천 6백만, napi-postinstall(0.3.1 버전)은 9백만 다운로드를 기록하고 있다.
윈도우 전용 스캐빈저 악성코드 분석
보안 전문가들의 분석 결과, 이번 공격에서 유포된 악성코드는 '스캐빈저(Scavenger) 악성코드'로 확인됐다. 이 악성코드는 node-gyp.dll이라는 PE32+ 바이너리 파일 형태로 패키지에 포함되어 있으며, 윈도우 시스템만을 표적으로 한다.
감염된 패키지의 package.json 파일에는 "install": "node install.js"라는 설치 스크립트가 추가되어 있었다. 이 스크립트는 install.js 파일을 실행하며, 해당 파일은 윈도우의 rundll32.exe를 통해 악성 DLL 파일을 로드하는 방식으로 작동한다.
파일 수집과 자격 증명 탈취 기능
스캐빈저 악성코드는 감염된 시스템에서 파일 수집, 자격 증명 탈취, 기타 악성 활동을 수행할 수 있는 기능을 갖추고 있다. 리눅스나 맥OS는 페이로드의 특성상 영향을 받지 않을 것으로 분석됐다.
InvokRE 블로그의 상세 분석에 따르면, node-gyp.dll 파일은 CreateThread API를 사용해 자체 스레드에서 난독화된 코드를 실행하는 구조로 되어 있다. 이는 탐지를 회피하고 지속적인 악성 활동을 가능하게 하는 설계로 평가된다.
GitHub 이슈로 발견된 의심스러운 활동
이번 공격은 GitHub 사용자 'dasa'가 7월 18일 eslint-config-prettier 저장소에 issue #339를 등록하면서 공개됐다. 이 사용자는 NPM 레지스트리에 예상치 못한 버전들이 게시된 것을 발견했다고 보고했다.
특히 10.1.7 버전의 차이점을 보여주는 npmdiff.dev 분석에서 의심스러운 변경사항이 확인됐다. 새로 추가된 install.js 파일과 node-gyp.dll 파일이 패키지에 포함되어 있었으며, 이는 정상적인 업데이트와는 명백히 다른 패턴이었다.
SafeDep 도구들의 자동 탐지 성공
보안 업체 SafeDep의 자동화된 악성 패키지 스캐너는 이번 공격을 성공적으로 탐지했다. 시스템은 PE32+ 실행 파일인 node-gyp.dll의 존재와 package.json의 설치 스크립트, 그리고 install.js의 의심스러운 명령 주입을 자동으로 식별했다.
SafeDep의 PMG(Package Manager Guard) 도구를 사용하는 개발자들은 악성 패키지 설치 시도 시 경고를 받을 수 있었다. 또한 CI/CD 파이프라인에 통합된 vet 도구는 GitHub Actions나 GitLab CI에서 감염된 패키지가 추가될 때 알림을 제공했다.
전문가들의 보안 권고사항
보안 전문가들은 이번 사건이 현대 소프트웨어 개발 생태계의 취약성을 여실히 보여주는 사례라고 평가했다. 단일 NPM 계정 탈취만으로도 전 세계 수백만 개발자에게 악성코드를 유포할 수 있다는 점이 확인됐다.
플로리다 대학교의 사이버범죄 및 사이버보안 전문가 Tom Hyslip은 "이번 NPM 패키지 공격은 단순히 윈도우 전용 DLL에 그치지 않았다. 크로스 플랫폼 자바스크립트 악성코드 로더를 사용했으며, 이는 Node.js 12 이상에서 맥OS, 리눅스, 윈도우를 아우르며 실행되고 실시간 명령 제어 채널을 유지한다"고 분석했다.
개발자 보호를 위한 대응 방안
보안 업체들은 NPM과 같은 패키지 배포 플랫폼이 지속적으로 공격 대상이 되고 있다고 경고했다. 5월에는 Socket이 60개의 악성 NPM 패키지를 발견했으며, 6월에는 백도어를 설치하는 2개의 추가 패키지가 발견된 바 있다.
피싱 방지 업체 Cofense의 Max Gannon은 "패키지 관리자들은 광범위한 영향력을 가진 고권한 계정 보유자들의 매력적인 타겟이다. 한 회사를 공격해 불확실한 결과를 얻는 대신, 공격자들은 한 명의 개발자를 공격해 수백, 심지어 수천 개의 다른 회사에 악성코드를 유포할 수 있다"고 설명했다.
이번 사건을 계기로 오픈소스 생태계의 보안 강화가 시급하다는 목소리가 높아지고 있다. 개발자들은 새 버전을 자동으로 설치하기 전에 반드시 검증 과정을 거쳐야 하며, 특히 NPM이 가장 표적이 되는 패키지 배포 플랫폼 중 하나라는 점을 인식해야 한다고 전문가들은 조언했다.
SafeDep은 "개발자 환경, CI/CD, AI IDE, AI 코딩 에이전트, 컨테이너 런타임 등 다양한 단계에서 적절한 보안 가드레일을 채택할 것"을 모든 소프트웨어 개발팀에 권고했다. 특정 도구에 관계없이 소프트웨어 개발 생명주기의 다양한 단계에서 악성 오픈소스 패키지로부터 보호하는 것이 필수적이라고 강조했다.
한국정보기술신문 정보보안분과 이승기 기자 news@kitpa.org