SAML 인증 우회 취약점 (SAML Ignore Comments)

SAML 서명 검증과 사용자 식별 사이의 XML 주석 해석 불일치 방지

설명

SAML 처리에서 XML 주석이 텍스트를 나누고 애플리케이션이 NameID 등의 일부 텍스트만 사용자 식별자로 읽으면, 서명 검증에 사용한 값과 실제 로그인 계정이 달라질 수 있습니다. 주석을 제외하는 정규화 방식에서는 주석 추가 후에도 서명이 유효할 수 있습니다. 이는 주석만으로 서명 없는 어설션이 신뢰된다는 뜻은 아닙니다.

잠재적 영향

  • 취약한 사용자 식별 처리에서 다른 계정으로 로그인
  • 잘못 선택된 계정의 데이터나 기능에 접근

해결 방법

  1. 지원되는 SAML 라이브러리를 사용하고 주석을 포함한 입력의 식별자 해석을 확인하세요. 서명으로 검증한 어설션에서 완전한 식별자 값을 읽어야 합니다.
  2. 실제 SAML 처리에 쓰이는 XML 파서에서 주석을 무시하도록 구성하세요. setIgnoreComments(true)는 보조 설정이며 전체 인증 검증을 대체하지 않습니다.
  3. 신뢰하는 IdP의 키로 서명을 검증하고, 발급자·대상 서비스·수신자·유효 시간과 해당 흐름에 필요한 요청 연계를 확인하세요.

예시

다음은 기존 OpenSAML 2 계열의 org.opensaml.xml.parse.BasicParserPool 설정 발췌입니다. 파서 초기화와 실제 SAML 처리기에 연결하는 코드는 생략했습니다. 사용하는 버전의 API와 보안 구성에 맞춰 적용하세요.

변경 전

java
import org.opensaml.xml.parse.BasicParserPool;

public class InsecureSAMLConfig {
    public void configureParser() {
        BasicParserPool parserPool = new BasicParserPool();
        parserPool.setIgnoreComments(false); // XML 주석을 보존
    }
}

변경 후

java
import org.opensaml.xml.parse.BasicParserPool;

public class SecureSAMLConfig {
    public void configureParser() {
        BasicParserPool parserPool = new BasicParserPool();
        parserPool.setIgnoreComments(true); // XML 주석을 무시; 별도의 SAML 검증도 필요
    }
}

변경 전에는 주석을 보존하고, 변경 후에는 파싱 과정에서 주석을 무시하도록 설정합니다. 이 설정만으로 모든 SAML 인증 우회를 방지하지는 않습니다.

참조