- 여러 공격 캠페인이 계정 탈취 및 타이포스쿼팅을 통해 UI 구성 요소부터 CLI 유틸리티에 이르기까지 신뢰할 수 있는 React Native npm 패키지 및 도구를 악용했습니다.
- 공격자들은 개발자 컴퓨터, CI 파이프라인, 지갑 또는 자격 증명 데이터를 표적으로 삼아 Solana 또는 분산형 C2를 사용하는 정교한 다단계 악성 소프트웨어를 배포하는 사례가 점점 늘어나고 있습니다.
- 보안 업체들은 이제 AI 분석, 쿨다운 검사, 강화된 CI 유출 제어 기능을 활용하여 이러한 공급망 공격을 몇 분 안에 포착하고 차단합니다.
- React Native 팀은 공급망 위험을 의미 있게 줄이기 위해 엄격한 의존성 관리, npm 2FA, 락파일 및 지속적인 모니터링을 결합해야 합니다.

React Native는 모바일 앱 개발을 위한 대표적인 프레임워크로 자리 잡았으며, 이로 인해 npm 생태계는 개발자 컴퓨터와 CI 파이프라인을 공격하려는 공격자들에게 매우 매력적인 표적이 되었습니다. 지난 몇 년 동안 여러 고도로 정교한 공격 캠페인이 신뢰할 수 있는 React Native 패키지, 프레임워크 관련 인기 도구, 심지어는 오타를 이용해 만든 유틸리티까지 악용하여 악성코드를 심고, 자격 증명을 탈취하고, 지갑 정보를 빼돌리고, 대규모로 JavaScript 프로젝트를 파괴해 왔습니다.
오늘날 React Native 앱을 개발하거나 유지 관리하려면 단순히 "npm install"을 실행하고 잘 되기를 바라는 것만으로는 더 이상 충분하지 않습니다. 다수의 위협 행위자들이 npm을 조직적으로 악용하여 UI 구성 요소부터 CLI 도구, 심지어는 lockfile 깊숙이 숨겨진 전이적 종속성 그래프까지 모든 것을 공격하고 있습니다. 이 글에서는 주요 공격 사례들을 살펴보고, 악성코드의 작동 방식을 분석하며, 개발 환경에서 피해를 최소화하기 위한 실질적인 조치를 제시합니다.
React Native 입력 컴포넌트의 계정 탈취 및 악성코드 감염
React Native 업계에서 가장 우려스러운 공급망 사고 중 하나가 전화번호 및 국가 선택과 같은 매우 일반적인 UI 구성 요소 두 가지에 영향을 미쳤습니다. react-native-international-phone-number react-native-country-select. 두 패키지 모두 동일한 작성자가 관리합니다.@AstrOOnautanpm 사용자 astroonauta이 플러그인은 매주 수만 건의 다운로드를 기록했으며, 많은 상용 모바일 앱에 내장되어 있습니다.
2026년 3월 16일, StepSecurity의 AI 기반 패키지 분석기는 이러한 라이브러리의 새 버전에 설치 시 악성코드가 갑자기 포함된 것을 최초로 발견했습니다. 즉시 유출된 정보는 다음과 같습니다. react-native-international-phone-number@0.11.8 react-native-country-select@0.3.91그 시점에서 마지막으로 확인된 클린 버전은 다음과 같습니다. 0.11.7 0.3.9 각각.
초기 백도어(1차 공격)는 매우 간단했습니다. 새로운 preinstall 스크립트와 심하게 난독화된 install.js 파일이 tarball에 포함되어 있습니다. 악의적인 package.json 해당 코드 조각은 다음과 같았습니다.
"scripts": { "preinstall": "node install.js" }
npm 라이프사이클 스크립트는 자동으로 실행되기 때문입니다. npm install로컬 환경이든 CI 환경이든, 이러한 버전을 다운로드한 사람은 코드를 가져오지 않고도 악성코드를 실행한 것입니다. 해당 버전에는 상응하는 Git 태그, 릴리스 또는 CI 워크플로 실행이 없었으며, gitHead 이전의 정상적인 릴리스와 일치하는 것으로 보아 공격자가 GitHub 저장소를 수정하는 대신 관리자의 npm 계정에 직접 게시 권한을 획득했을 가능성이 높습니다.
당시 다운로드 데이터는 이 문제가 얼마나 심각할 수 있었는지를 보여줍니다. 주간 다운로드 수는 대략 9,000건이었습니다. react-native-country-select 그리고 20,000명 이상 react-native-international-phone-number두 앱을 합쳐 한 달에 130,000만 건 이상의 다운로드가 이루어지고 있습니다. 이는 바로 수천 대의 개발자 및 CI 시스템에 조용히 스며드는, 눈에 잘 띄지 않는 대량의 종속성 문제입니다.
3단계 공격: 명백한 사전 설치부터 은밀한 의존성 연결망까지
이러한 React Native 패키지에 대한 공격은 세 차례에 걸쳐 진행되었으며, 각 단계는 이전 단계보다 더 교묘한 수법을 사용하면서도 동일한 핵심 악성코드를 재사용했습니다. StepSecurity는 거의 실시간으로 상황 변화를 추적하고 관리자와 협력했지만, 공격자는 손상된 npm 계정에 대한 접근 권한을 반복적으로 되찾거나 유지했습니다.
1차 파동(2026년 3월 16일)은 직접 파동을 중심으로 진행되었습니다. preinstall 두 패키지 모두에 후크가 있습니다. StepSecurity의 AI는 새 릴리스가 게시된 지 약 5분 만에 심각한 문제로 표시했으며, GitHub에 #165 이슈가 제기되었습니다. react-native-international-phone-number 그리고 11번은 react-native-country-select관리자는 신속하게 대응하여 악성 버전을 사용 중지하고 깨끗한 버전을 배포했습니다. react-native-country-select@0.4.0게시부터 사용 중단까지 총 소요 시간은 약 2시간 21분으로, 생태계 기준으로 볼 때 빠른 편입니다.
그럼에도 불구하고 공격자는 npm 자격 증명에 대한 제어권을 잃지 않았고, 이로 인해 3월 17일에 2차 공격이 발생했습니다. 공격자는 눈에 띄는 스크립트를 메인 패키지에 다시 넣는 대신, 숨겨진 인프라 역할을 하는 두 개의 새로운 범위 지정 패키지를 배치했습니다.
@usebioerhold8733/s-format@2.0.1– 텅 빈 복제품string-format와postinstall: "node init.js"스크립트이지만 누락된 부분이 있습니다.init.js파일이기 때문에 후크가 아무런 오류 메시지 없이 실패합니다.@agnoliaarisian7180/string-argv@0.3.0– 거의 비어있는 패키지(README, LICENSE, package.json)로, 그 유일한 실제 목적은 의존성을 확보하는 것뿐이었다.@usebioerhold8733/s-formatProtonMail 기반의 관리자 주소를 사용합니다.
그날 저녁 늦게, react-native-international-phone-number@0.12.1 출판되었습니다 @agnoliaarisian7180/string-argv@0.3.0 GitHub Actions 활동 없이 새로운 종속성으로 추가되었습니다. 그 시점에서 체인은 준비는 되어 있었지만 비활성 상태였으며, 페이로드가 활성화되기를 기다리고 있었습니다. StepSecurity가 이상 현상을 보고했을 때, 관리자는 이미 증거를 통해 명백했던 사실을 확인시켜 주었습니다. "제 npm 계정이 공격당했고 라이브러리가 탈취당했습니다."
3차 공격(3월 18일)에서는 단계별 인프라를 능동적인 다계층 악성코드 전달 체계로 전환한 후, 이를 신속하게 개선했습니다. 공격자는 한 시간도 채 안 되어 릴레이 패키지와 메인 라이브러리의 새 버전을 모두 배포했으며, 페이로드를 실행하는 방식을 반복적으로 변경했습니다.
최종 연결 고리는 다음과 같았습니다.
react-native-international-phone-number@0.12.2/0.12.3 → @agnoliaarisian7180/string-argv@latest → @usebioerhold8733/s-format@latest → postinstall → node child.js → init.js (malware)
공격자는 먼저 페이로드를 활성화했습니다. @usebioerhold8733/s-format@2.0.2 크고 모호한 것을 추가함으로써 init.js 이전 파일과 바이트 단위로 완전히 동일한 파일 install.js 1차 웨이브부터. 그들은 그 후 변경했습니다. postinstall 전화 child.js 대신 init.js, 게시 됨 2.0.3 스크립트가 누락된 상태로 (또 다른 예행연습), 마침내 배송되었습니다. 2.0.4 아주 작은 것과 함께 child.js 단순히 확인하는 로더 init.js 그리고 다음과 같은 방식으로 실행합니다. child_process.exec 오류 및 stderr 출력은 무시합니다.
동시에, @agnoliaarisian7180/string-argv@0.3.1 의존성을 전환했습니다. s-format 고정된 버전에서 "latest"글렌데일 react-native-international-phone-number@0.12.2 와 똑같이 했다 string-argv. 이로 인해 메인 패키지를 설치할 때마다 자동으로 최신 페이로드 버전이 다운로드되는 자체 업데이트 악성 프로그램이 생성되었습니다.
마지막으로, react-native-international-phone-number@0.12.3 (더 깔끔해 보이도록) 이제 불필요해진 사전 설치 후크를 제거하고, 악의적인 의존성 체인은 그대로 유지했으며, npm 관리자 이메일을 원래 작성자가 소유하지 않은 또 다른 ProtonMail 계정으로 변경했습니다. 이는 공격자가 유출된 토큰을 단순히 기회주의적으로 재사용하는 것이 아니라 npm ID에 대한 지속적인 제어권을 확보하려는 분명한 신호였습니다.
솔라나(Solana)가 지원하는 리액트 네이티브 개발자 대상 악성코드의 내부 구조
내부적으로, 세 차례의 공격 모두에서 실행된 페이로드는 솔라나 블록체인을 동적 명령 및 제어 채널로 악용하는 동일한 정교한 다단계 악성코드였습니다. 전달 방식은 계속 바뀌었지만, "무기"는 모든 버전에서 동일하게 유지되었으며, 심지어 1차 웨이브에서 3차 웨이브 인프라로 이식될 때에도 바이트 단위까지 완전히 동일한 파일이었습니다.
이 스크립트는 의도적으로 10초의 지연을 두고 시작됩니다. setTimeout이는 전형적인 샌드박스 회피 전략입니다. 많은 자동화된 샌드박스와 보안 도구는 스크립트에 짧은 실행 시간만 허용하고 의심스러운 활동이 없다고 판단하기 때문에 악성 프로그램은 해당 시간이 끝날 때까지 기다렸다가 의미 있는 작업을 수행합니다.
다음으로, 러시아와 CIS 일부 지역의 시스템 감염을 방지하기 위해 지리적 필터링을 수행합니다. 환경 변수를 검사합니다. LANG, LANGUAGE, LC_ALL호스트 사용자 정보, 시스템 시간대, 심지어 UTC 오프셋까지 포함하여 러시아어 로케일을 나타내는 값(예: ru_RU or Russian) 또는 러시아/CIS 시간대 목록 중 하나를 선택합니다. 이 중 하나라도 일치하면 스크립트는 즉시 조용히 종료됩니다.
해당 환경이 검사를 통과해야만 악성 소프트웨어가 솔라나 블록체인과 통신을 시작합니다. 이 기능은 하드코딩된 지갑 주소를 보유하고 있으며, 해당 주소를 통해 조회합니다. getSignaturesForAddress 다양한 공급업체에서 호스팅하는 9개의 Solana RPC 엔드포인트를 통해 JSON-RPC 방식을 사용합니다. 이러한 설계는 공격자에게 높은 가용성을 제공하며, 간단한 도메인 또는 IP 차단으로는 효과를 볼 수 없게 합니다.
핵심은 공격자가 솔라나 지갑으로의 거래 메모 필드 안에 다음 단계 페이로드 URL을 숨긴다는 것입니다. 이 메모에는 base64로 인코딩된 JSON 데이터가 저장되어 있습니다. link 해당 필드에는 다음 단계의 URL이 포함됩니다. 운영자는 새로운 트랜잭션을 게시함으로써 게시된 npm 패키지를 수정하지 않고도 언제든지 페이로드 URL을 변경할 수 있습니다.
URL이 추출되면 악성 프로그램은 공격자의 서버로 HTTP 요청을 보냅니다. http://45.32.150.251/사용자 정의 방식으로 OS 유형을 전송합니다. os 헤더를 추가하여 C2 서버가 플랫폼별 바이너리를 반환할 수 있도록 합니다. 응답 본문에는 암호화된 페이로드가 포함되지만, 이를 복호화하는 데 필요한 AES-256 키와 IV는 HTTP 헤더에만 전송됩니다.secretkey ivbase64따라서 캐시되거나 가로챈 신체 데이터는 그 자체로는 쓸모가 없습니다.
복호화된 2단계는 디스크에 저장되지 않고 메모리에서 실행됩니다. eval(atob(...)) 유닉스 계열 시스템에서 또는 다음을 통해 vm.Script Node 내부 구조에 대한 완전한 접근 권한이 있는 Windows 환경입니다. 그 후 악성 프로그램은 파일을 드롭합니다. ~/init.json 타임스탬프와 고유 식별자를 저장하는 마커 파일을 사용하여 동일한 컴퓨터가 48시간에 한 번 이상 재감염되지 않도록 합니다. 이러한 속도 제한은 노이즈를 크게 줄이고 방어자가 추적할 수 있는 행동 지표를 줄입니다.
연구원들이 솔라나 및 HTTP 단계를 재현하여 복구한 AES 복호화된 3단계 페이로드는 윈도우 중심의 자격 증명 및 지갑 탈취 악성코드와 로더입니다. 지속성을 확립합니다 schtasks 그리고 Run 레지스트리 키를 사용하면 추가 암호화 모듈을 다운로드할 수 있습니다. 45.32.150.251그리고 획득한 전리품을 217.69.3.x 범위의 IP 주소로 유출합니다.
이 악성 프로그램은 Chrome과 Firefox를 강제로 종료한 후 브라우저 프로필 폴더와 로컬 지갑 디렉토리를 탐색하여 MetaMask, Phantom, Exodus, Atomic, Guarda, Coinomi, Daedalus, OKX Wallet, Trust Wallet, Braavos 등과 같은 데스크톱 지갑 및 브라우저 확장 프로그램에서 데이터를 수집합니다. 게다가 이 악성코드는 로컬 구성 및 자격 증명 도우미에서 npm 토큰과 GitHub 자격 증명을 직접 가져와 개발자 컴퓨터를 추가적인 공급망 공격을 위한 완벽한 발판으로 만듭니다.
특히, 해당 악성 프로그램은 x86 및 x64용 Node.js 런타임(v22.9.0)을 자체적으로 다운로드하기도 합니다. %APPDATA%\_node_x86 %APPDATA%\_node_x64, 대상 시스템에 Node가 설치되어 있지 않더라도 일관된 실행 환경을 유지할 수 있도록 보장합니다.
ForceMemo 및 GlassWorm 위협 행위자와 관련된 링크
이번 React Native npm 관련 사건의 기술적 특징은 GitHub의 수백 개의 Python 저장소를 해킹했던 "ForceMemo"라는 이전 공격과 거의 완벽하게 일치합니다. 두 작업 모두 Solana를 데드드롭 C2로 사용했고, 동일한 9개의 RPC 엔드포인트 그룹과 동일한 JSON 메모 형식을 사용했습니다. link 필드, 동일한 러시아/CIS 지역 필터링 로직, 동일 ~/init.json Vultr에서 호스팅되는 지속성 잠금 및 이와 유사한 인프라 범위.
두 공격 캠페인에서 솔라나 지갑 주소는 다르지만, 다른 모든 정황은 글래스웜(GlassWorm)으로 알려진 그룹으로 추정되는 매우 유능한 공격자가 저지른 짓임을 가리킵니다. ForceMemo는 악성 GitHub 저장소를 통해 개발자를 표적으로 삼았고, React Native 공격은 npm 패키지와 그 종속성 체인을 통해 이루어졌습니다. 이들의 전략은 명확합니다. 정교하고 모듈화된 악성코드 프레임워크를 재사용하되, 다양한 배포 채널에 연결하여 가능한 한 많은 개발 환경에 침투하는 것입니다.
React Native 및 JavaScript 관련 기타 악성 npm 캠페인
AstrOOnauta 해킹 사건은 React Native 앱에 직간접적으로 영향을 미치는 광범위한 npm 기반 공격의 일부일 뿐입니다. 여러 보안 업체들이 React Native UI 라이브러리, 핵심 CLI 도구, 심지어 많은 React Native 코드베이스가 의존하는 일반 빌드 플러그인까지 겨냥한 동시다발적인 공격 캠페인을 진행하고 있다고 보고했습니다.
아이키도 시큐리티는 2025년 6월, 최소 16개의 리액트 네이티브 관련 패키지에 백도어를 심어놓은 대규모 공급망 사기 행각을 적발했습니다. @react-native-aria/* 스코프 플러스 @gluestack-ui/utils이들 앱은 collectively 매주 약 100만 건의 다운로드를 기록하고 있습니다. 최초 침해는 2025년 6월 6일에 발생했으며, 그 시작은 다음과 같습니다. @react-native-aria/focus@0.2.10그 후 6월 7일에 포커스, 오버레이, 상호 작용, 토글, 스위치, 체크박스, 라디오, 버튼, 메뉴, 리스트박스, 탭, 콤보박스, 펼침, 슬라이더, 구분선 패키지 및 GlueStack 유틸리티로 빠르게 확장되었습니다.
해당 캠페인에 사용된 악성코드는 윈도우 환경에 맞춰 제작된 원격 접속 트로이목마(RAT)로, 특정 하위 디렉터리에 지속적으로 존재했습니다. %LOCALAPPDATA%\Programs\Python\Python3127 그리고 C2 서버에 연결합니다. 136.0.9[.]8 85.239.62[.]36. 해당 악성코드는 임의 명령 실행, 파일 업로드/다운로드, 장기 원격 접속 등의 기능을 제공했습니다. 지속적인 공격으로 인해 React Native 라이브러리를 깨끗한 버전으로 업그레이드하는 것만으로는 이미 감염된 시스템을 치료할 수 없었습니다.
Socket의 위협 연구팀이 밝혀낸 또 다른 장기적인 캠페인은 타이포스쿼팅과 모방을 이용하여 React, Vue, Vite, Quill과 같은 인기 있는 JavaScript 프레임워크를 명시적으로 표적으로 삼는 악성 패키지를 심었습니다. 공격자는 npm 별칭을 사용합니다. xuxingfeng2년이 넘는 기간 동안 합법적인 패키지와 악성 패키지를 혼합하여 배포하면서, 겉보기에는 신뢰할 수 있는 관리자처럼 보였습니다.
다음과 같은 패키지 vite-plugin-bomb, vite-plugin-bomb-extend, vite-plugin-react-extend, vite-plugin-vue-extend vue-plugin-bomb 이 프로그램들은 데이터를 훔치기 위한 것이 아니라, 프로젝트를 적극적으로 손상시키거나 파괴하기 위해 설계되었습니다. 그들은 특정 날짜에 맞춰 작동하는 다단계 공격을 실행하여 핵심 프레임워크 파일을 삭제했습니다. node_modules (Vue, React, Vite, TypeScript, Ant Design Vue, Pinia, ECharts 등) 때로는 매초마다 시스템을 강제로 종료하는 기능과 함께 사용되기도 합니다. shutdown -s -t 5.
특히나 불쾌한 소포 하나, js-hood핵심 자바스크립트 프로토타입을 변조했습니다. Array.prototype.filter, map, push, pop 그리고 여러 String 방법구문적으로는 유효해 보이지만 임의의 데이터를 반환하는 함수로 대체함으로써, 애플리케이션은 계속 실행되지만 디버깅이 매우 어려운 왜곡되고 비결정적인 결과를 생성하게 됩니다.
The quill-image-downloader 해당 시리즈는 다른 방향으로 나아가 클라이언트 측 스토리지 파괴에 초점을 맞췄습니다. 지정된 활성화 날짜 이후에 모든 키를 순회하는 3개 파일 아키텍처를 배포했습니다. localStorage, sessionStorage 쿠키를 비롯한 여러 데이터의 값을 무작위 문자로 부분적으로 뒤섞으면서 구조는 유지합니다. 인증 토큰, 장바구니, 사용자 환경 설정 및 브라우저 측 상태가 미묘하게 손상되어 간헐적인 오류가 발생하며, 많은 팀에서 이를 처음에는 애플리케이션 버그로 오인하게 됩니다.
OP Innovate의 별도 연구에 따르면 TypeScript, discord.js, ethers.js, nodemon과 같은 잘 알려진 라이브러리를 사칭하는 악성 npm 패키지 10개가 발견되었습니다. react-router-dom zustand. 설치가 완료되면 이러한 패키지는 가짜 CAPTCHA 창을 표시하고 호스트의 지문을 수집한 다음 C2 서버에서 대규모 크로스 플랫폼 정보 탈취 프로그램을 다운로드합니다. 195.133.79.43윈도우, macOS, 리눅스를 명시적으로 지원합니다.
마지막으로, 아이키도가 자세히 설명한 캐니스터웜(CanisterWorm) 공격은 공격자들이 npm을 배포 수단으로 악용하기 위해 얼마나 극단적인 조치를 취할 수 있는지를 보여주었습니다. 해킹당한 퍼블리셔 계정에서 유출된 135개 이상의 패키지에는 애플리케이션 코드나 빌드 단계보다 먼저 실행되는 설치 스크립트가 포함되어 있었습니다. 이러한 설치 스크립트는 로컬 개발 환경, CI 작업, 컨테이너화된 빌드 노드 등 설치 위치에 따라 동작 방식이 달라지며, 은밀한 C2 서버 역할을 하는 분산형 인터넷 컴퓨터(ICP)와 통신합니다. 이를 통해 운영자는 npm 레지스트리를 직접 수정하지 않고도 동작을 즉시 변경할 수 있습니다.
React Native 툴링의 심각한 취약점: 커뮤니티 CLI RCE
React Native의 보안 위험이 모두 악성 패키지에서 비롯되는 것은 아닙니다. 일부는 널리 사용되는 도구의 심각한 취약점에서 발생합니다. 주목할 만한 사례 중 하나는 React Native Community CLI의 CVE-2025-11953 취약점인데, 이 패키지는 Windows, macOS 및 Linux 환경의 개발자들이 매주 수백만 번씩 다운로드하는 프로그램입니다.
이 취약점으로 인해 CLI에서 시작된 로컬 개발 서버에 대한 조작된 POST 요청을 통해 인증되지 않은 원격 코드 실행(RCE)이 허용되었습니다. 많은 개발자들이 디버깅이나 모바일 기기 테스트를 위해 메트로/개발 서버를 네트워크에 노출시키기 때문에, 근처에 있는 공격자(또는 해당 포트로 트래픽을 라우팅할 수 있는 사람)가 개발자의 컴퓨터에서 임의의 명령을 실행할 수 있습니다.
그 영향은 개발자 워크스테이션 하나에만 국한되지 않습니다. 공격자가 개발 환경에서 코드 실행 권한을 확보하면 기업 네트워크로 침투하여 자격 증명을 탈취하거나, 빌드를 악용하거나, 해당 환경에서 동기화되는 CI/CD 파이프라인을 조작할 수 있습니다. 이는 클라우드 연결 시스템에서 작업할 때 "단순한 로컬 개발 도구"가 어떻게 프로덕션 공격 표면의 일부가 될 수 있는지 보여주는 전형적인 사례입니다.
권장되는 완화 조치는 간단하지만 필수적입니다. React Native Community CLI 12.5.1 이상으로 업데이트하고, 개발 서버에서 의심스러운 POST 요청이나 예기치 않게 실행되는 프로세스에 대한 감사 로그를 확인하고, 로컬 서버에 대한 액세스를 제한하고, 개발 도구를 위협 탐지 전략에 통합하십시오. DevOps 또는 개발자 엔드포인트는 매우 가치 있는 공격 대상이므로, 항상 그렇게 취급해야 합니다.
수비진의 대응 방안: AI 분석, 쿨다운 시스템 및 강화된 CI
이러한 사례에서 긍정적인 측면은 보안 커뮤니티가 React Native 및 더 넓은 JavaScript 환경에 대한 공급망 위협을 탐지하는 데 있어 더욱 빠르고 정교해지고 있다는 것입니다. StepSecurity, Socket, Aikido Security와 같은 도구들은 행동 분석, 자동 차이점 비교, 그리고 새로운 npm 릴리스가 게시된 후 몇 분 안에 스캔하는 머신러닝 모델에 막대한 투자를 하고 있습니다.
AstrOOnauta 공격에서 StepSecurity의 AI 패키지 분석기는 5분 이내에 악성 버전을 탐지하고, 자세한 기술적 분석을 포함한 GitHub 이슈를 생성했으며, 이후 공격자가 악용한 인프라 패키지를 npm에 보고하여 제거하도록 했습니다. 해당 팀은 각 웨이브를 문서화하고, Git 헤드를 추적하고, 난독화된 코드를 분석하고, Solana C2 사용 증거를 제시하고, 유지 관리자에게 단계별 해결 지침을 제공했습니다.
탐지 기능을 넘어, 예방적 제어 기능이 CI 파이프라인에서 점차 주목받고 있습니다. 예를 들어, StepSecurity의 npm 패키지 쿨다운 검사(Package Cooldown Check)는 조직이 불과 몇 시간 전에 게시된 종속성을 차단하여 스캐너와 담당자가 검사할 시간을 확보할 수 있도록 합니다. 또한, 이들의 손상된 업데이트 검사(compromised-updates check)는 지속적으로 업데이트되는 악성 패키지 피드를 참조하여 해당 패키지를 추가하거나 업그레이드하려는 PR을 거부합니다.
Harden-Runner와 같은 네트워크 인식 도구는 GitHub Actions 및 기타 CI 작업에서 외부 연결을 예상되는 엔드포인트 허용 목록으로 제한합니다. 악성코드가 Solana RPC 노드, Google 캘린더 URL, Vultr IP 범위 또는 ICP 컨테이너에서 페이로드를 가져오는 세상에서 빌드 시스템에서 외부로의 접근을 차단하는 것은 단순한 패키지 변경 오류와 본격적인 침입 사이의 차이를 결정짓는 중요한 요소가 될 수 있습니다.
대응 측면에서는 조직 전체 패키지 검색 및 위협 센터와 같은 기능이 팀이 폭발 반경을 신속하게 파악하는 데 도움이 됩니다. 손상된 React Native 패키지 또는 플러그인이 발견되는 즉시 보안 팀은 해당 패키지나 플러그인이 포함된 저장소, 브랜치 및 잠금 파일, 해당 패키지를 실행한 작업, 의심스러운 IP 주소와 통신한 머신을 파악하고 수십 또는 수백 개의 코드베이스에 걸쳐 복구 우선순위를 정할 수 있습니다.
npm 멀웨어에 직면한 React Native 팀을 위한 실질적인 조치
React Native 개발자와 보안 엔지니어 모두에게 npm 수준의 공격으로부터 방어하는 것은 개별 머신의 위생 관리와 CI/CD 및 종속성 관리의 안전장치를 결합하는 것입니다. 단 하나의 제어만으로는 문제를 해결할 수 없지만, 다층적인 방어 체계를 구축하면 악성 패키지가 시스템 전체 침해로 이어질 가능성을 크게 낮출 수 있습니다.
앞서 언급된 손상된 패키지를 사용하는 경우 즉시 수행해야 할 몇 가지 점검 사항이 있습니다. AstroOOnauta 사건의 경우, 다음을 참고하세요. react-native-international-phone-number 버전에 0.11.7 react-native-country-select 에 0.4.0악성으로 표시된 모든 버전을 피하거나 해결되지 않는 경우 @latest 현재 해당 버전은 보안이 취약한 릴리스에 해당합니다.
홈 디렉터리에서 해당 이름의 파일을 찾아보세요. init.json 사용자 프로필 아래 (예: ~/init.json 유닉스와 ~\init.json (Windows의 경우). 해당 로그가 존재한다는 것은 Solana 기반 악성코드가 최소 한 번 이상 실행되었음을 시사합니다. 또한 개발자 워크스테이션과 CI 실행기의 외부 네트워크 로그에서 해당 연결에 대한 감사를 실시하십시오. 45.32.150.251캠페인에 사용된 Solana RPC 엔드포인트 또는 앞서 언급된 다른 C2 주소(예: 136.0.9[.]8, 85.239.62[.]36, 195.133.79.43, 217.69.3.152).
당신을 확인하십시오 node_modules 그리고 다음과 같은 명백한 종속성을 나타내는 잠금 파일 @agnoliaarisian7180/string-argv, @usebioerhold8733/s-format 그리고 악의적인 @react-native-aria/* or @gluestack-ui/utils 권고 사항에 나열된 버전입니다. 이러한 항목을 발견하면 해당 시스템이 잠재적으로 손상된 것으로 간주하고 모든 민감한 자격 증명(npm 토큰, GitHub 액세스 토큰, SSH 키, 클라우드 공급자 키 및 모든 비밀 키)을 주기적으로 교체하십시오. .env 또는 설치 시 구성 파일.
앞으로 React Native 개발을 위한 공급망 관리를 강화하십시오. 항상 잠금 파일을 커밋하고 적용합니다.package-lock.json, yarn.lock, pnpm-lock.yaml), 게시 권한이 있는 모든 npm 계정에 2FA를 활성화하고, 검토 없이 새 종속성이 나타날 경우 CI 빌드가 실패하도록 구성하십시오. 다음 환경에서 실행하는 것을 고려해 보세요. --ignore-scripts 신뢰할 수 없는 환경에 타사 패키지를 설치할 때 종속성 검사 도구를 로컬 워크플로와 CI 모두에 연동합니다.
마지막으로, 개발 환경, 특히 모바일, 웹 및 백엔드 API를 연결하는 React Native 앱에 사용되는 환경을 프로덕션 공격 표면의 일부로 간주해야 합니다. 계정 탈취를 통해 솔라나(Solana) 기반 악성코드를 휴대전화 입력 요소에 심는 위협이든, 오타를 이용해 변형된 Vite 플러그인이 React를 삭제하는 위협이든, node_modules클라이언트 측 스토리지를 뒤흔드는 악의적인 Quill 통합이나 React Native 커뮤니티 CLI의 원격 코드 실행(RCE) 취약점 등, 공통점은 공격자들이 이제 개발자 도구를 조직의 핵심 자산에 침투하는 가장 효율적인 경로 중 하나로 여긴다는 것입니다.

