설명
의존성을 HTTP 또는 FTP 같은 암호화되지 않은 프로토콜로 다운로드할 때 발생하는 취약점입니다. 전송 구간이 암호화·인증되지 않아 MITM(Man-in-the-Middle) 공격으로 아티팩트가 변조될 수 있습니다. 공격자는 동일 네트워크, 악성 프록시/DNS 스푸핑, 또는 감염된 미러 서버를 통해 의존성 파일(tarball 등)을 악성 파일로 바꿔치기하여 빌드/설치 단계에서 임의 코드 실행을 유도할 수 있습니다.
잠재적 영향
- 임의 코드 실행: 공격자가 변조된 패키지나 설치 스크립트를 통해 빌드/설치 시점에 악성 코드를 실행할 수 있음
- 공급망 오염(Supply Chain Compromise): 오염된 의존성이 제품 바이너리에 포함되어 배포·운영 환경까지 침투할 수 있음
- 빌드 무결성 손상: 빌드 산출물이 신뢰할 수 없게 되어 릴리스 신뢰 체인이 붕괴됨
- 데이터 유출/변조: 전송 중 평문으로 노출된 메타데이터나 아티팩트가 탈취·변조될 수 있음
해결 방법
- 전송 보호: npm의 tarball URL은 HTTPS를 사용하고, Git 의존성은 지원되는 HTTPS 또는 검증된 SSH 연결을 사용하세요.
- 직접 URL 지양: 가능하면 공식 registry(npm registry 등)의 버전 범위를 사용하고, 외부 직접 URL 참조를 줄이세요.
- TLS 검증 강제: .npmrc 등에서 strict-ssl=true, registry를 https로 설정하고, 내부 아티팩트 서버는 유효한 인증서와 적절한 TLS 설정을 사용하세요.
- 무결성 검증: 검토한
package-lock.json또는npm-shrinkwrap.json을 커밋하고 CI에서npm ci를 사용하세요. 잠금 파일의integrity검증은 기록된 아티팩트와 일치하는지 확인하며, 그 아티팩트 자체의 신뢰성을 보장하지는 않습니다. - 체크섬/서명 확인: 제공되는 경우 아티팩트의 checksum 또는 서명(GPG 등)을 신뢰한 값이나 키로 검증하세요.
- CI 보안 정책: 빌드 환경에서 HTTP 아웃바운드를 차단하고, 허용된 도메인(allowlist)만 통신을 허용하세요.
- 설치 스크립트: CI에서는
npm config set ignore-scripts true를 검토하고, 필요한 스크립트만 별도로 허용하세요.
예시
변경 전
HTTP는 암호화되지 않은 다운로드를 보여 줍니다. FTP URL은 현재 npm에서 지원되지 않아 설치 오류가 날 수 있으며, 실제로 FTP 전송이 이뤄진다고 가정해서는 안 됩니다.
javascript
{
"name": "demo-app",
"version": "1.0.0",
"dependencies": {
"left-pad": "http://mirror.local/libs/left-pad-1.3.0.tgz",
"my-utils": "ftp://downloads.example.org/my-utils-2.1.0.tgz"
}
}
변경 후
package.json:
json
{
"name": "demo-app",
"version": "1.0.0",
"dependencies": {
"left-pad": "^1.3.0",
"my-utils": "https://repo.example.com/npm/my-utils-2.1.0.tgz"
}
}
프로젝트 또는 CI 환경의 .npmrc:
ini
registry=https://registry.npmjs.org/
strict-ssl=true
# 내부 레지스트리도 HTTPS 사용
@company:registry=https://repo.example.com/npm/
설명:
- 변경 전: HTTP 다운로드는 전송 중 tarball 변조 위험이 있습니다. FTP 항목은 현재 npm에서 지원되지 않는 구성입니다. 설치 시 postinstall 등 스크립트나 모듈 코드가 악성으로 바뀌어 빌드/개발자 환경에서 임의 코드 실행으로 이어질 수 있습니다.
- 변경 후: HTTPS를 사용해 전송 구간을 암호화·인증하고, 공식 registry의 버전 범위를 사용하여 직접 URL 의존을 줄였습니다. 또한 .npmrc에서 strict-ssl로 TLS 검증을 강제합니다. 검토한 잠금 파일의
integrity와 다른 다운로드는 거부됩니다. 다만 악성 패키지 자체나 함께 변조된 잠금 파일까지 신뢰할 수 있게 해 주지는 않습니다.