Development/Windows

#1 MiniFilter - 개요

geunyeong 2021. 11. 20. 00:40

Table of Contents

    Abstract

    MiniFilter는 Filter Manger에 의해 관리되며, 쉽게 개발할 수 있고 언로드가 가능한 파일 시스템 필터 드라이버다. 미니 필터 드라이버가 필터 관리자에게 어떤 요청(생성, 읽기, 쓰기)에 대해 작업할 것인지를 알려주면 필터 관리자는 해당 요청이 들어왔을 때 이에 대한 데이터를 미니 필터에게 전달하고 그 결과를 받아 I/O 관리자에게 넘겨준다. 즉 I/O 관리자와 직접 통신하던 기존 방식이 아닌 중간에 필터 관리자를 두고 작업을 함으로써 언로드도 가능하고, 개발도 한결 편해진다는 장점을 가질 수 있다.

    본 글에서는 Windows의 파일 시스템 필터 드라이버 기능인 미니 필터에 대해 간단하게 정리했다.

    MiniFilter

    많은 보안 프로그램들이 파일 시스템 이벤트를 모니터링하기 위해 미니 필터를 사용하고 있다. 미니 필터는 Windows 시스템의 커널 레벨에서 모든 프로세스의 파일 시스템 요청을 모니터링하고 필요시 요청을 차단하는 것도 가능하지만 일반 파일 시스템 드라이버와 달리 언로드도 가능하고, Port와 같이 쓰기 쉬운 유저 모드 어플리케이션과의 통신 방식도 지원한다.

    Windows 시스템의 I/O 관련 인사이트는 아래 글을 참고하면 좋을 것 같다.

    • Windows I/O Manager
    https://geun-yeong.tistory.com/50

    Filter System Filter Driver

    미니 필터가 있기 전엔 파일 시스템 모니터링이 불가능 했던 건 아니다. 단지 좀 더 까다롭고, 좀 더 위험했다. 미니 필터가 있기 전에는 실제 파일 시스템 드라이버를 만들고 이 드라이버가 필터 기능을 하도록 했다. 드라이버 스택 상으로 NTFS 서비스를 제공하는 ntfs.sys의 바로 위에 올가가게 된다.

    파일 시스템 드라이버 위에 필터 드라이버를 올린 모습

    해당 드라이버의 IRP_MJ_CREATE에 IRP Dispatch Routine을 등록하면 어떤 어플리케이션이 파일에 접근하는 지 볼 수 있고, I/O 관리자에게 STATUS_ACCESS_DENIED를 반환하는 방법으로 파일 접근을 차단하는 것도 가능하다.  문제는 이러한 파일 시스템 드라이버는 레거시 드라이버가 아니기 때문에 로드는 될지언정 언로드가 불가능하다는 단점이 있었다. 언로드 하고 싶다면 시스템을 재부팅해야 했다.

    미니 필터 이전의 파일 시스템 필터 드라이버 동작 원리

    Filter Manager

    앞서 본 바와 같이 레거시 드라이버가 아닌 WDM 스타일의 드라이버는 많은 부담을 안고 개발해야했다. 이를 개선하고자 필터 기능을 위한 인터페이스를 제공하는 Filter Manager(FltMgr.sys)가 생겼다. 필터 관리자는 ntfs.sys 같은 파일 시스템 드라이버보다 위에 존재하며 미니 필터 드라이버 개발자가 제공한 미니 필터 드라이버의 필터 콜백 함수를 호출하고 그 결과를 I/O 관리자가에게 넘겨주는 역할을 한다. 이로 하여금 파일 시스템 드라이버와 동일한 기능을 제공할 수 있으면서도 개발하기 쉬운 드라이버 프로그램을 만들 수 있다.

    필터 관리자와 미니 필터 간의 관계(MSDN)
     미니 필터 사용시 모습

    위 그림을 보면 알 수 있듯 ntfs.sys 같은 파일 시스템 드라이버보다 위에 FltMgr.sys인 필터 관리자가 올라가 있고, 필터 관리자는 우리가 만든 미니 필터 드라이버를 호출하는 방식으로 동작한다. 파일 시스템 드라이버 스택에 직접 추가되면 언로드가 불가능하다는 문제가 발생하지만 이렇게 필터 관리자를 통해 간접적으로 스택에 추가되기 때문에 언로드가 가능하게 되는 것이다.

    필터 관리자는 미니필터 드라이버가 로드될 때만 활성화 된다. 즉 현재 시스템에 FltMgr.sys가 로드되어 있다면 미니 필터가 설치됐을 것이다. 로드된 후에는 각 볼륨의 파일 시스템 스택에 Attach된다. 백신과 같은 보안 프로그램도 미니 필터를 이용해 시스템 보호를 제공하기 때문에 필터 관리자는 거진 로드되어 있다고 보면 된다. DeviceTree를 이용하면 로드된 FltMgr.sys를 볼 수 있다.

    OSR의 DeviceTree로 본 FltMgr

    Mini Filter

    미니 필터는 필터 관리자에게 종속되어 각 볼륨에 대해 필터링 작업을 수행하는 레거시 드라이버다. 파일 시스템 드라이버처럼 디바이스 스택에 직접 Attach되는 것이 아니라 FlgMgr에 의해 간접적으로 Attach 되기 때문에 언제든지 언로드도 가능하다. 미니 필터는 필터 관리자에게 어떤 작업에 대해서 필터링을 수행할 것인지를 알려주고, 필터 관리자는 미니 필터가 필터링하겠다고 알려준 작업이 들어오면 이를 미니 필터의 콜백 함수에게 전달한다. 그리고 미니 필터가 반환한 결과는 그대로 I/O 관리자에게 전달된다.

    미니 필터 동작 원리

    Windows 시스템에는 여러 개의 미니 필터가 존재할 수 있다. 그러므로 이들의 순서도 존재하는데, 이들의 순서를 결정 짓는 값을 Altitude라고 한다. Altitude는 기본적으로 정수지만 실수도 사용 가능하다. 필터 관리자는 Altitude 값이 높은 미니 필터부터 값이 낮은 미니 필터 순으로 작업 요청 정보를 전달하고 그 결과를 반환받는다. 시스템에 로드된 미니 필터 목록은 fltmc 명령으로 볼 수 있다. fltmc로 미니 필터 목록을 보면 V3 Lite 제품에서 사용하는 미니 필터가 다수 보이는데, 이중 Altitude를 실수로 지정하여 같은 Altitude 내에서도 우선순위를 달리 줄 수 있다. 기본적으로 Altitude는 임의로 지정해서는 안되고 MS에 등록하여 값을 지정받아야 한다. MS에서 지정한 Altitude 값들은 MSDN에서 확인할 수 있다.

    https://docs.microsoft.com/en-us/windows-hardware/drivers/ifs/allocated-altitudes

    fltmc 결과

    Close

    유저 모드 어플리케이션에서 파일에 접근할 때 커널에서 일어나는 과정을 정리하면 아래 그림과 같다. 옛날에 파일 시스템 필터 드라이버를 처음 공부할 때 정리했던 그림이라 사실과 맞지 않을 수 있으니 참고용으로만 보길 바란다. 지금이라고 이게 맞는지 틀린지 아는 것도 아니다...

    1. I/O 관리자는 Object Manager를 통해 유저 모드 어플리케이션이 요청한 파일에 대해 File Object를 생성한다.
    2. I/O 관리자는 Security Reference Monitor를 호출해 유저 모드 어플리케이션이 요청한 파일에 대해 올바른 접근 권한을 가지는 지 검사한다.
    3. I/O 관리자는 요청된 파일에 대한 IRP를 만든다.
    4. File System Driver 스택에 포함된 드라이버들의 IRP Major Function을 호출한다.
    5. _
    6. _
    7. Volume Manager Driver 스택에 포함된 드라이버들의 IRP Major Function을 호출한다.
    8. _
    9. Disk Device Driver 스택에 포함된 드라이버들의 IRP Major Function을 호출한다.
    10. _
    11. 후처리 루틴(Post Routine or Completion Routine)이 등록된 드라이버가 있다면 Post Routine들을 실행한다.
    12. 만약 파일 생성 요청이라면 File Object의 Vpb가 NULL이다. 드라이버가 모든 작업을 끝내고 나면 File Object의 Vpb에 VPB 구조체를 가리키는 주소 값을 저장한다.
    13. 유저 모듈에게 요청 결과를 반환한다.

    다음 글부턴 MiniFilter를 직접 만드는 글을 작성해보겠다.

    Github

    https://github.com/geun-yeong/minifilter-example