악성 패키지
악성 패키지는 소프트웨어 공급망 공격을 수행하는 인기 있는 방법 중 하나로, 계속해서 증가하는 경향이 있습니다. 본 페이지에서는 악성 패키지가 무엇인지, Snyk이 이를 식별하는 방법, 그리고 고객이 프로젝트에 악성 패키지를 갖고 있을 때 해야 하는 일에 대해 설명합니다.
Snyk은 스캔된 패키지의 출처나 원천을 고려하지 않습니다. 일부 경우에는 스캔된 패키지의 생태계, 이름 및 버전이 악의적인 공개 패키지와 일치할 때 가짜 양성 결과를 감지할 수 있습니다.
패키지의 출처를 확인하십시오.
악성 패키지 소개
오픈소스 악성 패키지
오픈소스 악성 패키지는 공격을 수행하기 위해 악의적인 코드가 삽입된 패키지입니다. 이는 대상 네트워크에 감염을 유발하고, 패스워드 및 신용 카드 정보와 같은 민감한 정보를 탈취하며, 다운로드된 악성 코드 구성품에 의한 추가 악의적인 활동에 참여하는 것을 포함합니다.
악성 패키지는 npm, PyPI, NuGet, RubyGems 등의 인기있는 패키지 레지스트리에 정상적인 패키지로 게시됩니다.
악성 패키지 선별 과정
Snyk 보안 연구팀은 매일 수십 개의 데이터 소스를 확인하고 취약점을 식별, 악성 패키지를 포함하여 확인합니다.
이 프로세스는 지속적으로 개선되며, 잠재적인 위협을 적시에 식별하기 위해 새로운 도구 및 소스를 추가합니다.
악성 패키지에 대한 CVE ID 없음
보통 오픈소스 취약점은 CVE ID가 할당됩니다. 예를 들어, CVE-2021-44228와 같은 CVE ID가 있습니다. CVE ID는 Snyk와 같은 보안 업체가 공개적으로 공개된 취약점을 식별, 정의 및 카탈로그에 수록할 수 있도록 도와줍니다. 거의 모든 경우에 악성 패키지에는 CVE ID가 할당되지 않습니다. 이 식별자의 부재로 인해 보안 커뮤니티에 새로운 위협을 공유하는 것이 어려워집니다. Snyk은 패키지의 이름, 패키지 레지스트리(예: npm), 영향을 받는 버전 범위를 사용하여 악성 패키지를 공개 카탈로그에 수록하고 공유합니다.
악성 패키지 - CWE-506
Snyk 취약점 데이터베이스의 모든 악성 패키지는 CWE-506 - 임베디드 악성 코드로 표시됩니다.
CWE-506을 필터링하여 고객이 프로젝트 중에 악성 패키지가 있는지 빠르게 확인할 수 있습니다.
악성 패키지 심각도 - 중요
악성 패키지는 공격자가 대상 기기에서 원격 코드를 실행할 수 있게 합니다. 이러한 패키지는 신뢰할 수 없으며, 발견된 후 언제든지 악의적인 기능을 추가할 수 있습니다. 그러므로 Snyk은 악성 코드를 평가하고 (대부분의 경우) 중요한 심각도 수준을 부여합니다.
악성 패키지에 대한 조치안은 해당 패키지를 설치하지 않거나 이미 설치된 패키지를 제거하는 것입니다.
악성 패키지 공개 일정
악성 패키지는 식별되어 제거될 때까지 일부 경우에는 몇 분 동안만 공개적으로 이용 가능할 수 있습니다. 다른 경우에는 악성 패키지가 대상 공급망 감염 캠페인에 포함되어 있고 몇 달 또는 몇 년 동안 감지되지 않을 수 있습니다.
연구 및 방어 능력이 향상되는 동안, 공격자는 새로운 기술과 기술을 사용하여 연구 결과를 극복하려 합니다. 사용자는 지난 일 동안 악성 패키지가 통합되어 있었더라도 최근에 Snyk 조언이 발표되었음을 알 수 있습니다.
악성 패키지 유형
다양한 종류의 악성 패키지가 있으며, 신중한 해커들은 항상 새로운 유형을 개발합니다. 최근 공급망 캠페인을 살펴보면 다음의 공격 벡터 군을 관찰할 수 있습니다:
오타 스쿼팅 공격
악의적인 사람들은 사용자가 그것들을 설치하게 속일 수 있는 악성 패키지를 레지스트리에 게시합니다. 오타 스쿼팅 공격의 한 예로 crossenv가 있습니다. 공격자는 인기 있는 패키지 cross-env와 유사한 이름을 사용했고, 원본 모듈과 똑같은 기능까지 엮어 이 모듈이 예상대로 작동하는 것처럼 보이게 했습니다. 그러나 이 모듈은 환경 변수를 캡처하여 공격자가 제어하는 원격 서버로 보냈습니다.
의존성 혼란 공격
의존성 혼란 공격은 악의적인 사람들이 비공개 패키지 이름을 가진 악성 패키지를 공개 패키지 레지스트리에 업로드하는 전술입니다. 이로 인해 패키지를 가져오는 자동 프로세스(IDE, CI 등)가 의도한 비공개 패키지 대신 공개 패키지를 다운로드하도록 혼란이 발생합니다.
예를 들어, ACME 회사가 내부 UI 패키지를 개발하고 acme-ui
로 이름을 지었으며, 이를 비공개 패키지 레지스트리에 호스팅했습니다.
악성 사용자가 npm에 동일한 이름의 악의적인 패키지를 게시했습니다. ACME의 개발자는 개발 환경을 설정해 둔 상태가 아니라서 개인 저장소에서 패키지를 가져오지 않았습니다. 패키지를 설치하는 동안, 개발자는 비공개 패키지 대신 공개 레지스트리에서 acme-ui
패키지를 잘못 다운로드했으며 이로 인해 악의적 사용자가 개발자의 기기에서 코드를 실행한 성공적인 의존성 혼란이 발생했습니다.
의존성 선점
이 공격에서 개발자가 사용하는 패키지는 합법적인 공개 패키지이지만, 하향적으로 악성 패키지를 의존성으로 사용하고 있습니다. 이는 의존성 혼란 때문에 발생할 수 있습니다.
이 유형의 공격에 대한 더 자세한 내용은 npm 패키지 event-stream의 악성 코드 발견 문서에서 설명되어 있습니다.
탈취된 계정
악의적인 사람은 공개 패키지 유지자의 계정을 탈취하고 악성 코드를 패키지에 삽입할 수 있습니다.
이 유형의 공격에 대한 자세한 내용은 ESLint 패키지의 악성 버전 문서에서 설명되어 있습니다.
패키지 출처 확인
현재 Snyk Open Source와 Snyk Container 스캐너는 내부 및 외부 패키지를 구별할 수 없어 공개 또는 비공개 레지스트리에서 패키지가 가져와졌는지를 판별할 수 없습니다. 이 기능은 추후에 추가될 예정입니다. 그 동안 비공개 레지스트리에서 가져온 패키지와 관련된 부정확한 경고가 표시될 수 있습니다.
Snyk 경고는 기관을 대상으로 한 공격을 나타내는 것이지, 기관이 악성 코드를 발행했다는 것을 의미하는 것은 아닙니다.
여러 생태계에서 검증증명을 지원하기 시작했습니다. 예를 들어, 공개 npm 레지스트리는 패키지 출처를 확인하는 지원을 제공합니다. 보다 많은 유지자들이 이 기능을 채택하고 출처 세부 정보를 게시할수록 패키지 출처를 확인하는 방법이 더 안전하고 나아집니다. Snyk은 오픈소스 패키지 소비 전략에 이 기능을 지원할 준비를 시작하도록 권장합니다.
내부 패키지가 악성으로 표시될 수 있습니다. 이런 경우, 이는 비슷한 이름의 패키지가 악성 코드가 포함된 패키지로 공개 레지스트리에 게시되었으며, 개발자가 악의적인 공개 패키지를 가져오도록 만들기 위해 발행되었습니다. 이런 악성 패키지를 피하기 위해 항상 npm 레지스트리 출처를 확인하십시오.
npm의 악성 패키지 이해
JavaScript와 npm의 인기로 인해 대부분의 악성 패키지가 이 생태계를 대상으로 합니다.
다음 세부 사항을 이해하는 것이 중요합니다:
npm의 "안전 유지"
패키지에 대한 "안전 유지"는 해당 패키지가 악성 코드를 포함하고 있었고, npm 보안팀에 의해 레지스트리에서 삭제된 것을 의미합니다. 미래에 사용자가 영향을 받지 않도록 패키지를 삭제함을 확인하기 위해 보안을 유지하는 플레이스홀더가 발행되었습니다. 현재 패키지가 "안전 유지" 플레이스홀더에 있는 상태라도 이 플레이스홀더에 표시되기 전에 npm에서 가져왔는지 확인하는 것이 중요합니다. 이 패키지의 모든 경우가 개인 레지스트리에서 다운로드되었음을 확인한 후 문제를 무시할 수 있습니다.
Snyk 취약점 데이터베이스에서도 패키지를 "안전 유지" 상태로 표시합니다. 예를 들어, flatmap-stream 패키지가 있습니다.
npm에서 사용할 수 없는 악성 패키지 및 "보안 유지 없음"
패키지가 npm에서 공개적으로 사용 가능했지만 소유자에 의해 삭제되어 현재 사용할 수 없는 경우가 있습니다. 특정 조건에서는 이로 인해 패키지 페이지가 사용할 수 없으나 한때 사용된 것을 볼 수 있습니다. 이름은 여전히 새로운 환생에서의 내용이 안전할 것을 보장하지 않고 다시 사용될 수 있습니다.
이런 경우 패키지를 다운로드한 경로에 대해 특히 조심해야 합니다. 문제를 완전히 무시하면 나중에 악의적인 사용자가 패키지를 다시 npm에 게시하는 경우에 문제가 발생할 수 있습니다.
npm 레지스트리 출처 확인
공개 레지스트리 또는 비공개 레지스트리를 사용하는지 확인하려면 다음 옵션을 사용할 수 있습니다:
npm에서 비공개 패키지 사용
Last updated