|
编者注:本文由北京铠信神州科技有限责任公司 文档安全实验室 友情提供
文件加密技术模型从早期的ApiHook,经历了Sfilter,MiniFilter,LayerFSD (DoubleFCB),LoneFSD到现在的UniFSD技术,已经经历了六代技术发展。主流开发模型已经过渡到MiniFilter框架和传统Legacy FSD框架相结合的新架构。在这里我们着重描述一下文件加密驱动技术的发展进程。根据驱动开发网上的划分方式,目前已经是六代阶段。在第六代技术中,所有的文件请求都经过独立的FSD统一处理,不再区分加密与非加密文件,进一步提高兼容性和安全性。
第一代文件加密技术是采用APIHOOK技术实现的。加密客户端在需要保护的软件中注入自己的填块,然后将CreateFile/CloseHandle/WriteFile/ReadFile等系统调用Hook掉,然后在其中处理数据的加解密。从实现原理上来讲没有问题,但是实作上来看,问题很多。对于paging io 之类的操作,不需要调用read/write操作,所以不能很容易的处理数据。虽然有人已经使用其它办法解决了这个问题,但是从稳定性兼容性上看,还存在不少问题,达不到实用程度。
基于Sfilter的技术中,最大的问题就是缓存同步。为了在加密进程和非加密进程之间进行有效的数据隔离,我们要不断地进行清cache操作,所谓 purgecache,这个操作会投大地降低文件系统的效率。我们的文件系统是基于磁盘存贮的,目前主流的磁盘系统是普通的机械硬盘,速度远远跟不上基于电子运作的内存系统,为了解决这个速度矛盾,操作系统引入了缓存管理机制。如果我们为了加密而不断地清除 cache,会导致文件系统效率降低。而且基于sfilter模型的加密系统的主要问题是这种以降低文件系统效率来换取加密功能的方式并不能彻底解决文件系统缓存混淆问题导致的文件损坏。
Minifilter是一种对sfilter进行封装并为了解决不同的filter设备的加载位置而开发的新的框架,但是它没有从实质上解决上述的问题。试想一下,你用win32 API开发的应用程序有问题时,换用MFC 并不能解决这些根本问题。封装的目的是简化开发难度降低开发时间,但是不能从本质上解决问题。这种框架在杀毒及备份软件上工作得非常好,但是在加密应用中却没有实质性提高。
LayerFSD的出现是为了解决缓存不能清理干净的问题。我们可以这样考虑,如果我们清不干净可不可以干脆不清?答案是肯定的。从本书前面的内容中你可以知道,Windows系统是基于fcb来管理缓存的。如果是这样,我们为啥不给已经加密的文件另外生成一个fcb来只表示加密过并需要透明解密的数据?这样不是很好地解决了这些问题吗?LayerFSD实际上是一个完整的FSD实现。但是只是底层存贮数据时我们并不存贮于磁盘扇区这样的物理结构中而是存贮于下层的文件系统如NTFS之中。这样在加密系统不运行时,用户的文件表现为一个加密过的数据文件,当加密系统工作时,加密进程可以以明文方式从我们的FSD中访问数据。典型的实现方式如OSR公司的DMK开发包,当前市面的销售的成熟产品中也有基于LayerFSD 实现的,如恺信公司的上一代产品就是基于这种技术实现而成。
- LoneFSD With Transaction Support
LoneFSD这种方式是在LayerFSD基础上发展而成。通过前面的了解我们知道,LayerFSD是在现有文件系统上实现我们自己的FSD,但是这种紧耦合方式带来的问题是故障查找不便,出现兼容性问题时无法方便快速地查找原因。LoneFSD 是将FSD的实现外置井安装于文件系统中,通过Miniflter组件进行IO转发,并实现对最新的基于windows vista以上系统的事务支持处理而成的新型的加密文件系统,这种方式对服务器软件有更好的兼容性。
UniFSD技术不再需要Filter进行转发,直接在整个系统中注册新的FSD接管加密进程的文件访问请求,无论是加密文件还是明文文件统一经过FSD处理,这样的好处是兼容性进一步提高,安全性进一步增强。此种方式类似linux中的VFS模型。
在加密软件系统中最重要的功能组件除了加密驱动程序外,还有加密行为触发器。这个组件的作用是帮助加密系统文件驱动决定何时将某个进程设置为信任进程。通常的方式是基于文件扩展名,基于进程名,基于进程特征几种方式。
基于扩展名的方式安全性比较差,通常需要配合其它方式使用。基于进程名的方式存在进程伪造问题。比较好的方式是基于进程特征,特征的采样可以分为MD5之类 hash 算法或者基于病毒查杀引擎的特征值检测。当然,我们在这里使用反毒引擎是为了严格识别需要加密的进程并且使用方式和通常意义上的反病毒刚刚相反。反病毒软件用引擎来检测有害程序,而我们却用它来检测需要保护的进程。
在加密软件中可信对象管理是很重要的部分。通常来说,一般软件是以进程为单位进行可信对象管理,但是这样无法解决如线程注入之类的攻击。为此,我们通常会引入线程管理方式,以线程为单位对加密对象进行管理,以此来解决注入攻击问题。对于非加密进程中需要加密的部分,我们也通过标识线程的方式来进行管理。
在一些特殊的软件,如explorer.exe中的图片预览,这种组件只是在现成的非信任进程中生成一个线程对象,我们需要精确分析并捕捉到这个线程井标记为可信线程即可。
沙盒技术实际上是用来防止其它有害进程通过远程线程注入、屏幕截图、剪切板访问、进程间通信等方式窃取加密信息的手段。在加密软件中,如果只是简单地加密而不设防就会导致如同关上了门却打开了窗的情形出现,为此引入了沙盒技术,这种技术如果复杂点就类似于一个小型的HIPS系统。当然安全和方便是相对的,太安全的系统必然会降低使用的方便性,反之亦然。
通过以上的描述,相信你已经了解了目前要开发一个新的文件加密系统需要具有的技术背景以及正确的技术路径,通常文件加密系统客户端包括加密驱动程序、加密行为触发器、进程标识模块、外围的类沙盒保护模块等。
|
|