转自:cnblog  

各种折腾,经过了一个蛋疼的周末,终于在Ubuntu14.04上运行了一个基于LSM的简单demo程序。

一:程序编写

  先简单的看一下这个demo:

//demo_lsm.c
#include <linux/lsm_hooks.h>
#include <linux/sysctl.h>static unsigned long long count = 0;int demo_task_create(unsigned long clone_flags)
{printk("[+geek] call task_create(). count=%llu\n", ++count);    return 0;
}static struct security_hook_list demo_hooks[] = {LSM_HOOK_INIT(task_create,demo_task_create),
};
void __init demo_add_hooks(void)
{pr_info("Demo: becoming mindful.\n");        //打印相关信息,可以通过dmesg |  grep Yama:查看security_add_hooks(demo_hooks, ARRAY_SIZE(demo_hooks));   //添加安全模块函数
}static __init int demo_init(void){demo_add_hooks();return 0;
}security_initcall(demo_init);

  根据(一)的yama可以得出,编写一个基于LSM的安全模块的基本流程:

    1>确定需要hook的函数

    2>对hook函数进行填充,添加自己的逻辑(安全检查)

    3>添加到在security_hook_list的数据结构里

    4>对这个有注册逻辑的函数进行注册

  1:确定需要hook的函数:

    1>用户创建进程需要调用系统调用 sys_fork()/sys_vfork()/sys_clone()

    2>sys_fork()等函数中调用 do_fork()

    3>do_fork()调用copy_process()

    4>copy_process()调用security_task_create(),这里便是hook点了,可以进行自己的逻辑

    5>security_task_create()的主体就是security_hook_list的task_create()

  2:对hook函数进行必要的填充,添加自己的逻辑(额外的安全检查)

    在这里,只是为了简单的检测自己的代码是否能够正常运行,所以,只用了简单的printk,详情请看demo_task_create函数。

  3:添加到在security_hook_list的数据结构里

    额外说一点:关于这一步,在4.0之前后某个版本,打了个补丁,所以实现方式会有不同,先看一下4.0以前:

struct security_operations {char name[SECURITY_NAME_MAX + 1]; int (*ptrace_access_check) (struct task_struct *child, unsigned int mode);int (*ptrace_traceme) (struct task_struct *parent);int (*capget) (struct task_struct *target, kernel_cap_t *effective, kernel_cap_t *inheritable, kernel_cap_t *permitted);int (*capset) (struct cred *new, const struct cred *old, const kernel_cap_t *effective, const kernel_cap_t *inheritable, const kernel_cap_t *permitted);int (*capable) (const struct cred *cred, struct user_namespace *ns, int cap, int audit);int (*quotactl) (int cmds, int type, int id, struct super_block *sb);....

    这种实现方式有个缺点,无论hook几个函数,都会替每个指针占一个位置,由于内核空间,内存十分宝贵,这种占空间西行为产生了很大的浪费。所以实现换了一种方式,如下:

struct security_hook_list {struct list_head                list;struct list_head                *head;union security_list_options     hook;};

    然后,security_list_options以一种联结体的方式存在,然后通过侵入式链表连接,可以有效的节省空间。

     言归正传。数据结构可以通过LSM_HOOK_INIT宏来进行填充,详情可以看(一):

  4:对这个有注册逻辑的函数进行注册

    在这一点上,简单的security_initcall(demo_init);就可以了

二:Makefile和Kconfig编写

    在编写这两个文件时,由于在2.6.X后,lsm的模块不允许通过insmod动态加载到内核中,需要在编译内核时添加,所以,需要谨慎,否则容易出错(-_-)。

  如下:

//Kconfig
config     SECURITY_DEMObool     "demo support"depends on SECURITYdefault     nhelpintroduction of demo modules
//Makefile
obj-$(CONFIG_SECURITY_GEEK) := demo.o
demo-y := demo_lsm.o

将这两个文件以及前文的 demo_lsm.c 放到./linux-X.X.X(X.X.X>4.0.0)/security/demo(自己创建)中,然后修改security下的Kconfig和Makefile,这里可以参照SElinux或者yama的格式进行编写,      但需要注意的是,在Linux>4.2之后,Yama默认只能依附在其它模块上,所以,最好对照SELinux。

#
# Makefile for the kernel security code
#obj-$(CONFIG_KEYS)            += keys/
subdir-$(CONFIG_SECURITY_SELINUX)    += selinux
subdir-$(CONFIG_SECURITY_DEMO)        += demo
subdir-$(CONFIG_SECURITY_SMACK)        += smack
subdir-$(CONFIG_SECURITY_TOMOYO)        += tomoyo
subdir-$(CONFIG_SECURITY_APPARMOR)    += apparmor
subdir-$(CONFIG_SECURITY_YAMA)        += yama# always enable default capabilities
obj-y                    += commoncap.o
obj-$(CONFIG_MMU)            += min_addr.o# Object file lists
obj-$(CONFIG_SECURITY)            += security.o
obj-$(CONFIG_SECURITYFS)        += inode.o
obj-$(CONFIG_SECURITY_SELINUX)        += selinux/
obj-$(CONFIG_SECURITY_DEMO)        += demo/
obj-$(CONFIG_SECURITY_SMACK)        += smack/
obj-$(CONFIG_AUDIT)            += lsm_audit.o
obj-$(CONFIG_SECURITY_TOMOYO)        += tomoyo/
obj-$(CONFIG_SECURITY_APPARMOR)        += apparmor/
obj-$(CONFIG_SECURITY_YAMA)        += yama/
obj-$(CONFIG_CGROUP_DEVICE)        += device_cgroup.o# Object integrity file lists
subdir-$(CONFIG_INTEGRITY)        += integrity
obj-$(CONFIG_INTEGRITY)            += integrity/
#
# Security configuration
#menu "Security options"source security/keys/Kconfig.....source security/selinux/Kconfig
source security/demo/Kconfig
source security/smack/Kconfig
source security/tomoyo/Kconfig
source security/apparmor/Kconfig
source security/yama/Kconfigsource security/integrity/Kconfigchoiceprompt "Default security module"default DEFAULT_SECURITY_SELINUX if SECURITY_SELINUXdefault DEFAULT_SECURITY_DEMO if SECURITY_DEMOdefault DEFAULT_SECURITY_SMACK if SECURITY_SMACKdefault DEFAULT_SECURITY_TOMOYO if SECURITY_TOMOYOdefault DEFAULT_SECURITY_APPARMOR if SECURITY_APPARMORdefault DEFAULT_SECURITY_DAChelpSelect the security module that will be used by default if thekernel parameter security= is not specified.config DEFAULT_SECURITY_SELINUXbool "SELinux" if SECURITY_SELINUX=yconfig DEFAULT_SECURITY_DEMObool "demo" if SECURITY_DEMO=yconfig DEFAULT_SECURITY_SMACKbool "Simplified Mandatory Access Control" if SECURITY_SMACK=yconfig DEFAULT_SECURITY_TOMOYObool "TOMOYO" if SECURITY_TOMOYO=yconfig DEFAULT_SECURITY_APPARMORbool "AppArmor" if SECURITY_APPARMOR=yconfig DEFAULT_SECURITY_DACbool "Unix Discretionary Access Controls"endchoiceconfig DEFAULT_SECURITYstringdefault "selinux" if DEFAULT_SECURITY_SELINUXdefault "demo" if DEFAULT_SECURITY_DEMOdefault "smack" if DEFAULT_SECURITY_SMACKdefault "tomoyo" if DEFAULT_SECURITY_TOMOYOdefault "apparmor" if DEFAULT_SECURITY_APPARMORdefault "" if DEFAULT_SECURITY_DACendmenu

三:编译安装运行内核

    1>将linux内核源码和二里面添加和更改的部分移到 /usr/src中。

    2> cp /boot/config-‘uname -r’ /usr/src/kernels/linux3.2.14/.config,将原系统内核配置拷贝到需要编译的源码上

    3> make menuconfig,这里可能会失败,这时候,你需要去apt-get install libncurses5-dev:截图如下:

在配置上,需要自己根据自己的水平来进行配置,否则极易弄巧成拙(-_-)

    4>make bzImage -jN(N为具体数字,代表线程数),可以根据虚拟机内核数 X2来确定N的具体值,以节约时间

    5>make modules -jN,同上

    6>make modules_install

    7>make install

    8>部分可能需要修改grub的default为0,经测ubuntu14.04自动修改了,不需要自己去改

    9>reboot ,并且demesg,可以得到如下:


demo就运行成功了

学习LSM(Linux security module)之二:编写并运行一个简单的demo相关推荐

  1. 学习LSM(Linux security module)之四:一个基于LSM的简单沙箱的设计与实现

    转自:cnblog 嗯!如题,一个简单的基于LSM的沙箱设计.环境是Linux v4.4.28.一个比较新的版本,所以在实现过程中很难找到资料,而且还有各种坑逼,所以大部分的时间都是在看源码,虽然写的 ...

  2. 学习LSM(Linux security module)之一:解读yama

    最近打算写一个基于LSM的安全模块,发现国内现有的资料极少.因此打算自己琢磨一下.大致的学习路线如下: 由易至难使用并阅读两到三个安全模块->参照阅读模块自己实现一个安全模块->在自己实现 ...

  3. Linux Security Module逆向分析实战

    Linux Security Module逆向分析实战 本文记录了对某发行版Linux中一个安全模块(LSM)的逆向过程,该LSM对系统中待运行的程序进行安全校验,数据流穿越内核态与用户态,涉及系统内 ...

  4. Spring学习笔记(一):眼见为实,先上一个简单例子

    概述 所谓眼见为实,Spring虽然是一个轻量级的框架,但涉及众多的概念,理解起来并不容易,因此,先参考资料写一个简单的Demo,从中洞见Spring的大体工作流程,为后面深入学习做铺垫. 本文的De ...

  5. LSM(Linux Security Modules)框架原理解析

    1. 基本原理 LSM是内核安全模块的一套框架,本质是插桩法.它的主要有两个特点: 1.在内核安全相关的关键路径上插入了Hook点: 内核安全相关的关键对象有:task_struct(任务和进程).l ...

  6. Linux环境下用vim编写编译运行C/C++程序

    在Linux环境下编写编译运行C程序 首先在终端下输入命令进入编写 vim hello.c #include <stdio.h> int main() {printf("hell ...

  7. 【RuoYi-Vue-Plus】学习笔记 46 - Redisson(十二)布隆过滤器 BloomFilter 简单分析

    文章目录 前言 参考目录 测试方法 配置说明 Demo 方法 功能调用流程分析 1.布隆过滤器的初始化 `tryInit` 1.1.创建布隆过滤器 1.2.初始化布隆过滤器 1.2.1.计算 bit ...

  8. maven学习笔记之IDEA+Maven+Jetty运行一个简单的web项目

    maven学习笔记 一.什么是maven Maven是一个项目管理工具,它包含了一个项目对象模型 (Project Object Model),一组标准集合,一个项目生命周期(Project Life ...

  9. 《Linux内核分析》 第三周 构造一个简单的Linux系统MenuOS

    Linux内核分析 第三周 构造一个简单的Linux系统MenuOS 张嘉琪 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/ ...

最新文章

  1. c枚举类型enum例题_一篇文章让你详细了解Java中Enum枚举类的使用
  2. java ResultSet常用操作
  3. CruiseControl.NET开篇
  4. Js提交表单的两种方法
  5. SAP数据表(一)商品表
  6. 计算机硬盘能否做u盘用怎么用,U盘能一直插在电脑上当硬盘用吗?
  7. 服务器每秒钟执行命令数量是什么_全国自考互联网及其应用模拟试卷(一)及答案.doc...
  8. ELASTIC API
  9. atom-design(Vue.js移动端组件库)手势组件介绍
  10. 2021公益数字化研究报告
  11. 2018.09.28python学习第十三天part2
  12. Linux的网卡由eth0变成了eth1,如何修复
  13. Javascript_备忘录3
  14. USACO_1_2_Dual Palindromes
  15. 锐捷 重启计算机,关于锐捷客户端重安装后要求反覆重启的解决办法
  16. 半导体界仙童“八叛逆”又一人去世,仅存一人!
  17. linux环境(centos7.3)下安装Xilinx FPGA以及烧录算法教程
  18. 彩影2008 白金版 10.1 build 2010
  19. docker安装gamit_Ubuntu Linux下安装GAMIT
  20. java算法编程题:利用单链表求集合的交集、并集和补集

热门文章

  1. 李嘉诚布局接班人富儿穷养 财富版图正远离中华区
  2. liblensfun 在 mingw 上编译时遇到的奇怪问题
  3. python 把汉字转化为拼音-Python汉字转换成拼音
  4. 概率论:乘法定理、全概率公式以及贝叶斯定理
  5. pLC支持C语言编程执行复杂控制,能够实现多种工作方式的plc控制系统的编程
  6. 高分屏、分辨率、DPI、PPI,及 Qt 处理高分屏
  7. 计算机格式化什么意思,格式化硬盘是什么意思?怎么格式?格式了有什么用?会有什么后果?...
  8. Ubuntu 添加root用户
  9. mysql与oracle实现行转列并指定分隔符
  10. 全网最硬核 JVM TLAB 分析(单篇版不包含额外加菜)