ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 2017 OWASP A8 : 안전하지 않은 역직렬화 (역직렬화 취약점 - 원격 코드 실행)
    Knowledge/Web 2019. 6. 5. 00:19

     

     

     

     

    2017 OWASP에 8위로 선택된 안전하지 않은 역직렬화에 대해서 정리해보려고 합니다.

    안전하지 않은 역직렬화는 이번 2017년도에 새롭게 기재된 항목으로 예전에는 원격코드 실행 취약점에 속해있었다고 봐도 무방해보입니다.

     

     

    그렇다면 역직렬화란 무엇일까?

    간단하게 말하면 서로간에 원활한 통신을 위해 데이터를 스트림하기 위해 직렬화를 시키고 그 직렬화된 데이터 스트림을 다시 받고 역직렬화 해서 데이터를 확인하는 과정을 말합니다.

     

     

    안전하지 않은 역직렬화는 종종 원격 코드 실행으로 이어집니다. 역직렬화 취약점이 원격 코드 실행 결과를 가져오지 않더라도 이는 권한 상승 공격, 주입 공격과 재생 공격을 포함한 다양한 공격 수행에 사용될 수 있습니다.

     

    공격 가능성 : 1

    확산 정도 : 2

    탐지 가능성 : 2

    기술 : 3

     

    받아온 데이터를 역직렬화하는 과정에서 원격코드가 실행 가능한 취약점이 발생할 수 있으며 그렇지 않더라도 권한 상승 같은 일들이 일어날 수가 있습니다.

     

    Java를 예로 들면 java.lang.ProcessBuilder라는 객체를 예로 들 수가 있는데요.

    bin에 접근하여 shell을 실행하거나 cmd를 실행하기 위해 사용 할 수 있는 명령어로 운영 체제 프로세스를 만들고 구성하는 방법을 제공합니다.

     ProcessBuilder 인스턴스는 프로세스 속성 모음을 관리 할 수있게 해줍니다 .

    그러면 주어진 속성을 사용 하여 새 Process 를 시작할 수 있습니다.

     

     

    method

     

    ProcessBuilder(String... command)

    directory(File directory)

    environment()

    inheritIO()

    redirectInput(File file), redirectOutput(File file), redirectError(File file)

    start()

     

    자세한 메서드 설명은 여기선 넘어가도록 하겠습니다.

     

     

    예를들어 보면

    find . -name *.java -type f | wc -l

    라는 명령어가 실행하고 싶다면 이렇게 작성하면 됩니다.

    public void givenProcessBuilder_whenStartingPipeline_thenSuccess()
      throws IOException, InterruptedException {
        List builders = Arrays.asList(
          new ProcessBuilder("find", "src", "-name", "*.java", "-type", "f"), 
          new ProcessBuilder("wc", "-l"));
     
        List processes = ProcessBuilder.startPipeline(builders);
        Process last = processes.get(processes.size() - 1);
     
        List output = readOutput(last.getInputStream());
        assertThat("Results should not be empty", output, is(not(empty())));
    }

     

     

     

    그리고 이런 객체를 통해 XStreamHandler를 이용하는 곳에서 충분한 검사를 하지 않고 변환하기 때문에 공격당 할 요소가 있습니다.

     

    2017년 그당시 제보된 CVE-2017-9805, S2-052를 보면

    X stream을 사용하는 환경에서 사용자의 요청으로 serialize1 xml이 전송되면 별도의 검정없이 deserialize1(역직렬화)가 이루어 집니다.

    그렇게 되면 별도의 검증을 하지 않고 서버에서 명령이 실행되게 됩니다.

     

    ex)

    xml 코드들이 있을때

    그 사이에

    .
    .
    .
    <next class="java.lang.ProcessBuilder">
    	<command>
    		<string>cmd.exe</string>
        </command>
        <redirectErrorStream>false</redirectErrorStream>
    </next>
    .
    .
    .
    <method>
    	<class>java.lang.ProcessBuilder</class>
    	<name>start</name>
        <parameter-types/>
    </method>
    .
    .
    .

    이렇게 삽입 후 보내게 되면

    서버에선 cmd창이 실행되게 된다.

     

    대응방안은 이런 취약한 핸들러가 이용되는 플러그인을 사용하지 않고 xml사용에 주의를 해야한다.

     

     

    댓글

Designed by Tistory.