🇰🇷 한글 설명
use-reducer-async 패키지의 기본 브랜치에 2026-05-18 16:29:52부터 2026-05-19 15:26:07 사이 악성 커밋이 포함되었습니다. 이 커밋들은 npm install 실행 시 개발자 PC에서 원격 공격자 제어 코드를 실행했으며, 현재는 force-push로 제거되었지만 로컬 클론, 포크, 직접 SHA URL에는 남아 있을 수 있습니다. 해당 패키지는 npm에 배포되지 않았습니다.
💡 쉬운 설명
이 패키지의 특정 기간 소스 코드를 설치할 때, 공격자가 보낸 프로그램이 개발자 컴퓨터에서 몰래 실행될 수 있었습니다. 해당 기간에 설치했다면 컴퓨터와 그 컴퓨터에 저장된 계정 정보를 침해된 것으로 간주해야 합니다.
🇺🇸 원문 (English)
use-reducer-async is a React useReducer with async actions. Between 2026-05-18 16:29:52 and 2026-05-19 15:26:07, the default branch contained malicious commits da72edbde5705efcec6c62e0a3dcb73687b78dc8 through df07d5711458d8b46e11dd7afaaa21e88cafabfb that executed remote attacker-controlled code on developer machines during `npm install`. The commits were removed by force-push, but local clones, forks, and direct-SHA URLs may still contain them, and `npm install` against an affected checkout will still execute the code today. The package was not published to npm. `src/install.js` was added and wired into the `postinstall` script. It fetched a JavaScript payload from an attacker-controlled HTTPS endpoint (configurable via an environment variable), disabled TLS verification, and evaluated the response as code with `require` available. Execution was deliberately skipped on CI and cloud/serverless environments, targeting developer workstations. The second-stage payload was attacker-hosted and cannot be reconstructed. Assume full compromise of anything reachable from a Node process with the user's permissions. Those who ran `npm install` against an affected checkout on a developer machine on or after 2026-05-18 16:29:52 should treat the machine as compromised, rotate every credential the machine could reach, audit account activity since 2026-05-18 16:29:52, and clean local clones.
📍 영향받는 시스템
2026-05-18 16:29:52 이후 악성 커밋이 포함된 use-reducer-async 소스를 npm install로 설치한 개발자 워크스테이션 (npm 배포본은 영향 없음)
⚔️ 공격 벡터
postinstall 스크립트(src/install.js)가 공격자 HTTPS 엔드포인트에서 TLS 검증 없이 JavaScript를 받아 require 권한과 함께 eval 실행
🛡️ 대응 방법
해당 기간 설치 이력이 있는 장비는 침해된 것으로 보고 접근 가능한 모든 자격증명을 교체하고, 2026-05-18 16:29:52 이후 계정 활동을 감사하며, 로컬 클론을 삭제 후 재클론
🔧 검증 코드
COMPROMISED_COMMIT_PRESENT가 출력되면 악성 커밋이 로컬 저장소에 남아 있으므로 해당 클론을 삭제하고 침해 여부를 점검하세요. not_found_locally가 출력되면 이 커밋은 없지만 다른 커밋(df07d5711458d8b46e11dd7afaaa21e88cafabfb 등)도 함께 확인하세요.
cd "$(git rev-parse --show-toplevel 2>/dev/null || pwd)" && git cat-file -e da72edbde5705efcec6c62e0a3dcb73687b78dc8 2>/dev/null && echo COMPROMISED_COMMIT_PRESENT || echo not_found_locally