通过对驱动层硬件插拔的研究实现USB安全的设计

描述

大多数普通安全U盘通过使用软件实现安全U盘加密功能。在使用过程中,用户需要打开专用的U盘浏览器或管理工具等,不但操作不方便,而且不符合USB设备使用习惯和人性化设计。

本文通过对驱动层硬件插拔(PNP)的研究,PNP是由Microsoft提出的,英文Plug and play的缩写,中译即插即用,意思是系统自动侦测周边设备和板卡并自动安装设备驱动程序,作到插上就能用,无须人工干预,是Windows自带的一项技术。所谓即插即用是指将符合PNP标准的PC插卡等外围设备安装到电脑时,操作系统自动设定系统结构的技术。这就是说,当用户安装新的硬件时,不必再设置任何跳线器开关,也不必用软件配置中断请求(IRQ)、内存地址或直接存储器存取(DMA)通道,Windows会向应用程序通知硬件设备的新变化,并会自动协调IRQ、内存地址和DMA通道之间的冲突。

在分析了Windows DDK/FSD驱动开发技术、卷上过滤驱动技术,提出了在Windows系统插入USB设备时,自动挂载符合规定卷格式的USB设备,映射为本地磁盘,USB(Universal Serial Bus)即“通用串行总线”是一种应用在计算机领域的新型接口技术。USB的拓扑结构中居于核心地位的是Host(也称为主机)。任何一次USB的数据传输都必须由主机来发起和控制,所有的USB外设都只能和主机建立连接,任何两个外设之间或是两个主机之间无法直接通信。而目前,大量的扮演主机角色的是个人电脑PC。随着USB应用领域的逐渐扩大,对于USB的期望也越来越高。我们希望USB能应用在各种计算机领域中,希望能通过PDA等移动设备直接和USB外设通信,使得USB能应用在没有PC的领域中。

1 原理与架构

系统分为驱动层和应用层,驱动层包括一个卷过滤驱动程序和一个文件系统过滤驱动;应用层包括一个应用程序和与驱动交互的dll。应用层是隐藏界面的应用程序。卷过滤驱动对USB盘的(PNP)动作识别,读移动硬盘卷的头为512 B,对特定标识识别,如果不符合卷标示,则可采用禁用或放行等;如果符合卷格式和标识,则对此卷进行映射。

普通U盘使用前需要格式化,物理U盘上的数据是随机的数值。密码算法采用基于口令的密码系统 (RFC2898),口令和盐(salt)结合产生密钥。盐可看作是对口令导出的一个大密钥集合的索引。盐和迭代次数构成了PKCS#5v1.5中基于口令加密基础。系统总体架构序列图如图1所示。

电脑

加密算法可采用AES-256、Serpent、Twofish等,解密时通过判断厂商标识以及CRC-32校验和是否正确,在此过程中在权限注册区读入相应的注册信息,如GUID和厂商标识等。如上述过程正确,则执行正确的卷映射过程。

2 研究与实现

系统应用层主要由三个线程组成,主线程是应用程序,剩下卷映射线程和卸下卷(unmount)线程分别用来在USB存储设备做PNP时对本地盘进行卷映射和卸下卷。线程和驱动层采用事件通信机制。本系统定位于移动存储设备,包括移动硬盘、U盘及移动存储卡等移动存储介质。密文区是从内部可信计算机拷贝数据到USB存储设备,数据在后台加密处理后存放的区域;权限注册区则写入GUID和必要的厂商、运行权限、内外网策略等。

卷映射线程收到底层USB的PNP动作时,首先得到运行环境,根据运行环境得到USB存储设备读写权限,然后根据相关密码、密钥等参数通过DEVICEIOCONTROL通知驱动创建本地虚拟盘,最后广播DBT_DEVICEARRIVAL消息通知操作系统。

集中注册与授权,使用前必须经过授权中心统一注册与授权,包括格式化、实名注册、标识密级、指定授权计算机、是否采用口令保护等。授权后的移动存储介质在涉密计算机上能正常使用,当未授权的移动存储设备接入计算机时,系统可自动关闭USB端口,使未授权移动存储介质无法在涉密计算机上使用。

对于正确安装了移动存储安全系统客户端的计算机,客户端自动上报该机状态,完成到控制台服务器注册功能,有效防止非法用户安装客户端程序。灵活的注册策略,可设定移动存储介质允许的计算机或组;管理员可随时更改移动存储介质注册策略和信息,包括远程策略变更、挂失和注销等;外出拷贝功能是将COPY到U盘内安全存储的数据与外界没有安装客户端程序的计算机进行数据交互使用。

应用层完成对移动存储设备的格式化工作。对卷起始位置写入密码、校验和等信息,提供了FAT32和NTFS两种文件系统格式。在驱动中对移动存储设备做卷映射,创建类型为FILE_DEVICE_DISK卷过滤驱动,使用不同的盘符。在IRP_MJ_WRITE和IRP_MJ_READ请求例程中进行加解密。在IRP_MJ_WRITE分发例程中把相关的IRP存入队列。在新创建的系统线程内进行卷加密。在IRP_MJ_READ中进行解密。

注册主要由应用层注册工具完成,可由用户选择FAT32或NTFS格式。注册流程如下:访问移动存储盘,输入需要注册信息。注册信息包括:移动存储盘密码、标签名、安全等级、客户标识名、分区个数、内网移动存储策略、外网移动存储策略、1~5等级的移动存储策略。

插入安全U盘后,得到处理环境信息:是否为有效设备、是否有客户端代理、客户标识匹配、在内网否、安全等级是否1~5,然后决定应用不同策略。驱动只要挂载存储卷的UpperFilter即可完成卷的加解密任务。

在PnP技术出现之前,中断和I/O端口的分配是由人手工进行的,您想要这块声卡占用中断5,就找一个小跳线在卡上标着中断5的针脚上一插。这样的操作需要用户了解中断和I/O端口的知识,并且能够自己分配中断地址而不发生冲突,对普通用户提出这样的要求是不切实际的。PnP技术就是用来解决这个问题的,PnP技术将自动找到一个不冲突的中断和I/O地址分配给外部设备,而完全不需要人工干预。但是如果您读懂了上面关于中断冲突的那一部分,您就应该了解,在中断资源非常紧张的今天,即使是PnP技术,也不一定能找到一个合适的中断分配给您刚刚插入的设备,所以尽量释放那些没有必要的中断,对PnP正常工作也是很有帮助的。

卷过滤驱动在IRP_MJ_PNP请求时监控设备的插拔消息,程序判断是否是指定的卷格式,如发现是移动存储设备,则用DeviceIoControl与驱动层通信。通过对新加卷的监控,实现对移动存储设备的加解密。应用层通过DeviceIoControl与应用层的通信获得用户密钥和权限策略。

在文件系统驱动层映射卷的流程如下:应用程序调用ZwCreateFile或IoCreateFileSpecifyDeviceObjectHint,I/O管理器确定请求的目标是哪个逻辑卷,检查是否设置了VPB_MOUNTED。如此卷在系统引导后未被卷映射,则I/O管理器发送卷映射请求(IRP_MN_MOUNT_VOLUME)。

对移动存储设备的格式化可分为FAT32和NTFS两种格式。卷过滤驱动监控系统的PNP行为,如移动介质头512 B符合卷头格式,则使用事件通知应用层对移动介质卷映射,卷映射线程将相关参数(盘符、密码、磁盘属性)等传递到文件系统驱动,创建一个FILE_DEVICE_DISK类型的过滤设备;然后创建一个线程,在线程中应用ZwCreateFile打开卷设备Handle,读取卷头信息,对卷头信息进行验证,如验证卷头信息成功,则创建相应盘符的符号链接;对USB设备加密模式为XTS;卸下卷线程接到拔下USB存储器通知事件后,对相应盘符进行卸载,清理相关资源。

应用层包括对卷格式化功能,对移动USB设备合法性验证、得到USB运行环境信息、根据策略信息对USB设备进行读写、禁用等控制。在USB设备上单开辟一个区域,用来存取注册信息以及写入注册信息和读取注册信息,生成GUID写入USB设备的唯一标示,完成卷映射功能。

安全U盘总体设计序列图如图2所示。

电脑

在PNP发生时,驱动层和应用层通过事件进行通信。对卷映射和卸下卷过程各启动一个线程等待PNP事件发生。首先验证卷头格式,卷头信息读到RAM中。卷头64 B是生成密钥所需的盐(salt),驱动层解密读入的标准卷头、解密过程中的所有数据保存在RAM中。在此过程中需要得到如下参数:

卷头导出函数用的PRF参数(见PKCS #5 v2.0)可为:HMAC-SHA-512、HMAC_RIPEMD-160等;厂商标示密码和读入的盐值传给卷头密钥导出函数,生成头解密密钥和扇区解密密钥;使用的加密算法为AES-256;解密时对照厂商标示密码及校验和,密钥用来解密卷上的扇区。

主要数据结构和参数如下:

(1)卷映射数据结构

typedef  struct

{

Int    nReturnCode;                //底层sys返回码

Short      wszHsVolume[MAX_PATH];        //卷名称

Password   VolumePassword;            //用户密码

BOOL      bCache;//是否在驱动中缓存密码

Int          nDosDriveNo;    //需要卷映射的盘符号

Int          BytesPerSector;                //扇区字节数

BOOL      bSystemVolume;        //是否为系统卷

BOOL      bPersistenVolume;    //是否为隐藏卷

BOOL      bMountReadOnly;//是否映射为隐藏卷格式

BOOL      bMountRemovable;//是否映射为可移动

//存储设备

} MOUNT_STRUCT;

(2)设备信息结构

typedef struct _SECDEVICEINFO

{

CHAR    szProvider[SD_MAX_PROVIDER_LEN];

//设备提供者名称

DWORD  dwDeviceType;        //设备类型

CHAR    szDeviceID[SD_MAX_DEVICE_ID_LEN];

//设备唯一标识

__int64  dwDeviceCapacity;            //设备容量

} SECDEVICEINFO, *PSECDEVICEINFO;

(3)策略数据结构

typedef struct  _POLICYDATA

{

BOOL    bEnableSecPart;    //是否启动保密区

BOOL   bReadSecPart;    //是否可读保密区

BOOL   bWriteSecPart;        //是否可写保密区

BOOL    bEncryptSecPart;        //是否加密保密区

BOOL    bEnableExchPart;        //是否启用交换区

BOOL    bReadExchPart;        //是否可读交换区

BOOL   bWriteExchPart;        //是否可写交换区

BOOL    bEncryptExchPart;        //是否加密交换区

BOOL    bExchPartToSecPart;

//是否允许从交换区复制到保密区

BOOL    bsechPartToSecPart;

//是否允许从保密区复制到交换机

} POLICYDATA,*PPOLICYDATA;

应用层创建双线程,等待PNP消息,如接入USB盘符和特定卷格式,则对卷做相应卷映射和卸下卷。

对卷卷映射函数:

Int MountVolume (

int driveNo,

char *volumePath,

Password *password,

MountOptions *mountOptions,

BOOL bReportWrongPassword );

对卷卸下卷函数:

BOOL    UnmountVolume

(int nDosDriveNo, BOOL forceUnmount );

创建内存中卷格式:

int VolumeWriteHeader(char*header,int ea,int mode,Password* password,

char*masterKey,

PCRYPTO_INFO*retInfo,

BOOL bWipeMode );

读入USB卷头:

int VolumeReadHeader(char*encryptedHeader,Password);

经过测试人员测试和客户现场应用,本系统达到了良好的应用效果,从驱动层到应用层都运行良好。系统支持FAT32和NTFS格式,对容量较大的USB移动存储设备和容量较小的U盘都有较好的使用和保密果。WINDOWS NT则更进一步,它可以检测出SCSI设备及其他一些硬件,到了WINDOWS95/98,则几乎可以实现全自动的安装和系统的动态重配置。尽管WINDOWS95不可能对所有旧设备都能正确地识别,甚至有时也会求助于用户,但就即插即用本身而言,这已经是一个真正的飞跃了。现在的WIDNOWS98/2000在PNP方面又得到进一步的发展。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分