我写了一个LKM,它将可信路径执行(TPE)实现到你的内核中:
https://github.com/cormander/tpe-lkm
当我将WRAP_SYSCALLS定义为1时,我偶尔遇到一个内核OOPS(在这个问题的最后描述),并且在我的智慧结束时尝试跟踪它.
一点背景:
由于LSM框架不会导出其符号,因此我必须对如何将TPE检查插入正在运行的内核进行创作.我写了一个find_symbol_address()函数,它给了我所需的任何函数的地址,并且它工作得非常好.我可以调用这样的函数:
int (*my_printk)(const char *fmt, ...);
my_printk = find_symbol_address("printk");
(*my_printk)("Hello, world!\n");
Run Code Online (Sandbox Code Playgroud)
它工作正常.我使用此方法来定位security_file_mmap,security_file_mprotect和security_bprm_check函数.
然后我用asm跳转到我的函数来覆盖这些函数来进行TPE检查.问题是,当前加载的LSM将不再执行它对该函数的挂钩的代码,因为它已被完全劫持.
这是我做的一个例子:
int tpe_security_bprm_check(struct linux_binprm *bprm) {
int ret = 0;
if (bprm->file) {
ret = tpe_allow_file(bprm->file);
if (IS_ERR(ret))
goto out;
}
#if WRAP_SYSCALLS
stop_my_code(&cs_security_bprm_check);
ret = cs_security_bprm_check.ptr(bprm);
start_my_code(&cs_security_bprm_check);
#endif
out:
return ret;
}
Run Code Online (Sandbox Code Playgroud)
注意#if WRAP_SYSCALLS部分之间的部分(默认情况下定义为0).如果设置为1,则调用LSM的钩子,因为我将原始代码写回asm跳转并调用该函数,但是我遇到了一个带有"无效操作码"的偶尔内核OOPS:
invalid opcode: 0000 [#1] SMP
RIP: 0010:[<ffffffff8117b006>] [<ffffffff8117b006>] security_bprm_check+0x6/0x310
Run Code Online (Sandbox Code Playgroud)
我不知道问题是什么.我尝试了几种不同类型的锁定方法(详情请参见start/stop_my_code的内部)无济于事.要触发内核OOPS,请编写一个简单的bash while循环,无休止地启动后台"ls"命令.大约一分钟后,它就会发生.
我在RHEL6内核上测试它,也适用于Ubuntu …
我无法在任何地方找到这些信息.无论我到哪里,我都会发现,一旦你点击"主"(无论你的入口点是什么),这将是程序参数和环境,看起来堆栈的外观,但我正在寻找的是系统如何设置堆栈与switch_to宏配合.第一次切换到任务时,需要有EFLAGS,EBP,GCC保存的寄存器,以及来自"tsk-> thread-> esp"指向的堆栈上schedule()函数的返回地址,但是我无法弄清楚内核是如何设置这个堆栈的,因为它允许GCC保存通用寄存器(使用内联汇编的输出参数).
我指的是x86个人电脑.我正在为我自己的(尝试)编写的小内核研究Linux调度程序/进程系统,而我无法理解我所缺少的内容.我知道我遗漏了一些东西,因为Slackware在我的计算机上运行这一事实证明了调度程序的工作原理:P
编辑:我似乎措辞严厉.我正在寻找有关如何设置任务内核堆栈而不是如何设置任务用户任务的信息.更具体地说,tsk-> thread-> esp指向的堆栈,以及"switch_to"切换到的堆栈.
如何获取Android系统上所有活动内核驱动程序的列表?Android中Linux"lsmod"的等效内容是什么?我使用adb shell并打开了我的Android终端模拟器应用程序,并做了一个"lsmod".我从我的BSP得到了一些蹩脚的两件物品清单.但它没有列出Linux内核主动运行的整个系统上的所有驱动程序.
我知道在linux内核中我们可以在传输层添加自己的协议,类似于TCP,UDP等.
是否有任何钩子在网络层注册新协议,类似于IP,ARP,它可以将数据包传输到应用程序以及如何在Linux内核中添加此协议?
我的任务很简单:在Linux上用C++读取和解析一个大文件.有两种方法:
逐字节解析.
while(/*...*/) {
... = fgetc(...);
/* do something with the char */
}
Run Code Online (Sandbox Code Playgroud)缓冲区解析缓冲区.
while(/*...*/) {
char buffer[SOME_LARGE_NUMBER];
fread(buffer, SOME_LARGE_NUMBER, 1, ...);
/* parse the buffer */
}
Run Code Online (Sandbox Code Playgroud)现在,逐字节解析对我来说更容易(不检查缓冲区的满载程度等).但是,我听说读大片更有效率.
什么是哲学?是"最佳"缓冲内核的任务,所以当我打电话时它已经被缓冲了fgetc()?或者是否建议我处理它以获得最佳效率?
此外,除了所有哲学:Linux上的现实是什么?
操作系统是从BIOS获取此信息还是单独扫描总线以检测系统上安装的硬件.在网上浏览不同的消息来源说不同的事情.有人说BIOS检测到硬件,然后将其存储在操作系统随后读取的内存中,其他人则说OS扫描总线(例如pci)以了解硬件.
我会想到现代操作系统会忽略BIOS并自行完成.
任何帮助,将不胜感激.
谢谢.
在新安装的虚拟机中,我在编译x86架构的内核时遇到此错误:
$ Could not mmap file: vmlinux
$ make: *** [vmlinux] Error 1
Run Code Online (Sandbox Code Playgroud)
这是我第一次看到它.我已经将大小/proc/sys/kernel/shmmax增加到128MB,但它没有解决问题.有任何想法吗?
谢谢!:)
我想阅读并理解Linux内核的内存管理(特别是defrag\compaction\migration).
所以,我关闭了大小的优化.config(当然使用make menuconfig)并编译...这让我仍然是一个优化的内核.
注意:当我说优化内核时,我的意思是当我使用gdb并告诉它next它会跳转时.我不希望这样,我希望能够像一个简单的hello世界一样逐行地遵循代码.
接下来,我编辑Makefile并交换-O2,-O0这会导致事情中断.
我发现了这个,但我不知道我想要什么文件,因为我不知道兔子洞到底有多远.
我可以使用更通用的选项吗?我理解内存压缩的概念; 但是,我希望看到一切发生的地方以及它是如何发生的.
我试着安装一个内核模块xfsprogs.它已成功安装在容器内.这确实令人惊讶,但lsmod没有在容器或主机系统中列出此模块.如何在容器中加载新的内核模块?(CentOS容器,Ubuntu主机)