빌드 전에 악성코드부터 실행? 개발자 노린 깃허브 공격
정상적인 개발 프로젝트로 보이는 깃허브(GitHub) 저장소에도 악성코드가 숨겨져 있을 수 있다. 안랩은 탈취된 것으로 추정되는 깃허브 계정의 기존 저장소 10개에서 악성코드 유포 정황을 확인했다. 공격자는 개발자가 프로젝트를 열거나 빌드하는 과정에서 악성코드가 실행되도록 설정하고, 이더리움(Ethereum) 거래 정보를 이용해 추가 악성코드를 내려받도록 구성했다. 이번 공격에서 확인된 난독화된 코드와 블록체인 기반 서버 주소 탐색, 다단계 정보 탈취 구조는 북한 연계 공격 그룹이 사용하는 것으로 알려진 PolinRider 유형과 유사한 특징을 보인다. 정상 개발 프로젝트로 위장한 이번 공격의 주요 특징과 감염 과정, 대응 방안을 살펴보자.

정상적인 개발 프로젝트로 위장한 깃허브 저장소
안랩이 확인한 깃허브 계정은 정상 사용자의 마지막 활동이 2025년 4월로 추정된다. 이후 2026년 5월부터 악성코드 유포에 악용된 것으로 보이며, 2026년 11월 3일까지도 저장소 업데이트가 이어졌다.
공격자는 해당 계정이 보유한 기존 프로젝트에 악성코드를 삽입했다. 감염된 저장소 대부분은 React 및 Vite 기반의 개발 과제 형태였으며, 개발자 프로필과 포트폴리오를 소개하는 형태도 확인됐다. 이는 정상적인 프로젝트 구성과 기존 활동 이력을 활용해 개발자의 신뢰를 얻고, 악성코드가 추가됐다는 사실을 알아차리기 어렵게 하려는 의도로 추정된다.

[그림 1] 탈취된 것으로 추정되는 깃허브 계정

[그림 2] 깃허브 계정의 커밋 내역
이 과정에서 여러 파일이 추가되거나 변경됐으며, 이 가운데 ‘.vscode/tasks.json’, ‘package.json’, ‘vite.config.js’가 악성 페이로드 실행에 사용됐다.

[그림 3] 악성코드가 삽입된 저장소
프로젝트 실행 과정에 숨겨진 악성코드
이들 세 개 설정 파일은 서로 다른 실행 경로를 제공하지만, 최종적으로는 동일한 난독화된 자바스크립트(JavaScript) 로더를 실행한다. 따라서 개발자가 프로젝트 폴더를 열거나 개발 서버 또는 빌드 도구를 실행하는 과정에서 악성코드가 동작하도록 구성됐다.
먼저 .vscode/tasks.json은 Visual Studio Code에서 작업 실행 방식을 지정하는 파일이다. 공격자는 작업 이름을 정상적인 코드 검사 작업처럼 보이는 eslint-check로 설정했지만, 실제로는 Node.js를 이용해 fa-brand-400.orc를 실행하도록 했다. 폰트 파일로 위장한 이 파일에는 난독화된 자바스크립트가 포함돼 있었다.
또한 "runOn": "folderOpen" 속성을 추가해 프로젝트 폴더를 열 때 작업이 자동으로 실행되도록 구성했다.
"reveal": "never", "echo": false 등의 옵션은 실행 명령과 출력이 화면에 표시되는 것을 최소화하는 데 사용됐다.

[그림 4] tasks.json 코드
package.json에서는 dev와 build 스크립트에 node init 명령을 추가했다. 이에 따라 정상적인 Vite 개발 서버나 빌드 작업이 실행되기 전에 Node.js를 통해 init 파일이 먼저 실행된다. 공격자는 이 파일의 정상적인 초기화 코드 뒤에 긴 공백을 넣고, 같은 줄의 뒷부분에 난독화된 자바스크립트를 숨겼다. 일반적인 편집기 화면에서는 악성코드가 눈에 잘 띄지 않도록 한 것이다.

[그림 5] package.json 코드
마지막으로 vite.config.js에도 정상적인 설정 선언 뒤에 다량의 공백이 있으며, 그 뒤에 난독화된 자바스크립트가 삽입돼 있다. 해당 코드는 Vita가 설정 파일을 불러와 평가하는 과정에서 실행되도록 구성돼 있다.

[그림 6] vite.config.js 코드
이더리움 거래 정보로 추가 악성코드 다운로드
앞서 실행된 자바스크립트 로더는 블록체인 정보를 이용해 악성코드 다운로드 서버 주소를 확인하는 EtherHiding 기법을 사용한다. 구체적으로 이더리움 거래 정보의 to 필드에 포함된 바이트 값을 IP 주소로 변환한 뒤, 해당 서버에서 cls와 ls라는 두 개의 페이로드를 내려받아 실행한다.
1) cls: 원격 제어 및 지속성 확보
cls는 Node.js 기반의 원격 제어 코드를 추가로 다운로드해 실행한다. 해당 코드는 명령 실행, 클립보드 정보 수집, 파일 및 디렉터리 업로드 기능을 제공한다.
특히 Visual Studio Code, Cursor, Discord, GitHub Desktop, NPM 등 일부 프로그램의 자바스크립트 파일을 변조해 지속성을 확보한다. 이를 통해 사용자가 해당 프로그램을 실행할 때 악성코드가 다시 동작하도록 구성했다.
2) ls: Python 기반 정보 탈취
ls는 추가 페이로드를 내려받아 시스템에 파이썬(Python) 실행 환경을 준비한 뒤, 정보 탈취 기능을 가진 파이썬 코드를 실행한다.
이 코드는 브라우저에 저장된 비밀번호와 쿠키, 카드 정보뿐 아니라 운영체제 자격증명, 환경 변수, 암호화폐 지갑, Git 인증 정보 등을 수집한다. 수집된 정보는 암호화된 ZIP 파일로 압축해 공격자 서버로 전송하며, 서버에서 전달받은 설정에 따라 텔레그램(Telegram)을 통한 전송도 시도한다.

[그림 7] 이더리움 거래 정보
깃허브 프로젝트 실행 전 확인해야 할 보안 수칙
개발자 프로필이나 경력, 외부 프로젝트 링크, 깃허브 활동 통계가 정상적으로 표시돼 있더라도 계정이 탈취됐을 가능성을 배제해서는 안 된다. 특히 기존 저장소에 새로운 실행 설정이나 스크립트가 추가됐는지 확인하는 것이 중요하다.
- 자동 실행 설정과 스크립트 점검
프로젝트를 실행하기 전에 .vscode/tasks.json의 자동 실행 설정과 실제 명령을 확인해야 한다. package.json의 스크립트와 vite.config.js, init 등 개발 도구가 불러오는 파일도 점검 대상이다. 정상 코드 뒤 긴 공백에 숨겨진 코드, 확장자가 없거나 비정상적인 파일, 폰트나 이미지 등 리소스 파일로 위장한 스크립트에 주의해야 한다. - 최근 커밋과 변경 파일 확인
장기간 활동이 없던 계정에서 갑자기 활동이 재개되거나 여러 저장소에 유사한 설정 파일과 리소스가 반복적으로 추가된 경우에는 관련 커밋의 시점과 변경 내용을 살펴봐야 한다. 또한 변경 목적이 프로젝트의 기존 기능이나 개발 이력과 부합하는지도 함께 확인할 필요가 있다. - 검증되지 않은 프로젝트의 자동 실행 제한
출처와 안전성이 확인되지 않은 프로젝트에는 작업 영역 신뢰를 부여하거나 자동 작업 실행을 허용하지 않아야 한다. 소스코드를 확인하기 위해 프로젝트를 열거나 개발 서버 및 빌드 명령을 실행하는 과정에서도 악성코드가 동작할 수 있기 때문이다. 따라서 프로젝트 실행과 의존성 설치에 앞서 설정 파일과 스크립트를 점검하고, 필요한 경우 외부 통신과 중요 정보 접근이 제한된 격리 환경에서 분석해야 한다.
공유 등급: TLP:GREEN
본 콘텐츠는 AhnLab TIP에 게시된 위협 정보를 바탕으로, 독자가 쉽게 이해할 수 있도록 주요 내용을 요약·재구성한 자료입니다. 위협 관련 상세 정보는 AhnLab TIP에서 확인할 수 있습니다.
- AhnLab콘텐츠마케팅팀
