설명
이 취약점은 TLS 설정에서 이미 취약하다고 알려진 CipherSuite(암호 스위트)를 직접 지정해서 사용하는 경우에 발생합니다. RC4, 3DES나 아래의 비권장 CBC 스위트를 허용하면 협상된 조합과 구현에 따라 통신 기밀성이나 무결성이 약해질 수 있습니다. AES-CBC를 사용했다는 사실만으로 모든 구현이 동일한 공격에 취약한 것은 아닙니다. 공격자는 네트워크를 가로채는 Man-in-the-Middle(MITM) 공격이나 프로토콜 다운그레이드 공격 등을 통해, 취약한 CipherSuite가 사용되는 연결을 유도하고, 암호화된 데이터를 점진적으로 복호화하거나 세션 정보를 탈취할 수 있습니다.
잠재적 영향
- 민감 정보 노출: 취약한 CipherSuite를 통한 TLS 통신은 암호 강도가 낮아, 세션 키나 개인정보, 인증 토큰 등이 장기간에 걸쳐 복호화될 수 있습니다.
- 통신 위·변조: 공격자가 TLS 세션을 부분적으로 해독하면서, 요청/응답 데이터를 조작하거나 피싱 페이지로 리다이렉트하는 등의 MITM 공격이 가능해질 수 있습니다.
- 암호 강도 저하: 서비스 자체는 TLS를 사용하지만, 안전하지 않은 CipherSuite 때문에 실제 보안 수준이 크게 떨어져 규제나 보안 요구사항을 충족하지 못할 수 있습니다.
해결 방법
- 암호 스위트 범위 확인:
tls.Config.CipherSuites는 TLS 1.0–1.2에 적용됩니다. TLS 1.3의TLS_AES_128_GCM_SHA256,TLS_AES_256_GCM_SHA384등은 이 필드로 설정할 수 없습니다. TLS 1.2를 직접 구성한다면tls.CipherSuites()와 공식 문서에서 권장 AEAD 스위트를 확인하세요. - 취약 CipherSuite 명시적 차단: RC4, 3DES, AES-CBC 기반 CipherSuite는 설정에서 제거하고, 가능하면 CipherSuites를 직접 나열하기보다 기본값을 사용하세요(유지 관리되는 Go 버전 기준).
- TLS 버전 상향:
MinVersion을tls.VersionTLS12이상(가능하면tls.VersionTLS13)으로 설정하여, 프로토콜 다운그레이드 및 구식 CipherSuite 사용 가능성을 줄이세요. - 정기적인 보안 가이드 업데이트: 운영 중인 서비스는 주기적으로 Go 릴리스 노트 및 보안 가이드를 확인하여, 더 이상 안전하지 않은 CipherSuite가 없는지 점검하세요.
예시
변경 전
go
package main
import (
"crypto/tls"
"net/http"
)
// 비준수 예: 취약한 CipherSuite를 명시적으로 사용
func insecureClient() *http.Client {
tr := &http.Transport{
TLSClientConfig: &tls.Config{
// RC4, 3DES, AES-CBC 등은 이미 취약 또는 비권장
CipherSuites: []uint16{
tls.TLS_RSA_WITH_RC4_128_SHA,
tls.TLS_RSA_WITH_3DES_EDE_CBC_SHA,
tls.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,
},
MinVersion: tls.VersionTLS10,
},
}
return &http.Client{Transport: tr}
}
변경 후
go
package main
import (
"crypto/tls"
"net/http"
)
// 준수 예: 현대적인 안전 CipherSuite와 TLS 버전 사용
func secureClient() *http.Client {
tr := &http.Transport{
TLSClientConfig: &tls.Config{
// TLS 1.3 이상 사용 권장 (기본 CipherSuite는 안전한 것들로 구성)
MinVersion: tls.VersionTLS12,
// 필요 시 명시적으로 안전한 CipherSuite만 선택 (TLS 1.2용)
CipherSuites: []uint16{
tls.TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
tls.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
tls.TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,
tls.TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,
tls.TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,
tls.TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,
},
},
}
return &http.Client{Transport: tr}
}
설명:
- 변경 전: 위 비준수 코드는 TLS 설정에서
tls.TLS_RSA_WITH_RC4_128_SHA,tls.TLS_RSA_WITH_3DES_EDE_CBC_SHA,tls.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256와 같이 취약하거나 비권장된 CipherSuite를 명시적으로 사용하고 있습니다. RC4는 통계적 약점으로 인해 평문 복구 공격이 가능하고, 3DES는 블록 크기가 작아 SWEET32 같은 공격에 취약합니다. AES-CBC는 구현/패딩 처리에 따라 여러 패딩 오라클 공격에 노출될 수 있습니다. 또한MinVersion을 TLS 1.0으로 낮게 두면, 프로토콜 다운그레이드 공격으로 더 취약한 조합이 사용될 수 있습니다. - 변경 후: 준수 코드는 다음과 같은 방식으로 취약점을 완화합니다.
MinVersion: tls.VersionTLS12로 최소 TLS 버전을 상향하여, 오래된 프로토콜(TLS 1.0/1.1)을 제외합니다. TLS 1.2 스위트의 선택은 별도 설정입니다.- CipherSuites 배열에는 GCM 또는 CHACHA20-POLY1305 같은 AEAD 방식을 사용하는 현대적인 CipherSuite만 포함해, 이 예시의 비권장 RC4/3DES/CBC 스위트를 제외했습니다. TLS 1.3 스위트는 Go가 별도로 관리합니다.
- 이로 인해 공격자가 MITM이나 다운그레이드 공격을 시도해도, 약한 암호 조합으로 세션을 유도하기가 어렵고, 장기적인 복호화 및 세션 탈취 위험이 크게 줄어듭니다.