Author:l1b0
Ubuntu 18.04 64bits Linux 4.4
sudo adduser user_name # 新建用户user1和user2 cat /etc/passwd # 查看用户信息
本次作业我设计了两个用户,分别为user1和user2;以及两个角色fish1和fish2,支持的三种操作为执行、删除和修改文件,其中fish1具有创建和重命名文件的权限,fish2只有删除文件的权限。
角色的信息存储在/etc/lsm/roleconfig,用户的信息存储在/etc/lsm/userconfig,权限只支持三种,即MKDIR、RENAME和RENAME,如下图。
由于这两个文件需要管理员权限编辑,故执行lsm_init程序需要 sudo。 用户层程序lsm_init通过对文件/etc/lsm/roleconfig和/etc/lsm/userconfig进行读写,该程序具有以下功能:
- 输出系统的所有用户信息(name,uid,gid);
- 输出userconfig;
- 更新userconfig;
- 删除userconfig的一个用户;
- 添加userconfig支持的一个用户;
- 输出roleconfig;
- 更新roleconfig;
- 删除roleconfig的一个角色;
- 添加一个角色;
调用system函数执行命令实现,使用者通过该功能查看当前系统的用户信息。
system("cat /etc/passwd|grep -v nologin|grep -v halt|grep -v shutdown|awk -F\":\" '{ print $1\"|\"$3\"|\"$4 }'|more");
通过该功能查看lsm_module支持的用户id及其拥有的角色。
可以看到用户user1的角色由fishone更新为fishtwo。
通过该功能查看lsm_module支持的角色及其拥有的权限。
角色fishone的权限由可创建和可重命名变更为仅可重命名。
添加角色fishone,并赋予权限mkdir和rename。
通过文件/etc/lsm/config的内容进行判断,为T时表示开启,为F时表示关闭。
为了不用每次导入模块时都重新编译内核,在内核源码/security/security.c的结尾处中添加如下代码,将符号security_add_hooks和security_hook_heads导出。
本次实验支持三种操作,创建文件、删除文件以及重命名文件,对应角色结构体的syscall变量的第1位、第3位和第2位。
三种操作分别对应lsm hook的函数inode_mkdir、inode_rmdir和inode_rename,其函数定义可以在/security/security.c中查看,如下图。
首先定义一个security_hooks_list类型的结构体数组,存放要hook的函数以及自定义的函数。
调用security_add_hooks函数,添加hook。
在模块卸载时需要实现对hook的钩子删除,否则在模块卸载后lsm安全功能仍有效。 由于lsm提供的security_delete_hook(位于/include/linux/lsm_hook.h)是一个内联函数,无法导出,所以这里将其源码直接复制过来。
由于mkdir、rmdir和rename的自定义函数流程相似,所以仅对my_inode_mkdir函数进行描述。
函数首先检查安全功能是否开启(读取文件/etc/lsm/config内容判断); 若开启则获取当前用户的uid,并读取user_config和role_config获取到其对应的角色和权限,如果当前用户不在user_config中,说明lsm尚未支持该用户,则直接返回0表示校验通过; 最后判断权限中mkdir操作对应的位是否为1,若为1则表示具有该操作权限,函数返回0(表示通过),否则返回EACCES(表示Permission denied)。
切换用户:su - username
user1在lsm中不具有删除文件夹的权限,但是在关闭lsm功能时可以删除文件夹。
dmesg查看内核输出,首先校验lsm安全开关,然后校验当前用户uid及拥有的角色,最后判断该角色的权限是否能够mkdir。
用户r11t进行删除文件夹操作,由于lsm的user_config中没有该用户,所以直接通过。
dmesg查看内核输出。
- 虚拟机OS禁用CPU
加载模块lsm_module一段时间后,出现下图弹窗,只能通过恢复快照解决。
r11t@ubuntu:/usr/src/linux-4.4$ cp /boot/
config-5.4.0-42-generic memtest86+.elf
config-5.4.0-70-generic memtest86+_multiboot.bin
config-5.4.0-72-generic System.map-5.4.0-42-generic
grub/ System.map-5.4.0-70-generic
initrd.img-5.4.0-42-generic System.map-5.4.0-72-generic
initrd.img-5.4.0-70-generic vmlinuz-5.4.0-42-generic
initrd.img-5.4.0-72-generic vmlinuz-5.4.0-70-generic
memtest86+.bin vmlinuz-5.4.0-72-generic
r11t@ubuntu:~/Desktop$ uname -r # 查看内核版本
5.4.0-70-generic
r11t@ubuntu:/usr/src/linux-4.4$ sudo cp /boot/config-5.4.0-70-generic ./config # 复制当前内核的配置
r11t@ubuntu:/usr/src/linux-4.4$ sudo make menuconfig # 直接退出
r11t@ubuntu:/usr/src/linux-4.4$ vim config # set CONFIG_MODULE_SIG=n,关闭内核模块签名验证
r11t@ubuntu:/usr/src/linux-4.4$ sudo make clean
r11t@ubuntu:/usr/src/linux-4.4$ sudo make modules -j3
r11t@ubuntu:/usr/src/linux-4.4$ sudo make modules_install
r11t@ubuntu:/usr/src/linux-4.4$ sudo make -j 3
r11t@ubuntu:/usr/src/linux-4.4$ sudo make install
- 【已解决】编译内核出现:cc1: error: code model kernel does not support PIC mode
- 【已解决】make modules_install出现sign-file: certs/signing_key.pem: No such file or directory
- 【已解决】内核签名验证关闭:CONFIG_MODULE_SIG=n
- 【已解决】make[1]: *** No rule to make target 'debian/canonical-certs.pem', needed by 'certs/x509_certificate_list'. Stop.
- 方法:在.config 中把CONFIG_SYSTEM_TRUSTED_KEYS=""设置为空值,重新make
- 【待解决】linux-4.12.1,编译内核完成并加载内核后,加载lsm_module模块,demsg出现
security_add_hooks: kernel tried to execute NX-protected page - exploit attempt? (uid: 0)
- 方法:更换为版本4.4的内核源码。
- 基于Linux Security Module的基于角色的权限管理模块:https://blog.csdn.net/jmh1996/article/details/88935907?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522161891473116780264053893%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=161891473116780264053893&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_v2~rank_v29-1-88935907.pc_v2_rank_blog_default&utm_term=%E8%A7%92%E8%89%B2
- 如何实现自己的lsm hook函数:https://stackoverflow.com/questions/10428212/how-can-i-implement-my-own-hook-function-with-lsm
- LSM(linux security module) Security钩子技术(linux原生机制):https://www.cnblogs.com/LittleHann/p/3854977.html#_lab2_3_4
- LSM HOOK 学习及踩坑:https://blog.csdn.net/weixin_45574485/article/details/108132539
- 错误值含义:https://elixir.bootlin.com/linux/latest/source/include/uapi/asm-generic/errno-base.h#L26
- 内核模块签名:http://lishiwen4.github.io/linux-kernel/linux-kernel-module-signing