Linux系统调用劫持技术原理、应用及检
测
Linux系统调用劫持:技术原理,应用及检测
时金桥方滨兴胡铭曾李斌
(哈尔滨工业大学国家计算机信息内容安全重点实验室,哈尔滨150001)
E—mail:sjq@pact518.hit.edu.cn
摘要系统调用劫持是黑客入侵系统后保留后门常用的一项技术.文章提出了利用可装入内核模块修改系统调用表
和中断描述符表两种实现L inu x系统调用劫持的方法,探讨了系统调用劫持技术在rootkit,入侵检测等方面的应用,并给
出了利用kmem进行系统调用劫持检测的一般方法.该文的分析基于Int elx 86平台上的2.4内核.
关键词系统调用劫持可装入内核模块Ro otkit入侵检测
文章编号1002—8331-(2003)32—0167--04文献标识码A中图分类号TP393.08LinuxSystemCallHij acking:TechnicalPrinciples,
App licationandDetection
ShiJinqiaoFangB inxingHuMingzengLiB in
(NationalKeyLabonCo mputerContextInformat io nS ecurity,Harbin 150001)
Abstract:Systemcallhij ackingisacommontechno logyusedbyhackerstokeepbackdoorsonthecompromisedsys—tem.Thispaperpresentstwomethodstohijacksystemcallbymodifyingthesystemcalltableandinterruptdescriptortableusinglo adablekernelmodule.Also.itdiscussestheapplicationo fsystemcallhij ackinginrootkit,intrusiondetec—tionandthegeneralwaytodetecthij ackingbyuseo fkmem.Theanalysiso fthispaperisbasedonlinuxkerne l2.4onInte lx86.
Keywords:Systemcallhij acking,l~adablekernelmodule,Ro otkit,Intrusiondetectio nrootkit是攻击者用来隐藏踪迹和保留root访问权限的工
具集.在一些黑客组织中,ro otkit是一个非常感兴趣的话题,各
种不同的rootkit被开发并发布在Intemet上.在这些工具集
中,基于LKM(10adaJ)lekernelmodule)的rootkit尤其受人关
注.基于UCM的rootkit可以实现隐藏文件,隐藏进程,隐藏网
络连接,重定向可执行文件,隐藏网络接口混杂模式等功能,它
所用到的主要技术是系统调用劫持.
文章在详细剖析L inu x系统调用机理的基础上,分析了基
于L KM的系统调用劫持的基本原理并给出了修改系统调用表
及中断描述符表两种劫持方法.着重探讨了利用系统调用劫持
技术进行可执行文件重定向的方法及其在rootkit,入侵检测中
的应用.最后分析了利用kme m系统内存映像设备文件检测系
统调用劫持的一般方法.lL inux系统调用机制
系统调用是操作系统核心向用户提供的操作硬件设备,请
求内核服务的接口.系统调用接口位于用户态与核心态之间的
边界,用户程序通过系统调用向操作系统内核请求服务,操作
系统内核完成服务,将结果返回给用户进程.系统调用提供了
一
种访问核心的机制,这种机制提高了系统的安全性,保证了
应用程序的可移植性.
Linux操作系统是利用软中断机制实现系统调用的,用户
程序通过调用int O x 80中断指令陷入核心,操作系统核心执行
中断服务例程,调用用户请求的系统调用服务例程,并将结果
返回给用户程序】 .这里以分析系统调用ren~ffle为例.
1.1系统调用相关数据结构
(1)系统调用号
Linux操作系统利用系统调用号来标识系统调用.Linux
2.418共支持237个系统调用,每个系统调用对应唯一的系统
调用号:
(2)系统调用表(sys—call—table)
Linux操作系统利用函数指针数组保存系统调用服务例程
的地址,这个数组称为系统调用表(sys—call—table).操作系统利
用系统调用号为下标在系统调用表中找到相应的系统调用服
务例程函数指针并跳转到相应地址,实现系统调用服务例程的
寻址与调用.
L inux的系统调用表定义在文件ar ch/J 386/ke rn e l/e ntry.S
中:
基金项目:国家863高科技发展计划资助项目(编号:863—1o4.JD2一O1)作者简介:时金桥,男,硕士研究生,主要研究领域为计算机网络与信息安全.方滨兴,男,博士,教授,博士生导师,主要研究领域为计算机网络与
信息安全,并行计算,高性能计算机体系结构.
计算机工程与应用20o3.32167
(3)中断描述符表(IDT)
Linux系统中利用intO x80中断指令陷入核心.每个中断
或异常是由一个8位的无符号整数来标识,Intel把这个整数称
作一个向量.中断描述符表(InterruptDescriptorTable,IDT)把
中断服务程序与中断向量对应起来,IDTR寄存器指向中断描
述符表的起始地址.中断描述符表由三种类型的描述符组成,
分别是任务门(taskgate),中断门(interruptgate)和陷阱门
(trapgate).系统调用中断向量Ox80对应的是陷阱门.陷阱门
是一个长为64位的描述符,各位的意义如图1所示I4/:
1"rapGate
1615141312
SegmentSeleaorOffset 15.0
DPLDescriptorPriegeLeveJ
O ffset0 f略eltopro cedureentrypo int
PSegmentPresentflag
SelectorSegmentSelectorfordestinationcodesegment
D S izeo faate:1:32bib:0=16b
圈Res erved
图l陷阱门描述符的格式
4
O
在L inux内核初始化时,调用trap init()函数针对系统保
留的中断向量进行初始化.trap_init函数调用set_system_gate(SYSCAU.VECTOR,&systemcal1)函数设置系统调用对应的中断服务程序为system_call(定义见areh/i386/kemel/entry.
S),并将描述符优先级别(DPL)设置成3,表明可以在用户空间调用int 0】 【80中断.
1.2Linux系统调用的函数执行链
当用户进程调用系统调用函数时,实际执行了libc标准库中的封装函数.封装函数将参数装入对应的寄存器,系统调用号装入eax寄存器,并调用int0 x80中断指令陷入系统核心.在libc封装库中renaro e系统调用的执行过程如下:
操作系统接收到中断请求后,会根据中断向量找到中断描述符表(IDT)中对应的描述符,进行优先级校验后,根据段选择码和段内偏移找到并调用对应的中断服务程序.对于系统调用来说,操作系统会调用system_call中断服务程序.system_call
1682003.32计算机工程与应用
函数保存寄存器,进行系统调用号有效性检验,最终根据系统调用号在系统调用表(sys_call_table)找到并调用相应的系统调厢服务例程.系统调用服务例程执行结束后,将返回值存人eax奇存器.操作系统调用ret_from_sys_call函数(定义见arch/i386/kemeVentry.S)返回
如上所述,Linux处理系统调用过程的函数执行链可以由图2表示[51.
用户态内按寿
应臻用系H曩的封系处理系统龌羲务
图2 linux处理系统调用函数执行链
2系统调用劫持原理
Linux处理系统调用时,从用户发出系统调用请求到执行系统调用服务例程,Linux共执行了两次查表操作,一次是以Ox80为索引查找中断描述符表,查找中断处理函数system_call的地址,一次是以系统调用号为索引查找系统调用表sys—calltable,查找对应的系统调用服务例程地址.通过对中断描述符表与系统调用表表项的分析可以发现,每一个表项中都保存有对应处理函数的地址,通过修改处理函数的地址,使它指向自定义的处理函数,可以达到函数劫持的目的.
利用函数劫持,采用可装载内核模块(1 o adablekernelmodule,LKM)技术动态链人内核,通过修改系统调用表以及中断描述符表的内核表项,使其指向自定义处理函数,实瑗系统调用劫持.
2.1 LKM技术简介
Linux操作系统自内核版本2.0开始提供对可装载模块L KM的支持.L KM可以运行时链人内核.成为内核的一部分,动态扩展内核的功能.一个内核模块至少包括iniLmo dtde以及clemlup_module两个函数.在加载模块的时候,将调用iniLmodule函数,进行模块初始化,在卸载模块时,调用cleanup_module函数进行资源回收.
2.2利用系统调用表劫持系统调用
利用L KM技术修改系统词用表,劫持系统调用的基本步骤如下[6j:
(1)编写内核模块,声明函数指针orig._sys_rename,保存系
统调用表中指向原系统调用的函数指针,实现自定义系统调用函数m.
(2)在模块初始化函数init_module中,保存系统调用表中原有系统凋用对应的表项,填人自定义系统调用函数指针,开始系统调用劫持:orig_sysrename=syscall—table[Na—l~na/lle】sys_calltable[NR_rename]=my—sysrename
(3)在模块卸载函数clemlup_mo dule中,恢复系统调用表中原有的系统调用函数指针,结束系统调用劫持:sys—call_table:[NR_rename]=orig__sys_rename
加载内核模块后,Linux处理系统调用的函数执行链变成图3所示,系统调用服务例程为自定义函数my_sys_rename.用户态内核态
应臻甩系.1 ib~装~麓的封系处理系统务
图3修改系统调用表后的函数执行链
利用系统调用表劫持系统调用的优点在于方法简单直观,不用编写复杂的模块进行劫持,可以将主要精力放在自定义系统调用上.但是这种方法易于被检测出来,不利用隐藏.
2_3利用中断描述符表劫持系统调用
通过修改中断向量Ox80所对应的中断描述符中的段内偏移地址,可以实现对systemcall函数的劫持,进而劫持系统调用函数[71.
利用L KM技术修改中断描述符表,劫持系统调用的基本步骤如下:
(1)编写内核模块,实现自定义系统调用函数mysysre—
name,编写自定义中断处理函数mysystemcall.
(2)在模块初始化函数init_module中,保存中断向量Ox80对应的中断描述符中的中断处理函数的段内偏移地址,填人自定义中断处理函数my_system_call的偏移地址,开始系统调用劫持.
(3)在模块卸载函数cleanup_module中,修改中断向量Ox80对应的中断描述符,恢复原有中断处理函数systemcall的偏移地址,结束系统调用劫持.
其中,核心函数my_system_call用汇编写成,判断eax寄存器值(系统调用号)是否等于欲劫持系统调用号,如果相等,则调用自定义函数,返回后调用原system_call函数;若不等,则调用原systemcall函数,按照正常流程处理系统调用.主要代码如下:
—-舾m一(
.globlmy_system_call,Il
.align4.0x90,Il
"my—system—call:
"pushl%%ds
,Il
//保存积存器
"push1%%ebx,Il
%or%%ebx.%%ebx,Il
"movl%2.%%ebx,Il
"
cmpl%%,%%ebx,Il//比较eex与欲劫持调用值
'4nefinis,Il//不相等,调用o ld_systemcall
"call%0,Il//相等,调用my_sys_xxxfinis:,Il
"pop 1%%ebx,Il//恢复寄存器
"jmp%l,Il//调用old_systemcall
: :m(my—sys_xxx),m"(old_system_cal 1),(sys_number));加载内核模块后,当调用欲劫持的系统调用时,Linux的函数执行链如图4所示.
修改中断描述符表的技术还可以用来截获其他的中断处理函数,缺点是编写自定义中断处理函数需要使用汇编语言,比较繁琐.
3系统调用劫持的应用与检测
3.1系统调用劫持的应用
Linux系统调用劫持被大量应用在后门技术中.通过劫持系统调用execve可以实现可执行文件的重定向.利用这种技术,可以重定向可执行文件/b in/lo g in,p s,I s等等,执行后门程序.这种后门技术可以逃避tripwir e等文件完整性校验工具的检测,因为原有的文件根本没有被改变.
利用系统调用劫持实现可执行文件重定向的主要思想是修改系统调用表中的某一空项,使其指向原系统调用sy.根据输入参数判定是否是欲重定向的可执行文件名,如果是,则修改参数,指向欲执行的可执行文件名,重新调用sys_execve,从而执行重定向后的可执行文件.
主要代码及注释如下:
(1)模块定义
intifit—modle(vo id)/模块初始化/
{
/查找空系统调用号/
一NR—myexecve=240;while(一NR—myexecve!=O&&sys—.call—.table[—.NRmyexecve] !=O;
一
NR—myexeeve;
//修改系统调用块.劫持系统调用'
核心态
应臁胍u囊麓的封系处理系务
图4修改中断描述符后的iti数执行链
计算机工程与应用2003.32169orig_execve=sys_call—table[SYS—exeeve】 ;if(一NR—myexe cve[=O){sysy_call_table[一NR_myexecve]=orig_execve;sys—call_table[SYS_execve]=(vo id)e_exeeve;lreturn0;
)vo iddeanup_module(vo id)
{//恢复原系统调用sys_execvesyscall_table[SYS_execve]=orig_execve;l
RAKsmart发布了9月份优惠促销活动,从9月1日~9月30日期间,爆款美国服务器每日限量抢购最低$30.62-$46/月起,洛杉矶/圣何塞/香港/日本站群大量补货特价销售,美国1-10Gbps大带宽不限流量服务器低价热卖等。RAKsmart是一家华人运营的国外主机商,提供的产品包括独立服务器租用和VPS等,可选数据中心包括美国加州圣何塞、洛杉矶、中国香港、韩国、日本、荷兰等国家和地区数据中心(...
a400互联是一家成立于2020年商家,主营美国机房的产品,包括BGP线路、CN2 GIA线路的云服务器、独立服务器、高防服务器,接入线路优质,延迟低,稳定性高,额外也还有香港云服务器业务。当前,全场服务器5折,香港VPS7折,洛杉矶VPS5折,限时促销!A400互联官网:https://a400.net/优惠活动全场独服永久5折优惠(续费同价):0722香港VPS七折优惠:0711洛杉矶VPS五...
百纵科技怎么样?百纵科技国人商家,ISP ICP 电信增值许可证的正规公司,近期上线美国C3机房洛杉矶独立服务器,大带宽/高配置多ip站群服务器。百纵科技拥有专业技术售后团队,机器支持自动化,自助安装系统 重启,开机交付时间 30分钟内交付!美国洛杉矶高防服务器配置特点: 硬件配置高 线路稳定 洛杉矶C3机房等级T4 平价销售,支持免费测试,美国独服适合做站,满意付款。点击进入:百纵科技官方网站地...