新普京网站-澳门新普京 > 前端 > 从用户空间到内核空间新普京网站:,如何增强

从用户空间到内核空间新普京网站:,如何增强

2019/12/29 17:19

背景

近期,我们的品种组在帮顾客消弭风流浪漫部分操作系统安整个世界的标题,涉及到windows,Linux,macOS三大操作系统平台。不论怎么样操作系统,本质上都以三个软件,任何软件在后生可畏始发规划的时候,都不可能整个的满足大家的急需,所以操作系统也是均等,为了尽量的满意大家须求,不能不提供一些供大家定制操作系统的建制。当然除了法定提供的有的编写制定,也是有风姿浪漫对黑法力,这一个黑法力不被推荐应用,然而有的时候面前遇到现实的事务场景,能够看作三个参谋的笔触。

转自:

Linux四川中国广播集团泛的掣肘过滤

正文珍视介绍Linux平台上海大学规模的阻拦:

  1. 客商态动态库拦截。
  2. 内核态系统调用拦截。
  3. 货仓式文件系统拦截。
  4. inline hook拦截。
  5. LSM(Linux Security Modules)

版权申明:本文为博主(

动态库威迫

Linux上的动态库免强首假诺基于LD_ PRELOAD景况变量,这一个境况变量的第百分之十效是改造动态库的加载顺序,让顾客有取舍的载入不一致动态库中的相近函数。不过使用不当就能够挑起严重的平安难点,咱们得以经过它在主程序和动态连接库中加载其余动态函数,那就给大家提供了二个机遇,向人家的前后相继注入恶意的代码。

若果有以下顾客名密码验证的函数:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, char **argv)
{
char passwd[] = "password";
if (argc < 2) {
printf("Invalid argc!n");
return;
}
if (!strcmp(passwd, argv[1])) {
printf("Correct Password!n");
return;
}
printf("Invalid Password!n");
}

咱俩再写黄金时代段hookStrcmp的次序,让那些相比恒久准确。

#include <stdio.h>
int strcmp(const char *s1, const char *s2)
{
/* 永远返回0,表示两个字符串相等 */
return 0;
}

各种试行以下命令,就能够使大家的hook程序先实行。

gcc -Wall -fPIC -shared -o hookStrcmp.so hookStrcmp.c
export LD_PRELOAD=”./hookStrcmp.so

结果会发觉,大家和睦写的strcmp函数优先被调用了。那是叁个最简便易行的仰制,可是若是威胁了看似于geteuid/getuid/getgid,让其重回0,就约等于曝光了root权限。所感到了安全起见,平日将LD_ PRELOAD情状变量禁止使用掉。

 

Linux系统调用威迫

多年来发今后4.4.0的水源中有513多少个种类调用(相当多都没用过卡塔尔国,系统调用勒迫的目标是改进系统中原本的连串调用,用大家和好的程序替换原有的系统调用。Linux内核中颇有的体系调用都以坐落二个誉为sys_ call _table的根本数组中,数组的值就表示那些体系调用服务程序的输入地址。整个种类调用的流水生产线如下:

新普京网站 1

当顾客态发起叁个连串调用时,会透过80软中断步向到syscall hander,进而步向全局的种类调用表sys_ call _table去探究具体的系统调用,那么黄金时代旦大家将以此数组中的地址改成大家友好的顺序地址,就可以达成系统调用威胁。可是根基为了安全,对这种操作做了有的节制:

  1. sys_ call _table的暗记未有导出,无法直接得到。
  2. sys_ call _table所在的内部存款和储蓄器页是只读属性的,不能够直接进行匡正。

对此上述七个难题,应用方案如下(方法不独有生机勃勃种):

  1. 获取sys call table的地址 :grep sys _ call _table /boot/System.map-uname -r
  2. 操纵页表只读属性是由CHighlander0寄放器的WP位调控的,只要将以此位清零就足以对只读页表举行改变。

    / make the page writable / int make_rw(unsigned long address) { unsigned int level; pte_t *pte = lookup_address(address, &level卡塔尔国;//查找虚构地址所在的页表地址 pte->pte |= _PAGE_ENVISIONW;//设置页表读写属性 return 0; }

    / make the page write protected / int make_ro(unsigned long address) { unsigned int level; pte_t *pte = lookup_address(address, &level); pte->pte &= ~_PAGE_EvoqueW;//设置只读属性 return 0; }

目录(?)[-]

千帆竞发改动系统调用

本文达成的是对 ls那个命令对应的种类调用,系统调用号是 _ NR _getdents。

static int syscall_init_module(void)
{
orig_getdents = sys_call_table[__NR_getdents];
make_rw((unsigned long)sys_call_table); //修改页属性
sys_call_table[__NR_getdents] = (unsigned long *)hacked_getdents; //设置新的系统调用地址
make_ro((unsigned long)sys_call_table);
return 0;
}

1背景知识

苏醒原状

static void syscall_cleanup_module(void)
{
printk(KERN_ALERT "Module syscall unloaded.n");
make_rw((unsigned long)sys_call_table);
sys_call_table[__NR_getdents] = (unsigned long *)orig_getdents;
make_ro((unsigned long)sys_call_table);
}

接纳Makefile编写翻译,insmod插入内核模块后,再实行ls时,就能踏向到我们的系统调用,我们得以在hook代码中删掉有些文件,ls就不会来得那一个文件,不过这么些文件或许存在的。

  1. 1 进程的顾客空间
  2.  12 地址映射

货仓式文件系统

Linux通过vfs设想文件系统来统风姿罗曼蒂克抽象具体的磁盘文件系统,从上到下的IO栈产生了八个货仓式。通过对内核源码的解析,以叁次读操作为例,从上到下所举办的流水生产线如下:

新普京网站 2

水源中选拔了不菲c语言情势的面向对象,也正是函数指针的方式,比方read是vfs提供顾客的接口,具体底下调用的是ext2的read操作。我们假设达成VFS提供的各样接口,就足以兑现一个酒店式文件系统。Linux内核中大器晚成度合龙了部分仓库式文件系统,举个例子Ubuntu在设置时会提示您是还是不是需求加密home目录,其实正是二个宾馆式的加密文件系统(eCryptfs),原理如下:

新普京网站 3

贯彻了贰个饭馆式文件系统,相当于具有的读写操作都会进来到咱们的文件系统,能够获得具有的多寡,就能够张开做一些挡住过滤。

以下是自个儿完结的三个最轻易易行的饭店式文件系统,完成了最简易的开发、读写文件,麻雀虽小但麻雀虽小。

malloc 和free

inline hook

咱俩驾驭根本中的函数不容许把持有功效都在这些函数中全体完毕,它必然要调用它的下层函数。假诺这几个下层函数能够拿走我们想要的过滤消息内容,就足以把下层函数在上层函数中的offset替换来新的函数的offset,那样上层函数调用下层函数时,就能够跳到新的函数中,在新的函数中做过滤和绑架内容的办事。所以从常理上的话,inline hook可以想hook哪儿就hook哪儿。

新普京网站 4

  1. 1 用户层
  2. 2 内核层
  3. 3 虚构地址与物理地址

inline hook 有四个主要的标题:

  1. 哪些定位hook点。
  2. 怎么注入hook函数入口。

总结

对此第二个难点:

内需有少数的水源源码经历,比方说对于read操作,源码如下:

新普京网站 5

在那间当发起read系统调用后,就能够进去到sys read,在sys read中会调用vfs read函数,在vfs read的参数中刚巧有我们须求过滤的新闻,那么就能够把vfs_ read当作三个hook点。

参考

对于第1个难点:

什么样Hook?这里介绍二种方法:

第意气风发种艺术:直接开展二进制替换,将call指令的操作数替换为hook函数的地点。

新普京网站 6

第三种格局:Linux内核提供的kprobes机制。

其规律是在hook点注入int 3(x86State of Qatar的机器码,让cpu运营到此处的时候会触发sig trap实信号,然后将客商自定义的hook函数注入到sig trap的回调函数中,达到触发hook函数的目标。这几个实际也是调节和测量试验器的原理。

附录

LSM

LSM是Linux Secrity Module的简单的称呼,即linux安全模块。是后生可畏种通用的Linux安全框架,具备效能高,轻便易用等性情。原理如下:

新普京网站 7

LSM在功底中做了以下专业:

  1. 在一定的内核数据构造中投入安全域。
  2. 在内核源代码中分化的关键点插入对铜川钩子函数的调用。
  3. 参预三个通用的防城港连串调用。
  4. 提供了函数允许内核模块注册为安全模块或许打消。
  5. 将capabilities逻辑的大超级多移植为三个可选的安全模块,具备可扩大性。

 

上一篇:没有了 下一篇:个你真的应该学习的功能,个你真的应该学习