Pulling the Plug

Kail-KM
|2017. 3. 22. 22:56

서론

이번 포스팅에서 다루고자 하는 주제는 바로 "Pulling the Plug" 이다. 단어 그대로 연결되어 있는 플러그를 뽑는다는 것으로 주로 장치의 강제 종료를 의미한다. PC 나 핸드폰 등 강제로 전원이나 배터리를 분리하여 종료시킨적이 한번 쯤은 있을 것이다. 필자의 경우 핸드폰에 대해서는 잘 모르니 PC 에 한해서만 이야기 해보고자 한다. 그렇다면 이 강제 종료에 대해 무슨 생각을 할 수 있기에 포스팅까지 할까? 


사실 별거 없다. 당연히 PC 에 무리가 간다는 것쯤이야 모두가 알고있다. 하지만 약간의 악성코드와 포렌식 측면의 고려 사항을 추가하면 고민해볼 가치는 있다고 생각한다. 필자도 포렌식에 대해서는 얕은 지식만 가지고 있어 깊이 다루기는 어렵지만 알고 있는 지식에 한해 이 주제에 대해 이야기해보고자 한다. 개인적인 의견이 다분하며 전문적인 내용은 거의 없으므로 시간이 많이 남는 사람들에 한해 가볍게 읽기를 권한다.





본론

정상적인 PC 종료 과정

PC 의 정상적인 종료 과정에는 무엇이 있는지 먼저 알아보자. Windows PC 의 종료 과정은 부팅과정 비하여 훨씬 간소화 된 절차를 거친다. 종료는 주로 CSRSS (Client/Server Runtime Subsystem) 및 WinLogon, 이 두 가지 구성 요소로 처리 된다. 대략적인 순서에 대해 알아보자.


Windows 에서 시스템 종료 명령을 내리면 ExitWindowsEx 함수를 호출한다. 이 함수는 RPC(원격 프로시저 호출) 을 사용하여 CSRSS 에게 시스템 종료 메시지를 보낸다. CSRSS가 이 메시지를 받은 후, WinLogon 에도 다른 메시지를 보낸다. 메시지를 받은 WinLogon 은 ExitWindowsEx 함수를 호출한 것이 자기 자신이 아님을 확인한다. 확인 후 자신이 호출한 것이 아니라면 사용자를 대신해 WinLogon 이 한번 더 ExitWindowsEx 함수를 호출한다.


두 번째 호출로 인해 CSRSS 에는 또 다시 RPC 를 통해 종료 메시지가 전달된다. 하지만 이번엔 위와 다르게 WinLogon 에서 ExitWindowsEx 함수가 호출된 것임을 확인하고 종료를 승인한다. 종료가 승인되면 CSRSS 는 각 사용자의 Interactive 세션에서 실행되는 모든 프로세스를 종료하는 작업을 수행한다. CSRSS 가 Interactive 사용자 세션에서 실행되고 있는 모든 프로세스를 종료할 때가 되면, 실행 중인 프로세스들의 셧다운 레벨 역순으로 종료 순서를 지정한다.


CSRSS 가 유저 세션 프로세스를 모두 종료한 뒤, shutdown 이 발생하고 있음을 세션 0에서 실행 중인 시스템 프로세스에 알린다. 이제 WinLogon 이 NtShutdownSystem 함수를 호출하며 제어를 반환한다. 그 다음 PoSetSystemPowerState 를 호출하며 아래의 작업을 진행한다.


 * I/O 관리자는 shutdown IRP 를 등록 된 모든 장치 드라이버에 보낸다. 이를 통해 각 장치 드라이버는 종료하기 전에 필수적으로 해야 할 작업을 수행한다. 

 * 메모리 관리자는 수정 된 메모리 페이지를 파일 데이터와 함께 디스크에 다시 기록한다.

 * 구성 관리자는 레지스트리 변경 사항을 각각의 하이브 파일에 기록하도록 한다.

 * I/O 관리자는 모든 파일 시스템 드라이버에 종료를 알려 변경 된 데이터 저장 등의 동작을 수행하도록 한다.

 * 마지막으로, 전원 관리자는 시스템 전원을 끄므로 shutdown 과정을 완료한다.


위와 같은 과정을 통해 정상적인 PC 의 종료를 확인할 수 있다.



비정상적인 PC 종료 과정

그렇다면 정상적인 종료가 아닌 '비정상적인' PC 종료에 대하여 간략히 알아보자. 우선 비정상적인 종료의 경우 위와 같이 특정 신호(API 호출이나 IRP 등)를 전달할 수 없게 된다. 특히 제목과 같이 전원 플러그를 바로 뽑아버린다면 정상적인 과정에서 볼 수 있던 Flush 작업이 모두 진행되지 않는다. 이로 인해 손실되는 데이터는 당연히 존재하게 된다.


PC 의 전원이 갑자기 차단되면 기존에 동작하고 있던 하드 디스크 표면에 물리적인 손상 또한 생길 수가 있다. 반복적인 손상은 하드디스크에 배드섹터를 유발 할 수 있으며, 이는 기능적인 측면 뿐만 아니라 여러 측면에서 불편함을 가지고 올 수 있다. 또한 위에서 언급했던 바와 같이 각 드라이버와 장치들이 수행하던 작업 데이터의 기록이 이루어지지 않는다. 변경 사항이 저장되지 않는다면 드라이버 동작 간에 문제를 유발할 수 있다. 그리고 개인적인 생각에서 문제가 될 수 있는 것은 사후 분석을 위한 데이터 수집 중 휘발성 데이터가 문제가 된다는 것이다. 우선 아래 RFC 3227 에서 언급하는 휘발성 데이터 순서를 보자.


 1. registers, cache
 2. routing table, arp cache,process table, kernel staistics, memory
 3. temporary file sysem
 4. disk
 5. remote logging and monitoring data that is relevant to the system in question
 6. physical configuration, network topology
 7. archival media 


휘발성 데이터의 경우 비휘발성 데이터보다 데이터 수집이 빠르게 이루어져야 한다. 그렇지 않다면 휘발성 데이터는 모두 손실될 수 있기 때문이다. 중요한 데이터는 디스크에 저장되어 있으니깐 상관없지 않느냐라고 할 수 있지만 메모리, 레지스터 등등 휘발성 데이터에도 중요한 데이터는 존재하고 있다. 


가령, Fileless 형태의 악성코드가 네트워크 연결을 통해 악성 실행 데이터를 받아와 메모리에서만 동작한다고 가정해보자. 동작 중인 악성코드에 의해 이상 징후를 느낀 사용자가 갑작스레 PC 를 종료하면 메모리에 있던 악성코드에 대한 정보는 모두 손실된다. 결국 사용자는 추후에도 어떤 악성코드에 의해 감염된 것인지 알기 어려울 것이다. 


이처럼 PC 를 강제 종료하는 것을 추천하는 경우는 결코 많지 않을 것이다.



결론

본론을 통해 PC 의 정상적인 종료 과정과, 그렇지 않은 경우에 나타날 수 있는 상황에 대하여 알아보았다. 사실 본론은 매우 편파적으로 'PC 를 강제 종료하면 안된다.' 라는 입장으로 쓰였다. 이렇게 서술한 이유는 모두가 알다시피 일반적인 상황에서는 PC 를 강제종료하지 않아야 한다는 것을 알고 있기 때문이다.


하지만 PC 를 강제 종료 해야할까? 라는 고민이 들 순간들에 대하여 몇 가지 언급해보자.

* 랜섬웨어에 의해 사용자 파일이 암호화 되고 있다.

* 어떠한 악성코드에 의해 PC 에 이상 증상(팝업 창 출력 등)이 연속적으로 나타나고 있다.


이러한 상황을 맞이한다면 어떻게 해야할까? 우선 필자가 위 상황에 놓인 경우 두 가지 행동으로 상황을 마무리 할 것이다. 첫째, 실행 중인 프로세스 목록을 확인하여 의심되는 프로세스를 종료한다. 하지만 의심되는 프로세스가 보이지 않고 종료했다하더라도 다시 실행되어 동작하는 경우를 가정하자. 그렇다면 둘째로 바로 PC 를 강제종료 시킬 것이다. 이렇게 하므로 악성코드의 동작을 저지할 수 있다.


대부분의 사용자는 이와 유사한 행동을 취할 것이라 생각한다. 하지만 개인이 아닌 기업의 입장에서 생각해보면 이는 큰 위험이 될 수 있다. 우선 운영 중인 서버에 악성코드가 나타났다고 생각해보자(참고로 서버를 잠시 종료해도 상관없다고 가정하자). 서버의 경우 하나의 개인이 아닌 기업이 가진 자산이다. 첫 번째 상황의 경우 랜섬웨어가 확실하다면 서버를 강제 종료해도 괜찮을 것이다. 하지만 두 번째 상황에 놓인 경우 역시 강제 종료하려 한다면 큰 리스크를 갖게 된다.

어떠한 악성코드인지 모르는 상황에서 섣불리 강제 종료해버린다면 그 증거들을 놓칠 수 있기 때문이다. 하지만 강제 종료하지 않는다면 서버 장치에서 어떠한 동작이 추가적으로 일어날지 모른다. 혹여나 악성코드에 대한 증거를 놓치면 그에 따른 치료 방향 또한 잡기 어려워지며, 이는 서버 장치 운영에 무리가 될 수 있다. 과연 어떠한 선택을 해야 할까.


사실 정답은 없다. 단지 어떠한 면을 우선으로 하느냐에 따라 강제종료 할 수도 있고, 하지 않을 수도 있다. 선택하는 사람의 몫인 것이다. 하지만 이러한 상황을 맞이하게 된다면 어떻게 행동해야 할지 한번 쯤 생각해보는 것도 나쁘지 않을까 생각한다.




참고자료

* OverClock, "Windows: The startup and shutdown process", http://www.overclock.net/t/1453560/windows-the-startup-and-shutdown-process

* faqs, "RFC 3227 - Guidelines for Evidence Collection and Archiving", http://www.faqs.org/rfcs/rfc3227.html#b