- 2023년 중반 시작된 저장소 혼동(repo confusion) 캠페인이 재확산되며, GitHub에서 유사 악성 페이로드를 담은 저장소가 10만 개 이상 탐지됨
- 공격자는 정상 저장소와 비슷한 악성 복제본을 만들어 개발자의 착오를 유도하고, 복제·로더 삽입·재업로드·대량 포크·은밀한 홍보를 조합함
- 악성 저장소를 실행하면 7단계 난독화 뒤 Python 코드와 바이너리가 내려오고, 로그인 정보·브라우저 비밀번호·쿠키 등 민감 데이터가 탈취됨
- GitHub가 대다수 포크를 자동 삭제해도 감지를 피한 저장소와 수동 업로드본은 남아, 전체의 1%만 생존해도 수천 개 악성 저장소가 유지됨
- 공격 흐름이 PyPI 악성 패키지에서 GitHub 저장소로 옮겨가며, 패키지 매니저 밖의 소프트웨어 공급망도 직접적인 공격면이 됨
저장소 혼동 공격 방식
- 저장소 혼동은 사용자가 정상 저장소 대신 악성 저장소를 내려받도록 유도한다는 점에서 dependency confusion과 닮아 있음
- 차이는 악용 지점에 있음
- dependency confusion은 패키지 매니저 동작 방식을 이용함
- 저장소 혼동은 사람이 비슷해 보이는 저장소를 잘못 선택하는 상황에 의존함
- 이번 캠페인은 GitHub에 악성 저장소를 대량으로 퍼뜨려 감염 가능성을 높임
TwitterFollowBot,WhatsappBOT,discord-boost-tool,Twitch-Follow-Bot등 기존 저장소를 복제함- 복제본에 멀웨어 로더를 삽입함
- 같은 이름으로 GitHub에 다시 업로드함
- 각 저장소를 자동으로 수천 번 포크함
- 포럼과 Discord 등에서 은밀히 홍보함
악성 저장소 실행 후 흐름
- 사용자가 악성 저장소를 사용하면 숨겨진 페이로드가 7단계 난독화를 해제함
- 이후 악성 Python 코드와 바이너리 실행 파일을 가져옴
- 악성 코드는 주로 BlackCap-Grabber의 수정 버전에 기반함
- 수집 대상은 여러 앱의 로그인 자격 증명, 브라우저 비밀번호와 쿠키, 기타 기밀 데이터임
- 탈취된 데이터는 공격자의 C&C(command-and-control) 서버로 전송되고, 추가 악성 활동이 이어짐
- 관련 코드 분석은 Trend Micro의 technical analysis에서 확인할 수 있음
GitHub 자동 삭제와 남는 저장소
- GitHub는 자동화를 식별해 포크된 저장소 대부분을 빠르게 제거함
- 다만 자동화 감지가 많은 저장소를 놓치고, 수동으로 업로드된 저장소는 살아남음
- 공격 체인이 대규모로 자동화돼 있어 1%만 남아도 수천 개 악성 저장소가 됨
- GitHub에서
🔥 2024 language:python을 검색하면 현재 확산 중인 일부 저장소를 볼 수 있음 - 삭제된 저장소까지 포함하면 전체 규모는 수백만 개에 도달함
- 삭제는 보통 업로드 후 몇 시간 뒤 일어나 문서화가 어려움
- 원본 저장소 다수는 남아 있고, 삭제는 주로 fork bomb을 겨냥함
- 예시로 Mattia69 저장소 목록에는 요약에서 수천 개 포크가 보이지만, 포크 상세에는 나타나지 않음
- 일부 사용자가 악성 저장소를 모르고 포크하면서 2차 사회공학 네트워크 효과도 생김
캠페인 전개 시점
- 2023년 5월: Phylum이 PyPI에 올라온 악성 패키지를 보고함
- 이 패키지들은 현재 페이로드의 초기 부분을 포함함
chatgpt-api같은 인기 GitHub 저장소의 포크에 심어진os.system("pip install package")호출로 확산됨
- 2023년 7~8월: 여러 악성 저장소가 GitHub에 올라왔고, PyPI 패키지를 가져오는 대신 페이로드를 직접 전달함
- PyPI가 악성 패키지를 제거하고 보안 커뮤니티의 관심이 높아진 뒤의 변화임
- Trend Micro의 Aliakbar Zahravi와 Peter Girnus가 기술 분석을 공개함
- 2023년 11월~현재: 유사한 악성 페이로드를 포함한 저장소 10만 개 이상이 탐지됐고, 수는 계속 증가함
- 이 방식이 공격자에게 유리한 이유는 명확함
- GitHub 규모가 커서 대량 인스턴스도 상대적으로는 작아 탐지하기 어려움
- 이전과 달리 패키지 매니저가 개입하지 않아 명시적인 악성 패키지 이름이 지표로 남지 않음
- 대상 저장소가 작은 틈새 영역이고 인기도가 낮아 개발자가 악성 사칭 저장소를 잘못 클론하기 쉬움
패키지 매니저에서 SCM으로 이동
- PyPI 악성 패키지에서 GitHub 악성 저장소로의 이동은 여러 패키지 매니저와 SCM 플랫폼에서 관찰된 흐름과 맞닿아 있음
- 보안 커뮤니티가 패키지 매니저에 더 집중하자, 공격 경로가 다른 곳으로 옮겨간 셈임
- GitHub와 유사 플랫폼은 계정과 저장소를 자동 생성하기 쉽고, 편리한 API와 우회하기 쉬운 느슨한 rate limit을 제공함
- 수많은 저장소 사이에 숨을 수 있어, SCM은 소프트웨어 공급망을 은밀히 감염시키기 좋은 표적이 됨
- dependency confusion 캠페인, 패키지 레지스트리의 악성 코드, SCM을 통한 악성 코드 확산은 도구와 보안 메커니즘이 많아도 소프트웨어 공급망 보안이 취약하다는 점을 드러냄
감염 여부 확인 지표
- Python 코드에서 다음 패턴을 검색하고, 일치 항목을 조사해야 함
exec(Fernetexec(requestsexec(__importexec(bytesexec("""\nimportexec(compile__import__("builtins").exec(
- 소셜 플랫폼 자동화, 봇, 게임 관련 저장소가 로컬에 있는지 확인하고 제거해야 함
- 꼭 사용해야 한다면 다시 설치하되, 출처를 신중히 검증하거나 샌드박스에서 실행해야 함
- 이런 유형의 저장소를 클론했을 가능성이 있다면 다음 쿠키, 자격 증명, 키가 탈취됐다고 보고 대응해야 함
- 브라우저: 금융 서비스, 이메일 서비스, 암호화폐 서비스, Amazon, eBay, AliExpress, Facebook, Instagram, Twitter, Youtube, Discord, TikTok, Telegram, Twitch, Steam, Yahoo, ExpressVPN, Spotify, 스트리밍 서비스
- 앱: Exodus, Atomic Wallet, Guarda, Coinomi, Ethereum
- 파일 체크섬 전체 목록은 실용적으로 다루기 어렵지만, 일부 공통 항목은 VirusTotal graph에서 확인할 수 있음
- Cloudflare는 통지를 받은 뒤 발견된 악성 주소의 DNS 레코드를 비활성화함
방어와 대응
- GitHub는 통지를 받았고 악성 저장소 대부분을 삭제했지만, 캠페인은 계속되고 있음
- 공급망에 악성 코드를 주입하려는 공격은 점점 더 널리 퍼지는 중임
- 시스템·네트워크 수준에서 멀웨어를 잡는 솔루션은 많지만, 공급망은 공격자에게 여전히 크고 수익성 있는 공격면임
- 악성 저장소를 발견하면 이번 캠페인의 일부인지와 관계없이 GitHub의 abuse or spam report를 통해 신고할 수 있음
- Apiiro는 연결된 코드베이스를 모니터링하는 악성 코드 탐지 시스템을 구축함
- LLM 기반 코드 분석
- 전체 실행 흐름 그래프로의 코드 분해
- 휴리스틱 엔진
- 동적 디코딩, 복호화, 난독화 해제
- 주입된 악성 페이로드를 모니터링하지 않으면 조직 보안은 개발자가 거의 동일한 잘못된 저장소를 선택하지 않는 능력, CI/CD 설정 오류가 전혀 없는 상태, 100% 안전한 서드파티 코드 같은 조건에 의존하게 됨
- 일반적인 취약점 탐지와 수집을 넘어, 다음 세대의 소프트웨어 공급망·애플리케이션 리스크를 드러내는 접근이 필요함