返回顶部
首页 > 资讯 > 操作系统 >怎么增强Linux内核中的访问控制安全
  • 148
分享到

怎么增强Linux内核中的访问控制安全

2023-06-16 09:06:32 148人浏览 薄情痞子
摘要

这篇文章主要为大家展示了“怎么增强linux内核中的访问控制安全”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“怎么增强Linux内核中的访问控制安全”这篇文章吧。Linux中常见的拦截过滤用户态

这篇文章主要为大家展示了“怎么增强linux内核中的访问控制安全”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“怎么增强Linux内核中的访问控制安全”这篇文章吧。

Linux中常见的拦截过滤

  • 用户态动态库拦截。

  • 内核态系统调用拦截。

  • 堆栈式文件系统拦截。

  • inline hook拦截。

  • 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) {  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的内核数组中,数组的值就表示这个系统调用服务程序的入口地址。整个系统调用的流程如下:

怎么增强Linux内核中的访问控制安全

当用户态发起一个系统调用时,会通过80软中断进入到syscall  hander,进而进入全局的系统调用表sys_call_table去查找具体的系统调用,那么如果我们将这个数组中的地址改成我们自己的程序地址,就可以实现系统调用劫持。但是内核为了安全,对这种操作做了一些限制:

  • sys_call_table的符号没有导出,不能直接获取。

  • sys_call_table所在的内存页是只读属性的,无法直接进行修改。

对于以上两个问题,解决方案如下(方法不止一种):

  • 获取sys_call_table的地址 :

  • grep sys_call_table /boot/System.map-uname -r
  • 控制页表只读属性是由CR0寄存器的WP位控制的,只要将这个位清零就可以对只读页表进行修改。

 int make_rw(unsigned long address) { unsigned int level; pte_t *pte = lookup_address(address, &level);//查找虚拟地址所在的页表地址 pte->pte |= _PAGE_RW;//设置页表读写属性 return 0; }
 int make_ro(unsigned long address) { unsigned int level; pte_t *pte = lookup_address(address, &level); pte->pte &= ~_PAGE_RW;//设置只读属性 return 0; }

1. 开始替换系统调用

本文实现的是对 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; }

2. 恢复原状

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就不会显示这些文件,但是这些文件还是存在的。

堆栈式文件系统

Linux通过vfs虚拟文件系统来统一抽象具体的磁盘文件系统,从上到下的IO栈形成了一个堆栈式。通过对内核源码的分析,以一次读操作为例,从上到下所执行的流程如下:

怎么增强Linux内核中的访问控制安全

内核中采用了很多C语言形式的面向对象,也就是函数指针的形式,例如read是vfs提供用户的接口,具体底下调用的是ext2的read操作。我们只要实现VFS提供的各种接口,就可以实现一个堆栈式文件系统。Linux内核中已经集成了一些堆栈式文件系统,例如ubuntu在安装时会提醒你是否需要加密home目录,其实就是一个堆栈式的加密文件系统(eCryptfs),原理如下:

怎么增强Linux内核中的访问控制安全

实现了一个堆栈式文件系统,相当于所有的读写操作都会进入到我们的文件系统,可以拿到所有的数据,就可以进行做一些拦截过滤。

以下是我实现的一个最简单的堆栈式文件系统,实现了最简单的打开、读写文件,麻雀虽小但五脏俱全。

https://GitHub.com/wangzhangjun/wzjfs

inline hook

我们知道内核中的函数不可能把所有功能都在这个函数中全部实现,它必定要调用它的下层函数。如果这个下层函数可以得到我们想要的过滤信息内容,就可以把下层函数在上层函数中的offset替换成新的函数的offset,这样上层函数调用下层函数时,就会跳到新的函数中,在新的函数中做过滤和劫持内容的工作。所以从原理上来说,inline  hook可以想hook哪里就hook哪里。

怎么增强Linux内核中的访问控制安全

inline hook 有两个重要的问题:

  • 如何定位hook点。

  • 如何注入hook函数入口。

1. 对于***个问题:

需要有一点的内核源码经验,比如说对于read操作,源码如下:

怎么增强Linux内核中的访问控制安全

在这里当发起read系统调用后,就会进入到sys_read,在sys_read中会调用vfs_read函数,在vfs_read的参数中正好有我们需要过滤的信息,那么就可以把vfs_read当做一个hook点。

2. 对于第二个问题:

如何Hook?这里介绍两种方式:

  • ***种方式:直接进行二进制替换,将call指令的操作数替换为hook函数的地址。

  • 怎么增强Linux内核中的访问控制安全

  • 第二种方式:Linux内核提供的kprobes机制。

其原理是在hook点注入int  3(x86)的机器码,让cpu运行到这里的时候会触发sig_trap信号,然后将用户自定义的hook函数注入到sig_trap的回调函数中,达到触发hook函数的目的。这个其实也是调试器的原理。

LSM

LSM是Linux Secrity  Module的简称,即linux安全模块。是一种通用的Linux安全框架,具有效率高,简单易用等特点。原理如下:

怎么增强Linux内核中的访问控制安全

LSM在内核中做了以下工作:

  • 在特定的内核数据结构中加入安全域。

  • 在内核源代码中不同的关键点插入对安全钩子函数的调用。

  • 加入一个通用的安全系统调用。

  • 提供了函数允许内核模块注册为安全模块或者注销。

  • 将capabilities逻辑的大部分移植为一个可选的安全模块,具有可扩展性。

适用场景

对于以上几种Hook方式,有其不同的应用场景。

  • 动态库劫持不太完全,劫持的信息有可能满足不了我们的需求,还有可能别人在你之前劫持了,一旦禁用LD_PRELOAD就失效了。

  • 系统调用劫持,劫持的信息有可能满足不了我们的需求,例如不能获取struct file结构体,不能获取文件的绝对路径等。

  • 堆栈式文件系统,依赖于Mount,可能需要重启系统。

  • inline hook,灵活性高,随意Hook,即时生效无需重启,但是在不同内核版本之间通用性差,一旦某些函数发生了变化,Hook失效。

  • LSM,在早期的内核中,只能允许一个LSM内核模块加载,例如加载了SELinux,就不能加载其他的LSM模块,在***的内核版本中不存在这个问题。

以上是“怎么增强Linux内核中的访问控制安全”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网操作系统频道!

--结束END--

本文标题: 怎么增强Linux内核中的访问控制安全

本文链接: https://lsjlt.com/news/283156.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 怎么增强Linux内核中的访问控制安全
    这篇文章主要为大家展示了“怎么增强Linux内核中的访问控制安全”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“怎么增强Linux内核中的访问控制安全”这篇文章吧。Linux中常见的拦截过滤用户态...
    99+
    2023-06-16
  • 增强Linux内核中访问控制安全的方法
    背景 前段时间,我们的项目组在帮客户解决一些操作系统安全领域的问题,涉及到windows,linux,macOS三大操作系统平台。无论什么操作系统,本质上都是一个软件,任何软件在一开始设计的时候,都不能百分之百的满足人...
    99+
    2022-06-04
    linux访问控制 linux内核访问控制安全
  • Db2中怎么配置安全性和访问控制
    在IBM Db2中,您可以配置安全性和访问控制通过以下步骤: 使用Db2 Control Center或命令行工具设置Db2的安...
    99+
    2024-03-08
    Db2
  • 如何解析K8s安全中的访问控制
    今天就跟大家聊聊有关如何解析K8s安全中的访问控制,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。导读:访问控制是云原生安全的一个重要组成部分,也是 K8s 集群在多租环境下必要且基本...
    99+
    2023-06-04
  • linux内核的安全问题如何解决
    要解决Linux内核的安全问题,可以采取以下措施:1. 及时更新:及时更新Linux内核版本,以获取最新的安全补丁和修复程序。2. ...
    99+
    2023-10-18
    linux
  • Oracle的安全审计和访问控制机制是什么
    Oracle的安全审计和访问控制机制主要包括以下几个方面: 安全审计:Oracle数据库提供了丰富的审计功能,可以对数据库的操作...
    99+
    2024-04-09
    Oracle
  • 怎么增强云主机的安全
    增强云主机的安全可以通过以下方法实现: 使用强密码和多因素认证:确保云主机的登录密码复杂且安全,建议使用包含字母、数字和特殊字符...
    99+
    2024-05-15
    云主机
  • 数据库访问控制:安全之路的基石
    ...
    99+
    2024-04-02
  • Python中怎么实现访问控制
    本篇文章给大家分享的是有关Python中怎么实现访问控制,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。属性的种类通过之前的内容,我们知道,在定义一个类时,类内部可以有属性和方法...
    99+
    2023-06-16
  • MySQL中怎么访问内部安全数据目录
    这篇文章将为大家详细讲解有关MySQL中怎么访问内部安全数据目录,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。 ◆为什么说安全性是重要的,应该警惕...
    99+
    2024-04-02
  • 如何使用Linux服务器加强Web接口的访问控制
    要加强Web接口的访问控制,可以使用以下方法:1. 使用防火墙:配置服务器的防火墙规则,只允许特定的IP地址或IP地址范围访问Web...
    99+
    2023-10-12
    Linux
  • 美国VPS服务器Linux系统的安全性怎么增强
    增强美国VPS服务器Linux系统安全性的方法:1、运行#more/var/log/secure greprefused,检查系统是否受到攻击,以便及时发现并采取相应的措施;2、加强启动和登录的安全,设置BIOS安全、用户口令、默认账号等;...
    99+
    2024-04-02
  • Teradata的安全认证和访问控制机制是如何实施的
    Teradata的安全认证和访问控制机制主要通过以下几种方式实施: 用户认证:Teradata支持多种用户认证方式,包括密码认证...
    99+
    2024-04-09
    Teradata
  • 美国VPS服务器的安全怎么增强
    美国VPS服务器增强安全的方法:1、保护账号和密码,设置多种字符复杂且具有一定长度的密码;2、设置双重认证,能有效提高美国VPS服务器的安全性;3、及时安装和更新系统补丁,以免操作系统的漏洞被蓄意攻击利用;4、对日志程序报表进行分析,看是否...
    99+
    2024-04-02
  • 怎么增强服务器租用的安全性
    使用强密码:确保服务器的密码足够复杂,包含大小写字母、数字和特殊字符,并定期更换密码。 双重验证:启用双重验证机制,例如短信...
    99+
    2024-04-25
    服务器
  • 数据库安全堡垒:访问控制的钢铁屏障
    身份验证和授权 访问控制的第一道防线是身份验证,它验证用户身份。通过用户名、密码或其他凭据,系统确定用户是否是合法用户。一旦身份得到验证,授权机制就会确定用户可以访问哪些数据和操作。 角色和权限 角色和权限是访问控制中常见的机制。角色是一...
    99+
    2024-04-02
  • 数据库访问控制:数据安全的秘密处方
    在当今以数据为中心的时代,保护数据库安全至关重要。数据库访问控制 (DAC) 是确保仅授权用户可以访问和修改数据的一项关键安全措施。 DAC 原则 DAC 遵循“最小特权”原则,该原则指出用户只能获得执行其工作职责所需的确切权限。这限制...
    99+
    2024-04-02
  • 数据库安全漏洞的克星:访问控制的妙计
    1. 角色分配和权限细化 创建具有特定权限和职责的角色,并仅将必要的权限分配给需要它们的个人。细化权限可确保用户只能访问他们需要执行工作职责的数据。 2. 最小权限原则 遵循最小权限原则,该原则规定用户只应授予其执行工作所需的最低权限。这...
    99+
    2024-04-02
  • 数据库访问控制的迷宫:破解安全的奥秘
    身份验证和授权 DAC 的核心是身份验证和授权。身份验证涉及验证用户或进程的身份,而授权涉及授予访问数据库特定部分的权限。常见的身份验证方法包括用户名和密码、双因素身份验证和生物特征识别。授权则使用访问控制列表 (ACL) 或角色来指定对...
    99+
    2024-04-02
  • 阿里云服务器安全组访问控制全面保障你的网络安全
    本文将深入探讨阿里云服务器安全组访问控制的基本概念、作用以及其如何保护你的网络安全。安全组是阿里云提供的一种网络安全解决方案,通过安全组规则可以对不同来源的网络流量进行管理,从而有效防止恶意攻击和数据泄露。 阿里云服务器安全组访问控制是阿里...
    99+
    2023-10-30
    阿里 网络安全 访问控制
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作