2024年2月9日发(作者:)

跟踪USB存储:分析USB存储设备所产生的Windows历史记录关键词:USB存储Windows历史记录设备ID即插即用管理物理设备对象摘要当一个USB存储设备(比如一个U盘)连接到Windows系统时,系统就会创建一些标识符。这些标识符,也称作历史记录,在系统关闭时仍然存在。在许多情况下,这些历史记录可能被用来识别曾经连接到Windows系统的特定设备,以对存在的问题进行取证。2005年爱思唯尔股份有限公司出版引言通用串行总线(USB)是允许将多种设备连接到计算机系统上的一种机制。随着各种各样的设备通过USB连接到一台计算机上已经变得很普遍,本文仅限于那些可选择的、可移动的存储介质。这不仅包括标准的“U盘”,还包括数码相机、个人媒体播放器以及伪装了的存储设备,比如一把包括数字存储空间和其它特征的瑞士小刀。这种存储介质为用户快速交换文件提供了前所未有的便利。近几年这种设备的价格疯狂下跌,但是其存储密度却有很大的提高。这种存储设备在给用户带来方便的同时,也带来了不可忽视的安全风险,特别是在企业环境中。这种容量大体积小的存储设备为下载和窃取大量隐私和敏感的信息提供了掩护。一张标准的3.5英寸软盘虽然很容易藏在衣服的口袋里,但它只能存储1.44MB的数据,而一个拥有1GB甚至更大存储空间的U盘可以很容易的藏起来,并且可以容得下整个数据库。许多数码相机在Windows系统中被用作标准的存储媒体,并且标有盘符,还可以像U盘一样使用。为了提供从一个系统中转移数据的方法,USB存储设备可以将外部代码输入到另外的受保护的系统或者网络。在限制了像防火墙和入侵检测系统等边界防御程序效率的情况下,终端用户如果使用了未经检查或未被监控的USB存储设备时,恶意的代码可能会在无意中或以其它方式引入。当一个USB存储设备连接到一个Windows系统时,这个系统上的驱动器会收集这个设备的信息,然后它会利用这些信息在这个系统上建立一个独立的历史记录。这个信息被固存在这个系统中,而且大多数情况下在其它的Windows系统下这个信息也是一样的。这些历史记录可以延续连接在这个系统上的USB存储设备的使用时间线,还可以证明这个设备曾连接到其它的Windows系统。这个信息可以用来进一步进行计算机取证调查并且记录下来。这篇文章讨论的样例操作系统是WindowsXP,并且大部分的信息也适用于Windows2000和2003。论述注册表记录当一个存储设备通过USB接口连接到一个Windows系统时,操作系统就会发现这个新硬件的附加信息,并且相关的驱动器就会寻求这个设备的确切描述符[1],以确定设备的制造商、版本号、设备种类以及其它信息。如果USB集线器驱动发现一个新的USB设备连接到这个系统,系统就会试图恢复这个设备的确切描述符。基于从这个设备上恢复的描述符,Windows就会按照如下格式创建设备实例标识符(设备ID)[2]:USBVID_v(4)&PID_d(4)&REV_r(4)设备ID中所呈现出的数值直接取自设备描述符[3]。v(4)是设备描述符中idVendor域的一个四

基于USB接口的HID设备接口设计·论文翻译位供应商代码,d(4)是idProduct域中的一个四位产品代码。r(4)是一个四位的版本代码。Windows也会从设备描述中提取类别码(bDeviceClass域)、子类别码(bDeviceSublass域)和协议码(bDeviceProtocol域),以便列出兼容的设备描述符(兼容ID)清单。如果想看这种描述符的例子,可以在USB存储设备连接在系统上时打开设备管理器。在通用串行总线控制器下选择对应的设备(比如USBMassStorageDevice),然后右击并从下拉菜单中选择属性。再选择详细信息标签,然后从下拉单选择设备范例ID、硬件ID或者兼容ID。相应的值就会显示在详细信息这一栏的文本框中,如图1所示。即插即用管理器就会访问注册表以定位即插即用设备的inf文件。这个注册表键是:图1设备属性的详细信息标签中显示设备范例IDHKEY_LOCAL_MACHINESoftwareMicrosoftWindowsCurrentVersion答案就是“DevicePath”的值。这个值的数据类型为REG_EXPAND_SZ,意思就是这个数据可以有多个路径值。在默认情况下,这个路径指向Windows系统目录的INF文件夹(也就是%SYSTEMROOT%Inf)。即插即用管理器会根据设备范例ID和兼容ID寻找设备路径注册表键中所列出的相应驱动的路径,然后在0到0xFFFF之间对发现的驱动进行排序[4]。序号最低的驱动就会被安装,即装载。文件明确地列出了操作系统所支持的设备ID。如果从设备描述符中所获取的描述符与文件中的任何一个相匹配,操作系统就会装载驱动[5]。一旦驱动被装载,系统就会为每一个设备逻辑单元创建一个新的物理设备对象,即PDO。PDO的格式如下:USBSTORv(8)p(16)r(4)在PDO中,v(8)是一个8位字符的供应商标识符,p(16)是一个16位字符的产品标识符,r(4)是一个4位字符的版本级别。通过设备管理器查看设备ID,就会发现有另外的12位附加在设备ID后面(如上所述)。这是设备的序列号。设备的设备描述符包含一个叫做iSerialNumber的值,这就是含有设备序列号的字符串的索引。如果iSerialNumber的值是0x00,那么这个设备就没有序列号;否则它的值就是可以被找到的代表设备序列号的字符串的索引[6]。这个序列号对这个设备来说是独有的,并且是用于识别系统中设备的独特方法。这个序列号在其它的Windows系统中也是识别设备的独特方法。注意图2通过UVCView查看到的序列号2

跟踪USB存储:分析USB存储器所产生的Windows历史记录到对于每一个USB的详细描述,序列号并不是必须要含有的这一点很重要。关于这方面的其它问题将在说明部分作深入探讨。用USB连接的存储设备的序列号可以用UVCView[7]工具查看,这个工具可以从MS得到。图2显示了通过UVCView查到的一个用USB连接的存储设备的序列号。没有序列号的设备,将会在第二个“&”字符后面赋上12位字符。详细说明如何创建这个标识符的文件是无法从供应商那里获得的,但是实验和经验表明倒数第二个字符也是“&”,并且最后的值与设备所连接的USB端口对应。设备范例ID[8]是由即插即用管理器生成的,并且会随着同一个硬件所插入的同一个USB集线器端口的不同而变化。一旦设备连接上并且用户已经访问了这个存储设备,连接的痕迹,即历史记录就会在注册表和文件系统中表现出来。我们关注的第一个注册表键就是:HKEY_LOCAL_MACHINESystemCurrentControlSetEnumUSB在这个注册表键下面还有一系列的子键,每一个都和之前介绍过的设备ID有相似的格式(即USBVID_v(4)&PID_d(4)&REV_r(4))。这些设备ID的每一个子键都有一个或者更多的子键,这些都是曾连接到过这个系统的设备的范例ID。我们关注的第二个注册表键是:HKEY_LOCAL_MACHINESystemCurrentControlSetEnumUSBStor在HKLM..EnumUSBStor键之下的子键和USB键之下的设备ID子键有相似的格式,但是这种十六进制的值可以被人们可以读懂的数值替换。一般情况下,在USBStor键下将会有更少的子键,因为它具体到USB大容量存储设备,而USB键是为用USB连接的设备而设的。就像USB子键一样,在USBStor键下的设备ID子键之下也有一个甚至更多的范例ID子键,它代表了每一个曾连接到这个系统的设备。图3给出了对应的注册表键的样例,显示了同一个设备的USB和USBStor键的入口。注册表有一个被称作“最后写入”时间并与它们相关的值。这个值和最后修改时间相近,并和文件有关,因为它以某种方式表示了注册表键最后一次修改的时间。当为了各种各样的值而查询注册表键时,根据与USB存储设备有关的用户行为,这个键的最后修改时间可以用来记录部分时间线。图3标准USB存储设备的注册表入口样例3

基于USB接口的HID设备接口设计·论文翻译别外,带有驱动盘符的USB存储设备可以通过查看如下注册表键下的注册表值看到。HKEY_LOCAL_MACHINESYSTEMMountedDevices为了确定这个USB存储设备被分配了哪一个驱动盘符,我们必须从USBSTOR下的设备注册表键的“ParentIDPrefix”中取出值。我们将利用图3中设备的值“8&2713a8a1&0”作为一个例子。图4安装设备的注册表键注册表键HKLMSystemMountedDevices(见图4)维护着安装管理器永久的名称数据库[9]。这个键下的值由一系列不同的卷名称(以“??Volume{GUID}”的格式存在)和驱动盘符(用“DosDevicesC:”格式表示)组成。安装点也可能包含在内(用如下格式表示:“DosDevicesdriveletter:mountpoint”)。每一个这种符号链接都伴有特有的卷标识符(不要和特有的卷名称混淆)。这种特有的ID允许系统识别一些表示同一个卷的符号链接名。这些特有的ID包含了ParentIDPrefix的值。所有这些子键的值都以二进制的形式存储。这个值(二进制数据,即REG_BINARY数据类型)的小数点后35位是与具体子键有关的存储设备的ParentIDPrefix值,如图5的屏幕截图所示。图5高亮显示ParentIDPrefix的安装设备数据这个信息可以用来将具体的USB存储设备映射到分配给它的驱动盘符。图6举例说明了贯穿USBStor键并列举设备的Perl脚本的输出。Perl脚本贯穿于USBStor注册表键并且列举出每一个和设备ID相一致的子键。这个脚本显示了带有最后写入时间的设备ID,就是键名右边括号中所显示的内容。这个脚本对设备ID键之下的每一个范例ID键名做出相同的处理,另外,还显示出“DeviceDescr”的值。在这些现象的背后,4

跟踪USB存储:分析USB存储器所产生的Windows历史记录图的Perl脚本输出样例这个脚本从每一个范例ID子键中收集ParentIDPrefix的数据。然后分析并且部分显示安装设备键的内容,并利用预先收集到的ParentIDPrefix值将用USB连接的存储设备映射到分配给这个设备的驱动盘符。然而,驱动盘符的分配并不是唯一的。前面图6所举的例子是2005年4月5日,星期二,收集到的。序列号是AC的USB存储设备是在那一天连接到测试系统的,并且分配的盘符是“D:”。然而,注册表键中的最后写入时间并没有如前所述的那样反应对驱动盘符的操作。将序列号为9487B4B0401DB6B5的USB存储设备连接到系统上并重新运行的Perl脚本,产生了图7所示的输出。图的Perl脚本输出样例注意安装设备键已经更新,就像已经改过了的伴随这个键的最后写入时间(“Mounted-Devices”右边的括号中)所揭示的那样。新设备驱动盘符的重新分配引起了最后写入时间的更新。利用这些信息,检查员就可以利用其它系统上的历史记录(例如最近访问的文档和LNK文件)来更深入地了解特定的USB存储设备的用途。5

基于USB接口的HID设备接口设计·论文翻译文件系统的历史记录从前面提及的注册表键中导出的信息可以通过对从%SYSTEMROOT%(标准XP安装是在C:WINDOWS)里找到的[10]文件的测试得到加强。这个文件相当详细地记录了驱动程序、服务包和热修复补丁的安装。下面是引自文件的部分:[2005/03/3007:13:591172.19DriverInstall]#-019正在查找硬件ID(s):usbstordiskwd_flash_disk_1.89,…(舍位).#-018正在查找兼容ID(s):usbstordisk,usbstorraw.#-198处理的命令行:C:.#I022在C:中发现了”GenDisk”;设备:”磁盘驱动”;驱动:”磁盘驱动”;提供程序:”Microsoft”;制造商:”(Standarddiskdrives)”;段:”disk_install”.#I023实际安装部分:[disk_].等级:0x00000006.驱动程序有效时间:07/01/2001.#-166设备安装函数:DIF_SELECTBESTCOMPATDRV.#I063从[disk_install]中的‘‘c:’’选择驱动器安装服务.#I320设备类别GUID依旧为:{4D36E967-E325-11CE-BFC1-08002BE10318}.#I060设备所选的驱动器#I058选择最兼容的驱动器.#-166设备安装函数:DIF_INSTALLDEVICEFILES.#I124正在做“仅复制”安装‘‘USBSTORDISK&VEN_WD&PROD_FLASH_DISK&REV_1.899487B4B0401DB6B5&0’’.#-166设备安装函数:DIF_REGISTER_COINSTALLERS.#I056注册了共同安装程序.#-166设备安装函数:DIF_INSTALLINTERFACES.#-011正在从"c:"安装段[disk_aces].#I054安装接口.#-166设备安装函数:DIF_INSTALLDEVICE.#I123进行‘‘USBSTORDISK&VEN_WD&PROD_FLASH_DISK&REV_1.899487B4B-0401DB6B5&0’’完整安装.#I121‘‘USBSTORDISK&VEN_WD&PROD_FLASH_DISK&REV_1.899487B4B0401DB6B5-&0’’的设备安装成功完成.引自中的设备ID和附加设备的序列号(分别就是DISK&VEN_WD&PROD_FLASH_DISK&REV_1.89和9487B4B0401DB6B5&0)以及安装日期(也就是“2005/03/3007:13:59”)都是重要的信息。通过Perl脚本可知,安装的设备和注册表所枚举的第二个设备相一致(见图7所示的Perl脚本输出),并且日期与注册表的最后写入时间相一致。时间要推迟5个小时,这相当于WindowsXP系统中用于测试的时区信息。Perl脚本以UTC格式返回最后写入时间,同时通过API函数FileTimeToSystemTime()对FILETIME对象进行转换[11],而不是FileTimeToLocalFileTime()函数。6

跟踪USB存储:分析USB存储器所产生的Windows历史记录说明不能依据没有返回有效iSerialNumber信息的USB存储设备在注册表中创建全局唯一的历史记录。在WindowsXP系统中,一个程序设计者可以通过添加两个完全相同并且没有序列号的U盘来产生注册表“冲突”。第一个设备像预期的一样运行,在注册表和文件中产生相应的历史记录。移除这个设备然后插入第二个设备导致没有新的记录产生——第二个设备仅仅利用第一个设备的全局唯一的标识符和USBStor键。把这两个设备中的任何一个插入到这个系统中的另一个USB端口,就会为每个键对或接口对产生一个新的范例ID(和一个新的ParentIDPrefix值)。作为iSerialNumber的替代品,通过没有正式说明的算法,范例ID和ParentIDPrefix值在内部很明显地产生。我们的观测结果表明,至少在供应商ID、产品ID和产生这些值的USB主硬件的有关信息,还有在具有相同系统硬件不同操作系统下,使用这两个相同设备会产生相同的范例ID和ParentIDPrefix值的测试上,这些计算机演算规则系统是有用的。另外,这种方法论对于不存储本地数据的USB存储设备(即USBCD/DVD刻录机、USB软件盘驱动器、USBZIP/JAZ驱动器等)来说,是没有太大价值的。然而设备本身可以运用这里描述的方法而列举出来,但正在写入的媒体则不能。结论应该重审,对于那些返回有效iSerialNumber值的设备来说,它们的历史记录会在不同的Windows系统之间持久存在。这些相同的有重要意义的值会在Windows2000、XP和2003系统中呈现出来。这会带来对这些数据的一些有趣利用,例如,一个域名管理员可能访问他(她)的整个域名以便找到曾经安装到许多其它机器上的那个USB存储设备。其它的用途包括:建立一个“knowngood”数据库,或者给USB存储设备授权,还可以判断是否有未经授权的存储设备已经安装,亦或者检测USB存储设备在受限的和未受限的机器之间的移动。HarlanCarvey是美国佛吉尼亚州北部麦德隆哥伦比亚特区的计算计算机安全顾问。他专门从事关于计算机的危险性评估和对突发事件反应,还是“WindowsForensicsandIncidentRecovery”(在Amazon上可以看到)的作者。对于Windows管理员和顾问,他还提供对突发事件的反应训练。注释[1]/library/?url=/library/enus/install/hh/install/idstrings_[2]这种格式仅适用于单一接口设备。[3]/library/?url=/library/en-us/install/hh/install/idstrings_[4]/?scid=kb;en-us;279112.[5]/library/?url=/library/en-us/install/hh/install/idstrings_[6]/whdc/system/bus/USB/USBFAQ_[7]/whdc/device/stream/vidcap/[8]/library/?url=/library/en-us/install/hh/install/idstrings_[9]/library/?url=/library/en-us/storage/hh/storage/03class_[10]/whdc/driver/install/[11]/?scid=kb;en-us;1889777