npm 패키지 mathmain, lusolve() 행렬 데이터를 키로 쓰는 암호화 로더로 원격 접근 임플란트 은닉
- mathjs를 베낀 npm 패키지 mathmain@1.0.0에서 lusolve()가 하삼각 행렬 데이터를 scrypt로 256비트 키로 바꾸고 암호화된 페이로드를 AES-256-GCM으로 복호화해 실행하는 원격 접근 임플란트가 발견됨.
- 페이로드는 공개 채팅 서비스와 블록체인 네트워크를 명령 채널로 쓰고 호스트에서 공격자 명령을 실행함.
- 암호가 곧 트리거라 로더에는 암호가 저장돼 있지 않고, 호출자가 lusolve() 객체 형태로 정확한 행렬 데이터를 넘겨야 복호화가 됨. 다른 입력은 인증 검사에서 실패해 파일을 쓰지도 않음.
- lib/cjs/utils/ 아래 base64 데이터로 대체된 파일 3개의 크기는 graph.js 20,918바이트, fraction.js 9,084바이트, bignumber/type.js 1,179,416바이트임. 나머지 두 파일은 로더가 직접 참조하지 않고 복호화된 graph.js가 다음 단계로 불러옴.
- npm 레지스트리 검색에서 mathsbase와 math-universe에도 같은 로더와 트리거 코드가 5개 버전에 걸쳐 그대로 들어 있음. 설치 훅은 없어서 패키지를 import하는 것만으로는 로더가 작동하지 않음.
Hacker News opinions
3x3 행렬이 왜 트리거인지 진짜 궁금함. 특정 수치 해석 하는 사람만 골라서 노린 건가?
합법 패키지에 하위 의존성으로 끼워 넣으려는 거 아님? PR로 슬쩍 넣으면 정상 패키지 코드는 전혀 의심 안 가니까.
아니면 먼저 퍼뜨려 놓고 나중에 활성화하려는 거겠지. 그때는 의존성 체인 전체가 털림.
저건 조건이 아니라 키임. JSON.stringify 결과가 scrypt 패스워드가 되고 AES-256-GCM 키가 만들어져. if 문이 없어서 정확한 입력을 모르면 복호화 자체가 안 됨. 그래서 아무도 페이로드를 못 꺼내는 거고.
산업 장비 상태 코드일 가능성도 있음. 외부에서 특정 오류 코드를 유발할 수 있으면 그 환경만 골라서 활성화하는 식으로 쓸 수 있으니까.
FBI 같은 데서 이런 백도어를 따라가긴 하나? 범죄로 보는 건가, 아니면 백도어를 실제로 쓰는 순간만 범죄인가? npm에는 아직 아무 경고 없이 남아 있고 GitHub 저장소랑 작성자 계정은 내려갔더라.
npm 보안팀이 악성 코드가 들어 있던 패키지를 레지스트리에서 제거했다는 안내가 붙어 있음.
제목에 패키지 이름이 안 나와서 답답했는데 이메일 보호 기능 때문에 mathmain@1.0.0이 mathmain@1.0.0으로 가려진 거였음. Safedep이 Cloudflare 설정 좀 봐야 할 듯.
Cloudflare 이메일 보호가 HTML에서 가렸다가 JS로 복원하는 방식이라 그럴 거임. 내 환경에선 제대로 보이긴 함.
누군가 이미 크랙했는데 2단계가 완전히 망가져 있었다는 분석 글도 있더라.
난 의존성 아예 안 쓰는 쪽이라 이런 뉴스 볼 때마다 내 전략이 맞았다는 생각만 듦. LLM 생성 코드도 안 씀.
OS도 의존성인데 선은 어디서 긋냐. BIOS나 UEFI 위에서 직접 돌리나?
이 글 AI가 쓴 것 같음. 사람은 안 신경 쓸 부분을 강조하고, 뭔지보다 아닌 게 뭔지를 강조하더라.
CommonJS는 이제 죽는 게 맞음. ESM 동적 import는 grep으로 훑을 수 있는데 require()는 그런 도구가 없음.
동적 import도 숨기기 쉬움. i = x => import(x) 로 감싸면 끝이고 require()랑 비슷한 노력이 듦.
JFrog가 먼저 암호를 깼다는 사실이 한참 읽어야 나옴. 그게 있어서 나머지 분석이 가능했던 건데.