27,000 다운로드 npm 패키지, 은밀히 OpenAI 토큰 탈취
악성 npm 패키지 codexui-android는 설치한 개발자들로부터 알 수 없는 기간 동안 은밀히 OpenAI 인증 토큰을 탈취했습니다. 주간 다운로드 약 27,000건을 기록하며, 이 패키지는 OpenAI의 Codex 모델을 위한 합법적인 사용자 인터페이스인 것처럼 가장했습니다. 그 익숙한 외관 아래에는 보안 연구원들이 현재 대규모 OpenAI 토큰을 겨냥한 표준적인 npm 공급망 공격으로 분류하는 은밀한 자격 증명 수집 작전이 진행되고 있었습니다.
이 발견은 패키지 레지스트리가 본질적으로 안전하지 않으며, 인기 자체가 신뢰성의 지표가 될 수 없다는 점을 다시 한 번 상기시켜 줍니다.
codexui-android가 어떻게 합법적으로 보이는 패키지 안에 토큰 탈취를 숨겼는가
이 공격은 단순하지만 효과적인 속임수에 의존했습니다. 개발자들이 실제로 사용하고 싶은 도구를 만든 다음, 백그라운드에서 은밀하게 실행되는 악성 로직을 추가하는 것입니다. codexui-android 패키지는 OpenAI의 Codex를 위한 기능적 인터페이스를 제공했기 때문에, 개발자들은 네트워크 계층에서 패키지가 무엇을 하는지 의심하지 않고 설치하고 테스트한 뒤 프로젝트에 유지했습니다.
이러한 접근 방식은 트로이 목마화된 패키지 공격으로 알려져 있습니다. 악성 코드가 유용한 도구처럼 보이는 것 안에 내장되어, 명백히 작동하지 않거나 부실하게 만들어진 패키지가 불러일으킬 자연스러운 의심을 피해갑니다. 이 패키지는 사용자가 다시 로그인하지 않아도 애플리케이션이 새 액세스 토큰을 요청할 수 있게 해주는 수명이 긴 자격 증명인 OpenAI 리프레시 토큰을 유출했습니다.
codexui-android라는 이름 또한 합법성을 암시하는 명명 규칙을 따랐습니다. OpenAI의 Codex 제품에서 브랜드 자산을 차용하면서, 특정 목적의 모바일 관련 도구인 것처럼 보이게 하는 플랫폼 특화 접미사를 추가했습니다. Codex 관련 도구를 찾기 위해 npm을 검색한 개발자라면 이를 의심할 명백한 이유가 없었을 것입니다.
탈취된 OpenAI 리프레시 토큰이 실제로 공격자에게 허용하는 것
리프레시 토큰은 단순한 비밀번호가 아닙니다. 많은 인증 시스템에서 이는 사실상 마스터 키입니다. 공격자가 유효한 리프레시 토큰을 획득하면, 원래 세션이 종료되거나 비밀번호가 변경된 후에도 새 액세스 토큰을 반복적으로 생성하여 계정에 지속적으로 접근할 수 있습니다.
OpenAI 계정의 경우, 이러한 접근은 유료 API 크레딧의 무단 사용, 저장된 프롬프트나 미세 조정된 모델 데이터에 대한 접근, API를 통해 전달된 독점 코드의 잠재적 노출, 그리고 조직 환경에서는 동일한 계정에 연결된 팀 리소스로의 수평 이동으로 이어질 수 있습니다.
개발자 환경에서는 위험이 빠르게 복합적으로 증가합니다. 엔지니어들은 자주 높은 권한을 가진 API 키와 토큰을 다룹니다. CI/CD 파이프라인이나 공유 개발 환경에서 단일 리프레시 토큰이 침해되면 공격자에게 탐지하기 어렵고 완전히 복구하기도 힘든 지속적인 거점을 제공할 수 있습니다. 이러한 연쇄 효과는 Dropbox Sign 침해 사건에서 탈취된 자격 증명이 최초 침해 지점을 훨씬 넘어 상호 연결된 시스템으로의 경로를 열었던 것과 유사합니다.
npm 생태계가 공급망 공격을 대규모로 쉽게 만드는 이유
npm 레지스트리는 200만 개가 넘는 패키지를 호스팅합니다. 새 패키지를 게시하는 데에는 최소한의 신원 확인만 필요하며, 레지스트리의 개방형 특성은 전 세계 개발 커뮤니티에 매우 유용하게 작용하는 바로 그 이유입니다. 또한 이는 공급망 공격자들의 반복적인 표적이 되는 이유이기도 합니다.
codexui-android 사례는 공격자들이 오픈소스 개발을 뒷받침하는 신뢰 모델을 어떻게 악용하는지 보여줍니다. 개발자들은 일반적으로 다운로드 수가 상당한 패키지가 어느 정도의 커뮤니티 검증을 거쳤을 것이라고 가정합니다. 이 가정은 점점 더 위험해지고 있습니다. 다운로드 수는 인위적으로 부풀려질 수 있으며, 실제 사용량이 보안 검토와 동일한 것은 아닙니다.
더 광범위한 npm 공급망 공격 문제는 새로운 것이 아니지만, AI 도구를 표적으로 삼은 것은 진화를 의미합니다. 개발자들이 대규모 언어 모델 API를 프로덕션 시스템에 통합함에 따라, 그러한 통합을 인증하는 토큰이 고가치 표적이 됩니다. 공격자들은 이러한 변화를 분명히 인지하고 있습니다. AI 개발자 도구를 모방한 패키지들은 보안 커뮤니티가 대규모로 대응 방법을 아직 고심 중인 새로운 위협 범주입니다.
개발자를 위한 심층 방어: 자격 증명 격리, 네트워크 세분화, 그리고 그 너머
codexui-android 사건은 이러한 부류의 공격에 대한 노출을 줄일 수 있는 몇 가지 구체적인 관행을 지목합니다.
자격 증명 격리가 가장 즉각적인 완화책입니다. API 토큰과 리프레시 토큰은 가능한 한 범위를 좁게 지정하고, 환경 변수나 설정 파일 대신 비밀 관리자에 저장하며, 정기적으로 교체해야 합니다. 토큰이 도난당하더라도 제한된 범위는 제한된 피해를 의미합니다.
의존성 감사는 모든 개발 워크플로의 표준이 되어야 합니다. npm audit과 서드파티 소프트웨어 구성 분석 플랫폼은 비정상적인 동작이나 알려진 취약점이 있는 패키지를 표시할 수 있습니다. 패키지 잠금 파일에 의존성 버전을 고정하고 업데이트를 수락하기 전에 변경 사항을 검토하는 것 또한 악의적인 버전 푸시에 대한 노출을 줄입니다.
네트워크 송신 모니터링은 감사 도구가 놓치는 유출 시도를 포착할 수 있습니다. 개발 환경이나 CI/CD 파이프라인이 예상치 못한 아웃바운드 연결에 대해 경고하도록 구성되어 있다면, 훔친 토큰을 가지고 본거지에 접속하려는 패키지를 탐지할 수 있게 됩니다.
최소 권한 원칙은 모든 수준에서 적용됩니다. 개발 머신은 프로덕션 수준의 접근 권한을 부여하는 자격 증명으로 실행되어서는 안 됩니다. CI/CD 파이프라인은 장기 저장된 비밀보다는 런타임에 생성된 수명이 짧은 토큰을 사용해야 합니다.
마지막으로, 지금 당장 인증 흐름과 관련된 모든 것을 건드리는 설치된 패키지를 검토하는 것은 가치 있는 작업입니다. codexui-android 사건이 고립된 사례일 가능성은 낮습니다. node_modules 안에 무엇이 있는지 감사하고, API 토큰이 어떤 권한을 가지고 있는지 확인하며, 자격 증명 저장소와 접촉하는 모든 패키지를 한층 강화된 주의를 기울여 다루십시오.
공급망 공격은 대규모로 신뢰를 악용하기 때문에 성공합니다. 가장 민감한 자격 증명부터 시작하여 하나의 의존성씩 그러한 보안 태세를 재구축하는 것이 오늘날 개별 개발자들이 취할 수 있는 가장 실용적인 대응입니다.




