SELinux安全标识符防篡改检测方法及系统与流程

文档序号:14175777阅读:425来源:国知局
本发明涉及linux系统安全领域,具体涉及一种selinux安全标识符防篡改检测方法及系统。
背景技术
::linux操作系统的系统管理员拥有对系统范围内的所有资源进行访问与管理的特权,成为恶意攻击者攻击的主要目标之一。一般情况下,恶意攻击者通过远程攻击等获取系统一般权限后,还往往要利用系统的提权漏洞进行提权攻击,获取系统root权限对系统进行全盘控制。为了保护系统管理员特权,操作系统的强制访问控制机制打破了root用户的特权,在操作系统内部根据不同的访问控制安全策略对系统中各类对象之间的访问控制行为进行控制管理。在这样的系统中,即使进程的属主为root,其所有行为也必须同时满足强制访问控制机制的要求才能够在系统中被允许发生。目前linux系统主要通过selinux安全域隔离策略实现这一控制。然而,随着运行在系统高级别的内核态提权漏洞攻击方法的出现,攻击者不仅可以篡改进程的用户id,还可以篡改进程的selinux安全标识符。由于在进程的内核栈中,保存进程权限信息的thread_info结构总是存放在内核栈的底部,因此攻击者可以根据内核栈中某一变量的地址获取内核栈基址,从而获取进程task_struct在内存中的位置,并进一步获取进程cred在内存中的位置,直接修改对应内存位置存储的数据,将对应的用户id和组id修改0,即root用户/组id,并且根据需要将selinux安全标识符修改为目标安全标识符,从而绕过系统中强制访问控制安全机制的检查。一旦攻击发生,如何能够尽早发现并制止进程利用篡改后的权限进行非法访问成为重要的问题。在linux系统中,每个进程都有与其对应的唯一的进程标识符pid,在系统创建进程时会生成一个尚未分配的pid并用其标识该进程。而每个进程的安全标识符的则经过创建、转换和终止的生命周期。linux系统主要在两种情况下创建进程:(1)一个父进程希望复制自己从而使父进程和子进程执行同一个程序中不同的代码段。该情况在网络服务进程中比较常见,父进程等待并接受客户端的请求,当请求到达时,创建子进程并使其处理该请求,而父进程继续等待新的服务请求。(2)一个进程要执行一个不同的程序。在该情况下,父进程创建一个子进程,然后使子进程去执行该程序。在这两种情况下,当父进程创建子进程时,子进程通常继承父进程的安全标识符。对于第二种情况,当子进程去执行另一个程序时,根据selinux安全规则,子进程的安全标识符可能会改变。linux系统创建进程的函数有fork(),vfork()和clone(),在linux内核中与之对应的系统调用分别为sys_fork(),sys_vfork()和sys_clone()。但是这三个系统调用在实际执行时都是通过do_fork函数来创建进程。而三个系统调用由于参数的不同而导致了子进程和父进程之间对资源的共享程度不同。进程撤销或终止的一般方式调用exit()库函数。当进程退出时一般是显示地或隐式地调用了exit(),但最终都调用了do_exit函数。linux系统使用sys_execve()系统调用来执行一个新程序。新程序的实际执行是通过do_execve函数来完成的。图1为进程执行新程序时的主要流程。当进程执行一个程序时,sys_execve()首先根据文件名及文件路径获取可执行文件的信息,然后调用do_execve()完成剩余主要工作。在读取可执行文件信息后,do_execve函数将文件信息装载入linux_binprm结构。根据可执行文件的信息,系统设置linux_binprm结构的安全标识符信息并保存在cred结构中,该结构与task_struct结构中的cred结构一致。在进程开始执行新程序之前,根据linux_binprm结构中的安全标识符设置进程安全标识符,在这一过程中进程安全标识符可能发生改变。在设置完进程安全标识符并完成其他相关工作后,就可以返回用户态执行新程序。对于selinux来说,在设置linux_binprm结构安全标识符时,根据可执行文件不同可能发生进程安全标识符转换。此时在执行新程序时,进程从父进程继承的安全标识符就会被转换为新的安全标识符。综上所述,linux系统的selinux安全标识符可能通过内核级提权漏洞被非法篡改,从而使访问控制机制的检查被绕过。因此,结合linux系统中进程安全标识符的转化过程,设计对系统中进程安全标识符的合法性检查机制,尽早发现安全标识符被非法篡改并进行恢复,中止攻击者对系统的攻击行为,对保护系统安全系统具有重要的现实意义。技术实现要素:本发明要解决的技术问题:针对现有技术的上述问题,提供一种能够检测到攻击者利用内核提权攻击手段对进程安全标识符的非法篡改,并将进程安全标识符恢复为非法篡改前的安全标识符,能够防止攻击者通过内核提权攻击手段突破selinux对系统的安全防护的selinux安全标识符防篡改检测方法及系统。为了解决上述技术问题,本发明采用的技术方案为:本发明提供一种selinux安全标识符防篡改检测方法,实施步骤包括:1)建立一个进程id及其安全标识符sid的映射关系表pst,且当系统创建进程时,以进程id为索引,将进程id及其安全标识符sid作为新节点插入到映射关系表pst中;当进程撤销时,从映射关系表pst中删除通过进程id索引的节点;当系统通过合法调用接口改变进程的安全标识符sid时,则更新映射关系表pst中进程id及其安全标识符sid,使映射关系表pst中进程id及其安全标识符sid的映射关系一直保持最新状态;2)当进程执行新程序时,在实际执行新的子进程之前首先检测父进程的安全标识符sid是否被非法修改,如果父进程的安全标识符sid与映射关系表pst中的父进程id对应的安全标识符sid不一致,则判定该父进程的安全标识符sid被非法修改,根据映射关系表pst中保存的数据恢复父进程的安全标识符sid,跳转执行步骤3);否则判定该新程序的安全标识符sid未被修改,跳转执行步骤3);3)将子进程的缺省安全标识符sid设置为父进程的安全标识符sid,执行该子进程。优选地,步骤1)中建立的映射关系表pst的数据结构包括一个链表的头指针以及为链表中节点计数的变量,且每个节点中保存着进程id和安全标识符sid以及指向下一个节点的指针。优选地,步骤1)中建立的映射关系表pst的初始化函数pst_init()嵌入在selinux的初始化函数selinux_init()中以在selinux初始化时完成映射关系表的初始化,当确定系统启动selinux安全机制后,调用映射关系表的初始化函数pst_init函数完成映射关系表pst的初始化。优选地,步骤1)中将进程id及其安全标识符sid作为新节点插入到映射关系表pst中、更新映射关系表pst中进程id及其安全标识符sid的详细步骤包括:首先检查以进程id为索引的节点在映射关系表pst中是否存在,如果不存在,则以输入参数中的进程id及其安全标识符sid作为新节点插入到映射关系表pst中;如果存在,则检查输入参数中的安全标识符sid与映射关系表pst中保存的安全标识符sid是否一致,如果一致则不做任何更改返回;如果不一致则将进程id在映射关系表pst中对应保存的安全标识符sid修改为输入参数中安全标识符sid;步骤1)中从映射关系表pst中删除通过进程id索引的节点的详细步骤包括:首先检查以输入参数中的进程id为索引的节点在映射关系表pst中是否存在,如果存在,则从映射关系表pst中删除通过进程id索引的节点;否则不执行任何操作。优选地,步骤1)中将进程id及其安全标识符sid作为新节点插入到映射关系表pst中是通过linux系统的do_fork函数来调用在lsm框架中预设的钩子函数security_pst_insert函数实现的;步骤1)中更新映射关系表pst中进程id及其安全标识符sid是通过linux系统的commit_creds函数来调用在lsm框架中预设的钩子函数security_pst_insert函数实现的;步骤1)中从映射关系表pst中删除通过进程id索引的节点是通过linux系统的do_exit函数来调用在lsm框架中预设的钩子函数security_pst_remove函数实现的;所述钩子函数security_pst_insert、security_pst_remove两者的函数指针均被添加到lsm框架的security_operations结构体中。优选地,所述钩子函数security_pst_insert、security_pst_remove在linux系统的selinux模块中添加有security_pst_insert函数对应的安全函数selinux_pst_insert以及security_pst_remove函数对应的安全函数selinux_pst_remove;在linux系统未启用selinux安全机制时,所述钩子函数security_pst_insert、security_pst_remove被执行时,系统将不执行selinux模块中实现的selinux_pst_insert、selinux_pst_remove函数;在linux系统启用selinux安全机制时,selinux_pst_insert与selinux_pst_remove函数在selinux模块中被注册到全局变量security_ops,且执行security_pst_insert函数时则通过调用安全函数selinux_pst_insert完成将进程id及其安全标识符sid作为新节点插入到映射关系表pst或更新映射关系表pst中进程id及其安全标识符sid,执行security_pst_remove函数时则通过调用安全函数selinux_pst_remove从映射关系表pst中删除通过进程id索引的节点。优选地,步骤2)中检测父进程的安全标识符sid是否被非法修改是在install_exec_creds函数中依据linux_binprm结构中保存的cred来设定子进程sid时进行检测,通过linux系统的commit_creds函数来调用在lsm框架中预设的钩子函数security_pst_check函数实现的。优选地,所述钩子函数security_pst_check在linux系统的selinux模块中添加有security_pst_check函数对应的安全函数selinux_pst_check;在linux系统未启用selinux安全机制时,钩子函数security_pst_check被执行时,系统将不执行selinux实现的selinux_pst_check函数;在linux系统启用selinux安全机制时,selinux_pst_check函数在selinux模块中被注册到全局变量security_ops,且执行security_pst_check函数时则通过调用selinux模块的selinux_pst_check完成检测该父进程的进程id对应的安全标识符sid是否被非法修改。本发明还提供一种selinux安全标识符防篡改检测系统,包括计算机设备,该计算机设备被编程以执行本发明前述selinux安全标识符防篡改检测方法的步骤。本发明的selinux安全标识符防篡改检测方法具有下述优点:如果攻击者通过内核提权攻击手段修改了进程的安全标识符,则该进程的安全标识符对应的sid和映射关系表中所保存的数据不一致,本发明的selinux安全标识符防篡改检测方法能够检测到攻击者利用内核提权攻击手段对进程安全标识符的非法篡改,并将进程安全标识符恢复为非法篡改前的安全标识符,能够防止攻击者通过内核提权攻击手段突破selinux对系统的安全防护。附图说明图1为现有技术的linux系统执行新程序的流程示意图。图2为本发明实施例方法的基本流程示意图。图3为本发明实施例方法的lsm模块钩子函数插入的原理示意图。具体实施方式如图2所示,本实施例selinux安全标识符防篡改检测方法的实施步骤包括:1)建立一个进程id及其安全标识符sid的映射关系表pst,且当系统创建进程时,以进程id为索引,将进程id及其安全标识符sid作为新节点插入到映射关系表pst中;当进程撤销时,从映射关系表pst中删除通过进程id索引的节点;当系统通过合法调用接口改变进程的安全标识符sid时,则更新映射关系表pst中进程id及其安全标识符sid,使映射关系表pst中进程id及其安全标识符sid的映射关系一直保持最新状态;2)当进程执行新程序时,在实际执行新的子进程之前首先检测父进程的安全标识符sid是否被非法修改,如果父进程的安全标识符sid与映射关系表pst中的父进程id对应的安全标识符sid不一致,则判定该父进程的安全标识符sid被非法修改,根据映射关系表pst中保存的数据恢复父进程的安全标识符sid,跳转执行步骤3);否则判定该新程序的安全标识符sid未被修改,跳转执行步骤3);3)将子进程的缺省安全标识符sid设置为父进程的安全标识符sid,执行该子进程。在本实施例的映射关系表pst中,以进程id为索引的节点中保存的安全标识符sid必须时刻与系统中相应进程的权限凭证集cred中保存的安全标识符sid信息一致。如果不一致,则会导致selinux安全机制不能正常运行。因此当系统中创建新的进程或者已存在进程的安全标识符更新时必须同步更新映射关系表。而为了防止由于随着新进程的创建映射关系表不断增大从而导致检测效率降低的问题发生,当系统中已创建的进程撤销时,需要从映射关系表中删除与进程id一致的节点。本实施例中,步骤1)中建立的映射关系表pst的数据结构包括一个链表的头指针以及为链表中节点计数的变量,且每个节点中保存着进程id的编号pid和安全标识符sid以及指向下一个节点的指针,具体代码如下:上述代码中,pid_sid_node为节点的数据结构,其中pid用于存储进程id,sid用于存储进程id的安全标识符sid,pid_sid_node*next为指向下一个节点的指针;pid_sid_table为映射关系表pst的数据结构,pid_sid_node*head为链表的头指针,nel为链表中节点计数的变量。本实施例中对selinux模块进行改进,在现有selinux模块的基础上添加新的模块,该模块负责映射关系表pst的建立及维护。本实施例中,步骤1)中建立的映射关系表pst的初始化函数pst_init()嵌入在selinux的初始化函数selinux_init()中以在selinux初始化时完成映射关系表的初始化,当确定系统启动selinux安全机制后,调用映射关系表的初始化函数pst_init函数完成映射关系表pst的初始化。本实施例中,步骤1)中将进程id及其安全标识符sid作为新节点插入到映射关系表pst中、更新映射关系表pst中进程id及其安全标识符sid的详细步骤包括:首先检查以进程id为索引的节点在映射关系表pst中是否存在,如果不存在,则以输入参数中的进程id及其安全标识符sid作为新节点插入到映射关系表pst中;如果存在,则检查输入参数中的安全标识符sid与映射关系表pst中保存的安全标识符sid是否一致,如果一致则不做任何更改返回;如果不一致则将进程id在映射关系表pst中对应保存的安全标识符sid修改为输入参数中安全标识符sid;步骤1)中从映射关系表pst中删除通过进程id索引的节点的详细步骤包括:首先检查以输入参数中的进程id为索引的节点在映射关系表pst中是否存在,如果存在,则从映射关系表pst中删除通过进程id索引的节点;否则不执行任何操作。本实施例中,步骤1)中将进程id及其安全标识符sid作为新节点插入到映射关系表pst中是通过linux系统的do_fork函数来调用在lsm框架中预设的钩子函数security_pst_insert函数实现的;步骤1)中更新映射关系表pst中进程id及其安全标识符sid是通过linux系统的commit_creds函数来调用在lsm框架中预设的钩子函数security_pst_insert函数实现的;步骤1)中从映射关系表pst中删除通过进程id索引的节点是通过linux系统的do_exit函数来调用在lsm框架中预设的钩子函数security_pst_remove函数实现的;所述钩子函数security_pst_insert、security_pst_remove两者的函数指针均被添加到lsm框架的security_operations结构体中。参见图3,本实施例钩子函数security_pst_insert、security_pst_remove在linux系统的selinux模块中添加有security_pst_insert函数对应的安全函数selinux_pst_insert以及security_pst_remove函数对应的安全函数selinux_pst_remove;在linux系统未启用selinux安全机制时,所述钩子函数security_pst_insert、security_pst_remove被执行时,系统将不执行selinux模块中实现的selinux_pst_insert、selinux_pst_remove函数;在linux系统启用selinux安全机制时,selinux_pst_insert与selinux_pst_remove函数在selinux模块中被注册到全局变量security_ops,且执行security_pst_insert函数时则通过调用安全函数selinux_pst_insert完成将进程id及其安全标识符sid作为新节点插入到映射关系表pst或更新映射关系表pst中进程id及其安全标识符sid,执行security_pst_remove函数时则通过调用安全函数selinux_pst_remove从映射关系表pst中删除通过进程id索引的节点。本实施例中,步骤2)中检测父进程的安全标识符sid是否被非法修改是在install_exec_creds函数中依据linux_binprm结构中保存的cred来设定子进程sid时进行检测,通过linux系统的commit_creds函数来调用在lsm框架中预设的钩子函数security_pst_check函数实现的。参见图3,本实施例中钩子函数security_pst_check在linux系统的selinux模块中添加有security_pst_check函数对应的安全函数selinux_pst_check;在linux系统未启用selinux安全机制时,钩子函数security_pst_check被执行时,系统将不执行selinux实现的selinux_pst_check函数;在linux系统启用selinux安全机制时,selinux_pst_check函数在selinux模块中被注册到全局变量security_ops,且执行security_pst_check函数时则通过调用selinux模块的selinux_pst_check完成检测该父进程的进程id对应的安全标识符sid是否被非法修改。综上可知,映射关系表pst的相关函数接口如表1所示:表1中,*pst为指向映射关系表的指针,pst为映射关系表,pid用于存储进程id,sid用于存储进程的安全标识符sid。本实施例中,首先建立全局变量pst作为映射关系表,而映射关系表pst的维护主要通过表1中的前三个函数接口完成:1.映射关系表pst初始化本实施例将映射关系表的初始化选择在selinux初始化时完成,即在selinux_init函数中。当确定系统启动selinux安全机制后,调用pst_init函数完成映射关系表pst的初始化。2.映射关系表pst的维护映射关系表pst的插入及更新通过pst_insert函数完成。首先检查以进程id为索引的节点在映射关系表pst中是否存在。如果不存在,则以输入参数进程id、安全标识符sid作为数据源插入新的节点。如果存在,则检查输入参数与映射关系表pst中保存的安全标识符sid是否一致。如果一致,则不做任何更改返回;否则将对应节点保存的安全标识符sid修改为输入参数中的安全标识符sid。映射关系表pst中节点的删除通过pst_remove函数完成。该函数首先检查以进程id为索引的节点在映射关系表pst中是否存在。如果存在,则删除该节点;否则不执行任何操作。当进程创建时以及进程执行新程序时需要在映射关系表pst中插入新的节点或更新映射关系表pst。当进程撤销时需要在映射关系表pst中删除相应节点。而linux系统中所有进程的创建都需要通过do_fork函数来完成,而当进程执行新程序时最终都是通过commit_creds函数修改当前进程的权限凭证集cred,其中也包括selinux授予进程的安全标识符。因此本实施例选择在这两个函数中调用pst_insert函数。进程撤销是通过do_exit函数完成的,因此本实施例选择在该函数中调用pst_remove函数。但是由于映射关系表是属于selinux的一部分,因此不能在do_fork函数和commit_creds函数中直接调用pst_insert函数,do_exit函数也不能直接调用pst_remove函数。如果直接调用,那么当系统不启用selinux安全机制时,系统就不能正常启动和运行。因此,本实施例基于lsm框架,在lsm的基础上添加两个新的钩子函数security_pst_insert(structtask_struct*tsk)和security_pst_remove(structtask_struct*tsk)。lsm框架通过security_operations结构体使不同的安全模块实现的安全函数可以注册到lsm框架中。本实施例在该lsm框架的结构体中添加新元素,如下所示:在selinux中添加新的安全函数selinux_pst_insert(structtask_struct*tsk)和selinux_pst_remove(structtask_struct*tsk)。这两个函数可以分别直接调用pst_insert()和pst_remove函数来完成操作。当系统启用selinux安全机制时,将这两个安全函数注册到security_ops。在注册后,函数调用关系如图3所示。本实施例的防篡改检测主要是通过pst_check函数来完成。该函数通过检测当前进程的安全标识符是否与映射关系表pst中所保存的安全标识符sid是否一致来判断当前进程的安全标识符是否被非法修改。如果被非法修改,则根据映射关系表pst中保存的安全标识符sid来恢复进程的安全标识符。防篡改检测需要在系统真正执行新程序之前进行。因此本实施例选择在进程通过install_exec_creds函数将linux_binprm结构中保存的cred提交更改到当前进程时进行检测。install_exec_creds函数同样是通过commit_creds函数来具体完成相关工作的。commit_creds函数中提供了lsm模块的钩子函数security_commit_creds(structcred*new,conststructcred*old)。但是,selinux机制并没有提供具体的操作函数完成相关操作。因此,本实施例在selinux模块中添加安全函数selinux_cred_commit(structcred*new,conststructcred*old)函数,在该函数中,指针new指向linux_binprm结构体中的cred,而指针old指向当前进程的cred。本实施例首先通过pst_check函数检测当前进程的安全标识符sid(old->security->sid)是否与映射关系表pst中保存的安全标识符sid一致。若一致,则不进行任何操作。否则,返回映射关系表pst中保存的安全标识符sid,修改指针new指向的的cred结构,将new->security->sid修改为映射关系表pst中保存的安全标识符sid。通过该方式,本实施例selinux安全标识符防篡改检测方法可以将非法修改的安全标识符恢复为修改之前的安全标识符。综上所述,本实施例selinux安全标识符防篡改检测方法能够检测到攻击者利用内核提权攻击手段对进程安全标识符的非法篡改,并将进程安全标识符恢复为非法篡改前的安全标识符,能够防止攻击者通过内核提权攻击手段突破selinux对系统的安全防护。以上所述仅是本发明的优选实施方式,本发明的保护范围并不仅局限于上述实施例,凡属于本发明思路下的技术方案均属于本发明的保护范围。应当指出,对于本
技术领域
:的普通技术人员来说,在不脱离本发明原理前提下的若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。当前第1页12当前第1页12
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1