FAT32文件系统惊现漏洞,正在运行的文件也能删除

最近测试发现,FAT32分区下正在运行的EXE程序能够被正常删除,但是无法删除正在使用中的文件。正在运行是指定文件模块已加载到内存,通常是EXE或DLL,而正在使用是指文件句柄被其它进程打开或占用,这类文件通常是文档,例如TXT,确切地说两者是有区别的。不过,即使是正在使用的文件也能通过改写FAT(文件分配表)来强制删除,这个在此暂且不谈。

漏洞测试方法:首先选择一个FAT32的分区,硬盘或U盘都可以,然后复制一个EXE文件到分区下面,可以放到任意目录,根目录或子目录都行,例如文件test.exe,然后复制到了F:\,那么它的路径现在是F:\test.exe,或者使用分区中原本的任意一个EXE也行。接下来双击运行,这时对test.exe进行Shift+Del会发现删除失败,提示“访问被拒绝”。然后,在test.exe所在的目录也就是F:\下新建一个目录,名字任意,比如test,然后移到test.exe到test目录中,这时test.exe的路径变成了F:\test\test.exe,现在重命名目录test,名字任意,比如改成test2,此时test.exe的路径为F:\test2\test.exe,好了,现在我们进入F:\test2,用Shift+Del删除test.exe,会发现test.exe被删除了,再返回删除F:\test2目录,整个删除过程就结束了。

原因分析:当用DeleteFile删除一个文件时,进程最终会调用NtSetInformationFile,将目标置删除标记,之后内核中的MmFlushImageSection会检查该文件的SECTION_OBJECT_POINTER结构,判断此文件是否正在运行,如果正在运行就拒绝删除。所以要强删一个文件,我们可以在内核中hook掉MmFlushImageSection,让系统以为该程序没有在运行,这样就能删除它了。出现上述的情况原因可能是当目录改名后,test.exe的内存区结构没有及时更新,结构中对应的文件名还是原来的路径,所以系统误以为test.exe没有运行,就将其它删除了。不过,NTFS和exFAT系统并没有出现这个问题,这个或许仅是FAT文件系统的缺陷,目前测试成功的分区类型只有FAT32,FAT12/16没有测试,运行环境为WinXP/SP3+FAT32分区,介质为TF卡8G,U盘16G。

FAT32终极强删:如何才能在FAT32下强删任意文件呢?包括句柄被占用的进程?FAT分区下文件被删除后,文件名首字节被改写为0xE5,我们可以直接将目标文件FAT项文件名处改为0xE5,它就看不到了,不过文件簇没有释放,这样相当于它被隐藏了,并没有真正删除。要彻底删除,我们可以采用另一种方法,先在FAT中将其改名,改名后,系统不再对其进行句柄检查,便可直接DeleteFile进行删除,这种方法基本上是万能的。


测试代码:

'**************** FAT32删除文件测试 ********************
'删除文件
Sub m_DelFile(sFileName As String, Optional ByVal bWrite As Boolean)
        Dim sDir        As String
        Dim sDirNew     As String
        Dim sName       As String
        Dim sFileNew    As String
        Dim bSuccess    As Boolean
        
        If SetFileAttributes(sFileName, FILE_ATTRIBUTE_NORMAL) = 0 Then
                If Err.LastDllError = ERROR_FILE_NOT_FOUND Then
                        MsgBox "文件不存在", vbCritical, ""
                        Exit Sub
                End If
        End If
        If InStr(sFileName, "\") <> 0 Then
                sName = Mid(sFileName, InStrRev(sFileName, "\") + 1)
                sDir = Left(sFileName, InStrRev(sFileName, "\") - 1) & "\~NULL"
        End If
        If sName = "" Or sDir = "" Then
                MsgBox "文件名无效", vbCritical, ""
                Exit Sub
        End If
        
        CreateDirectory sDir, ByVal 0&  '创建一个临时目录
        SetFileAttributes sDir, FILE_ATTRIBUTE_HIDDEN  '将目录设为隐藏
        MoveFile sFileName, sDir & "\" & sName  '将目标文件移动到目录
        sDirNew = sDir & "_"
        MoveFile sDir, sDirNew  '重命名目录
        sFileNew = sDirNew & "\" & sName
        If Not bWrite Then
                If DeleteFile(sFileNew) Then
                        RemoveDirectory sDirNew
                        MsgBox "删除成功", , ""
                Else
                        MoveFile sFileNew, sFileName
                        RemoveDirectory sDirNew
                        MsgBox "删除失败,请确定目标文件所在分区是否为FAT32,以及句柄是否被占用", vbCritical, ""
                End If
        Else
                Dim hFile As Long
                hFile = CreateFile(sFileNew, _
                                GENERIC_READ Or GENERIC_WRITE, _
                                FILE_SHARE_READ Or FILE_SHARE_WRITE Or FILE_SHARE_DELETE, _
                                ByVal 0&, _
                                TRUNCATE_EXISTING, _
                                0, _
                                0)
                If hFile <> INVALID_HANDLE_VALUE Then
                        CloseHandle hFile
                End If
                MoveFile sFileNew, sFileName
                RemoveDirectory sDirNew
        End If
End Sub


完整代码:
http://pan.baidu.com/s/1c0CwQ7Q

猜你喜欢

转载自blog.csdn.net/zzmzzff/article/details/80298427