关于NTFS文件系统中的数据流问题

创建时间:2001-03-02
文章属性:原创
文章提交:xundi (xundi_at_xfocus.org)

关于NTFS文件系统中的数据流问题

xundi@xfocus.org <安全焦点>
http://www.xfocus.org
2000-9-18

在NTFS文件系统里存在的数据流形式已经是几年前的事情了,而防病毒供应商
没有充分的检查这一方面的文件,这样导致病毒扫描程序发现不了而已代码或者
病毒扫描程序本身就会有可能破坏文件系统的文件。

NTFS分区的数据流是一个子文件系统允许额外的数据连接到一个特别的文件中,
现在的FAT文件系统格式是不支持数据流格式的。我们可以看看下面的例子来
了解下NTFS的数据流是怎样工作的:

WINDOWS操作系统中使用NTFS文件系统,我们建立下面的一个文件:

echo "this is the main file" > file1.txt

上面这个命令会建立一个叫file1.txt的文本文件并在文件中存在文本字符串
"this is the main file",你可以使用下面的命令验证文件是否成功建立:

type file1.txt
edit file1.txt
notepad file1.txt

使用dir命令就会显示大约26字节大小的文件,上面文件成功建立是因为你存储
到文件系统的有名流分区(the named stream portion of the file system)。

下面我们来建立一个刚才预备的数据文件,在提示符下运行下面的命令:

echo "this is the stream" > file1.txt:stream1.txt

这上面的一个命令可以成功的完成而且没有任何错误显示,其中":"号就是你
指定关联一个流文件。在你尝试运行下面的命令:

type file1.txt:stream1.txt
edit file1.txt:stream1.txt
notepad file1.txt:stream1.txt

除了Notepad,你可以发现所有上面的命令退出的时候会出现某中种形式的错误,
这是由于其中的一些WINDOWS工具对处理有关数据流文件的能力不是很强,因为
在当时写有关NTFS文件系统的数据流存储的时候很多WINDOWS工具没有相应的
更新。OK,现在我们关联一个大的数据流到file1.txt文件中,并俩看看现在
的dir出现的情况,查看文件的字节大小之间的区别:

dir c:\winnt\* > file1.txt:stream2.txt

命令可以成功的执行,但我们建立的数据流文件中增加了将近6,500字节的数据,
可是dir显示的file1.txt显示的仍然只有26个字节,如果我们使用WINDOWS的
资源管理器检查我们照样看到的26个字节的误报数。

为了证实你确实增加了6,500字节的信息,你可以执行下面的命令:

notepad file1.txt:stream2.txt

你可以看到一个包含WINNT 目录的目录列表的文本文件,现在你试试选择
文件-->另存为,你会接受到错误的对话框信息。这是因为notepad有能力
打开和建立流文件,但它不能浏览NTFS这方面的范围。

上面是关联一个文件为流文件,但有趣的是你也可以直接创建一个流文件,
请用下面的命令测试:

echo "this is a stream file" > :file3.txt

OK,这样创建了的流对于dir或者资源浏览器是完全不可见的,就是说是隐藏的,
其中流文件也不能被del文件删除:

del file1.txt:stream2.txt
del :stream3.txt

上面两个删除命令都失败了,这是因为del命令是另一个没有升级到能处理流的
工具,唯一的方法删除挂付的流只能是删除前面的一个主文件,这样的操作就会
自动删除了所追加的流。:stream3.txt的情况你就必须上删除整个目录来删除
这个文件,呵呵。

其中关于流的最大的问题是难于鉴别它们是否存在,编程人员可以使用API函数
CreateFile()来查看一个数据流文件是否存在,但这是假定编程人员在知道
数据流名字的前提下才能操作,例如:在上面的实践中我们能打开数据流文件是
因为我们提供给notepad相应的文件名,但你从上面应该知道,当我们使用"另存
为"的操作时我们失败了,因为"另存为"的操作需要浏览文件系统数据流部分的能力。
CreateFile()只是当你给它提供特定的信息的时候才能工作。

这就出现了一个有趣的问题,"是否存在一种方法,当你不知道文件名的时候也
能鉴别数据流的存在?"经过研究,发现只有API函数中的BackupRead()有能力
发现数据流的存在,不幸的是,很少有工具使用了这个功能。

关于讨论NTFS文件系统的数据流存在问题不是一个新的问题了,在BUGTRAQ上也
讨论过这个问题,见URL:http://www.securityfocus.com/templates/archive.pike?
list=1&date=1998-03-15&msg=Pine.SUN.3.94.980320114349.19659S-100000@dfw.dfw.net

当然微软公司也有关于流这方面的信息和它们怎样的工作,参考URL如下:
http://www.securityfocus.com/templates/archive.pike?list=1&date=
1998-03-15&msg=Pine.SUN.3.94.980320114349.19659S-100000@dfw.dfw.net

Advisory Details
我们测试了最新三个主要病毒扫描开发商的最新版本的病毒扫描程序,所有程序
都不能很好的鉴别存在于数据流中的病毒。例如你建立一个MyResume.doc:ILOVEYOU.vbs
和在数据流文件中保存了I LOVE YOU病毒内容的WORD文件,没有一个测试的病毒
扫描程序在扫描整个磁盘的时候有能力发现这个病毒,即使是选择了"check all files"
选项。这表示一个恶意变成人员可以使用数据流文件系统来隐藏恶意代码来逃避
病毒扫描程序的检查。

当然也存在检测出病毒的可能,前提是驻留在你的内存里的病毒扫描存在必须能
设置成检查所有文件(但这势必要增加资源的负担),这样,当有名的流文件(the
named stream)里的内存读入存在的时候,其中的数据流也会被读到内存里,这
时候驻留在内存中的病毒扫描程序就能探测到有已知病毒特征串的病毒,呵呵,
但这种情况对于新的病毒,没有已知病毒特征串的病毒就无能为力了,而且要知道
的是现在的大多数病毒扫描程序为了减少对系统的负担,病毒扫描程序一般
不设置检查全部文件的选项,驻留内存的病毒扫描程序一般仅仅检查一些带有特定
后缀名如.com,.exe,.vbs等的有名文件流(the named stream)。

所以因为大多数扫描程序没有包括对.ini文件的检查,一个编程人员可以关联一个
带有恶意代码而且不会被检查的文件类型写入到磁盘,在加上编的新病毒如果没有
使用已知的特征串就很难被驻留在内存里的病毒扫描程序发现。

但是问病毒扫描开发商为何没有对数据流文件进行处理?回答的答案是”数据流
可以插入,但你不能直接执行数据流文件,所以是没有威胁的"。这是回答是正确的,
你如果使用命令打开resume.doc:NastyEvilVirus.com所附的病毒码是不会被执行的。

但是如果病毒制作者把病毒代码和执行的代码--(简单的调用和处理的命令)追加到流
文件中,就有破坏系统的可能,下面解释如下:

大家知道病毒扫描程序的扫描是基于特征字符串的,这表示扫描程序检查病毒
代码中的唯一类型来区别其他的文件,如果病毒扫描程序没有能力检查使用数据流
的文件,那病毒扫描程序可以控制使用流数据文件的唯一方法就是控制存在在
流文件系统的中的执行代码部分。

所以一个攻击者可以写一段新的病毒程序,可以执行破坏的任务,他没有马上
发表出来,而是装载一个WORM或者其他投递程序中,这个WORM只是简单的并病毒
代码作为数据流追加到到NTFS文件系统中一些很重要的文件中,如cmd.exe,
Poledit.exe,Regedt32.exe或者其他的。

过几星期后,攻击者再发布了这个病毒代码,其作用就是写入到有名数据流中,
这样病毒供应商就回响应并产生此类病毒的特征字符串记性更新并让用户下载,
然后到第一次被插入数据流的文件被执行的时候,驻留在内存里的病毒扫描程序
就探测到这个装入到内存处的恶意代码。这样,病毒扫描程序就简单的把它作为
了有名数据文件,而不是更改了的数据流,然后就根据其设置提示相应的措施:
如"delete infected files"被选择了的话,一些被插入数据流的重要文件将被
删除,如果选择了"move infected files",那这个重要文件系统就会被移到一个
默认的位置,使系统处于不可操作的状态。如果"prompt for user intervention"
被选择了的话,就会停止执行这个文件并让用户手工删除。因此无论这个病毒
生成的数据流文件有没有执行以后的危害,都会使病毒扫描程序检测为不正常
文件,而使系统处于不稳定的状态。

那么到底有什么方法可以对付这些流文件系统呢?

1,对NTFS文件系统的数据流做一些常规的检查,NTOBJECTive开发了一个很好的
工具Sfind.exe可以很好的找到被更改了的数据流。其地址可以在这里找到:
http://www.ntobjectives.com/,你可以通过AT命令定时的来执行。

2,根据第一步所做的,如果你检查到一个新的数据流,就应该值得可疑,因为
测试情况下默认的NT和WIN2000的安装没有建立任何数据流文件。当然也可能是
第三放的软件造成的,如当一个Macintosh volume建立的时候,流会用来保存
派生的文件信息。因此你在NT系统中存储Macinitosh文件就可以看到数据流。

3,如果你找到可疑的数据流并想从系统中清除出去,第一步执行一个文件的
备份操作。注意你要知道这个备份文件是否支持流文件系统。如果数据流没有
备份,你可以map一驱动盘在一个远程的NTFS分区中并COPY文件到远程系统中。

然后在要把清理的数据流简单的拷贝到non-NTFS分区中,如使用FAT的系统,
WIN98系统或者LINUX,然后在拷贝到本地系统上,因此当你把带有数据流的文
件移到或则拷贝到远程系统里的时候,其中追加的数据流是不会被保存的。

要注意的上述移动会更改一些重要文件的权限,所以为了保证你文档的属性,你
最好使用FileStat或者其他工具来移动文件,这个工具也可以到NTOBJECTIVE里
找到。

当然有扫描程序的供应商进行支持是最好的方法,呵呵。

上面所有东西我本人觉得最有趣的是可以建立一个隐藏的文件,这个问题我记得
ADAM讨论这个情况,大家也可以向他请教。呵呵.....

谢谢大家有耐心看完这个文章。
posted @ 2006-05-09 17:35  Max Woods  阅读(595)  评论(0编辑  收藏  举报