매주 수십억 회 다운로드 되는 NPM 패키지 침해되다
- 유명 NPM 계정 침해한 공격자
- 침해 후 수십억 회 씩 다운로드 되던 패키지 오염시켜
- 다행히 5분만에 탐지돼 막혔으나 위험은 끝나지 않아
어쩌면 최악의 공급망 사건이 될 뻔한 일이 벌어졌다. 보안 업체 아이키도시큐리티(Aikido Security)가 발견해 세상에 알린 것으로, 오랜 시간 npm에서 활동해 온 계정 하나가 피싱 공격으로 탈취됐다고 한다. 이 계정은 킥스(qix)라고 하며, 계정 주인은 킥스를 통해 여러 패키지를 발표해 왔다. 이 패키지들 중 일부는 매우 인기가 높아, 주간 다운로드 수가 수십억 회를 상회하기도 했다.
공격자는 킥스 계정을 자기 것으로 만든 뒤, 인기 높은 패키지들에 악성코드를 첨가한 후 배포했다. 평소 신뢰받던 킥스의 패키지, 천문학적 다운로드 수를 기록하고 있던 킥스의 패키지였기 때문에 사용자들은 별 다른 의심 없이 이 악성 패키지들을 다운로드 해 사용한 것으로 추정된다. 문제의 패키지 중에는 초크(chalk), 디버그(debug), 안시스타일즈(ansi-styles) 등이 있다. 이 세 개만 합쳐도 다운로드 수가 20억 회 이상이라고 아이키도 측은 자사 블로그를 통해 설명했다. 이번 공급망 공격의 규모가 여태까지 발생했던 그 어떤 공급망 공격보다 파급력이 클 수 있을 거라고 예상하는 이유다.
다만 사태가 크게 악화되는 것은 미연에 방지할 수 있었다고 아이키도는 전달한다. 탐지가 빨랐기 때문이다. 아이키도의 설명에 따르면 “공격자가 악성코드를 첨가해 배포하기 시작하고서 5분도 되지 않아 해당 악성 행위가 탐지됐고, 이것이 npm 사용자들에게 알려진 건 1시간 내외였다”고 한다. 다만 그 1시간 내에 얼마나 다운로드가 이뤄졌는지는 아직 집계되지 않고 있다. 하지만 수십억 회는 아닐 것으로 보인다.
‘공급망 공격’은 광범위한 의미를 가지고 있다. 처음에는 공식 소프트웨어 업데이트 배포 채널에 공격자가 파고들어 가짜 업데이트를 공식 경로로 내보내는 것을 지칭했었다. 하지만 요즘에는 개발자들이 자주 사용하는 코드 리포지터리(예 : 깃허브, npm, PyPI)에 악성코드를 패키지 형태로 올려두고 다운로드를 유발하는 것을 주로 의미한다. 개발자들이 악성 패키지를 다운로드 해 소프트웨어 개발에 사용한다면, 그 소프트웨어는 저절로 멀웨어가 되며, 그 소프트웨어를 다운로드 받거나 구매해 사용하는 사람들 모두 그 멀웨어에 피해를 입게 된다. 공급망 공격의 이러한 파급력이 공격자들 사이에 알려진 요즘, 코드 리포지터리들에서는 매일처럼 이러한 일이 발생한다.
공격자의 목적은 무엇이었나?
중요한 건 공격자의 의도다. 공격자는 어떤 악성코드를 심어 퍼트리려 했을까? 보통 공급망 공격을 시도하는 자들은 정보 탈취나 암호화폐 채굴, 백도어 등을 확산시키려 한다. 이번에도 비슷했다. “공격자가 심은 악성코드를 분석했을 때 이들의 목적은 암호화폐 거래를 방해하는 것이라는 결론에 도달했습니다. 방해의 목적은 돈을 가로채는 것이었고요. 기존 공급망 공격과 크게 다르지 않습니다.”
좀 더 구체적으로 설명하자면, 공격자들은 각종 암호화폐 지갑 API에 훅을 걸고, 사용자가 서명하기 전에 거래 데이터를 변조하는 식의 공격을 시도했다. 이 때 표적이 된 건 메타마스크(MetaMask)와 팬텀(Phantom) 등 브라우저 상에서 작동하는 지갑 API 들이었다. “거래 데이터 중 수신자 정보를 주로 변경하는 것으로 분석됐습니다. 그러므로 지갑 인터페이스 상에는 사용자가 원래 지정한 수신자가 표시되는데, 실제 API가 처리할 때에는 공격자가 지정한 주소로 돈을 보내는 것이죠.”
‘훅을 건다’는 건 누군가 불법적으로 소프트웨어의 동작 흐름에 끼어든다는 의미다. 우체국을 통해 편지를 보냈는데, 그 체신의 과정 중 누군가 끼어들어 봉투에 적힌 주소나 아예 내용물을 바꾸는 것에 비유할 수 있다. 이번 사건에서는 공격자가 거래소와 사용자 사이에 끼어들어 주소를 바꿨다.
API만 건드린 게 아니었다. 공격자는 좀 더 치밀했다. “브라우저도 오염시켰습니다. 브라우저의 트래픽과 애플리케이션 호출을 가로채 사용자가 어떤 암호화폐를 거래하는지를 알아내고, 거기에 따라 주소를 그럴 듯하게 바꾼 것입니다. 사용자가 이더리움을 거래하든, 비트코인이나 라이트코인이나 트론으로 거래하든, 맞춤형으로 브라우저에 나타나는 주소를 바꾸니 사용자는 더더욱 속을 수밖에 없었습니다.”
npm 관리자 측은 문제를 인지하고 모든 패키지들을 이전 정상 버전으로 롤백했다. 하지만 조치가 취해지기 전에 다운로드 된 것까지 찾아내 롤백하거나 업데이트 할 수는 없다. 그것은 패키지를 다운로드 받은 사람들이 직접 해야 하는 일이다. 이 과정이 생략된다면, 해당 사용자가 만든 애플리케이션들을 통해 암호화폐 도난 사건이 발생할 수 있다. 아직 위험이 다 끝난 건 아니라는 의미다.
npm, 자바스크립트 생태계의 핵
npm은 자바스크립트 애플리케이션들이 공유되는 곳 중 가장 큰 규모를 자랑한다. 자바스크립트는 가장 널리 사용되는 언어 중 하나다. 즉 세상의 수많은 개발자들이 일상적으로 방문하여 별 다른 의심 없이 패키지를 다운로드 받는 곳이 npm이라는 것이다. 그나마 낯선 계정의 생소한 패키지라면 개발자들이 다운로드 하지 않고 넘어갔을 가능성이 높은데, 하필 유명한 계정이 침해되는 바람에 사건이 기하급수적으로 커질 수 있었다.
아이키도는 “앞으로도 이런 사건은 계속해서 일어날 것”이라며 “그 모든 사건들이 이번처럼 5분만에 탐지될 거라고 보장할 수 없다”고 경고한다. “공격자는 킥스의 관리자를 정확하게 노린 것으로 보입니다. npm 생태계의 사정을 잘 알고 있다는 뜻이죠. 킥스 관리자는 npmjs.help라는 도메인으로 구성된 메일 주소로부터 피싱 메일을 받았습니다. npm에서 날아온 메일이라고 여기고 자연스럽게 메일을 열었다고 합니다. npm의 다른 유명 계정의 관리자들도 비슷한 공격에 항상 유의해야 할 것입니다.”
npm에서 패키지를 일상적으로 다운로드 해 사용하는 개발자들 역시 이 사건을 통해 ‘경고’를 들을 수 있어야 한다. npm과 유명 계정 관리자가 언제든 침해될 수 있다는 건, 패키지를 다운로드 받아 사용하는 개발자가, 자신이 사용하려 하는 패키지를 스스로 검사하고 확인할 수 있어야 한다는 의미다. 개발의 과정 중에 패키지 검사 루틴이 반드시 포함돼야 한다.
이는 비단 npm에서 활동하는 자바스크립트 개발자들에게만 해당되는 얘기는 아니다. 비슷한 류의 공격은 파이선 리포지터리인 PyPI 등 다른 언어 기반 생태계에서도 계속해서 일어나고 있기 때문이다. 그래서 최근 ‘오픈소스 보안’이 큰 화두이며, 개발자를 노리는 유형의 ‘공급망 공격’이 극성이기도 하다. 개발자들이 보안의 ‘키’를 쥐고 있다고 해도 과언이 아니다.
Related Materials
- Dozens of Machines Infected: Year-Long NPM Supply Chain Attack — Checkmarx: 무해한 척 위장한 npm 패키지가 1년여간 암호화폐 채굴, SSH키·bash 이력 빼내며 장기간 유포된 사례 상세, 2024년
- CrowdStrike Falcon Prevents NPM Package Supply Chain Attacks — CrowdStrike: maintainer 피싱·권한 탈취로 수백만 다운로드 패키지 악성 DLL 삽입된 대형 공급망 사고 분석, 2024년
- NPM Supply Chain Attack Impacts Packages with 2 Billion Weekly Downloads — CyberInsider: 2025년 9월 발견, 18개 대형 모듈 동시 감염 및 암호지갑 탈취/트랜잭션 변조 공격 구조, 2024년
- The biggest supply chain attacks in 2024 — Kaspersky: 2024년 1월 GitHub·npm 동시 유포, SSH키 탈취·mimikatz 연계, npm/pyPI 동시 악성 전파 건 주요 설명, 2024년