[하루한줄] 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).
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가 가능합니다.RpcServlet
... public RpcData readObject(ObjectInputStream param1ObjectInputStream) throws Exception { return (RpcData)param1ObjectInputStream.readObject(); } ...
com.nmwco.server.events.EventRpcServlet
클래스의 코드입니다. readObject dispatcher는 RpcData 타입의 입력을 받을 때 attacker-controlled 데이터에 대한 검사를 하지 않습니다.MvcUtil valueStringToObject
... mvcController.invoke(servletContext, paramHttpServletRequest, paramHttpServletResponse); ...
com.nmwco.server.mvc.MvcServlet
클래스의 코드입니다. attacker-contolled 데이터인paramHttpServletRequest
를 2번째 인자로invoke
메서드가 사용됩니다.webrepdb StatusServlet
... param1ObjectInputStream) throws Exception { // 1 return (RpcData)param1ObjectInputStream.readObject(); } ...
com.nmwco.server.web.repdb.StatusServlet
클래스의 코드입니다. attacker-controlled 데이터에 대한readObject()
호출을 사용해 GET 또는 POST request에 대한 디스패처를 설정합니다.
본 글은 CC BY-SA 4.0 라이선스로 배포됩니다. 공유 또는 변경 시 반드시 출처를 남겨주시기 바랍니다.