加入收藏 | 设为首页 | 会员中心 | 我要投稿 河北网 (https://www.hebeiwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 业界 > 正文

如何增强Linux内核中的访问控制安全

发布时间:2018-12-20 04:42:26 所属栏目:业界 来源:王张军
导读:配景 前段时刻,我们的项目组在帮客户办理一些操纵体系安详规模的题目,涉及到windows,Linux,macOS三大操纵体系平台。无论什么操纵体系,本质上都是一个软件,任何软件在一开始计划的时辰,都不能百分之百的满意人们的需求,以是操纵体系也是一样,为了
副问题[/!--empirenews.page--]

配景

前段时刻,我们的项目组在帮客户办理一些操纵体系安详规模的题目,涉及到windows,Linux,macOS三大操纵体系平台。无论什么操纵体系,本质上都是一个软件,任何软件在一开始计划的时辰,都不能百分之百的满意人们的需求,以是操纵体系也是一样,为了尽也许的满意人们需求,不得不提供一些供人们定制操纵体系的机制。虽然除了官方提供的一些机制,也有一些黑邪术,这些黑邪术不被保举行使,可是偶然辰面临详细的营业场景,可以作为一个参考的思绪。

怎样加强Linux内核中的会见节制安详

Linux中常见的拦截过滤

本文着重先容Linux平台上常见的拦截:

  • 用户态动态库拦截。
  • 内核态体系挪用拦截。
  • 仓库式文件体系拦截。
  • inline hook拦截。
  • LSM(Linux Security Modules)

动态库挟制

Linux上的动态库挟制首要是基于LD_PRELOAD情形变量,这个情形变量的首要浸染是改变换态库的加载次序,让用户有选择的载入差异动态库中的沟通函数。可是行使不妥就会引起严峻的安详题目,我们可以通过它在主措施和动态毗连库中加载此外动态函数,这就给我们提供了一个机遇,向别人的措施注入恶意的代码。

假设有以下用户名暗码验证的函数:

  1. #include <stdio.h> 
  2. #include <string.h> 
  3. #include <stdlib.h> 
  4. int main(int argc, char **argv) 
  5. char passwd[] = "password"; 
  6. if (argc < 2) { 
  7. printf("Invalid argc!n"); 
  8. return; 
  9. if (!strcmp(passwd, argv[1])) { 
  10. printf("Correct Password!n"); 
  11. return; 
  12. printf("Invalid Password!n"); 

我们再写一段hookStrcmp的措施,让这个较量永久正确。

  1. #include <stdio.h> 
  2. int strcmp(const char *s1, const char *s2) 
  3. /* 永久返回0,暗示两个字符串相称 */ 
  4. return 0; 

依次执行以下呼吁,就会使我们的hook措施先执行。

  1. gcc -Wall -fPIC -shared -o hookStrcmp.so hookStrcmp.c 
  2. 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的地点 :
    1. grep sys_call_table /boot/System.map-uname -r 
  • 节制页表只读属性是由CR0寄存器的WP位节制的,只要将这个位清零就可以对只读页表举办修改。
  1. /* make the page writable */ 
  2. int make_rw(unsigned long address) 
  3. unsigned int level; 
  4. pte_t *pte = lookup_address(address, &level);//查找假造地点地址的页表地点 
  5. pte->pte |= _PAGE_RW;//配置页表读写属性 
  6. return 0; 
  1. /* make the page write protected */ 
  2. int make_ro(unsigned long address) 
  3. unsigned int level; 
  4. pte_t *pte = lookup_address(address, &level); 
  5. pte->pte &= ~_PAGE_RW;//配置只读属性 
  6. return 0; 

1. 开始替代体系挪用

(编辑:河北网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读