[이것만은지키자] 보안이야기1- OWASP TOP 10 2017 의 신규 취약점. "XML 외부 개체(XXE)" 문제

in #xxe7 years ago (edited)

안녕하세요.
첫 보안 게시글로 OWASP TOP 10 2017 버젼에서 새로 등록된 취약점인 "XML 외부 개체(XXE)" 문제에 대해 다뤄보려고 합니다.
해당 글은 상황에 따라, 주기적으로 업데이트 됩니다.


[참조: OWASP TOP 10 2017 코리아챕터]

먼저 OWASP 에서 말하는 해당 공격의 정의는 아래와 같다.

"
오래되고 설정이 엉망인 많은 XML 프로세스들은 XML 문서내에서 외부 개체 참조를 평가합니다. 외부개체는 파일 URI 처리기, 내부 파일 공유, 내부 포트스캔, 원격 코드 실행과 서비스 거부 공격을 사용하여 내부 파일을 공개하는데 사용할 수 있습니다.
"

손쉽게 말하면,
Entity는 반복적으로 나오는 문장이나 문자열을 다른 곳에 저장해 놓고 참조하는 개체로,
재사용이 가능한 XML , DTD 등의 데이터가 될 수 있습니다. 이 중 Entity의 대상이 DTD 외부에 존재하는 경우 External Entity 라고 합니다.
이러한 External Entity( 외부 개체) 의 사용을 금지 시키지 않아 발생하는 취약점 입니다.


[참조: OWASP TOP 10 2017 코리아챕터]
xml 통신을 하는 어플리케이션에 위와같은 방법으로 공격을 수행하게 됩니다.

*추가 공격 방법은 현재 code syntax highlight가 지원이 안돼, 가독성이 떨어져 다른 방법으로 업로드 예정입니다.

보안책으로는, OWASP 에서는 아래와 같이 권고합니다.

  1. 가능할 때마다, JSON과 같은 덜 복잡한 데이터 형식을 사용하거나 민감한 데이터를 지양합니다.
  2. 애플리케이션이나 운영체제에서 사용중인 모든 XML 프로세서와 라이브러리를 패치하거나 업그레이드 합니다.
  3. 의존성 체커를 사용합니다. SOAP을 SOAP 1.2나 그 이상으로 업그레이드 합니다.
  4. 서버에서 허용 목록(화이트리스트)을 이용한 입력값 검증, 필터링, 검사를 구현해서 XML 문서, 헤더, 노드에 있는 악의적인 데이터를 막습니다.
  5. XML이나 XSL 파일 업로드 기능이 XSD 검증기 같은 것을 사용해서 XML이 유효한 내용인지 호가인하고 검증합니다.
  6. 많은 것들이 통합된 크고 복잡한 애플리케이션에서는 수동으로 소스코드 리뷰가 최선의 방법일 수 있으나, SAST는 소스코드에 존재하는 XXE를 탐지하는데 도움이 될 수 있습니다.

프로그래머는, 아래와 같은 방법으로 외부개체 취약점에 대해 보완을 할 수 있습니다.

  1. 일반 가이드
    factory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);

  2. JAVA 코드 상에서는 JAXP DocumentBuilderFactory, SAXParserFactory and DOM4J 을 사용하여 예방가능.

  3. PHP코드 상에서는 libxml_disable_entity_loader(true); 함수를 이용하여 외부 Entity 사용을 비활성화.
    $oldValue = libxml_disable_entity_loader(true);
    $dom = new DOMDocument();
    $dom->loadXML($xml);
    libxml_disable_entity_loader($oldValue);

  4. 코드상 DOCTYPE 태그에 대해서 다른 문자열로 치환.
    $collapsedXML = preg_replace("/[:space:]/", '', $xml);
    if(preg_match("/<!DOCTYPE/i", $collapsedXml)) {
    throw new \InvalidArgumentException(
    'Invalid XML: Detected use of illegal DOCTYPE’
    );
    }

Sort:  

Congratulations @beomps! You have received a personal award!

1 Year on Steemit
Click on the badge to view your Board of Honor.

Do not miss the last post from @steemitboard!


Participate in the SteemitBoard World Cup Contest!
Collect World Cup badges and win free SBD
Support the Gold Sponsors of the contest: @good-karma and @lukestokes


Do you like SteemitBoard's project? Then Vote for its witness and get one more award!

Congratulations @beomps! You received a personal award!

Happy Birthday! - You are on the Steem blockchain for 2 years!

You can view your badges on your Steem Board and compare to others on the Steem Ranking

Vote for @Steemitboard as a witness to get one more award and increased upvotes!