[하루한줄] CVE-2021-26912: NetMotion Mobility Deserialization to RCE

URL

NetMotion Mobility Server Multiple Deserializaion of Untrusted Data Lead to RCE

Target

NetMotion Mobility Server 11.73 이전 버전

NetMotion Mobility Server 12.01.09045

Explain

NetMotion Mobility는 사내 네트워크를 안전하게 외부 모바일 기기로 연장시키기 위해 사용하는 VPN입니다. NetMotion Mobility Server 12.01.09045는 untrusted data에 대한 Java deserialization취약점 패턴이 여러 개 존재해 SYSTEM 권한으로 원격코드 실행이 가능합니다(CVE-2021-26912).

  1. SupportRpcServlet

    ...
    RpcData rpcData = (RpcData)objectInputStream.readObject();
          if (rpcData.validate(true)) {
            command(paramHttpServletResponse, rpcData);
          }
    ...

    com.nmwco.server.support.SupportRpcServlet 클래스의 코드입니다. Inputstream으로부터 특별한 검사 및 보호 없이 readObject()를 통해 rpcData의 값을 설정합니다. Inputstream은 해커가 제어(attacker-controlled)할 수 있으므로 RCE가 가능합니다.

  2. RpcServlet

    ... 
     public RpcData readObject(ObjectInputStream param1ObjectInputStream) throws Exception {
                return (RpcData)param1ObjectInputStream.readObject();
              }
    ...

    com.nmwco.server.events.EventRpcServlet 클래스의 코드입니다. readObject dispatcher는 RpcData 타입의 입력을 받을 때 attacker-controlled 데이터에 대한 검사를 하지 않습니다.

  3. MvcUtil valueStringToObject

    ...
    mvcController.invoke(servletContext, paramHttpServletRequest, paramHttpServletResponse);
    ...

    com.nmwco.server.mvc.MvcServlet 클래스의 코드입니다. attacker-contolled 데이터인 paramHttpServletRequest를 2번째 인자로 invoke 메서드가 사용됩니다.

  4. webrepdb StatusServlet

    ...
    param1ObjectInputStream) throws Exception {   // 1
                return (RpcData)param1ObjectInputStream.readObject();
              }
    ...

    com.nmwco.server.web.repdb.StatusServlet 클래스의 코드입니다. attacker-controlled 데이터에 대한 readObject()호출을 사용해 GET 또는 POST request에 대한 디스패처를 설정합니다.