MITRE ATT&CK: T1195.001 (Compromise Software Dependencies and Development Tools) | 전술: Initial Access | 플랫폼: PRE, Linux, macOS, Windows
도입: 왜 이 공격이 중요한가
개발자가 npm install을 실행하는 순간, 북한 해커들이 시스템에 침투할 수 있습니다. 2024년 Lazarus 그룹이 가짜 NPM 패키지로 암호화폐 개발자들을 노린 사건이 바로 그 예시죠.
공격자들은 더 이상 복잡한 제로데이 취약점을 찾지 않아도 됩니다. 개발자들이 매일 사용하는 패키지 매니저와 개발 도구 자체를 악용하거든요. 정상적인 개발 과정에서 자연스럽게 악성코드가 설치되니까 탐지도 어렵고요.
💡 쉬운 비유: 마트에서 파는 우유에 독을 넣는 것과 같습니다. 소비자는 정상적인 구매 행위를 했을 뿐인데 피해를 당하게 되죠.
1. 공격자 관점
왜 이 기법을 사용하는가
- 대규모 감염 가능: 하나의 인기 패키지를 침해하면 수천 개의 프로젝트가 동시에 감염됨
- 신뢰성 악용: 개발자들은 패키지 매니저를 통한 설치를 당연하게 여기므로 의심하지 않음
- 지속적 접근: CI/CD 파이프라인에 포함되면 새로운 빌드마다 자동으로 악성코드가 실행됨
동작 흐름
공격자는 개발자의 일상적인 작업 흐름을 악용합니다.
| 단계 | 공격자 행동 | 피해자(개발자) 행동 |
|---|---|---|
| 1. 준비 | 인기 패키지와 유사한 이름의 가짜 패키지 생성 (typosquatting) | 평상시 개발 작업 |
| 2. 배포 | NPM, PyPI 등 공개 저장소에 악성 패키지 업로드 | 프로젝트 의존성 설치 시도 |
| 3. 감염 | 개발자가 오타로 가짜 패키지 설치 시 악성코드 실행 | npm install 또는 pip install 실행 |
| 4. 확산 | CI/CD 파이프라인을 통해 프로덕션 환경까지 전파 | 코드 빌드 및 배포 |
2. 실제 공격 사례
📌 Lazarus (APT38) - Contagious Interview Campaign (2024)
배경: 북한 Lazarus 그룹이 암호화폐 업계 개발자들을 표적으로 삼아 가짜 채용 면접을 빌미로 공격을 시도했습니다. 이들의 목표는 암호화폐 관련 기업의 내부 정보와 자산 탈취였죠.
공격 과정:
- 가짜 채용공고: LinkedIn 등에서 매력적인 개발자 채용 공고를 올려 표적을 유인
- NPM 패키지 유포: BeaverTail 악성코드가 포함된 NPM 패키지를 면접 과제로 제공
- 시스템 침해: 개발자가 패키지를 설치하면 정보 수집 도구(InvisibleFerret)가 자동 실행되어 민감한 데이터 탈취
피해 규모: 암호화폐 시장 메이킹 회사, 온라인 카지노, 소프트웨어 개발 회사 등 최소 3개 조직이 2024년 10-11월 사이 피해를 당했습니다.
출처: eSentire - Bored BeaverTail & InvisibleFerret Yacht Club
📌 XCSSET - Xcode 프로젝트 감염 (2020)
배경: macOS를 표적으로 한 XCSSET 악성코드는 개발자들의 Xcode 프로젝트를 직접 감염시키는 방식을 사용했습니다. iOS 앱 개발자들의 개발 환경 자체를 공격 벡터로 활용한 사례죠.
공격 과정:
- CocoaPods 탐색: 시스템의
/Library/Ruby/Gems폴더에서 CocoaPods 관련 파일들을 열거 - Xcode 프로젝트 감염:
.xcodeproj폴더를 찾아 악성 스크립트와 Mach-O 파일을 주입 - 백도어 설치: Safari 브라우저에 UXSS(Universal Cross-Site Scripting) 백도어를 심어 웹 트래픽 조작
피해 규모: macOS 개발자 커뮤니티 전반에 영향을 미쳤으며, 감염된 앱이 App Store에 배포될 위험까지 있었습니다.
3. 왜 탐지가 어려운가?
공식 탐지 방법
MITRE에서 제시하는 탐지 방법은 다음과 같습니다:
DET0009 공급망 변조 탐지: 패키지 매니저(npm/yarn/pip 등)가 콘텐츠를 다운로드하거나 복원할 때, 프로젝트 경로와 실행 경로(node_modules, packages 등)에 파일이 작성되는 것을 모니터링합니다. 새로 작성된 컴포넌트가 처음 실행될 때 스크립트(preinstall/postinstall), 셸/PowerShell 실행, 또는 로더 DLL이 트리거되고, 이후 승인되지 않은 레지스트리/CDN으로의 네트워크 송신이 발생하는 패턴을 탐지합니다.
공격자가 이 기법을 선호하는 이유
정상 행위로 위장: 패키지 설치는 개발자의 일상적인 작업이라 보안팀이 의심하지 않습니다. npm install 명령어 자체는 완전히 정상적이거든요.
광범위한 영향: 하나의 패키지가 수많은 프로젝트에서 사용되므로, 한 번의 침해로 엄청난 파급효과를 낼 수 있어요.
자동화된 확산: CI/CD 파이프라인에 포함되면 사람의 개입 없이도 자동으로 악성코드가 실행됩니다.
탐지의 현실적 한계
패키지 설치는 너무 빈번함: 개발팀에서는 하루에도 수십 번의 패키지 설치가 일어나는데, 이를 모두 모니터링하기엔 너무 많은 이벤트가 발생해요.
False Positive 문제: 정상적인 postinstall 스크립트와 악성 스크립트를 구분하기가 쉽지 않습니다. 많은 정상 패키지도 설치 후 추가 작업을 수행하거든요.
네트워크 활동의 모호성: 패키지들이 CDN이나 외부 저장소에서 추가 리소스를 다운로드하는 것은 일반적인 행위라 악성 통신과 구분이 어렵습니다.
4. 나도 위험할까? 자가 진단
이 공격이 나와 관련 있는지 확인해보세요.
이런 환경이라면 주의가 필요합니다
- 개발팀에서 NPM, PyPI, NuGet 등 공개 패키지 저장소를 자주 사용하는 경우
- CI/CD 파이프라인이 외부 저장소에서 직접 의존성을 다운로드하도록 설정된 경우
- 패키지 설치 시 의존성 버전을 고정하지 않고 최신 버전을 자동으로 받아오는 경우
- GitHub Actions 등 써드파티 CI/CD 컴포넌트를 검증 없이 사용하는 경우
공식 대응 방안
M1013 애플리케이션 개발자 가이드: 애플리케이션 개발자들은 써드파티 라이브러리를 선택할 때 신중해야 합니다. 가능한 경우 소프트웨어 의존성을 빌드 시 최신 버전을 가져오는 것보다 특정 버전으로 고정해야 합니다. GitHub Actions는 태그나 브랜치보다는 특정 커밋 해시로 고정하는 것이 좋습니다.
M1033 소프트웨어 설치 제한: 가능한 경우 개발자들이 외부 저장소보다는 검증되고 승인된 패키지가 포함된 내부 저장소에서 가져오도록 요구하는 것을 고려해보세요.
M1051 소프트웨어 업데이트: 사용하지 않는 의존성, 유지보수되지 않거나 이전에 취약했던 의존성, 불필요한 기능, 컴포넌트, 파일, 문서를 확인하는 패치 관리 프로세스를 구현해야 합니다.
M1016 취약점 스캐닝: 취약점 소스에 대한 지속적인 모니터링과 자동/수동 코드 리뷰 도구의 사용도 구현되어야 합니다.
당장 할 수 있는 것
- 패키지 설치 전 패키지명 철자를 꼼꼼히 확인하고, 다운로드 수와 최근 업데이트 날짜를 체크하기
- 개인 프로젝트에서도 package-lock.json이나 requirements.txt로 의존성 버전을 고정하는 습관 기르기
- 🏢 보안 담당자: 내부 패키지 저장소(Nexus, Artifactory 등) 구축하여 검증된 패키지만 사용하도록 정책 수립
5. 관련 기술
| 기법 | 설명 | 링크 |
|---|---|---|
| T1195 Supply Chain Compromise | 전체적인 공급망 침해 공격의 3가지 세부 기법을 다루며, 개발 도구 외에도 소프트웨어 공급망과 하드웨어 공급망 침해 방법을 설명합니다 | 상세 분석 보기 |
| T1059.007 JavaScript | 침해된 NPM 패키지에서 자주 사용되는 JavaScript 기반 악성코드 실행 기법으로, Node.js 환경에서 시스템 명령을 실행하는 데 활용됩니다 | 상세 분석 보기 |
| T1562.001 Disable or Modify Tools | 패키지 설치 과정에서 보안 도구를 무력화하여 탐지를 우회하는 기법으로, 공급망 공격과 함께 자주 사용됩니다 | 상세 분석 보기 |
참고 자료
- [MITRE ATT&CK - T1195.001](https://attack.mitre.org/techniques/T1195/001/)
관련 글 더 보기
- 공급망 침해 공격: 왜 가장 효과적인 침투 방법인가 (3가지 기법) | T1195
- 매직 바이트 조작: .exe를 .jpg로 위장하는 파일 헤더 공격 | T1036.008
- 이중 확장자 공격: report.pdf.exe가 문서로 보이는 이유 | T1036.007
- 파일명 공백 위장: 확장자를 숨겨 탐지를 우회하는 원리 | T1036.006
- 정상 프로세스 위장: svchost.exe 이름을 도용하는 공격 원리 | T1036.005
- 가짜 작업·서비스: 공격자가 윈도우 시스템에 숨는 방법 | T1036.004
- 소프트웨어 공급망 침해: 한 번 감염으로 수백만 피해자를 만드는 원리 | T1195.002
- 프로세스 트리 조작: 공격자가 부모 프로세스 추적을 차단하는 원리 | T1036.009
- 브라우저 핑거프린트 위조: 공격자가 네트워크 탐지를 우회하는 원리 | T1036.012
- Kerberos 티켓 탈취·위조: 도메인 인증을 우회하는 5가지 기법 | T1558
안내 및 법적 고지
AI 활용 안내 이 글은 AI(Claude)의 도움을 받아 작성되었으며, MITRE ATT&CK (최신 버전) 기준 정보를 포함합니다. 기술적 내용은 MITRE ATT&CK 공식 데이터를 기반으로 하며, 보안 교육 목적으로 제공됩니다.
면책 조항 본 글은 보안 인식 제고를 위한 교육 목적으로 작성되었습니다. 언급된 공격 기법을 실제로 시도하는 행위는 「정보통신망법」, 「형법」 등에 따라 처벌받을 수 있으며, 본 블로그는 이에 대한 법적 책임을 지지 않습니다.
COMMENTS (0)
댓글은 익명으로 작성되며, 삭제 비밀번호를 설정하면 본인만 삭제할 수 있습니다. 비밀번호를 설정하지 않은 댓글은 누구나 삭제할 수 있습니다.