"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > string-width-cjs npm 패키지의 신비한 공급망 문제

string-width-cjs npm 패키지의 신비한 공급망 문제

2024-11-07에 게시됨
검색:597

이 이야기는 React 기반 오픈 소스 문서 프로젝트인 Docusaurus의 관리자인 Sébastien Lorber가 패키지 매니페스트에 대한 Pull Request 변경 사항을 발견하면서 시작됩니다. 인기 있는 cliui npm 패키지에 제안된 변경 사항은 다음과 같습니다.

The mysterious supply chain concern of string-width-cjs npm package
특히, 익숙하지 않은 구문을 사용하는 npm 종속성 변경에 주의를 환기시킵니다.


  "dependencies": {
    "string-width": "^5.1.2",
    "string-width-cjs": "npm:string-width@^4.2.0",
    "strip-ansi": "^7.0.1",
    "strip-ansi-cjs": "npm:strip-ansi@^6.0.1",
    "wrap-ansi": "^8.1.0",
    "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0"


대부분의 개발자는 패키지 값이나 Git 또는 파일 기반 URL에서 semver 버전 범위를 볼 것으로 예상합니다. 하지만 이 경우 특별한 npm: 접두사 구문이 있습니다. 무슨 뜻인가요?

npm 패키지 별칭이란 무엇입니까?

npm 패키지 관리자는 패키지에 대한 사용자 정의 해결 규칙을 정의할 수 있는 패키지 별칭 기능을 지원합니다. 따라서 패키지가 참조되는 곳마다 코드나 잠금 파일을 통해 별칭에 지정된 이름과 버전으로 확인됩니다.

따라서 이 풀 요청에서 제안된 변경의 경우 string-width-cjs 패키지는 ^4.2.0 버전의 string-width 패키지로 확인됩니다. 이는 string-width-cjs에 대한 node_modules 디렉터리 항목이 있지만 string-width@^4.2.0의 내용과 잠금 파일(package-lock.json)의 유사한 동작을 포함함을 의미합니다.

패키지 별칭은 ESM과 CJS를 지원하는 경우에 사용할 수 있는 npm 패키지 관리자 기능입니다.

그렇다면 패키지 별칭은 남용될 수 있습니다. Snyk 대사인 Nishant Jain은 2021년으로 거슬러 올라가는 기사 및 보안 공개에서 어떻게 공식 npmjs 레지스트리를 속여 종속성 혼란 및 공급망 보안 문제의 일환으로 패키지 별칭을 기반으로 종속성 정보를 잘못 알릴 수 있는지 보여주었습니다.

풀 요청은 무해했으며 공급망 공격의 위험이 없었습니다. 그러나 패키지 이름에 대한 Sébastien의 우려로 인해 잠재적인 보안 위험이 발견되었습니다.

악성 모듈과 관련된 npm 잠금 파일에서 의심스러운 동작 발견

풀 요청을 검사하기 위해 Sébastien은 lockfile-lint를 사용했습니다. 이 도구는 package-lock.json 또는 Yarn.lock과 같은 잠금 파일에서 변조 징후를 확인하여 원래 npm 패키지 대신 악성 패키지가 삽입되지 않았는지 확인합니다.

도구를 실행하면 다음 경고가 표시됩니다.


npx lockfile-lint --path package-lock.json --allowed-hosts yarn npm --validate-https --validate-package-names

detected resolved URL for package with a different name: string-width-cjs
    expected: string-width-cjs
    actual: string-width

detected resolved URL for package with a different name: strip-ansi-cjs
    expected: strip-ansi-cjs
    actual: strip-ansi

detected resolved URL for package with a different name: wrap-ansi-cjs
    expected: wrap-ansi-cjs
    actual: wrap-ansi

 ✖ Error: security issues detected!



면책 조항: lockfile-lint는 잠금 파일의 보안 문제를 공개한 출판물에 이어 2019년에 개발한 도구입니다. 왜 npm 잠금 파일이 악성 모듈 주입의 보안 맹점이 될 수 있는지.

높은 경고: npm에서 유사하게 보이는 인기 패키지

위의 lockfile-lint 결과를 바탕으로 Sébastien은 npm에서 이러한 패키지 이름을 검색한 후 놀랍게도 이러한 패키지 이름이 공개 npm 레지스트리에 존재한다는 사실을 발견했습니다.

  • https://www.npmjs.com/package/string-width-cjs
  • https://www.npmjs.com/package/strip-ansi-cjs
  • https://www.npmjs.com/package/wrap-ansi-cjs

Sébastien은 이러한 패키지 이름이 npm에만 존재하는 것이 아니라 의심스러운 특성을 나타내는 것을 관찰했습니다. 패키지는 공개 소스 코드 저장소에 연결되지 않았고 검사 시 실제 코드가 비어 있었으며 관련 개인 정보 없이 익명으로 게시되었습니다.

npm 패키지 Strip-ansi-cjs를 보면 README나 소스 코드 저장소가 없습니다. 그러나 동일한 동작을 인용하는 합법적이고 인기 있는 패키지가 많이 있습니다.

사실 이 특정 패키지는 529개의 종속 항목(이 패키지에 의존하는 다른 패키지)과 7,274개의 주간 다운로드를 통해 알 수 있듯이 인기가 높습니다.

The mysterious supply chain concern of string-width-cjs npm package
Strip-ansi-cjs에 대한 코드를 보면 이 패키지에는 패키지 매니페스트 package.json 파일이 하나만 있다는 것을 알 수 있습니다.

그렇다면 아무 작업도 하지 않는 패키지가 그렇게 많은 다운로드를 받는 이유는 무엇이며, 왜 그렇게 많은 패키지가 이에 의존합니까?

The mysterious supply chain concern of string-width-cjs npm package
이 npm 패키지의 작성자를 살펴보겠습니다.

세 ​​가지 패키지는 모두 Himanshutester002의 소유이며 해당 패키지는 모두 작년에 프로그래밍 버전 번호와 함께 게시되었습니다. 언급해야 할 몇 가지 흥미로운 관찰 사항:

  • isaacs-cliui npm 패키지는 잠재적으로 Isaac의 cliui 프로젝트 포크와 네임스페이스 @isaacs/cliui.
  • 에 있는 합법적인 npm 패키지에 대한 타이포스쿼팅 시도입니다.
  • azure-sdk-for-net npm 패키지는 잠재적으로 동일한 이름의 프라이빗 패키지를 공격하기 위한 종속성 혼란 캠페인을 시도합니다.
  • link-deep npm 패키지는 lodash 및 기타 유틸리티 패키지와 관련된 인기 있는 기능을 사용하고 있습니다.

The mysterious supply chain concern of string-width-cjs npm package
또한 사용자 himanshutester002는 npmjs의 이 사용자 프로필 페이지에 식별 가능한 정보가 없다는 점을 참고할 수 있습니다.

우리는 이전에 Strip-ansi-cjs npm 패키지가 이를 사용하는 500개 이상의 다른 패키지를 가지고 있으므로 잠재적으로 인기를 나타내는 긍정적인 지표라는 점을 언급했습니다. 살펴보겠습니다:

The mysterious supply chain concern of string-width-cjs npm package
목록에 포함되어 있기 때문에 신뢰할 수 있는 것처럼 보일 수 있지만, 정말 그럴까요?
예를 들어 clazz-transformer, React-native-multiply 또는 gh-monoproject-cli와 같은 이름은 합법적인 것처럼 보이지만 과연 그럴까요?

여기는 React-native-multiply npm 패키지 페이지입니다:

The mysterious supply chain concern of string-width-cjs npm package
이 패키지에는 사실상 다운로드가 없으며 작성자는 식별 가능한 정보가 없는 익명의 npm 사용자입니다. 이 패키지가 리디렉션되는 소스 URL 저장소는 존재하지 않는 https://github[.]com/hasandader/react-native-multiply입니다. GitHub 사용자 프로필도 매우 의심스러워 보이며 실제적인 활동이 부족합니다.

npm 패키지에는 소스 코드가 포함된 것처럼 보이지만 자세히 살펴보면 "hello world" 애플리케이션 프로토타입을 위해 생성된 코드 샘플임을 알 수 있습니다.

The mysterious supply chain concern of string-width-cjs npm package
또한 이 패키지가 단지 곱셈 라이브러리라면 다음을 수행하기 위해 왜 776개의 종속성이 필요한지 궁금해야 합니다.


import { multiply } from 'react-native-multiply';
const result = await multiply(3, 7);


JavaScript가 과도한 종속성 사용을 통해 천문학적인 중첩 패키지 트리에 기여한다는 농담이 있지만, 776개의 직접 종속성이 있는 프로젝트는 비합리적으로 큽니다.

이러한 모든 종속성 중에는 우리 이야기가 시작된 의심스러운 npm 패키지 3개가 있습니다: string-width-cjs, Strip-ansi-cjs 및 Wrap-ansi-cjs:

The mysterious supply chain concern of string-width-cjs npm package
우리는 Strip-ansi-cjs 종속성 중 하나의 이름이 clazz-transformer라고 언급했습니다. 살펴보겠습니다:

The mysterious supply chain concern of string-width-cjs npm package
여기서 무슨 일이 일어나고 있는지 설명해 보겠습니다. ​​npm 패키지 clazz-transformer의 이름은 README 페이지에서 의도적으로 class-transformer라는 제목으로 잘못 지정되었습니다. 또한 소스 코드 저장소인 https://github[.]com/typestack/class-transformer는 패키지 이름과 상관 관계가 없으므로 적법성에 대한 우려를 불러일으킵니다.

GitHub에 있는 관련 저장소의 typstack/class-transformer에는 다음과 같은 package.json 파일이 있습니다.

The mysterious supply chain concern of string-width-cjs npm package
GitHub의 package.json 파일에는 종속성 선언이 표시되지 않지만 npmjs에서 실제 패키지의 소스 코드를 검사하면 이 clazz-transformer가 패키징된 437개의 종속성을 볼 수 있습니다. 다시 말하지만, 의심스러운 *-cjs 패키지 3개를 매우 편리하게 번들로 묶었습니다.

The mysterious supply chain concern of string-width-cjs npm package

의심스러운 npm 패키지 발견에 대한 추가 생각

추가 결론을 내리기 전에 위에서 관찰한 npm 패키지의 몇 가지 특징을 언급하는 것이 중요합니다.

  • React Native 패키지는 create-react-native-library 스캐폴드 도구에서 파생된 것 같습니다. 이 도구는 또한 새 프로젝트를 위해 생성된 스톡 소스 코드의 일부로 기본 곱셈 함수 예제를 제공합니다.
  • 패키지는 npx create-next-app@14로 생성된 것과 같이 Next.js 14 시작 상용구에서 파생될 수 있는 디렉터리 및 파일 구조와 종속성을 갖습니다.

Sonatype의 동료들은 이전에 오픈 소스 레지스트리에 패키지가 넘쳐나는 유사한 사례를 확인했습니다. 이 경우 궁극적인 목표는 개발자가 오픈 소스 소프트웨어로 수익을 창출하기 위한 Web3 플랫폼인 Tea 토큰으로 스스로에게 보상하는 것이었습니다.

언급된 패키지에서 일부 tea.yaml 파일을 찾는 것은 이 캠페인의 목적 중 일부가 Tea의 오용을 통해 Tea 토큰을 채굴하는 것이라는 주장을 더욱 뒷받침합니다.

올해 초 2024년 4월 14일, 차 포럼 사용자는 차 남용에 대한 우려를 더욱 뒷받침하는 댓글을 게시했습니다.

The mysterious supply chain concern of string-width-cjs npm package
결론을 내리기 전에 신중한 유지 관리 사고방식과 잠재적인 npm 공급망 공격 스레드를 공개하는 데 도움을 준 Sébastien Lorber에게 진심으로 감사드립니다.

string-width-cjs에 무슨 일이 일어나고 있나요?

이 시점에서 나는 string-width-cjs에 의존하는 것으로 추정되는 나머지 패키지에 계속해서 구멍을 뚫어 진짜 적법성에 대한 매우 모호한 지표를 찾을 수 있다는 높은 확신을 갖고 있습니다.

이러한 모든 종속 패키지와 다운로드 부스트가 3개의 *-cjs 패키지에 대한 잘못된 합법성을 생성하려는 유일한 목적으로 이어진다고 가정합니다. 따라서 적절한 피해자가 등장하면 이러한 가짜 패키지가 설치한 다음 새로운 악성 버전을 따르세요.

오픈 소스 소프트웨어로 작업하는 동안 보안을 유지하려면 보안 관행, 특히 다음 후속 교육 리소스를 채택하는 것이 좋습니다.

  • npm 잠금 파일이 악성 모듈 주입의 보안 사각지대가 될 수 있는 이유
  • 10 npm 보안 모범 사례
  • NPM 보안: 공급망 공격 방지

저희가 그들의 반칙 행위 중에 공급망 보안 캠페인을 포착했나요? 아니면 이것이 모두 돈 추적에 관한 것이며 따라서 Tea 토큰을 채굴하기 위해 npm 및 GitHub와 같은 공공 레지스트리를 스팸 및 남용했기 때문일 수 있습니까?

그러나 이 일이 어떻게 전개되든 경계를 늦추지 마십시오.

릴리스 선언문 이 기사는 https://dev.to/snyk/the-mysterious-supply-chain-concern-of-string-width-cjs-npm-package-j96?1에서 복제됩니다. 침해가 있는 경우, Study_golang에 문의하세요. @163.com 삭제
최신 튜토리얼 더>

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3