一种Linux系统内存敏感数据的清除方法及装置制造方法

文档序号:6549257阅读:233来源:国知局
一种Linux系统内存敏感数据的清除方法及装置制造方法
【专利摘要】一种Linux系统内存敏感数据的清除方法和装置;方法包括:当进程调用close系统调用关闭文件时,或当因进程退出而调用exit_files关闭未关闭的文件时,通过struct?file定位到相应的struct?address_space,如果判断所要关闭的文件对应的inode结构有脏页有则调用vfs_fsync函数只将该文件中的脏页回写到磁盘中;遍历所定位到的地址空间结构中的基数树,将基数树中的所有页面全部删除、清零后释放到空闲区;在每个进程中构造读写链表,记录对设备文件读或写数据时在设备缓存中的起始地址address和数据长度length;在read或write系统调用退出时,通过遍历所述读写链表,对每个节点将从address开始,到address加length为止的地址空间中的数据清零。
【专利说明】一种Linux系统内存敏感数据的清除方法及装置
【技术领域】
[0001]本发明涉及计算机操作系统内存数据安全【技术领域】,具体涉及一种基于Linux系统的内存敏感数据的清除方法及装置。
【背景技术】
[0002]随着科学技术的发展,内存安全,尤其是被计算机操作系统安全领域会议和IT公司密切关注的用户敏感数据的安全,成为计算机操作系统安全的重要组成部分,这对为了提高系统性能,内存空间不断增大,将越来越多的数据放置到内存这一发展趋势提出了新的挑战。
[0003]由于在物理内存中清除一个物理页框中数据的操作的延迟相对较大,因而传统Linux系统的内存管理模块的机制是,物理页框的释放只是解除进程页表项和对应的物理页框的映射关系,只有当物理页框再次被分配时才将其中的数据进行清零或是用进程读写的数据进行覆盖。正是由于这一特性使得传统Linux系统在保护内存中的敏感数据安全方面具有先天性缺陷,使得开机密码、进程打开过的文件、用户输入的账号密码以及查看过的电子邮件和即时聊天信息等用户数据仍存留在进程的地址空间中,这一现象使得用户的个人隐私信息受到严重威胁。
[0004]目前针对Linux系统内存中的敏感数据安全这一问题广泛使用的工具是PAX补丁,它在内存敏感数据安全这一问题包含两方面:一、清除内核栈,用于将内核态的所有变量、状态、参数等信息进行清除;二、清除所释放的页框中的数据,随着物理页框的释放,将物理页框中的数据进行清除。主要表现在进程退出时清除进程的用户空间的堆、栈和非共享映射区中的数据,防止用户数据被泄露。
[0005]但是,现有的PAX补丁仍存在效率低、无法全面清除敏感数据等不足。

【发明内容】

[0006]本发明要解决的技术问题是更加全面地清除计算机操作系统内存中的敏感数据,保护用户的隐私信息。
[0007]为了解决上述问题,本发明提供了一种Linux系统内存敏感数据的清除方法,包括:
[0008]当进程调用close系统调用关闭文件时,或当因进程退出而调用eXit_files关闭未关闭的文件时,通过文件结构struct file定位到相应的地址空间结构struct address_space,判断所要关闭的文件对应的inode结构是否有脏页,如果有则调用vfs_fsync函数只将该文件中的脏页回写到磁盘中;遍历所定位到的地址空间结构中的基数树,将基数树中的所有页面全部删除、清零后释放到空闲区;
[0009]在每个进程中构造读写链表,记录对设备文件读或写数据时在设备缓存中的起始地址address和数据长度length ;在read系统调用或write系统调用退出时,通过遍历所述读写链表,对每个节点将从address开始,到address加length为止的地址空间中的数据清零。
[0010]可选地,所述的方法还包括:
[0011]在进程调用exit系统调用进行退出而释放页表项对应的物理页框时,或是调用brk和unmmap系统调用时,在释放物理页框前将物理页框中的数据清零。
[0012]可选地,所述的方法还包括:
[0013]定期进行下述操作:
[0014]将系统调用过程中遗留在当前内核栈中的数据用预定的四字节标志覆盖;标记所述内核栈中已覆盖的空间。
[0015]可选地,所述将系统调用过程中遗留在当前内核栈中的数据用预定的四字节标志覆盖的步骤包括:
[0016]当进程第一次系统调用离开内核栈,则找到thread_inf0的地址;当进程非第一次系统调用离开内核栈,则找到第一个具有连续50个所述预定的四字节标志的地址;如果不存在具有连续50个该所述预定的四字节标志的地址,则找到最后一个具有连续所述预定的四字节标志的地址;将从esp开始到所找到的地址之间的数据用所述预定的四字节标
志覆盖。
[0017]可选地,所述的方法还包括:
[0018]当回收内存时,加密写入交换区的数据;清除被换出到交换区的匿名页中的数据,以及被内存回收机制回收的页中的数据。
[0019]本发明还提供了一种Linux系统内存敏感数据的清除装置,包括:
[0020]文件数据清除模块,用于当进程调用close系统调用关闭文件时,或当因进程退出而调用exit_files关闭未关闭的文件时,通过文件结构struct file定位到相应的地址空间结构struct address_space,判断所要关闭的文件对应的inode结构是否有脏页,如果有则调用vfS_fSync函数只将该文件中的脏页回写到磁盘中;遍历所定位到的地址空间结构中的基数树,将基数树中的所有页面全部删除、清零后释放到空闲区;
[0021]设备数据清除模块,用于在每个进程中构造读写链表,记录对设备文件读或写数据时在设备缓存中的起始地址address和数据长度length ;在read系统调用或write系统调用退出时,通过遍历所述读写链表,对每个节点将从address开始,到address加length为止的地址空间中的数据清零。
[0022]可选地,所述的装置还包括:
[0023]用户数据清除模块,用于在进程调用exit系统调用进行退出而释放页表项对应的物理页框时,或是调用brk和unmmap系统调用时,在释放物理页框前将物理页框中的数
据清零。
[0024]可选地,所述的装置还包括:
[0025]内核栈清除模块,用于定期进行下述操作:将系统调用过程中遗留在当前内核栈中的数据用预定的四字节标志覆盖;标记所述内核栈中已覆盖的空间。
[0026]可选地,所述内核栈清除模块将系统调用过程中遗留在当前内核栈中的数据用预定的四字节标志覆盖是指:
[0027]所述内核栈清除模块当进程第一次系统调用离开内核栈,则找到thread_inf0的地址;当进程非第一次系统调用离开内核栈,则找到第一个具有连续50个所述预定的四字节标志的地址;如果不存在具有连续50个该所述预定的四字节标志的地址,则找到最后一个具有连续所述预定的四字节标志的地址;将从esp开始到所找到的地址之间的数据用所述预定的四字节标志覆盖。
[0028]可选地,所述的装置还包括:
[0029]回收过程清除模块,用于当回收内存时,加密写入交换区的数据;清除被换出到交换区的匿名页中的数据,以及被内存回收机制回收的页中的数据。
[0030]本发明的至少一个实施例覆盖面广,对进程遗留在内存中的敏感数据进行全面定位,可以彻底清除敏感数据的备份;对Linux现存机制不做更改,不需要更改应用程序,不需要硬件支持,兼容性强;本发明的又一个实施例能够在进程运行过程中,对不再使用的敏感数据进行清除,所有工作都是在进程退出之前完成,不需要监控程序,更加简单有效;本发明的又一个实施例只对进程中存在敏感数据的地址空间进行清除操作,因此功耗低。
【专利附图】

【附图说明】
[0031]图1是页缓存机制框架示意图;
[0032]图2是进程读写块设备数据过程示意图;
[0033]图3是进程和内存地址空间相关的结构联系不意图;
[0034]图4是TTY设备读写过程示意图;
[0035]图5是Linux系统中进程执行过程示意图;
[0036]图6是Linux系统中与进程相关的结构联系示意图;
[0037]图7是内核栈结构示意图;
[0038]图8是内存回收过程示意图;
[0039]图9是实施例二的清除装置的示意图。
【具体实施方式】
[0040]为使本发明的目的、技术方案和优点表达得更加清楚明白,下面将结合本发明实施实例中的附图,对本发明再作进一步详细的说明。显然,所描述的实施例只是本发明的一部分实例,而不是全部的实施例。基于本发明的实施例,本领域普通技术人员凡是采用本发明的设计结构和思想而在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
[0041]本文是基于Linux系统的方案,其中所涉及的现有的系统调用、结构、函数的名称在本领域均习惯使用英文,对于没有公认中文释义的名称,使用中文反而有可能让本领域技术人员迷惑;且这些名称在Linux系统中均有特定含义,技术人员能够明确各名称所表示的内容,而不会产生误解。因此本文中所涉及的Linux系统中现有的、无公认中文翻译的名称均使用英文表示。
[0042]实施例一、一种Linux系统内存敏感数据的清除方法,包括:
[0043]101、当进程调用close系统调用关闭文件时,或当因进程退出而调用exit_files关闭未关闭的文件时,通过文件结构struct file定位到相应的地址空间结构structaddress_space,判断所要关闭的文件对应的inode结构是否有脏页,如果有则调用vfs_fsync函数只将该文件中的脏页回写到磁盘中;遍历所定位到的地址空间结构中的基数树,将基数树中的所有页面全部删除、清零后释放到空闲区;
[0044]102、在每个进程中构造读写链表,记录对设备文件读或写数据时在设备缓存中的起始地址address和数据长度length ;在read系统调用或write系统调用退出时,通过遍历所述读写链表,对每个节点将从address开始,到address加length为止的地址空间中的数据清零。
[0045]其中,步骤101主要是针对进程读取磁盘等块设备而遗留在页缓存中的备份数据,当进程关闭打开的文件时进行清除操作。步骤102主要是将设备缓存中的数据的生命期尽量缩短,设备用完数据就将数据清除。
[0046]由于磁盘和内存读写速度的量级不同,传统Linux系统在磁盘和用户空间之间引入了页缓存机制,如图1所示。页缓存机制利用系统的部分物理内存作为页缓存(使用结构address_space描述页面page),用于存放磁盘disk中经常被使用的块设备数据,进程P1、P2……Pn从页缓存中读取数据,而不必每次使用时都从低速块设备中读取。然而,在文件关闭后,PAX补丁并没有及时的将文件中的数据同步到磁盘,也没有将文件在页缓存中的相应物理页框释放并清除数据;而本实施例的步骤101则可以同步文件中的数据,清除打开文件时在页缓存中的备份数据,并释放物理页框。
[0047]另外,在数据实际读写操作时,如图2所示,进程P1、P2和P3是通过虚拟文件系统virtual file system对应到不同的文件系统(比如EXT2、NTFS、EXT4等)中,然后直接或通过结构address_space采用具体的设备驱动程序(比如图2中的驱动1、驱动2、驱动3)来完成相应设备(比如图2中的设备1、设备2、设备3)的读写操作的,这一机理使得用户读写的数据被遗留在设备缓存中,PAX补丁也没有将设备缓存考虑在内;而本实施例的步骤102则可以对进程读写设备 存放到设备驱动缓存中的数据进行清除。
[0048]本实施例的一种实施方式中,所述方法还可以包括:
[0049]103、在进程调用exit系统调用进行退出而释放页表项对应的物理页框时,或是调用brk和unmmap系统调用时,在释放物理页框前将物理页框中的数据清零。
[0050]步骤103是对存有用户数据的堆、栈和映射区这些用户空间的数据的清除;这一部分是主要清除对象,因为进程的大部分数据都存放在这一部分。相比其他步骤中清除的部分,这一部分所占比重最大。步骤101中数据的清除相比步骤103而言,生命期更短。
[0051]本实施例的一种实施方式中,所述方法还可以包括:
[0052]104、定期进行下述操作:
[0053]将系统调用过程中遗留在当前内核栈中的数据用预定的四字节标志覆盖;并标记所述内核栈中已覆盖的空间。
[0054]和其它步骤相比,步骤104的清除操作最频繁。PAX补丁是在每次系统调用退出时,清除本次系统调用写入内核栈中的数据,这样集中清除会影响系统的处理性能,而本实施方式则性能损耗较低。
[0055]本实施方式的一种备选方案中,所述将系统调用过程中遗留在当前内核栈中的数据用预定的四字节标志覆盖的步骤具体可以包括:
[0056]当进程第一次系统调用离开内核栈,则找到thread_inf0的地址;当进程非第一次系统调用离开内核栈,则找到第一个具有连续50个所述预定的四字节标志的地址;如果不存在具有连续50个该所述预定的四字节标志的地址,则找到最后一个具有连续所述预定的四字节标志的地址;定期将esp将从esp开始到所找到的地址之间的数据用所述预定的四字节标志覆盖。
[0057]本实施例的一种实施方式中,所述方法还可以包括:
[0058]105、当回收内存时,加密写入交换区的数据;清除被换出到交换区(swap space)的匿名页中的数据,以及被内存回收机制回收的页中的数据。
[0059]本实施方式中,数据的清除是利用Linux系统原有的机制,在页面回收时最后会调用Shrink_page_liSt()函数,对写入交换区中的数据进行加密,并在释放物理页框时进行数据清除。
[0060]上述步骤101?105在执行上不分先后,分别针对页缓存、设备缓存、用户空间、内核栈内存进行清除和交换区加密;只要一个步骤的触发条件满足(比如进程调用exit系统调用),就执行该步骤中相应的操作(比如将物理页框中的数据清除)。
[0061]下面将用几个例子具体阐述每一个步骤的实现,下述例子是基于Linux内核版本linux-3.2.30 ;参考下述例子,本领域技术人员可以容易得到其它Linux版本上的实现方案,这里不再赘述。
[0062]Linux系统中文件读写有两种方式:其一,通过read、write系统调用对文件进行读写;其二,通过_ap*_ap2系统调用对文件进行映射,进而通过读写内存对文件进行读写,而通常程序编写时都是使用第一种方式。在这种情况下,为了加快文件的读写速度引入了如图1所示的页缓存(page cache)机制,在将磁盘中的文件读入用户空间时,会首先在页缓存中进行查找该文件页。如果该页不在页缓存中,则从磁盘中读取该页到页缓存,然后再复制到用户空间。而页缓存中的页只有在内存紧缺或者周期性内存回收时才被释放,导致的结果是即使进程已经退出,进程读写过的文件数据仍遗留在页缓存中,这会导致文件中的敏感数据信息被泄露。
[0063]本实施例中步骤101采取的措施是在调用close系统调用关闭文件时,或因进程退出而调用eXit_files关闭未关闭的文件时,将文件对应页缓存中的物理页框进行清零并释放。步骤101的具体例子包括以下步骤:
[0064]11)在内核源代码文件sched.h中为进程描述符task_struct结构的flags中定义标志 PF_SWITHC_ADDRESS_FILE,定义如下:
[0065]#define PF_SWITHC_ADDRESS_FILE 0x00000001
[0066]PF_SWITHC_ADDRESS_FILE表示打开这个进程可以清零页缓存和设备缓存。
[0067]task_struct 的 flags 在 do_execve_common O 函数中将相应的位用 PF_SWITHC_ADDRESS_FILE 置位:
[0068]
【权利要求】
1.一种Linux系统内存敏感数据的清除方法,包括: 当进程调用close系统调用关闭文件时,或当因进程退出而调用eXit_files关闭未关闭的文件时,通过文件结构struct file定位到相应的地址空间结构struct address_space,判断所要关闭的文件对应的inode结构是否有脏页,如果有则调用vfs_fsync函数只将该文件中的脏页回写到磁盘中;遍历所定位到的地址空间结构中的基数树,将基数树中的所有页面全部删除、清零后释放到空闲区; 在每个进程中构造读写链表,记录对设备文件读或写数据时在设备缓存中的起始地址address和数据长度length ;在read系统调用或write系统调用退出时,通过遍历所述读写链表,对每个节点将从address开始,到address加length为止的地址空间中的数据清零。
2.如权利要求1所述的方法,其特征在于,还包括: 在进程调用exit系统调用进行退出而释放页表项对应的物理页框时,或是调用brk和unmmap系统调用时,在释放物理页框前将物理页框中的数据清零。
3.如权利要求1所述的方法,其特征在于,还包括: 定期进行下述操作: 将系统调用过程中遗留在当前内核栈中的数据用预定的四字节标志覆盖;标记所述内核栈中已覆盖的空间。
4.如权利要求3所述的方法,其特征在于,所述将系统调用过程中遗留在当前内核栈中的数据用预定的四字节标志覆盖的步骤包括: 当进程第一次系统调用离开内核栈,则找到thread_inf0的地址;当进程非第一次系统调用离开内核栈,则找到第一个具有连续50个所述预定的四字节标志的地址;如果不存在具有连续50个该所述预定的四字节标志的地址,则找到最后一个具有连续所述预定的四字节标志的地址;将从esp开始到所找到的地址之间的数据用所述预定的四字节标志覆至JHL ο
5.如权利要求1所述的方法,其特征在于,还包括: 当回收内存时,加密写入交换区的数据;清除被换出到交换区的匿名页中的数据,以及被内存回收机制回收的页中的数据。
6.一种Linux系统内存敏感数据的清除装置,其特征在于,包括: 文件数据清除模块,用于当进程调用close系统调用关闭文件时,或当因进程退出而调用exit_files关闭未关闭的文件时,通过文件结构struct file定位到相应的地址空间结构struct address_space,判断所要关闭的文件对应的inode结构是否有脏页,如果有则调用vfS_fSync函数只将该文件中的脏页回写到磁盘中;遍历所定位到的地址空间结构中的基数树,将基数树中的所有页面全部删除、清零后释放到空闲区; 设备数据清除模块,用于在每个进程中构造读写链表,记录对设备文件读或写数据时在设备缓存中的起始地址address和数据长度length ;在read系统调用或write系统调用退出时,通过遍历所述读写链表,对每个节点将从address开始,到address加length为止的地址空间中的数据清零。
7.如权利要求6所述的装置,其特征在于,还包括: 用户数据清除模块,用于在进程调用exit系统调用进行退出而释放页表项对应的物理页框时,或是调用brk和unmmap系统调用时,在释放物理页框前将物理页框中的数据清零。
8.如权利要求6所述的装置,其特征在于,还包括: 内核栈清除模块,用于定期进行下述操作:将系统调用过程中遗留在当前内核栈中的数据用预定的四字节标志覆盖;标记所述内核栈中已覆盖的空间。
9.如权利要求8所述的装置,其特征在于,所述内核栈清除模块将系统调用过程中遗留在当前内核栈中的数据用预定的四字节标志覆盖是指: 所述内核栈清除模块当进程第一次系统调用离开内核栈,则找到thread_inf0的地址;当进程非第一次系统调用离开内核栈,则找到第一个具有连续50个所述预定的四字节标志的地址;如果不存在具有连续50个该所述预定的四字节标志的地址,则找到最后一个具有连续所述预定的四字节标志的地址;将从esp开始到所找到的地址之间的数据用所述预定的四字节标志覆盖。
10.如权利要求6所述的装置,其特征在于,还包括: 回收过程清除 模块,用于当回收内存时,加密写入交换区的数据;清除被换出到交换区的匿名页中的数据,以及被内存回收机制回收的页中的数据。
【文档编号】G06F9/445GK104007993SQ201410258526
【公开日】2014年8月27日 申请日期:2014年6月11日 优先权日:2014年6月11日
【发明者】涂碧波, 朱民, 孟丹 申请人:中国科学院信息工程研究所
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1