CN104007993B - 一种Linux系统内存敏感数据的清除方法及装置 - Google Patents
一种Linux系统内存敏感数据的清除方法及装置 Download PDFInfo
- Publication number
- CN104007993B CN104007993B CN201410258526.XA CN201410258526A CN104007993B CN 104007993 B CN104007993 B CN 104007993B CN 201410258526 A CN201410258526 A CN 201410258526A CN 104007993 B CN104007993 B CN 104007993B
- Authority
- CN
- China
- Prior art keywords
- data
- address
- file
- page
- call
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Landscapes
- Memory System Of A Hierarchy Structure (AREA)
Abstract
一种Linux系统内存敏感数据的清除方法和装置;方法包括:当进程调用close系统调用关闭文件时,或当因进程退出而调用exit_files关闭未关闭的文件时,通过struct file定位到相应的struct address_space,如果判断所要关闭的文件对应的inode结构有脏页有则调用vfs_fsync函数只将该文件中的脏页回写到磁盘中;遍历所定位到的地址空间结构中的基数树,将基数树中的所有页面全部删除、清零后释放到空闲区;在每个进程中构造读写链表,记录对设备文件读或写数据时在设备缓存中的起始地址address和数据长度length;在read或write系统调用退出时,通过遍历所述读写链表,对每个节点将从address开始,到address加length为止的地址空间中的数据清零。
Description
技术领域
本发明涉及计算机操作系统内存数据安全技术领域,具体涉及一种基于Linux系统的内存敏感数据的清除方法及装置。
背景技术
随着科学技术的发展,内存安全,尤其是被计算机操作系统安全领域会议和IT公司密切关注的用户敏感数据的安全,成为计算机操作系统安全的重要组成部分,这对为了提高系统性能,内存空间不断增大,将越来越多的数据放置到内存这一发展趋势提出了新的挑战。
由于在物理内存中清除一个物理页框中数据的操作的延迟相对较大,因而传统Linux系统的内存管理模块的机制是,物理页框的释放只是解除进程页表项和对应的物理页框的映射关系,只有当物理页框再次被分配时才将其中的数据进行清零或是用进程读写的数据进行覆盖。正是由于这一特性使得传统Linux系统在保护内存中的敏感数据安全方面具有先天性缺陷,使得开机密码、进程打开过的文件、用户输入的账号密码以及查看过的电子邮件和即时聊天信息等用户数据仍存留在进程的地址空间中,这一现象使得用户的个人隐私信息受到严重威胁。
目前针对Linux系统内存中的敏感数据安全这一问题广泛使用的工具是PAX补丁,它在内存敏感数据安全这一问题包含两方面:一、清除内核栈,用于将内核态的所有变量、状态、参数等信息进行清除;二、清除所释放的页框中的数据,随着物理页框的释放,将物理页框中的数据进行清除。主要表现在进程退出时清除进程的用户空间的堆、栈和非共享映射区中的数据,防止用户数据被泄露。
但是,现有的PAX补丁仍存在效率低、无法全面清除敏感数据等不足。
发明内容
本发明要解决的技术问题是更加全面地清除计算机操作系统内存中的敏感数据,保护用户的隐私信息。
为了解决上述问题,本发明提供了一种Linux系统内存敏感数据的清除方法,包括:
当进程调用close系统调用关闭文件时,或当因进程退出而调用exit_files关闭未关闭的文件时,通过文件结构struct file定位到相应的地址空间结构struct address_space,判断所要关闭的文件对应的inode结构是否有脏页,如果有则调用vfs_fsync函数只将该文件中的脏页回写到磁盘中;遍历所定位到的地址空间结构中的基数树,将基数树中的所有页面全部删除、清零后释放到空闲区;
在每个进程中构造读写链表,记录对设备文件读或写数据时在设备缓存中的起始地址address和数据长度length;在read系统调用或write系统调用退出时,通过遍历所述读写链表,对每个节点将从address开始,到address加length为止的地址空间中的数据清零。
可选地,所述的方法还包括:
在进程调用exit系统调用进行退出而释放页表项对应的物理页框时,或是调用brk和unmmap系统调用时,在释放物理页框前将物理页框中的数据清零。
可选地,所述的方法还包括:
定期进行下述操作:
将系统调用过程中遗留在当前内核栈中的数据用预定的四字节标志覆盖;标记所述内核栈中已覆盖的空间。
可选地,所述将系统调用过程中遗留在当前内核栈中的数据用预定的四字节标志覆盖的步骤包括:
当进程第一次系统调用离开内核栈,则找到thread_info的地址;当进程非第一次系统调用离开内核栈,则找到第一个具有连续50个所述预定的四字节标志的地址;如果不存在具有连续50个该所述预定的四字节标志的地址,则找到最后一个具有连续所述预定的四字节标志的地址;将从esp开始到所找到的地址之间的数据用所述预定的四字节标志覆盖。
可选地,所述的方法还包括:
当回收内存时,加密写入交换区的数据;清除被换出到交换区的匿名页中的数据,以及被内存回收机制回收的页中的数据。
本发明还提供了一种Linux系统内存敏感数据的清除装置,包括:
文件数据清除模块,用于当进程调用close系统调用关闭文件时,或当因进程退出而调用exit_files关闭未关闭的文件时,通过文件结构struct file定位到相应的地址空间结构struct address_space,判断所要关闭的文件对应的inode结构是否有脏页,如果有则调用vfs_fsync函数只将该文件中的脏页回写到磁盘中;遍历所定位到的地址空间结构中的基数树,将基数树中的所有页面全部删除、清零后释放到空闲区;
设备数据清除模块,用于在每个进程中构造读写链表,记录对设备文件读或写数据时在设备缓存中的起始地址address和数据长度length;在read系统调用或write系统调用退出时,通过遍历所述读写链表,对每个节点将从address开始,到address加length为止的地址空间中的数据清零。
可选地,所述的装置还包括:
用户数据清除模块,用于在进程调用exit系统调用进行退出而释放页表项对应的物理页框时,或是调用brk和unmmap系统调用时,在释放物理页框前将物理页框中的数据清零。
可选地,所述的装置还包括:
内核栈清除模块,用于定期进行下述操作:将系统调用过程中遗留在当前内核栈中的数据用预定的四字节标志覆盖;标记所述内核栈中已覆盖的空间。
可选地,所述内核栈清除模块将系统调用过程中遗留在当前内核栈中的数据用预定的四字节标志覆盖是指:
所述内核栈清除模块当进程第一次系统调用离开内核栈,则找到thread_info的地址;当进程非第一次系统调用离开内核栈,则找到第一个具有连续50个所述预定的四字节标志的地址;如果不存在具有连续50个该所述预定的四字节标志的地址,则找到最后一个具有连续所述预定的四字节标志的地址;将从esp开始到所找到的地址之间的数据用所述预定的四字节标志覆盖。
可选地,所述的装置还包括:
回收过程清除模块,用于当回收内存时,加密写入交换区的数据;清除被换出到交换区的匿名页中的数据,以及被内存回收机制回收的页中的数据。
本发明的至少一个实施例覆盖面广,对进程遗留在内存中的敏感数据进行全面定位,可以彻底清除敏感数据的备份;对Linux现存机制不做更改,不需要更改应用程序,不需要硬件支持,兼容性强;本发明的又一个实施例能够在进程运行过程中,对不再使用的敏感数据进行清除,所有工作都是在进程退出之前完成,不需要监控程序,更加简单有效;本发明的又一个实施例只对进程中存在敏感数据的地址空间进行清除操作,因此功耗低。
附图说明
图1是页缓存机制框架示意图;
图2是进程读写块设备数据过程示意图;
图3是进程和内存地址空间相关的结构联系示意图;
图4是TTY设备读写过程示意图;
图5是Linux系统中进程执行过程示意图;
图6是Linux系统中与进程相关的结构联系示意图;
图7是内核栈结构示意图;
图8是内存回收过程示意图;
图9是实施例二的清除装置的示意图。
具体实施方式
为使本发明的目的、技术方案和优点表达得更加清楚明白,下面将结合本发明实施实例中的附图,对本发明再作进一步详细的说明。显然,所描述的实施例只是本发明的一部分实例,而不是全部的实施例。基于本发明的实施例,本领域普通技术人员凡是采用本发明的设计结构和思想而在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
本文是基于Linux系统的方案,其中所涉及的现有的系统调用、结构、函数的名称在本领域均习惯使用英文,对于没有公认中文释义的名称,使用中文反而有可能让本领域技术人员迷惑;且这些名称在Linux系统中均有特定含义,技术人员能够明确各名称所表示的内容,而不会产生误解。因此本文中所涉及的Linux系统中现有的、无公认中文翻译的名称均使用英文表示。
实施例一、一种Linux系统内存敏感数据的清除方法,包括:
101、当进程调用close系统调用关闭文件时,或当因进程退出而调用exit_files关闭未关闭的文件时,通过文件结构struct file定位到相应的地址空间结构structaddress_space,判断所要关闭的文件对应的inode结构是否有脏页,如果有则调用vfs_fsync函数只将该文件中的脏页回写到磁盘中;遍历所定位到的地址空间结构中的基数树,将基数树中的所有页面全部删除、清零后释放到空闲区;
102、在每个进程中构造读写链表,记录对设备文件读或写数据时在设备缓存中的起始地址address和数据长度length;在read系统调用或write系统调用退出时,通过遍历所述读写链表,对每个节点将从address开始,到address加length为止的地址空间中的数据清零。
其中,步骤101主要是针对进程读取磁盘等块设备而遗留在页缓存中的备份数据,当进程关闭打开的文件时进行清除操作。步骤102主要是将设备缓存中的数据的生命期尽量缩短,设备用完数据就将数据清除。
由于磁盘和内存读写速度的量级不同,传统Linux系统在磁盘和用户空间之间引入了页缓存机制,如图1所示。页缓存机制利用系统的部分物理内存作为页缓存(使用结构address_space描述页面page),用于存放磁盘disk中经常被使用的块设备数据,进程P1、P2……Pn从页缓存中读取数据,而不必每次使用时都从低速块设备中读取。然而,在文件关闭后,PAX补丁并没有及时的将文件中的数据同步到磁盘,也没有将文件在页缓存中的相应物理页框释放并清除数据;而本实施例的步骤101则可以同步文件中的数据,清除打开文件时在页缓存中的备份数据,并释放物理页框。
另外,在数据实际读写操作时,如图2所示,进程P1、P2和P3是通过虚拟文件系统virtual file system对应到不同的文件系统(比如EXT2、NTFS、EXT4等)中,然后直接或通过结构address_space采用具体的设备驱动程序(比如图2中的驱动1、驱动2、驱动3)来完成相应设备(比如图2中的设备1、设备2、设备3)的读写操作的,这一机理使得用户读写的数据被遗留在设备缓存中,PAX补丁也没有将设备缓存考虑在内;而本实施例的步骤102则可以对进程读写设备存放到设备驱动缓存中的数据进行清除。
本实施例的一种实施方式中,所述方法还可以包括:
103、在进程调用exit系统调用进行退出而释放页表项对应的物理页框时,或是调用brk和unmmap系统调用时,在释放物理页框前将物理页框中的数据清零。
步骤103是对存有用户数据的堆、栈和映射区这些用户空间的数据的清除;这一部分是主要清除对象,因为进程的大部分数据都存放在这一部分。相比其他步骤中清除的部分,这一部分所占比重最大。步骤101中数据的清除相比步骤103而言,生命期更短。
本实施例的一种实施方式中,所述方法还可以包括:
104、定期进行下述操作:
将系统调用过程中遗留在当前内核栈中的数据用预定的四字节标志覆盖;并标记所述内核栈中已覆盖的空间。
和其它步骤相比,步骤104的清除操作最频繁。PAX补丁是在每次系统调用退出时,清除本次系统调用写入内核栈中的数据,这样集中清除会影响系统的处理性能,而本实施方式则性能损耗较低。
本实施方式的一种备选方案中,所述将系统调用过程中遗留在当前内核栈中的数据用预定的四字节标志覆盖的步骤具体可以包括:
当进程第一次系统调用离开内核栈,则找到thread_info的地址;当进程非第一次系统调用离开内核栈,则找到第一个具有连续50个所述预定的四字节标志的地址;如果不存在具有连续50个该所述预定的四字节标志的地址,则找到最后一个具有连续所述预定的四字节标志的地址;定期将esp将从esp开始到所找到的地址之间的数据用所述预定的四字节标志覆盖。
本实施例的一种实施方式中,所述方法还可以包括:
105、当回收内存时,加密写入交换区的数据;清除被换出到交换区(swap space)的匿名页中的数据,以及被内存回收机制回收的页中的数据。
本实施方式中,数据的清除是利用Linux系统原有的机制,在页面回收时最后会调用shrink_page_list()函数,对写入交换区中的数据进行加密,并在释放物理页框时进行数据清除。
上述步骤101~105在执行上不分先后,分别针对页缓存、设备缓存、用户空间、内核栈内存进行清除和交换区加密;只要一个步骤的触发条件满足(比如进程调用exit系统调用),就执行该步骤中相应的操作(比如将物理页框中的数据清除)。
下面将用几个例子具体阐述每一个步骤的实现,下述例子是基于Linux内核版本linux-3.2.30;参考下述例子,本领域技术人员可以容易得到其它Linux版本上的实现方案,这里不再赘述。
Linux系统中文件读写有两种方式:其一,通过read、write系统调用对文件进行读写;其二,通过mmap或mmap2系统调用对文件进行映射,进而通过读写内存对文件进行读写,而通常程序编写时都是使用第一种方式。在这种情况下,为了加快文件的读写速度引入了如图1所示的页缓存(page cache)机制,在将磁盘中的文件读入用户空间时,会首先在页缓存中进行查找该文件页。如果该页不在页缓存中,则从磁盘中读取该页到页缓存,然后再复制到用户空间。而页缓存中的页只有在内存紧缺或者周期性内存回收时才被释放,导致的结果是即使进程已经退出,进程读写过的文件数据仍遗留在页缓存中,这会导致文件中的敏感数据信息被泄露。
本实施例中步骤101采取的措施是在调用close系统调用关闭文件时,或因进程退出而调用exit_files关闭未关闭的文件时,将文件对应页缓存中的物理页框进行清零并释放。步骤101的具体例子包括以下步骤:
11)在内核源代码文件sched.h中为进程描述符task_struct结构的flags中定义标志PF_SWITHC_ADDRESS_FILE,定义如下:
#define PF_SWITHC_ADDRESS_FILE 0x00000001
PF_SWITHC_ADDRESS_FILE表示打开这个进程可以清零页缓存和设备缓存。
task_struct的flags在do_execve_common()函数中将相应的位用PF_SWITHC_ADDRESS_FILE置位:
在表示struct page结构的flags的enum pageflags{......}中添加标记PG_clear和PG_cleaned。PG_clear标志为“1”时表示页面释放时需要执行清零操作,为“0”时表示页面释放时不再需要执行清零操作;PG_Cleaned标志为“1”时表示页面是干净页,为“0”时表示不是干净页。
struct page和enum pageflags的结构如下:
12)在内核函数filp_close()中判断PF_SWITHC_ADDRESS_FILE对应的current->flags中的位是否置1,如果置1,则调用本实施例提供的sanitize_pagecache()函数。该函数首先根据file结构找到相应的address_space结构,关系图如图3所示,进程描述符task_struct中的字段fs指向进程的fs_struct,files字段指向进程的files_struct;files_struct中的字段fdt指向相应的struct_table,struct_table中的字段fd指向相应的fd_array,并最终指向相应的file结构;file结构中的字段f_mapping指向相应的address_space结构。
找到address_space结构后判断该文件对应的inode结构是否有脏页,如果该inode有脏页,则调用vfs_fsync函数将该文件中的脏页回写到磁盘中;
13)待脏页回写完成后,调用sanitize_inode_pages()函数,遍历所找到的address_space结构中的基数树,将基数树中的所有页面全部删除、清零,然后调用pagevec_release()释放到空闲区。在pagevec_release()中通过SetPageClear(page)置位page->flags的PG_clear标志;
14)在sanitize_page()函数清零页面时,对page->flags的PG_clear标志和PG_cleaned标志分别用ClearPageClear(page)和SetPageCleaned(page)置0和置1。
下面介绍步骤102的具体例子。
众所周知,Linux系统的设备驱动程序是内核的重要组成部分。以TTY设备为例,如图4所示,在用户进程将数据输出到TTY设备(do tty write)时,内核首先将用户空间buf中的数据复制到TTY驱动程序的tty结构体的tty->write_buf设备缓存中,然后将write_buf中的数据显示到终端屏幕上。这样读写的数据就会遗留在设备缓存中。
从用户空间到内核空间或者从内核空间到用户空间复制数据是通过Linux内核提供的copy_to_user()和copy_from_user()这两个函数实现的。为了确保用户读写的数据在设备缓存中没有备份,本实施例在每个进程中构造一个链表,记录对设备文件的读写调用,通过记录设备缓存中读写数据的起始地址address和数据长度length,在读写系统调用完成时,通过遍历该链表,将地址空间(address,address+length)中的数据清零。
本例子中的具体步骤如下:
21)为进程描述符task_struct结构的flags在文件sched.h中定义一个标志PF_DEVICE_BUF_TRACK,表示可以在read和write系统调用中记录交互给内核的数据的地址,同时在task_struct结构中添加一个链表头,用于记录本进程与内核空间交互的数据;
#define PF_DEVICE_BUF_TRACK0x00000002
22)由于需要在函数copy_to_user()和copy_from_user()中记录每次用户空间与内核空间交互的数据的地址和长度,故在文件uaccess.h中定义了一个结构:
23)在copy_to_user()和copy_from_user()函数中调用本实施例提供的函数prepare_kernel_buffer()。这个函数首先遍历current->dev_buffer指向的链表,检查buf的地址是否已在链表之中。如果已在,则将相应节点的size修改为当前的len。否则,则申请一个新节点,将赋值后结构添加到该链表中;
24)在read和write系统调用完成时,调用本实施例提供的函数clear_device_buffer()再次遍历current->dev_buffer链表,这次的目的是清零链表中每个节点中address对应的地址中的数据。
下面介绍步骤103的具体例子。
Linux系统中进程的执行流程如图5所示,由父进程P1通过调用fork或clone等系统调用产生一个子进程P1',而后子进程P1'通过调用exec系统调用加载自己的可执行文件,然后把控制权交给自己的可执行文件P2。在进程完成其所有工作后,通过调用exit系统调用退出并释放相关资源,主要是将页表项对应的物理页框释放。
Linux系统中与进程相关的结构关系图如图6所示,在Linux系统中,每一个进程都通过自身的内存管理结构struct mm_struct管理进程自身与内存有关的数据资源。Linux的虚拟地址空间被分割成多个线性区vm_area_struct,这些线性区以线性地址递增的形式组成一个链表,其中堆、栈和文件映射都是由这些线性区构成。进程退出时,通过内核中的函数exit_mm()遍历进程的所有线性区,将页表项对应的物理页框释放到相应的空闲链表中。
步骤103在页框被释放时对页框进行sanitize_page清零,使页框中的数据不可恢复。步骤103的例子具体包括的步骤如下:
31)在系统调用exit最终调用内核函数zap_pte_range()释放页表项对应的物理页框时或者brk、unmmap等系统调用中都会调用内核函数__tlb_remove_page()。在该内核函数中将page->flags的PG_clear标记位置位,即SetPageClear(page);
32)在释放页框时通过PageClear(page)判断page->flags的clear标志位是否置位,如果置位则对其页框调用所述清零函数sanitize_page(struct page)进行清零操作。
33)sanitize_page()函数利用内核函数kmap_atomic()在内核空间临时映射区申请一个虚拟地址,用于访问page对应的物理页框,然后调用内核函数clear_page(page)对该虚拟地址对应的物理页框进行清零,最后用内核函数kunmap_atomic()释放该内核空间的虚拟地址;
34)最后通过ClearPageClear(page)对该页的page->flags的PG_clear标志位置0,同时用SetPageCleaned(page)置PG_cleaned为1,目的是表明该页是干净页,当该页再次被分配时不需要进行清零,以提高效率。
下面介绍步骤104的具体例子。
用户进程从用户态切换到内核态的同时,栈空间也切换到了内核栈,在内核态的所有操作都记录在内核栈中。因此,定期清除内核栈时需执行一函数,这一函数有一举两得之效。其一,为下次清除内核栈设置标记,目的是标记哪些空间是干净的。其二,将系统调用过程中遗留在当前内核栈中的数据用预定的四字节标志覆盖清除。在进程退出时,通过释放内核栈的物理页框,进而清零内核栈中的数据。为了下文方便描述,在此将该预定的四字节标志设为aabbccdd;实际应用时可自行设置其他标志。内核栈结构如图7所示,基址指针ebp指向struct thread_info、struct task_struct*task;堆栈指针esp指向栈顶;步骤104的例子具体包括如下步骤:
定期执行步骤41)~44)。
41)首先将会用到的几个寄存器入栈,如下所示:
这几个寄存器用于系统调用退出时保存重要数据。
42)在这一步分三种情况:
情况一:进程P第一次系统调用离开内核栈,则找到thread_info的地址;
情况二:进程P非第一次系统调用离开内核栈,则找到第一个具有连续50个aabbccdd的地址,比如该地址是0xbfccfa0;从该地址往前连续50个四字节都是aabbccdd;
情况三:如果不存在具有连续50个该四字节标志的地址,则找到最后一个具有连续四字节标志的地址,比如该地址是0xbfcc00b;
43)将从堆栈指针esp开始到在42)中找到的地址之间的数据用aabbccdd覆盖清除,42)中三种情况所覆盖清除的区域分别对应图7中的701、702和703;
44)将41)中入栈的相应的寄存器出栈,即
下面介绍步骤105的具体例子。
在物理内存紧缺或者周期性回收内存时,会将不经常使用的内存释放,回收的过程如图8所示;内存紧缺回收包括页分配时内存紧缺和缓冲区分配时内存紧缺(调用)两种情况;周期回收由kswapd内核线程进行。在内存回收时,只是将页中的数据写回到磁盘或者交换到交换区中,然后释放相应的页。被释放的页中仍然存有进程的数据,基于此在释放页时利用所述sanitize_page()函数将页中的数据清零。具体步骤如下:
51)由图8可知,首先通过shrink_page_list()收集能够被释放的页;
52)将写入swap空间中的物理页框利用Linux内核提供的crypto API,对相应的页进行加密,然后将加密后的数据写入swap磁盘空间中。
53)将收集好的页通过free_page_list()释放到空闲链表中,在函数free_page_list()中对每个page->flags的PG_clear位置1,即SetPageClear(page);
54)在释放page时通过判断page->flags的PG_clear位决定是否执行sanitize_page()清零。
55)清零操作中同样将page->flags的PG_clear和PG_cleaned分别置0和1。
此外,为了方便对每个部分的使能操作,本实施例利用proc虚拟文件系统对ioctl的支持,在/proc/sys/vm/目录下添加了一个switch_operations文件,每个用户都可以对该文件进行读写,其取值是1~31,具体对应如下:
该功能的实现如下:
61)在Linux内核源代码的/kernel/sysctl.c文件中定义变量:
static int thirty_one=31
62)在static struct ctl_table vm_table[]中添加一个结构:
63)定义对应的全局变量和操作函数:
通过在函数中对相应的变量赋值,来控制执行相应部分的功能;实际应用中也可以用其它代码或方案来实现上述功能。
本实施例及其各实施方式在Linux内核现有机制的基础上,分析泄露敏感数据的问题所在,进而对相应结构或函数进行更改,在进程执行过程或退出时等特定时机清除进程执行过程中遗留在内存中的不再使用的敏感数据,使其不可被还原,防止这些敏感数据被泄露。由进程中数据的线性地址来获取进程遗留下的过期数据,进而对这些数据进行清除、销毁,使其在进程退出后不可被恢复。
实施例二、一种Linux系统内存敏感数据的清除装置90,如图9所示,包括:
文件数据清除模块901,用于当进程调用close系统调用关闭文件时,或当因进程退出而调用exit_files关闭未关闭的文件时,通过文件结构struct file定位到相应的地址空间结构struct address_space,判断所要关闭的文件对应的inode结构是否有脏页,如果有则调用vfs_fsync函数只将该文件中的脏页回写到磁盘中;遍历所定位到的地址空间结构中的基数树,将基数树中的所有页面全部删除、清零后释放到空闲区;
设备数据清除模块902,用于在每个进程中构造读写链表,记录对设备文件读或写数据时在设备缓存中的起始地址address和数据长度length;在read系统调用或write系统调用退出时,通过遍历所述读写链表,对每个节点将从address开始,到address加length为止的地址空间中的数据清零。
本实施例的一种实施方式中,所述的装置90还可以包括:
用户数据清除模块903,用于在进程调用exit系统调用进行退出而释放页表项对应的物理页框时,或是调用brk和unmmap系统调用时,在释放物理页框前将物理页框中的数据清零。
本实施例的一种实施方式中,所述的装置90还可以包括:
内核栈清除模块904,用于定期进行下述操作:将系统调用过程中遗留在当前内核栈中的数据用预定的四字节标志覆盖;标记所述内核栈中已覆盖的空间。
本实施方式的一种备选方案中,所述内核栈清除模块904将系统调用过程中遗留在当前内核栈中的数据用预定的四字节标志覆盖具体可以是指:
所述内核栈清除模块904当进程第一次系统调用离开内核栈,则找到thread_info的地址;当进程非第一次系统调用离开内核栈,则找到第一个具有连续50个所述预定的四字节标志的地址;如果不存在具有连续50个该所述预定的四字节标志的地址,则找到最后一个具有连续所述预定的四字节标志的地址;将从esp开始到所找到的地址之间的数据用所述预定的四字节标志覆盖。
本实施例的一种实施方式中,所述的装置90还可以包括:
回收过程清除模块905,用于当回收内存时,加密写入交换区的数据;清除被换出到交换区的匿名页中的数据,以及被内存回收机制回收的页中的数据。
当然,本发明不仅局限于上述具体的实现方式,本发明还可有其他多种实施例,在不背离本发明精神及其实质的情况下,熟悉本领域的技术人员当可根据本发明作出各种相应的改变和变形,但这些相应的改变和变形都应属于本发明的权利要求的保护范围。
Claims (10)
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_info的地址;当进程非第一次系统调用离开内核栈,则找到第一个具有连续50个所述预定的四字节标志的地址;如果不存在具有连续50个该所述预定的四字节标志的地址,则找到最后一个具有连续所述预定的四字节标志的地址;将从esp开始到所找到的地址之间的数据用所述预定的四字节标志覆盖。
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_info的地址;当进程非第一次系统调用离开内核栈,则找到第一个具有连续50个所述预定的四字节标志的地址;如果不存在具有连续50个该所述预定的四字节标志的地址,则找到最后一个具有连续所述预定的四字节标志的地址;将从esp开始到所找到的地址之间的数据用所述预定的四字节标志覆盖。
10.如权利要求6所述的装置,其特征在于,还包括:
回收过程清除模块,用于当回收内存时,加密写入交换区的数据;清除被换出到交换区的匿名页中的数据,以及被内存回收机制回收的页中的数据。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201410258526.XA CN104007993B (zh) | 2014-06-11 | 2014-06-11 | 一种Linux系统内存敏感数据的清除方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201410258526.XA CN104007993B (zh) | 2014-06-11 | 2014-06-11 | 一种Linux系统内存敏感数据的清除方法及装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN104007993A CN104007993A (zh) | 2014-08-27 |
CN104007993B true CN104007993B (zh) | 2017-05-10 |
Family
ID=51368660
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201410258526.XA Active CN104007993B (zh) | 2014-06-11 | 2014-06-11 | 一种Linux系统内存敏感数据的清除方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN104007993B (zh) |
Families Citing this family (15)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104809414B (zh) * | 2015-05-04 | 2017-07-07 | 深圳市创世达实业有限公司 | 一种防止冷启动攻击的u盘加密密钥存放方法 |
CN105205409A (zh) * | 2015-09-14 | 2015-12-30 | 浪潮电子信息产业股份有限公司 | 一种防止内存复用中数据泄露的方法及计算机系统 |
CN105354079B (zh) * | 2015-09-29 | 2019-06-07 | 上海斐讯数据通信技术有限公司 | 提高系统内存利用率的方法 |
CN108089815A (zh) * | 2016-11-23 | 2018-05-29 | 阿里巴巴集团控股有限公司 | 一种数据筛选方法和装置 |
US11216570B2 (en) * | 2017-05-18 | 2022-01-04 | Visa International Service Association | Reducing compromise of sensitive data in virtual machine |
CN107766151A (zh) * | 2017-09-28 | 2018-03-06 | 郑州云海信息技术有限公司 | 一种页面换出方法 |
CN108920946A (zh) * | 2018-07-30 | 2018-11-30 | 美通云动(北京)科技有限公司 | 基于浏览器的数据安全管控方法及装置 |
CN109857677B (zh) * | 2018-12-28 | 2023-03-31 | 晶晨半导体(上海)股份有限公司 | 内核栈的分配方法及装置 |
CN111177805B (zh) * | 2019-12-12 | 2023-10-03 | 海光信息技术股份有限公司 | 一种提高处理器运行安全性的方法、装置及cpu芯片 |
CN112131240B (zh) * | 2020-09-30 | 2023-09-26 | 腾讯科技(深圳)有限公司 | 脏数据的处理方法和装置、存储介质及电子设备 |
CN112817613A (zh) * | 2021-02-04 | 2021-05-18 | 咪咕音乐有限公司 | 插件数据的删除方法、服务器、电子设备和存储介质 |
CN113157395A (zh) * | 2021-04-20 | 2021-07-23 | 上海泓戟信息科技有限公司 | 一种优化计算机内存数据同步的方法 |
CN113254404B (zh) * | 2021-05-25 | 2022-05-27 | 技德技术研究所(武汉)有限公司 | 一种文件处理方法及装置 |
CN114666132B (zh) * | 2022-03-22 | 2024-01-30 | 深圳供电局有限公司 | 基于tcp/ip协议对应用层加密认证的方法 |
CN116070205B (zh) * | 2023-03-07 | 2023-06-13 | 北京和升达信息安全技术有限公司 | 一种数据清除方法、装置、电子设备及存储介质 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1567254A (zh) * | 2003-06-17 | 2005-01-19 | 深圳市中兴通讯股份有限公司南京分公司 | 嵌入式实时操作系统高效可靠的内存保护方法 |
CN102662799A (zh) * | 2012-04-13 | 2012-09-12 | 华为技术有限公司 | 数据备份的方法、服务器及热备份系统 |
WO2014011312A1 (en) * | 2012-07-10 | 2014-01-16 | Raytheon Bbn Technologies Corp. | Anti-wikileaks usb/cd device |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US8782351B2 (en) * | 2011-10-13 | 2014-07-15 | International Business Machines Corporation | Protecting memory of a virtual guest |
-
2014
- 2014-06-11 CN CN201410258526.XA patent/CN104007993B/zh active Active
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1567254A (zh) * | 2003-06-17 | 2005-01-19 | 深圳市中兴通讯股份有限公司南京分公司 | 嵌入式实时操作系统高效可靠的内存保护方法 |
CN102662799A (zh) * | 2012-04-13 | 2012-09-12 | 华为技术有限公司 | 数据备份的方法、服务器及热备份系统 |
WO2014011312A1 (en) * | 2012-07-10 | 2014-01-16 | Raytheon Bbn Technologies Corp. | Anti-wikileaks usb/cd device |
Non-Patent Citations (2)
Title |
---|
计算机数据安全删除和隐私保护;尹燕彬等;《信息网络安全》;20090515(第5期);第55-58页 * |
重复数据删除技术;敖莉等;《软件学报》;20100515(第5期);第916-927页 * |
Also Published As
Publication number | Publication date |
---|---|
CN104007993A (zh) | 2014-08-27 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN104007993B (zh) | 一种Linux系统内存敏感数据的清除方法及装置 | |
DE102010013389B4 (de) | Verfahren und System zum Durchführen von Caching, basierend auf der Heuristik auf Dateiebene | |
US9251011B2 (en) | Backup of in-memory databases | |
US8346805B2 (en) | Filter driver for identifying disk files by analysis of content | |
CN105005528B (zh) | 一种日志信息提取方法及装置 | |
CN104636414B (zh) | 提供对更新后的文件的访问的方法和执行该方法的计算机 | |
US7636736B1 (en) | Method and apparatus for creating and using a policy-based access/change log | |
Reardon et al. | Secure data deletion | |
US8452740B2 (en) | Method and system for security of file input and output of application programs | |
JP2013509621A (ja) | メモリ管理装置及び仮想メモリ領域を提供する方法 | |
CN105045850B (zh) | 云存储日志文件系统中垃圾数据回收方法 | |
DE112012002600T5 (de) | Informationsverarbeitungsvorrichtung, -verfahren und -programm zum Verwalten vertraulicher Informationen | |
CA2758235A1 (en) | Device and method for storage, retrieval, relocation, insertion or removal of data in storage units | |
Onarlioglu et al. | Privexec: Private execution as an operating system service | |
US20160300069A1 (en) | Data sanitization | |
CN107992504A (zh) | 一种文件处理方法及装置 | |
Vidas | The acquisition and analysis of random access memory | |
Aga et al. | InvisiPage: oblivious demand paging for secure enclaves | |
JP2003316774A (ja) | 文書管理システム、文書蓄積方法及びこの方法を実行するプログラム | |
Diesburg et al. | Trueerase: Leveraging an auxiliary data path for per-file secure deletion | |
Hausknecht et al. | Anti-computer forensics | |
US8407196B1 (en) | Object-oriented database for file system emulator | |
CN113190178A (zh) | 一种fat32文件系统中数据无痕删除方法及系统 | |
CN108958652A (zh) | 一种记录日志信息的方法、装置和计算机可读存储介质 | |
CN105068941A (zh) | 一种缓存页面替换方法及装置 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |