Understanding NPM Malicious Package Detection: A Benchmark-Driven Empirical Analysis
이 논문은 NPM 생태계의 악성 패키지 탐지를 위해 6,420 개의 악성 및 7,288 개의 정상 패키지로 구성된 벤치마크를 구축하고 8 가지 도구를 평가하여, 탐지 성능이 코드 행위와 의도 간의 모호성 해결 방식에 의해 결정되며 ML 성능 저하는 개념 드리프트가 아닌 개념 수렴에 기인한다는 다섯 가지 핵심 발견을 제시합니다.
원저자:Wenbo Guo, Zhongwen Chen, Zhengzi Xu, Chengwei Liu, Ming Kang, Shiwen Song, Chengyue Liu, Yijia Xu, Weisong Sun, Yang Liu
자바스크립트 개발자들은 전 세계 350 만 개 이상의 '부품 (패키지)'을 무료로 다운로드해서 자신의 집을 짓습니다. 문제는 이 아파트 단지가 열려 있고, 경비원이 거의 없으며, 누구든 입주민 (개발자) 이 될 수 있다는 점입니다.
악당들은 이 틈을 타서 가짜 부품을 넣거나, 정상적인 부품에 독을 섞어서 입주자들의 집 (시스템) 을 해킹합니다.
🔍 연구의 목적: 경비원들 테스트하기
지금까지 여러 보안 회사들이 "우리의 경비원은 가장 잘 작동한다"고 주장해 왔습니다. 하지만 서로 다른 테스트를 했기 때문에 누가 진짜로 강한지 알 수 없었습니다. 저희 연구팀은 6,420 개의 악성 부품과 7,288 개의 정상 부품을 모아, **8 가지 다른 경비원 (검출 도구)**을 같은 조건에서 시험해 보았습니다.
🕵️♂️ 주요 발견 5 가지 (비유로 설명)
1. 경비원의 딜레마: "무기 소지" vs "범행 의도"
상황: 모든 아파트 주민은 집안 청소 (파일 조작) 나 우편물 배달 (네트워크 통신) 을 할 수 있습니다. 악당도 똑같은 행동을 합니다.
문제: 경비원이 "무기 (API) 를 들고 다니는 사람"만 잡으면, **정당한 청소부까지 잡아감 (오경보)**이 발생합니다. 반대로 "범행 의도"를 증명해야 잡으면, 악당을 놓치는 (미검출) 경우가 생깁니다.
결과:GuardDog이라는 경비원이 가장 잘했습니다. 단순히 "무기"만 보는 게 아니라, **"무기를 들고 누구에게서 무엇을 가져가서 어디로 보내는지 (데이터 흐름)"**를 추적해서 악의적인 의도를 찾아냈기 때문입니다.
2. 악당들의 숨바꼭질: "혼자서" vs "팀워크"
상황: 악당이 혼자 "환경 변수를 훔쳐서" 도망가는 건 찾기 어렵습니다. 하지만 "환경 변수를 훔쳐서 → 암호화해서 → 서버로 보내는" 연쇄 행동을 하면, 그 의도가 명확해집니다.
발견: 악성 코드가 여러 행동을 **연결 (Coupling)**하면, 경비원들이 훨씬 쉽게 잡아냅니다. 특히 SAP_DT라는 도구는 혼자서는 3% 만 잡았지만, 행동이 연결되면 79% 를 잡아냈습니다.
반면: 웹 페이지를 조작하거나 비밀번호를 훔치는 행동은 정상적인 앱과 똑같은 도구를 쓰기 때문에, 경비원들이 구별하기 매우 어렵습니다.
3. 악당들의 변신: "위장술"은 더 이상 통하지 않음
과거: 악당들은 코드를 난독화 (글자 섞기) 하거나, 감시 카메라 (샌드박스) 를 피하는 복잡한 위장술을 썼습니다.
현재: 아파트에 입주 전 검사 (스캔) 가 의무가 아니기 때문에, 악당들은 더 이상 복잡한 위장술을 쓰지 않습니다. 그냥 가장 단순하고 눈에 띄지 않는 방법을 씁니다.
결과: 머신러닝 (AI) 을 쓰는 경비원들은 과거에 학습한 "복잡한 위장 패턴"을 찾아다니다가, 단순해진 악당들을 놓쳐버렸습니다. 악당이 더 똑똑해진 게 아니라, 단순해져서 AI 가 구별할 수 없게 된 것입니다.
4. 경비원들의 팀워크: "서로 다른 눈"이 중요
전략: 경비원 하나만 믿기보다 여러 명을 쓰는 게 좋습니다. 하지만 무작정 많이 모으는 건 아닙니다.
핵심: 서로 서로 다른 것을 보는 팀이 중요합니다.
GuardDog(의도 분석) + SocketAI(문맥 분석): 서로 다른 관점에서 보니까 악당을 놓치지 않고, 오경보도 줄여서 96% 이상의 정확도를 냈습니다.
동일한 도구들: 같은 방식으로 보는 경비원들을 여러 명 모아도 소용없습니다. 서로가 놓친 악당을 채워주지 못하기 때문입니다.
5. 시간의 흐름: 악당의 진화
현상: 2021 년에는 악당들이 복잡한 위장술을 썼지만, 2023 년 이후로는 단순한 명령어 하나로 모든 것을 해결합니다.
비유: 과거에는 "가짜 지문"을 남겼다면, 지금은 "정말 깨끗한 손"으로 문을 엽니다.
결과: 코드의 '모양'을 보는 AI 는 시간이 지날수록 성능이 떨어졌지만, **실제 행동 (파일 실행, 네트워크 연결)**을 감시하는 도구는 시간이 지나도 여전히 강력했습니다.
💡 이 연구가 우리에게 주는 교훈
단순한 도구가 더 강력할 수 있다: 복잡한 AI 보다는, 악의적인 의도를 추적하는 규칙 기반 (GuardDog) 도구가 현재는 더 잘 작동합니다.
혼자서 하기보다 팀으로 하라: 서로 다른 원리로 작동하는 도구들을 조합하면 (예: GuardDog + SocketAI), 악당을 거의 100% 에 가깝게 잡을 수 있습니다.
시스템의 근본적인 문제: 악당들이 **설치 스크립트 (package.json)**라는 '뒷문'을 통해 들어옵니다. 이는 코드를 분석하는 도구로는 잡기 어렵습니다. 아파트 관리소 (NPM 공식) 가 입주 전 검사를 의무화하거나, 자동 실행을 막는 것이 근본적인 해결책입니다.
📝 결론
이 논문은 "악성 코드가 너무 똑똑해져서 잡을 수 없다"는 오해를 깨뜨립니다. 악당들은 오히려 단순해졌고, 우리가 쓰는 검출 도구들이 너무 복잡하거나, 서로 겹쳐서 오히려 악당을 놓치고 있었습니다.
**"악당이 무엇을 하려는지 (의도)"**에 집중하는 도구와, 서로 다른 눈을 가진 도구들을 함께 쓰는 것이 가장 현명한 방법입니다.
이 논문은 NPM 생태계의 악성 패키지 탐지 도구들을 벤치마크 기반의 경험적 분석을 통해 평가한 연구입니다. 기존 탐지 도구들이 호환되지 않는 데이터셋에서 고립적으로 평가되어 비교가 어렵다는 문제를 해결하기 위해, 저자들은 대규모 통합 벤치마크를 구축하고 8 가지 도구 (13 가지 변형) 를 심층적으로 분석했습니다.
주요 내용은 다음과 같습니다.
1. 연구 배경 및 문제 정의
배경: NPM(Node Package Manager) 은 자바스크립트 개발의 핵심이지만, 오픈된 출판 모델과 최소한의 게이트키프링으로 인해 공급망 공격의 주요 표적이 되고 있습니다.
문제점: 기존 탐지 도구들은 정적 분석, 동적 분석, 머신러닝 (ML), LLM 기반 등 다양한 접근 방식을 사용하지만, 서로 다른 데이터셋에서 평가되어 성능 비교가 어렵습니다. 또한, 왜 특정 도구가 실패하거나 성공하는지에 대한 구조적인 메커니즘에 대한 이해가 부족합니다.
연구 질문:
현재 도구들의 탐지 성능과 정밀도 - 재현율 (Precision-Recall) 트레이드오프의 구조적 원인은 무엇인가?
구체적인 악성 행동, 우회 기술, 공격 표면이 탐지 접근 방식과 어떻게 상호작용하는가?
시간에 따른 탐지 성능 저하 (특히 ML 기반 도구) 의 메커니즘은 무엇인가?
도구 조합의 효과를 지배하는 원칙은 무엇이며, 언제 조합이 역효과를 낼까?
2. 방법론 (Methodology)
데이터셋 구축:
악성 패키지: 학술 데이터셋 (BKC, DONAPI 등) 과 보안 권고안 (OSV, Snyk) 에서 수집하여 총 6,420 개의 악성 버전을 구성했습니다.
정상 패키지: 공식 NPM 레지스트리에서 다운로드량이 많은 7,288 개의 최신 버전을 수집하여 엄격한 테스트 환경을 조성했습니다.
전처리: 중복 제거, 플레이스홀더 제거, 3 인의 보안 전문가에 의한 수동 검증을 거쳐 데이터의 정확성을 확보했습니다.
태크소노미 (Taxonomy) 구축:
11 가지 악성 행동 카테고리 (명령 실행, 데이터 유출, 자격 증명 도난 등) 와 8 가지 우회 기술 (문자열 난독화, 환경 감지, 후크 남용 등) 로 분류했습니다.
LLM 을 활용한 코드 컨텍스트 추출과 전문가 검증을 통해 정밀한 라벨링을 수행했습니다.
평가 대상 도구:
정적 분석: GuardDog, OSSGadget, GENIE 등
동적 분석: Packj (정적/동적 모드)
머신러닝: SAP (XGB, RF, DT), MalPacDetector, Cerebro 등
LLM 기반: SocketAI
총 8 개의 도구 (13 가지 변형) 를 평가하고, 각 도구의 소스 코드를 직접 분석하여 탐지 규칙과 구조적 메커니즘을 규명했습니다.
3. 주요 발견 및 결과 (Key Findings)
1) 탐지 성능과 구조적 트레이드오프 (RQ1)
GuardDog이 정밀도 (96.99%) 와 재현율 (89.92%) 의 균형이 가장 잘 잡혀 **F1 점수 93.32%**로 가장 우수한 성능을 보였습니다.
핵심 원인: 악성/정상 패키지는 동일한 OS API 를 호출하므로, "코드가 무엇을 할 수 있는지 (Capability)"와 "코드가 무엇을 의도하는지 (Intent)"를 구분하는 것이 근본적인 난제입니다.
Capability-end 도구 (예: Packj_static): 민감한 API 호출만 감지하여 재현율은 높지만 (98.69%), 오탐 (False Positive) 이 매우 많습니다.
Intent-end 도구 (예: GENIE, SAP_DT): 엄격한 증거를 요구하여 정밀도는 높지만 (99.88%), 단순한 공격은 놓칩니다.
2) 세부 행동 및 우회 기술 분석 (RQ2)
행동 결합 (Behavioral Coupling): 단일 API 호출은 모호하지만, 환경 변수 수집 → 직렬화 → 유출과 같은 행동 체인이 형성되면 탐지 신호가 증폭됩니다. (예: SAP_DT 의 경우 단일 호출 대비 체인 탐지율이 3.2% 에서 79.3% 로 급증).
구조적 탐지 불가: 웹 주입 (Web Injection) 은 브라우저 DOM 을 대상으로 하지만 도구는 서버 사이드 Node.js 코드를 분석하므로 구조적으로 탐지가 어렵습니다.
우회 기술: 대부분의 공격자는 우회 기술을 사용하지 않습니다. 하지만 환경 감지 (39%) 와 반분석 (54%) 기술은 탐지가 가장 어렵습니다.
패러독스: 4 가지 이상의 우회 기술을 사용하면 오히려 탐지율이 높아집니다. 과도한 난독화가 자체적인 이상 징후 (높은 엔트로피 등) 를 만들어내기 때문입니다.
3) 시간적 진화 및 ML 성능 저하 (RQ3)
개념 수렴 (Concept Convergence): ML 기반 도구 (SAP, Cerebro) 의 성능 저하 원인은 '개념 드리프트 (Concept Drift)'가 아니라 **'개념 수렴'**입니다. 공격자가 난독화를 포기하고 정상 코드와 통계적으로 구별되지 않는 최소한의 코드 (Minimal-footprint) 를 사용하게 되면서, ML 특징이 무의미해졌습니다.
API 사용 변화: 과거의 광범위한 정보 수집 방식에서, 단일 스텝 쉘 명령어 실행 (exec('curl ... | sh')) 방식으로 전환되면서 API 레벨의 탐지가 어려워졌습니다.
GuardDog 의 회복: 규칙 기반 도구인 GuardDog 은 패턴 유지보수를 통해 성능을 회복한 반면, ML 도구는 재학습 없이는 적응이 불가능했습니다.
4) 도구 조합의 효과 (RQ4)
최적 조합:GuardDog + SocketAI (Union 전략) 조합이 95.79% F1으로 가장 높은 성능을 보였습니다.
조합 원칙: 조합의 효과는 '패러다임의 다양성'이 아니라 **'상호 보완성 (Complementarity) 에서 오탐 도입을 뺀 값'**에 의해 결정됩니다.
강력한 도구 (GuardDog) 는 오탐을 많이 추가하는 약한 도구와 결합하면 성능이 저하될 수 있습니다.
약한 도구 (SocketAI) 는 강력한 도구의 맹점을 보완받아 성능이 크게 향상됩니다.
4. 주요 기여 (Contributions)
대규모 벤치마크: 6,420 개의 악성 및 7,288 개의 정상 패키지로 구성된 NPM 최대 규모의 통합 데이터셋과 11 가지 행동/8 가지 우회 기술 태크소노미를 공개했습니다.
소스 코드 기반 심층 분석: 도구를 블랙박스처럼 실행하는 것을 넘어, 소스 코드를 분석하여 성능 차이의 구조적 원인을 규명했습니다.
새로운 통찰: '능력 - 의도 모호성 (Capability-Intent Ambiguity)'이 탐지 난이도의 근본 원인임을 밝혔으며, ML 성능 저하의 원인을 '개념 수렴'으로 재정의했습니다.
실용적 가이드라인: 도구 조합의 최적 전략과 생태계 유지 관리자를 위한 정책 제안 (예: 설치 스크립트 실행 제한) 을 제시했습니다.
5. 의의 및 시사점
실무자: CI/CD 파이프라인에는 오탐이 적은 GuardDog + Packj_static 조합을, 보안이 중요한 환경에는 GuardDog + SocketAI 조합을 사용하는 것이 권장됩니다. 또한, 악성 스크립트 실행을 방지하기 위해 npm install --ignore-scripts 사용을 고려해야 합니다.
연구자: 단순한 특징 추출을 넘어, 데이터 흐름 (Taint Analysis) 을 통한 의도 추론이 중요한 방향임을 시사합니다.
생태계: NPM 의 오픈 출판 모델이 가진 구조적 취약점 (설치 스크립트의 자동 실행) 을 해결하기 위해, 출판 전 강제적인 행동 샌드박스 스캔이나 생명주기 스크립트 실행 제한이 필요합니다.
이 연구는 NPM 악성 코드 탐지가 단순한 기술적 문제가 아니라, 코드 능력과 악의적 의도를 구분하는 구조적 난제임을 밝히고, 이를 해결하기 위한 체계적인 접근 방식을 제시했다는 점에서 의의가 큽니다.