취약하거나 위험한 암호 알고리즘 사용

Use of a Broken or Risky Cryptographic Algorithm

설명

이 취약점은 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이나 다운그레이드 공격을 시도해도, 약한 암호 조합으로 세션을 유도하기가 어렵고, 장기적인 복호화 및 세션 탈취 위험이 크게 줄어듭니다.

참조