인증 바이패스를 방지하기 위해 OpenSAML2 가 설정되어야 합니다.

 

2018년에, Duo Security 는 SAML 기반 SSO(Single Sign-On) 시스템에 영향을 끼치는 새로운 취약점 클래스를 발견했고, 이로 인해 다음의 취약성 (CVE-2017-11427, CVE-2017-11428, CVE-2017-11429, CVE-2017-11430, CVE-2018-0489, CVE-2018-7340) 이 공개되었습니다.

특수하게 조작된 파일에서, 이미 자신의 계정으로 SAML 시스템에 접근한 공격자는 인증 메커니즘을 무시하고 다른 사용자로 인증할 수 있습니다.

이것은 SAML 프로토콜이 XML 포맷에 의존하고, 기본 XML 파서가 XML 구문을 해석하는 방식 때문입니다.

공격자가 인증된 사용자를 식별하는 라는 XML 구문의 필드를 변경하는 경우, 이 취약점을 악용할 수 있습니다.

아래는 잠재적인 위험을 가진 payload 의 예시 입니다:

<SAMLResponse>
  [...]
  <Subject>
    <NameID>admin@domain.com<!---->.evil.com</NameID>
  </Subject>
  [...]
</SAMLResponse>

공격자는 “admin@domain.com.evil.com” 계정으로 유효한 콘텐츠를 생성할 수 있습니다. 공격자는 최종적으로 "admin@domain.com" 계정으로 인증되도록 XML 주석을 통해 콘텐츠를 수정할 것입니다. OpenSAML2에 의존하는 Spring Security SAML을 사용하는 애플리케이션에서 이 취약점을 방지하려면 ignoreComments 속성이 true로 설정되어 있으므로 XML 주석을 무시해야 합니다.

규칙을 어긴 코드

import org.opensaml.xml.parse.BasicParserPool;
import org.opensaml.xml.parse.ParserPool;
import org.opensaml.xml.parse.StaticBasicParserPool;

public ParserPool parserPool() {
  StaticBasicParserPool staticBasicParserPool = new StaticBasicParserPool();
  staticBasicParserPool.setIgnoreComments(false); // 규칙을 어긴 코드: 구문 분석 중에 취약점을 악용할 수 있는 여지를 주는 주석이 무시되지 않습니다.
  return staticBasicParserPool;
}
public ParserPool parserPool() {
  BasicParserPool basicParserPool = new BasicParserPool();
  basicParserPool.setIgnoreComments(false); // 규칙을 어긴 코드
  return basicParserPool;
}

규칙을 준수한 해결책

public ParserPool parserPool() {
  return new StaticBasicParserPool(); // 규칙을 준수한 코드: StaticBasicParserPool 생성자를 통해 "ignoreComments" 가 "true" 로 설정됩니다.
}
public ParserPool parserPool() {
  return new BasicParserPool();  // 규칙을 준수한 코드: BasicParserPool 생성자를 통해 "ignoreComments" 가 "true" 로 설정됩니다.
}

참고


If you like SONARKUBE, don’t forget to give me a star. :star2:

원문으로 바로가기

Star This Project