TECH 으로 돌아가기
TECH HACKER NEWS 오늘 7분 읽기 22 READS

수학 라이브러리가 왜 암호화된 로더를 품고 있을까? mathmain 패키지로 보는 공급망 공격의 요즘 수법

수학 라이브러리가 왜 암호화된 로더를 품고 있을까? mathmain 패키지로 보는 공급망 공격의 요즘 수법
SOURCE IMAGE · HACKER NEWS
수학 라이브러리가 왜 암호화된 로더를 품고 있을까? mathmain 패키지로 보는 공급망 공격의 요즘 수법

이름은 수학 라이브러리인데, 하는 짓은 금고 열기

npm이나 PyPI 같은 패키지 저장소에서 mathmain 같은 이름을 보면 어떤 생각이 드세요? 아마 '아, 수학 계산 도와주는 유틸리티겠네' 하고 별 의심 없이 넘어가실 거예요. 그런데 공급망 보안 회사 SafeDep이 이 패키지를 뜯어봤더니, 정작 수학 계산과는 아무 상관 없는 '암호화된 로더'가 들어 있었거든요. 그래서 글 제목이 아주 직설적이에요. 수학 라이브러리가 대체 왜 암호화된 로더를 필요로 하느냐는 거죠. 답은 간단해요. 필요 없어요. 정상적인 패키지라면 절대 그럴 이유가 없고, 그 존재 자체가 악성이라는 가장 강력한 증거인 거예요.

'암호화된 로더'가 뭐냐면

이게 뭐냐면, 진짜 악성 코드를 패키지 안에 그대로 넣지 않고 암호화해서 '의미 없는 문자열 덩어리'로 만들어 둔 다음, 설치되거나 import되는 순간에 복호화해서 메모리에서 바로 실행하는 구조예요. 택배 상자 안에 잠긴 금고가 들어 있는 셈이죠. 상자를 검사하는 사람은 금고만 보이고 안에 뭐가 들었는지 모르는데, 받는 사람 컴퓨터에서만 열쇠가 돌아가면서 내용물이 나오는 거예요.

왜 이렇게까지 하냐면, 저장소의 자동 검사 도구 대부분이 '정적 분석'을 하기 때문이에요. 정적 분석은 코드를 실행하지 않고 소스만 읽어서 child_process 호출이라든가 특정 악성 도메인 같은 위험한 패턴을 찾는 방식인데요. 코드가 암호화돼 있으면 읽을 패턴 자체가 없으니까 그냥 통과해 버리는 거죠. 게다가 이런 로더는 보통 한 단계로 끝나지 않아요. 복호화된 코드가 또 외부 서버에서 다음 단계 페이로드를 받아오는 식으로 여러 겹을 두는데, 이러면 분석가가 첫 번째 껍질을 벗겨도 진짜 목적은 여전히 숨겨져 있는 거예요.

그럼 어떻게 잡아내나

SafeDep 글의 핵심 메시지는 '코드가 뭘 하는지 못 읽어도, 뭘 하려고 하는지는 알 수 있다'는 거예요. 정상 패키지에는 거의 안 나타나는 행동 신호가 있거든요. 예를 들면 이런 것들이에요.

이런 신호들을 모아서 '이 패키지가 주장하는 목적과 실제 행동이 일치하는가'를 따지는 거예요. mathmain이라는 이름과 암호화 로더는 딱 봐도 안 맞잖아요. SafeDep이 오픈소스로 공개한 vet 같은 도구가 바로 이런 관점으로 의존성을 검사하는 도구고요.

요즘 공급망 공격이 얼마나 흔하냐면

이 사건이 특별히 새로운 건 아니에요. 오히려 '이제 이게 기본 수법이 됐다'는 게 무서운 점이죠. 2024년에는 xz-utils에 몇 년에 걸쳐 신뢰를 쌓은 메인테이너가 백도어를 심은 사건이 있었고, 2025년에는 npm에서 chalk, debug 같은 주간 다운로드 수십억 회짜리 패키지가 메인테이너 계정 피싱으로 탈취돼 암호화폐 지갑 탈취 코드가 들어갔어요. 이어서 Shai-Hulud라는 웜은 감염된 패키지가 메인테이너의 다른 패키지까지 자동으로 감염시키는 방식으로 퍼졌고요. 공통점은 '코드를 읽어서 잡기 어렵게 만든다'는 거예요. 그래서 Socket, Snyk, SafeDep 같은 회사들이 정적 시그니처 대신 행동 분석과 샌드박스 실행 쪽으로 옮겨가고 있어요.

우리 팀은 뭘 해야 할까

당장 할 수 있는 것부터 볼게요. 첫째, CI에서 npm ci --ignore-scripts를 기본으로 쓰고, 정말 postinstall이 필요한 패키지만 예외로 허용하세요. 이것만으로 설치 시점 공격의 상당수가 막혀요. 둘째, 락파일을 커밋하고 버전 범위를 느슨하게 두지 마세요. 셋째, 새 패키지를 추가할 때 다운로드 수나 별 개수보다 '이 패키지가 왜 이 권한이 필요하지?'를 한 번 물어보세요. 넷째, 회사 규모가 되면 Verdaccio나 Nexus 같은 사내 프록시 레지스트리를 두고 새 버전을 며칠 격리했다가 쓰는 정책이 효과적이에요. 마지막으로 요즘 특히 조심할 게, AI 코딩 도구가 존재하지 않는 패키지 이름을 지어내는 경우가 있거든요. 공격자들이 그 이름을 미리 등록해 두는 걸 슬롭스쿼팅이라고 하는데, AI가 추천한 패키지는 꼭 저장소에서 직접 확인하고 설치하세요.

정리하면

패키지가 '무엇을 하겠다'고 말하는 것과 '실제로 하는 행동'이 어긋나면 그게 곧 경고 신호예요. 수학 라이브러리에 암호화 로더가 있을 이유는 없거든요.

여러분 팀은 의존성 추가할 때 어떤 기준으로 검토하시나요? --ignore-scripts를 기본으로 쓰고 계신 분 있으면 실제로 뭐가 깨졌는지도 공유해 주세요.


🔗 출처: Hacker News

SOURCE · HACKER NEWS
원문 전체 보기 → https://safedep.io/mathmain-encrypted-loader/
SHARE
NEXT · CHOOSE

변화를 읽었다면,
내가 만들 수익 구조를 고릅니다.

정보를 더 모으는 데서 멈추지 않고, 광고·외주·판매·중개·구독 중 내 상황에 맞는 출발점을 정해보세요.

21가지 수익 구조 살펴보기
처리 중...