TLS 인증서 검증 비활성화
Improper Certificate Validation
설명
TLS 연결에서 서버 인증서 검증을 끄면(예: rejectUnauthorized: false 또는 NODE_TLS_REJECT_UNAUTHORIZED=0) 서버의 신원을 확인할 수 없습니다. 이 때문에 공격자가 임의(자체 서명 또는 위조) 인증서를 제시해도 연결이 성립하며, 사용자는 합법 서버라고 착각하게 됩니다. 실제 공격 시 공용 Wi‑Fi, 프록시, 악성 게이트웨이 등을 통해 트래픽을 가로채고 가짜 인증서를 주입하여 민감정보 탈취, 응답 변조, 세션 하이재킹이 가능합니다.
잠재적 영향
중간자(MitM) 공격 노출: 공격자가 통신을 가로채어 가짜 인증서를 제시해도 연결이 성공합니다.
데이터 유출: 로그인 정보, 토큰, 개인정보 등 민감 데이터가 평문과 다름없이 노출될 수 있습니다.
응답 변조/코드 주입: 전달되는 응답을 변경하거나 악성 페이로드를 삽입할 수 있습니다.
서비스 가장(Spoofing): 공격자가 합법 서버로 위장하여 사용자를 속일 수 있습니다.
해결 방법
rejectUnauthorized 옵션을 제거하거나 기본값(true)로 유지하세요.
전역 비활성화 금지: process.env.NODE_TLS_REJECT_UNAUTHORIZED=0 설정을 사용하지 마세요.
신뢰 가능한 CA 제공: 사내 CA 또는 공인 CA 번들을 ca 옵션(https.Agent/tls.connect)에 설정하세요.
서버명 검증 유지: servername(SNI)과 호스트명 검증을 기본대로 사용하고, 임의로 끄지 마세요.
필요 시 Certificate Pinning 적용: 허용된 공인 인증서의 공개키/지문과 일치하는지 애플리케이션 레벨에서 추가 검증하세요.
테스트 전용 완화: 테스트 환경에서만 임시 우회가 필요하다면, 별도 테스트 설정으로 분리하고 운영 빌드에 포함되지 않게 하세요.
취약한 코드 및 안전한 코드 예시
취약한 코드
안전한 코드
설명:
취약한 코드: rejectUnauthorized: false나 NODE_TLS_REJECT_UNAUTHORIZED=0은 인증서와 호스트명 검증을 비활성화하여, 공격자가 임의의(가짜) 인증서를 제시해도 연결이 성공하게 만듭니다. 이로 인해 공용 네트워크나 악성 프록시를 통한 중간자 공격에 매우 취약해집니다.
안전한 코드: 기본 검증을 유지하고(=rejectUnauthorized: true) 신뢰 가능한 CA 번들을 제공하여 서버 신원을 정상적으로 검증합니다. 필요 시 인증서 핀닝을 추가해 위조/중간자 시도를 한 번 더 차단합니다. 전역 비활성화 설정은 사용하지 않으므로 운영 환경에서도 안전합니다.
참조
Last updated