종속성
npm audit
npm audit은 프로젝트의 패키지를 알려진 보안 권고와 대조해 발견한 내용을 보고합니다. npm에 기본 포함되어 있고, 비용이 들지 않으며, 몇 초면 끝나므로 가장 손쉽게 실행할 수 있는 SCA 스캔입니다. 무엇을 읽는지 알면 무엇을 놓칠 수 있는지도 알 수 있습니다.
업데이트
npm audit의 작동 방식
npm audit은 프로젝트 종속성에 대한 설명을 기본 레지스트리로 보내 알려진 취약점을 조회합니다.
어떤 버전을 사용하는지 알아야 하므로 package-lock.json 또는 shrinkwrap 파일이 필요합니다.
자세한 내용은 npm 문서를
참조하세요.
npm audit # report everything
npm audit --omit=dev # skip dev dependencies
npm audit --audit-level=high # fail only on high or critical
npm audit --json # machine-readable output
보고서 읽는 법
- 심각도는 권고에서 가져옵니다. 결함이 일반적으로 얼마나 심각한지를 나타낼 뿐, 여러분에게 얼마나 심각한지를 나타내지는 않습니다.
- 종속성 경로는 무엇이 그 패키지를 끌어왔는지 보여 줍니다. 대부분의 발견 사항은 전이적 종속성이며, 수정은 대개 그 위의 패키지에서 이뤄집니다.
- 개발용인가 프로덕션용인가. 테스트 도구의 결함은 사용자에게 배포되지 않지만, 빌드 안에서는 여전히 실행되므로 완전히 무시해서는 안 됩니다.
목록이 길다면 실제로 악용되고 있는 것과 배포되는 것부터 시작하세요. 취약점 우선순위를 정하는 방법을 참조하세요.
npm audit fix, 그리고 강제로 실행하지 말아야 할 때
| 명령 | 하는 일 | 위험 |
|---|---|---|
npm audit fix |
지정한 버전 범위 안에서 호환되는 업데이트를 적용 | 낮음. 전체 설치를 실행하므로 그래도 테스트는 실행하세요 |
npm audit fix --force |
메이저 버전을 포함해 범위를 벗어나는 변경도 허용 | 높음. 애플리케이션이 깨질 수 있으며, npm은 원하는 결과가 분명하지 않다면 사용하지 말라고 안내합니다 |
수정 버전이 없다면 상위 패키지를 업그레이드하거나, overrides 필드를 package.json에 추가해
패치된 전이적 버전을 강제할 수 있습니다. 상위 패키지는 그 버전을 기준으로 빌드되지 않았으므로 반드시
테스트하세요.
CI에서 npm audit 실행하기
기본적으로 npm audit은 무엇이든 발견하면 0이 아닌 종료 코드를 반환하므로, 심각도가 낮은 권고 하나에도
작업이 실패합니다. 그래서 팀들은 대개 임계값을 설정합니다. --audit-level은 실패 임계값만 바꿀 뿐
보고서를 걸러 내지는 않는다는 점에 유의하세요.
- run: npm ci
- run: npm audit --omit=dev --audit-level=high
이런 검사는 밤사이 새 권고가 게시되었다는 이유만으로 코드 변경 없이도 빌드를 실패시킬 수 있습니다. 켜기 전에 그 실패를 누가 책임질지 정하세요. 자세한 내용은 SCA 스캔을 어디에서 실행할지를 참조하세요.
npm audit이 놓치는 것
-
npm 바깥의 모든 것. 베이스 이미지, 운영체제 패키지, Python 도구, GitHub Actions는
package-lock.json에 없습니다. - 설치 중에 가져오는 코드. 설치 스크립트는 어떤 잠금 파일에도 기록되지 않는 파일을 내려받을 수 있습니다. 잠금 파일이 기록하지 않는 것을 참조하세요.
- 새로운 악성 패키지. 게시된 권고와 대조하므로, 아직 권고가 없는 패키지는 문제없이 통과합니다.
- 이미 출시된 것. 눈앞의 프로젝트에 대해서만 보고합니다. 작년 릴리스에 대한 새 권고는 누군가 그 버전에서 다시 실행해야만 나타납니다.
- 실제로 영향을 받는지 여부. 코드가 취약한 함수를 사용하는지는 알지 못합니다. 도달 가능성 분석이 이 문제를 다룹니다.
npm audit signatures는 설치한 패키지의 레지스트리 서명과 출처 증명을 검증하는 별도의
명령입니다. 패키지가 어디서 왔는지를 확인할 뿐, 안전한지를 확인하지는 않습니다.
npm audit과 CRACI
풀 리퀘스트에서는 계속 npm audit을 실행하세요. 무료이며 알려진 문제를 일찍 잡아 줍니다. CRACI는
npm audit이 볼 수 없는 것을 다룹니다. GitHub Actions 러너로서 각 작업이 npm과 그 밖의 모든 소스에서 실제로 가져온
모든 패키지를 기록하며, 여기에는 CI 캐시에서 복원된 패키지와 설치 훅이 가져온 파일도 포함됩니다. 그리고 새 취약점이
게시될 때마다 출시된 것의 SBOM을 계속 검사합니다.
최고의 SCA 도구 또는
빌드 시점 SBOM 생성을 참조하세요.
npm audit: 자주 묻는 질문
npm audit은 무엇을 합니까?
종속성에 대한 설명을 npm 레지스트리로 보내 알려진 보안 권고와 대조하고, 취약한 패키지가 있으면 심각도와 프로젝트에 들어온 경로를 함께 보고합니다.
npm audit fix는 안전합니까?
옵션 없는 npm audit fix는 버전 범위 안에서만 동작하므로 대개 안전하지만, 실행 후 테스트는 하세요. npm audit fix --force는 새 메이저 버전을 설치할 수 있어 애플리케이션이 깨질 수 있습니다.
npm audit에 취약점이 왜 그렇게 많이 나옵니까?
대부분은 전이적 종속성과 개발 도구에서 나옵니다. --omit=dev로 배포되는 것에 집중하고, 개수가 아니라 악용 여부와 노출 정도로 우선순위를 정하세요.
npm audit에서 취약점을 무시하려면 어떻게 합니까?
npm audit에는 기본 무시 목록이 없습니다. 팀들은 overrides 필드로 버전을 바꾸거나, --audit-level로 임계값을 정하거나, 수용한 발견 사항을 기록하는 래퍼 도구를 사용합니다.
npm audit에 잠금 파일이 필요합니까?
예. 기본적으로 package-lock.json 또는 shrinkwrap 파일이 필요합니다. --no-package-lock으로 우회할 수 있지만, 그러면 실행할 때마다 결과가 달라질 수 있습니다.
npm audit이 멀웨어를 탐지합니까?
해당 패키지에 대한 권고가 게시된 뒤에만 탐지합니다. 새로운 악성 패키지에는 권고가 없으므로, 등장한 당일에는 보고되지 않습니다.
npm audit이 볼 수 없는 것을 확인하세요
GitHub Actions 워크플로 하나를 CRACI에서 실행하고, 기록된 SBOM을 package-lock.json과 비교해 보세요.
데모 예약