[MIP-3] [MVL] fltmgr.sys를 가르키며 bsod 발생하는 문제
Subject
[MVL] fltmgr.sys를 가르키며 bsod 발생하는 문제
APPLIES TO:
MCCS 3.1
SYMPTOMS
간헐적으로 blue screen 발생
CAUSE
dmp에서 가르키고 죽는 위치는 VllMessage()에서 IsWritable 체크하는 부분의 FltEnumerateVolumes() 사용때를 가르킴
FltEnumerateVolumes()에서 첫번째 인자인 PFLT_Volume 값이 정확하지 않을 경우 memory access violation 으로 bsod발생
어떤 경로로 첫번째 인자가 잘못된 값이 들어왔는지는 아직 파악 못함.
로그를 남기는 것이 아니라 bsod 로 죽어버리므로 당시의 값 파악이 어려움
따라서 FltEnumerateVolumes() 이 실패하였거나 PFLT_VOLUME 값이 NULL 인 경우는
아래의 FltGetVolumeGuidName()을 실행하지 못하도록 수정함.
FltEnumerateVolumes() 으로 얻어진 PFLT_VOLUME 값들은 반드시 FltObjectDereference()으로 각각 참조를 해제하여야 하나
같은 guid 의 볼륨을 찾을 시에는 break; 로 빠져나오면서 그 이후의 PFLT_VOLUME 값들은 해제가 안되고 있었음.
이를 수정.isWritable의 방식을 kernel을 통하지 않고 user 단에서 IOCTL_ 로 하는 방식으로 변경한 바이너리 설치
이유는 최초 bsod 발생 지점이 kernel을 통한 isWritable을 하는 곳이었으므로 아예 이를 사용하지 않는 방식으로 변경하였음.
isWritable을 예전 user단 IOCTL_ 방식으로 변경한 후에는 아직 bsod에 관련 보고 받은 바 없어 보류 시킴
SOLUTION
isWritable disk 체크 방식이 user 단의 IOCTL_DISK_IS_WRITABLE 을 사용하여 disk 존재 유무를 체크하는 것이
일부 경우에서는 false를 return 하는 오류가 발견되어 다시 kernel 단의 FltIsVolumeWritable() 를 사용하여 체크하는 방식으로 원복하였습니다.
TTA GS 인증 심사때 한번 발견되었으며, se test 서버에서도 발견되었는데
read/write 가 잘되는 local 볼륨을 IOCTL_DISK_IS_WRITABLE 으로 체크하는데 false 를 return 하며,
해당 로컬 볼륨에서는 특이한 사항을 발견 못하여 IOCTL_DISK_IS_WRITABLE 을 더이상 신뢰할 수 없게 되었습니다.
FltIsVolumeWritable() 에서는 지금 issue의 bsod를 유발시키는 루틴이 포함되어 있지만 방어코드 추가 이후는 MVL을 구체적으로 가르키며 bsod를 일으킨 사례가 발생되지 않아 현재방식대로 fix를 완료 합니다.
Fixed MCCS 3.2