-1. 현재

http://sanseolab.tistory.com/33 ] 해당 글과 같이 공부 및 실습 중이며 간단한 프로젝트를 해볼 생각이다.





0. 서론

  커널 관련 공부를 시작하면서 드라이버를 직접 개발해보는 것이 공부하는데 많은 도움이 될 것이라고 생각해 왔다. 루트킷의 원리를 이해하고 안티바이러스나 게임 보안 등의 프로그램을 개발해 보는 것도 관련 지식을 쌓는데 큰 도움이 될 것 같아서 드라이버 개발과 관련된 내용을 공부하고 정리하고 있다. 하지만 가장 큰 단점 중 하나는 인터넷에서 떠도는 대부분의 자료들이 너무 오래된 것들이고 심지어는 최근에 올라오는 자료들도 이러한 SSDT 후킹 같은 기술들 위주로 올라오는 것이 개인적으로는 마음에 들지 않았다.

  안티바이러스를 보더라도 국내 뿐만 아니라 외국의 자료들도 마찬가지인 것이 대부분 안티바이러스 개발과 관련된 자료는 스캐너 뿐이며 이것도 사용자 영역에서 시그니처를 기반으로한 것이 대부분이다. 하지만 분명히 내가 모르는 수많은 기술들과 자료들이 있을 것이라는 생각으로 많이 찾아보았지만 능력의 한계로 개략적인 방식과 관련된 자료들만을 겨우 얻을 수 있었다.





1. 드라이버 개발과 관련된 변화

  현재는 32비트 운영체제 보다는 64비트 운영체제가 주류를 이루고 있다. 윈도우 비스타 x64부터 시작해서 64비트 운영체제에는 많은 변화가 추가되었고 더 추가되고 있는 중이다. 눈여겨 볼 것 중 하나는 필터 관리자가 커널에 추가되었다는 점이다. 이것으로 인해 특히 안티바이러스 업체의 경우에 큰 변화가 생기게 되었는데 미니필터 드라이버를 개발함으로써 과거에 했던 방식보다 더 진보된 방식의 개발이 가능해지게 되었다고 한다. 커널의 필터 관리자가 제공해주는 기능을 사용함으로써 더 쉽고 빠르게 더 안전한 안티바이러스를 개발할 수 있게 되었다는 것이다.

  또한 드라이버와 관련된 정책에서도 여러 변경 사항이 추가되었다. 첫 번째는 KPP(Kernel Patch Protection)이다. 이것은 다른 말로 패치 가드라고도 불리는데 x64 버전의 비스타부터는 이 보호 정책으로 인하여 SSDT 후킹 같은 커널 영역의 수정이 불가능해 졌다. 즉 이것을 우회하지 않고서는 과거처럼 SSDT 후킹을 이용한 루트킷이 존재할 수 없으며 이것은 안티바이러스 프로그램에게도 마찬가지이다. 대신 앞에서 말한 미니필터 드라이버 외에도 후술할 MS에서 제공하는 다른 기능들을 사용할 수 있게 되었다.

  두 번째 변화는 KMCS(Kernel Mode Code Signing)이다. 이것도 x64 버전의 비스타부터 시행되는 정책으로서 간단히 말해서 모든 드라이버는 서명이 필요하다는 것이다. 즉 테스트 모드로 설정을 하지 않는 이상 모든 드라이버는 서명이 되어 있지 않다면 커널에 설치할 수 없게되었다. 

  지금까지 언급한 것들 이외에도 많은 변화들이 있을 것이며 추가될 것으로 여겨진다. 확실한 사실은 과거와는 달리 이제는 윈도우의 보안 정책들을 우회하는 취약점을 사용하지 않고서는 과거처럼 간단하게 루트킷을 만들고 감염시킬 수 없다는 점이다. 

  참고로 이런 저런 시도를 해보는 도중에 알게된 것은 윈도우 7의 32비트 버전의 경우에 32비트이기 때문에 KPP와 KMCS가 적용되지 않는다는점 외에도 필터 관리자도 커널에 존재한다는 장점이 있다. 하지만 추후에 살펴볼 PsSetCreateProcessNotifyRoutineEx()나 ObRegisterCallbacks() 같은 확장된 함수나 새로 추가된 함수들을 사용하기 위해서는 32비트 윈도우 7에서도 드라이버에 서명이 필요한 것은 마찬가지라는 것이다.

  개인적으로 KPP 같은 강력한 보안 및 코드 서명 등으로 인한 루트킷 수의 감소와 (물론 더 복잡하고 강력한 방식으로 계속되겠지만) 드라이버 관련 개발과 연구가 아마추어 개발자 입장에서는 쉽게 이루어질 수 없는 현실(코드 서명을 통해)로 인해서 루트킷의 원리를 공부하고자 하는 것 뿐만 아니라 안티 바이러스나 게임 보안 프로그램의 원리를 공부하려고 했던 계획이 잘 진행이 되지 않고 있다. 또한 SSDT 후킹 같은 과거의 기술을 공부해야 하는지에 등의 생각 때문에 아직도 혼란스럽다.





2. 안티바이러스 개발에 대한 정리

  비스타에서 여러 API들과 필터 관리자 등의 변화가 생기기 전까지만 해도 대부분의 AV들은 루트킷처럼 만들어져서 감시할 API들을 후킹하였다고 한다. 하지만 MS에서 기능들을 지원함에 따라 후킹 기반 모니터에서 이제는 미니 필터 드라이버와 커널 통지 콜백들을 사용한다.


2.1 자가 보호

  안티바이러스 프로그램은 특성상 자기 자체를 보호할 필요가 있다. 안티바이러스에 대한 공격으로는 프로세스 종료 외에도 메모리 변조 같은 공격이 있을 수 있다. 과거에는 SSDT 후킹을 사용해서 프로세스 관련 함수를 후킹하여 자가 보호를 구현하였다면 KPP에 의한 커널 변경 방지로 인해 최근에는 관련 함수가 제공되고 있다. 

  ObRegisterCallbacks() 함수는 비스타부터 제공되는 함수로서 프로세스 및 스레드 객체에 대한 특정한 사전 / 사후 동작에 관한 통지를 받는 콜백 함수를 등록하는 함수이다. 즉 각 객체에 대한 핸들의 생성 및 복사 등의 동작에 대해 콜백 함수를 등록해 주는 것이다. 예를들면 이로 인해 유저 모드에서 프로세스나 스레드에 접근하려고 하는 경우 이 콜백이 먼저 호출되고 만약 이러한 접근을 차단하거나 권한을 수정하는 내용을 등록했다면 유저 모드에서는 접근할 수 없게되는 것이다.


2.2 파일 스캐닝

  확실하진 않지만 일반적인 스캐너에서 사용하는 방식이라기 보다는 실시간 감시 같은 기능에서 파일이 생성될 때 하는 검사에서 사용되는것으로 보인다. 이것은 파일 시스템 미니필터 드라이버를 사용해서 구현한다. 과거에는 파일 생성과 관련된 API들에 대한 SSDT 후킹을 통해서 구현했던 것으로 보인다.

  조금 더 자세히 설명하자면 커널의 필터 관리자를 이용하는 함수들을 통해 구현하는데 예를들면 FltRegisterFilter()는 필터링 할 IRP에 해당하는 콜백 정보를 구성하고 필터 관리자에게 이 정보를 등록하도록 요청하며 FltStartFiltering()은 등록된 미니필터 드라이버의 필터링을 시작한다. 이 외에도 많은 함수들이 지원된다. 

[ FltRegisterFilter(), FltBuildDefaultSecurityDescriptor(), FltCreateCommunicationPort(), FltFreeSecurityDescriptor(), FltStartFiltering(), FltReadFile(), FltSendMessage(), FltCancelFileOpen(), FltCloseCommunicationPort(), FltUnregisterFilter() ]

  참고로 MS는 이것과 관련된 드라이버 예제 샘플도 제공하는데 Scanner는 AV에서 사용되는 파일 데이터 스캐너 관련 예제이며 AVScan은 transaction-aware 파일 스캐너와 관련된 에제이다. 


2.3 프로세스 / 스레드 보호

  예전부터 이것과 관련된 함수들이 지원되어 왔다. PsSetCreateProcessNotifyRoutine()은 프로세스의 생성과 소멸을 모니터링하기 위한 콜백 루틴을 등록해주는 함수이다. 비스타 이후에서는 이것의 확장형인 PsSetCreateProcessNotifyRoutineEx() 함수가 제공되며 최신 AV들도 이 함수를 사용하고 있다. 이 확장된 함수는 이전 버전과 달리 프로세스의 객체 등의 많은 정보들 뿐만 아니라 결과적으로 프로세스의 생성을 막을 수 있는 기능도 제공된다.

  이것과 비슷한 함수로 PsSetCreateThreadNotifyRoutine()이 있으며 대상은 스레드이다. 예를들면 외부 코드를 일반 프로세스의 내부에서 스레드로 실행 못하게 하는데 사용될 수도 있다. 윈도우 10부터는 PsSetCreateThreadNotifyRoutineEx() 함수가 추가되었다.

  마지막으로 PsSetLoadImageNotifyRoutine() 함수가 있는데 이것은 이름처럼 이미지가 로드되었을 때 통지해주는 콜백을 등록할 수 있다. 예를들면 이미지가 올라온 경우 아직 프로세스가 시작되지 않았다고 하더라도 어떤 dll을 또는 어떤 드라이버를 로드할지 알 수 있기 때문에 유용하게 사용될 수 있다. 


2.4 레지스트리 보호

  레지스트리 또한 자가 보호에서나 시스템 보호에서나 중요한 보호 대상 중 하나이다. MS는 레지스트리에 대해서도 레지스트리 필터링 드라이버를 제공한다. 옛날부터 RegistryCallback 루틴을 등록하는 CmRegisterCallback() 함수가 제공되어 왔다. 이 콜백 루틴은 프로세스가 레지스트리 관련 동작을 수행하기 전에 각 레지스트리 관련 동작에 관한 통지를 받을 수 있다. 최근 비스타부터는 확장된 버전인 CmRegisterCallbackEx() 함수를 사용할 수 있다.


2.5 네트워크 보호

  안티바이러스에서도 기본적으로 방화벽 기능이 제공된다. 과거에는 NDIS 및 TDI 필터 같은 드라이버를 개발해야 했지만 최근 비스타 부터는 WFP(Windows Filtering Platform)라는 플랫폼을 제공한다. 이것은 네트워크 필터링 애플리케이션을 만들기 위해 제공되는 플랫폼으로서 API와 시스템 서비스들의 집합이다. 참고로 과거의 NDIS / TDI는 다른 필터 드라이버들보다 개발하기 위한 난이도가 있었지만 WFP라는 간단한 개발 플랫폼이 제공됨으로 인해 최근 버전의 윈도우에서 돌아가는 안티바이러스 프로그램들은 이것을 사용한다고 한다.



'악성코드 분석' 카테고리의 다른 글

윈도우의 예외 처리  (0) 2017.05.09
링크 및 책 정리  (0) 2017.04.23
간단한 패커 개발  (0) 2017.04.23
Yoda's Protector 분석  (0) 2017.04.23
패커들 분석  (5) 2017.04.23
Posted by SanseoLab

블로그 이미지
Malware Analyst
SanseoLab

태그목록

공지사항

Yesterday
Today
Total

달력

 « |  » 2024.4
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30

최근에 올라온 글

최근에 달린 댓글

글 보관함