암호화되지 않은 프로토콜로 의존성 다운로드

Insecure Dependency Download (HTTP/FTP)

설명

의존성을 HTTP 또는 FTP 같은 암호화되지 않은 프로토콜로 다운로드할 때 발생하는 취약점입니다. 전송 구간이 암호화·인증되지 않아 MITM(Man-in-the-Middle) 공격으로 아티팩트가 변조될 수 있습니다. 공격자는 동일 네트워크, 악성 프록시/DNS 스푸핑, 또는 감염된 미러 서버를 통해 의존성 파일(tarball 등)을 악성 파일로 바꿔치기하여 빌드/설치 단계에서 임의 코드 실행을 유도할 수 있습니다.

잠재적 영향

  • 임의 코드 실행: 공격자가 변조된 패키지나 설치 스크립트를 통해 빌드/설치 시점에 악성 코드를 실행할 수 있음

  • 공급망 오염(Supply Chain Compromise): 오염된 의존성이 제품 바이너리에 포함되어 배포·운영 환경까지 침투할 수 있음

  • 빌드 무결성 손상: 빌드 산출물이 신뢰할 수 없게 되어 릴리스 신뢰 체인이 붕괴됨

  • 데이터 유출/변조: 전송 중 평문으로 노출된 메타데이터나 아티팩트가 탈취·변조될 수 있음

해결 방법

  • 항상 안전한 프로토콜 사용: 의존성 URL은 HTTPS 또는 SFTP만 허용

  • 직접 URL 지양: 가능하면 공식 registry(npm registry 등)의 버전 범위를 사용하고, 외부 직접 URL 참조를 피함

  • TLS 검증 강제: .npmrc 등에서 strict-ssl=true, registry를 https로 설정하고, 내부 아티팩트 서버는 유효한 인증서와 최신 TLS만 허용

  • 무결성 검증 사용: package-lock.json/npm-shrinkwrap.json을 커밋하고 CI에서 npm ci를 사용하여 integrity(SHA512) 검증을 강제

  • 체크섬/서명 확인: 제공되는 경우 아티팩트의 checksum 또는 서명(GPG 등)을 검증

  • CI 보안 정책: 빌드 환경에서 HTTP 아웃바운드를 차단하고, 허용된 도메인(allowlist)만 통신 허용

  • 스크립트 위험 축소: CI에서는 npm config ignore-scripts=true를 고려(필요 시 한시적으로만 예외 허용)

취약한 코드 및 안전한 코드 예시

취약한 코드

안전한 코드

설명:

  • 취약한 코드: HTTP/FTP는 평문 전송이므로 MITM이 의존성 tarball을 가로채 변조할 수 있습니다. 설치 시 postinstall 등 스크립트나 모듈 코드가 악성으로 바뀌어 빌드/개발자 환경에서 임의 코드 실행으로 이어질 수 있습니다.

  • 안전한 코드: HTTPS를 사용해 전송 구간을 암호화·인증하고, 공식 registry의 버전 범위를 사용하여 직접 URL 의존을 줄였습니다. 또한 .npmrc에서 strict-ssl로 TLS 검증을 강제합니다. 이와 함께 lockfile의 integrity 검증을 활용하면 전송 중 변조가 발생해도 설치가 실패하여 공급망 오염 위험이 크게 줄어듭니다.

참조

Last updated