调用Linux系统调用劫持:技术原理、应用及检测

劫持检测  时间:2021-03-27  阅读:()

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

火数云 55元/月BGP限时三折,独立服务器及站群限时8折,新乡、安徽、香港、美国

火数云怎么样?火数云主要提供数据中心基础服务、互联网业务解决方案,及专属服务器租用、云服务器、专属服务器托管、带宽租用等产品和服务。火数云提供洛阳、新乡、安徽、香港、美国等地骨干级机房优质资源,包括BGP国际多线网络,CN2点对点直连带宽以及国际顶尖品牌硬件。专注为个人开发者用户,中小型,大型企业用户提供一站式核心网络云端服务部署,促使用户云端部署化简为零,轻松快捷运用云计算!多年云计算领域服务经...

Puaex:香港vds,wtt套餐,G口带宽不限流量;可解流媒体,限量补货

puaex怎么样?puaex是一家去年成立的国人商家,本站也分享过几次,他家主要销售香港商宽的套餐,给的全部为G口带宽,而且是不限流量的,目前有WTT和HKBN两种线路的方面,虽然商家的价格比较贵,但是每次补一些货,就会被抢空,之前一直都是断货的状态,目前商家进行了补货,有需要这种类型机器的朋友可以入手。点击进入:puaex商家官方网站Puaex香港vds套餐:全部为KVM虚拟架构,G口的带宽,可...

Nocser:马来西亚独立服务器促销$60.00/月

Nocser刚刚在WHT发布了几款促销服务器,Intel Xeon X3430,8GB内存,1TB HDD,30M不限流量,月付$60.00。Nocser是一家注册于马来西亚的主机商,主要经营虚拟主机、VPS和马来西亚独立服务器业务,数据中心位于马来西亚AIMS机房,线路方面,AIMS到国内电信一般,绕日本NTT;联通和移动比较友好,联通走新加坡,移动走香港,延迟都在100左右。促销马来西亚服务器...

劫持检测为你推荐
experiencedto操作http2019支付宝五福支付宝五福是哪五福?cisco2960思科2960如何划分vlan?360邮箱lin.long.an@360.com是什么邮箱sqlserver数据库电脑如何找到sql server数据库flashfxp下载我想下载一个FlashFXP 4.0.0 Build 1510 简体中文版的软件,可是不知道下载地址,希望大家帮帮我?文档下载怎么下载百度文档温州商标注册温州注册商标需要注册公司吗开源网店开源网店iWebMall中会员管理包括哪些只要内容呢?
m3型虚拟主机 如何查询域名备案号 net主机 瓦工 hostmonster ix主机 l5520 双12活动 godaddy域名转出 新世界电讯 阿里云代金券 dropbox网盘 hnyd 100m独享 福建铁通 网站加速软件 服务器维护 广东主机托管 阿里dns phpwind论坛 更多