유형 | 보안기능 |
보안약점 | 부적절한 인증서 유효성 검증 |
개요 |
인증서를 확인하지 않거나 인증서 확인 절차를 적절하게 수행하지 않아, 악의적인 호스트에 연결되거나 신뢰할 수 없는 호스트에서 생성된 데이터를 수신하게 되는 보안약점이다.
|
보안대책 |
인증서를 사용하기 전에 인증서의 유효성을 확인한다.
인증서의 Common Name과 실제 호스트가 일치하는지, 신뢰된 발급기관(CA, RootCA)의 서명 여부, 인증서의 유효기간, 인증서의 해지여부, 안전한 암호화 알고리즘 사용 여부 확인 등으로 유효한 인증서인지 검증하는 절차를 구현하여야 한다.
|
진단방법 |
인증서를 확인하여, 검증결과 값이 X509_V_OK 이외의 값을 허용하는지 확인한다.
신뢰되지 않은 발급기관으로 받은 인증서를 허용하거나 유효기간이 만료된 인증서를 허용하면 위험하다.
또한 인증서의 Common Name 확인한다.
|
연관된 설계단계 기준 | 인증 대상 및 방식 |
코드예제
● 안전하지 않은 코드 예 (C)
if ((cert = SSL_get_peer_certificate(ssl)) && host)
foo=SSL_get_verify_result(ssl);
if ((X509_V_OK==foo) ||X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN==foo))
// 자체 서명된 인증서일 수 있다.
● 안전한 코드 예 (C)
cert = SSL_get_peer_certificate(ssl);
if (cert && (SSL_get_verify_result(ssl)==X509_V_OK)) {
// CN 을 확인하지 않았지만 신뢰하고 진행한다.
// 이럴 경우, 공격자가 Common Name을 www.attack.com으로 설정하여
// 중간자 공격에 사용할 경우 데이터가 중간에서 복호화 되고 있음을 탐지하지 못한다.
}
● 안전한 코드 예 (Java)
private boolean verifySignature(X509Certificate toVerify, X509Certificate signingCert) {
// 검증하려는 호스트 인증서(toVerify)와 CA인증서(signing Cert)의 DN(Distinguished Name)이 일치하는지 여부를 확인한다.
if (!toVerify.getIssuerDN().equals(signingCert.getSubjectDN())) return false;
try {
// 호스트 인증서가 CA인증서로 서명 되었는지 확인한다.
toVerify.verify(signingCert.getPublicKey());
// 호스트 인증서가 유효기간이 만료되었는지 확인한다.
toVerify.checkValidity();
return true;
} catch (GeneralSecurityException verifyFailed) {
return false;
}
}
진단방법

인증서를 확인하여(①), 검증결과 값이 X509_V_OK 이외의 값을 허용하는지 확인한다(②).
신뢰되지 않은 발급기관으로 받은 인증서를 허용하거나 유효기간이 만료된 인증서를 허용하면 위험하다.
또한 인증서의 Common Name 확인한다.(③)
● 일반적인 진단의 예
cert = SSL_get_peer_certificate(ssl); ·············································①
if (cert && (SSL_get_verify_result(ssl)==X509_V_OK)) { ····························②
SSL_set_hostflags(ssl, X509_CHECK_FLAG_NO_PARTIAL_WILDCARDS);
if (!SSL_set1_host(ssl, "www.securecoding_example.com")) { ························③
error("Invalid Common Name");
return –1;
}
// 서버와 클라이언트 간에 피어 확인을 사용하며 콜백함수는 지정하지 않는다.
SSL_set_verify(ssl, SSL_VERIFY_PEER, NULL);
...
}
● 정탐코드
cert = SSL_get_peer_certificate(ssl);
if (cert) {
// 인증서를 확인하지 않고 작업 수행
...
}
유효한 인증서인지 확인하지 않고, 인증서를 사용하고 있기 때문에 취약하다고 판정한다.
'소프트웨어(SW) 보안약점 진단원 > 구현단계 보안약점 제거 기준' 카테고리의 다른 글
구현단계 보안약점 기준 - 주석문 안에 포함된 시스템 주요정보 (1) | 2025.06.03 |
---|---|
구현단계 보안약점 기준 - 사용자 하드디스크에 저장되는 쿠키를 통한 정보 노출 (0) | 2025.06.03 |
구현단계 보안약점 기준 - 부적절한 전자서명 확인 (0) | 2025.06.03 |
구현단계 보안약점 기준 - 취약한 비밀번호 허용 (0) | 2025.06.03 |
구현단계 보안약점 기준 - 적절하지 않은 난수 값 사용 (1) | 2025.06.03 |