공급망 공격: 악성 패키지와 침해된 지갑 라이브러리
암호화폐 공급망 공격은 여러분이 신뢰하는 소프트웨어 안에 악성 코드를 숨깁니다. 침해된 패키지와 지갑 라이브러리가 어떻게 작동하는지, 그리고 스스로를 보호하는 방법을 알아보세요.
암호화폐 공급망 공격은 범죄자가 지갑, 앱, 웹사이트가 의존하는 소프트웨어(오픈소스 패키지, 브라우저 확장 프로그램, 업데이트 서버 등)를 침해해 악성 코드가 신뢰받는 경로를 통해 사용자에게 전달되도록 하는 공격입니다. 이 코드는 보통 수신 주소를 바꿔치기하거나, 웹사이트에 지갑 드레이너를 심거나, 시드 문구를 훔칩니다. 피해자는 이미 신뢰하던 제품을 사용한 것 외에는 아무 잘못도 하지 않은 경우가 많습니다.
이런 공격은 개발자뿐 아니라 암호화폐를 다루는 모든 사람에게 중요합니다. 현대의 지갑과 탈중앙화 앱은 수백 개의 서드파티 구성 요소로 만들어지며, 단 하나의 구성 요소만 침해되어도 여러 제품이 동시에 영향을 받을 수 있습니다. 이 가이드에서는 공격의 작동 방식, 주의해야 할 점, 그리고 사용자나 개발자로서 위험을 줄이는 방법을 설명합니다.
공급망 공격의 작동 방식
암호화폐 앱의 “공급망”이란 앱을 구성하는 모든 것, 즉 코드 라이브러리, 빌드 도구, 호스팅 업체, 콘텐츠 전송 네트워크, 업데이트 서버를 말합니다. 공격은 보통 다음 단계를 따릅니다.
- 1접근 권한 확보. 공격자는 인기 라이브러리의 메인테이너에게 피싱을 하거나, 방치된 패키지를 사들이거나, 약한 비밀번호를 추측하거나, 빌드 서버의 취약점을 악용합니다.
- 2악성 코드 삽입. 숨겨진 코드가 담긴 새 버전을 배포합니다. 이 코드는 흔히 난독화되어 있으며, 암호화폐 지갑이 있을 때처럼 특정 조건에서만 작동하도록 설계됩니다.
- 3업데이트를 통한 확산. 라이브러리의 최신 버전을 자동으로 가져오는 앱은 다음 빌드에 악성 코드를 포함하게 되고, 웹사이트의 경우 스크립트가 로드되는 즉시 영향을 받습니다.
- 4탈취. 코드는 클립보드에 복사된 주소를 바꾸거나, 가짜 트랜잭션 요청을 띄우거나, 시드 문구를 요구하거나, 탈중앙화 앱의 프런트엔드에 드레이너를 심을 수 있습니다.
- 5흔적 숨기기. 공격자는 사용 후 코드를 재빨리 제거하는 경우가 많아 조사가 어려워집니다.
이 패턴을 따른 실제 사건이 기록되어 있습니다. 2018년에는 인기 JavaScript 패키지에 추가된 악성 의존성이 특정 bitcoin 지갑 앱 사용자에게서 자금을 훔치도록 설계되어 있었습니다. 2023년 12월에는 Ledger의 Connect Kit 라이브러리 중 침해된 버전 때문에 여러 탈중앙화 앱이 잠시 동안 사용자에게 지갑 드레이너를 보여 주었습니다. 두 사례 모두 약점이 사용자가 아니라 공유 코드에 있었음을 보여 줍니다. 더 자세한 내용은 배니티 주소의 위험과 닮은꼴 주소를 참고하세요.
흔한 침투 경로
| 침투 경로 | 악용 방식 | 영향을 받는 대상 |
|---|---|---|
| 오픈소스 패키지(npm, PyPI 등) | 악성 버전 배포 또는 이름이 비슷한 패키지 업로드 | 해당 패키지를 사용하는 앱과 개발자 |
| 서드파티에서 로드하는 프런트엔드 스크립트 | 드레이너를 심도록 스크립트 변경 | 사이트의 모든 방문자 |
| 브라우저 확장 프로그램 | 확장 프로그램이 매각되거나 탈취된 뒤 악성 코드로 업데이트됨 | 확장 프로그램을 설치한 사용자 |
| 앱 업데이트 | 업데이트 서버나 서명 키가 침해됨 | 업데이트를 설치한 사용자 |
| 개발자 도구와 AI가 추천한 패키지 | 그럴듯해 보이는 가짜 패키지 이름 | 확인 없이 설치하는 개발자 |
인기 패키지와 이름이 매우 비슷한 패키지를 올리는 타이포스쿼팅은 특히 흔합니다. 패키지 이름을 잘못 입력한 개발자는 자신도 모르게 악성 코드를 설치할 수 있습니다.
가상의 예시
이것은 실제 사례가 아니라 설명을 위한 가상의 복합 예시입니다. 공개 패키지 레지스트리에서 인기 있는 지갑 연결 라이브러리를 불러오는 소규모 탈중앙화 거래소가 있다고 가정해 봅시다. 어느 날 아침, 라이브러리 메인테이너가 피싱을 당하고 공격자가 새 버전을 배포합니다. 거래소 웹사이트는 최신 버전을 자동으로 불러옵니다.
몇 시간 동안 지갑을 연결하는 모든 사용자는 평범한 스왑 요청처럼 보이는 화면을 보게 됩니다. 실제로는 자신의 토큰을 공격자의 컨트랙트에 승인하라는 요청입니다. 지갑의 승인 화면을 꼼꼼히 읽은 사용자는 낯선 컨트랙트를 발견하고 멈춥니다. 읽지 않고 클릭한 사용자는 토큰을 잃습니다. 거래소 팀은 사용자들의 피해 신고를 받고서야 문제를 발견해 경고를 게시하지만, 그때는 이미 코드가 제거된 뒤입니다.
사용자를 위한 경고 신호
- 익숙한 앱이 갑자기 이전에는 요구한 적 없는 시드 문구나 “지갑 인증” 단계를 요구합니다.
- 평소와 같은 작업에서 무제한 승인이나 알 수 없는 컨트랙트에 대한 서명 같은 이상한 지갑 요청이 나타납니다.
- 하드웨어 지갑 화면에 표시된 주소가 의도한 주소와 일치하지 않습니다.
- 브라우저 확장 프로그램이 업데이트되면서, 특히 모든 웹사이트의 데이터를 읽고 변경하는 새 권한을 요청합니다.
- 프로젝트나 보안 연구자가 특정 사이트나 앱을 사용하지 말라는 긴급 경고를 게시합니다.
이 중 상당수는 비슷한 기법을 쓰는 클립보드 악성코드 및 가짜 지갑 앱과 겹칩니다. 함께 보기: 암호화폐 사용자를 노리는 가짜 브라우저 업데이트와 캡차 악성코드.
스스로를 보호하는 방법
사용자라면
- 1하드웨어 지갑을 사용하고 확인하기 전에 화면에서 주소, 금액, 컨트랙트를 읽으세요.
- 2확장 프로그램은 최소한으로 유지하세요. 쓰지 않는 것은 삭제하고, 확장 프로그램의 소유자가 바뀌거나 새 권한을 요청할 때는 주의하세요.
- 3자금을 분리하세요. 장기 보유 자산은 웹사이트에 거의 연결하지 않는 지갑에 두고, 일상적인 DeFi에는 다른 지갑을 사용하세요.
- 4보안 경고 후에는 잠시 멈추세요. 문제가 해결되었다고 확인될 때까지 해당 앱 사용을 피하세요.
- 5불필요한 승인은 주기적으로 철회하세요.
개발자나 프로젝트라면
- 의존성 버전을 고정하고 락파일을 사용하세요. 업그레이드 전에 변경 사항을 검토하세요.
- 패키지 이름을 꼼꼼히 확인하고 관리가 잘 되는 라이브러리를 선택하세요.
- 패키지 레지스트리와 코드 호스팅 계정에 다중 인증을 필수로 적용하세요.
- 서명된 릴리스와, 가능하다면 재현 가능한 빌드를 사용해 사용자가 바이너리를 검증할 수 있게 하세요.
- 서드파티 스크립트에는 content security policy와 subresource integrity를 사용하세요.
피해를 입었다면 해야 할 일
- 1영향을 받은 앱이나 확장 프로그램 사용을 중단하고 모든 지갑의 연결을 해제하세요.
- 2영향 기간 동안의 승인이나 송금이 있는지 거래 내역을 확인하세요.
- 3의심스러운 승인을 철회하고, 시드 문구가 노출되었을 가능성이 있다면 새 시드 문구로 만든 새 지갑으로 남은 자금을 옮기세요.
- 4트랜잭션 해시와 주소를 모은 뒤, 프로젝트의 공식 채널과 저희 사기 신고 양식을 통해 사건을 신고하세요.
지갑이 침해되었을 때 즉시 해야 할 일의 전체 체크리스트를 따르세요.
결론
공급망 공격은 신뢰받는 소프트웨어를 도난 경로로 바꿔 놓기 때문에, 의심스러운 링크를 피하는 것만으로는 안전하지 않습니다. 하드웨어 지갑 화면과 지갑 요청을 최종 확인 단계로 삼고, 사용하는 소프트웨어를 최소화하며, 공식 보안 경고에 빠르게 대응하세요. 가장 큰 책임은 개발자에게 있습니다. 배포하는 모든 것을 고정하고, 검토하고, 서명하세요.
자주 묻는 질문
암호화폐에서 공급망 공격이란 무엇인가요?
범죄자가 사용자를 직접 공격하는 대신, 코드 라이브러리, 브라우저 확장 프로그램, 앱 업데이트처럼 다른 제품들이 의존하는 소프트웨어를 침해하는 공격입니다. 신뢰받는 소프트웨어가 업데이트되면 악성 코드가 그것에 의존하는 모든 앱과 사용자에게 전달되며, 대개 암호화폐를 훔치거나 주소를 바꿔치기하는 데 쓰입니다.
공급망 공격이 하드웨어 지갑에도 영향을 줄 수 있나요?
하드웨어 지갑의 화면은 컴퓨터나 웹사이트가 침해된 경우에도 사용자를 보호하도록 설계되어 있습니다. 실제 주소와 금액을 기기에서 확인하기 때문입니다. 하지만 화면을 읽지 않으면 공격에 속아 악성 트랜잭션을 승인할 수 있으므로, 항상 기기 자체에서 세부 정보를 확인하세요.
제가 사용한 웹사이트가 영향을 받았는지 어떻게 알 수 있나요?
보통 영향을 받은 프로젝트의 공식 공지나 보안 연구자를 통해 알게 됩니다. 사용한 프로젝트가 라이브러리나 프런트엔드 침해를 보고하면, 영향 기간 동안 서명한 것이 있는지 확인하고, 승인을 철회하며, 필요하면 자금을 새 지갑으로 옮기세요.
오픈소스 지갑은 공급망 공격으로부터 안전한가요?
오픈소스는 더 많은 사람이 코드를 검토할 수 있어 도움이 되지만, 소프트웨어를 완전히 안전하게 만들지는 않습니다. 악성 코드는 의존성, 침해된 메인테이너 계정, 빌드 시스템을 통해 들어올 수 있습니다. 재현 가능한 빌드, 서명된 릴리스, 신중한 의존성 관리가 위험을 줄여 줍니다.
