随笔分类 -  Linux

摘要:How to Add a System CallKernel : 2.6.18編譯環境 : Fedora Core 6假設要加的system call為 sys_project, 有一個int的輸入參數一、在linux source code的部份(以linux代表source code的根目錄)linux/arch/i386/kernel/syscall_table.S的最後面加上要新增的system call名稱如果syscall_table.S的最後面長得像這樣...long sys_tee/* 315 */.long sys_vmsplice.long sys_move_pages那麼 阅读全文
posted @ 2013-09-20 21:36 jeremyatchina 阅读(378) 评论(0) 推荐(0)
摘要:4月14日很多硬件的功能,物尽其用却未必好过软实现,Linux出于可移植性及其它原因,常常选择不去过分使用硬件特性。比如Linux只使用四个segment,分别是__USER_CS、__USER_DS、__KERNEL_CS、__KERNEL_DS,因为Paging可以完成segmentation的工作,而且可以完成的更好。而且这样简化了很多,统一了逻辑地址和线性地址。而TSS存在每CPU一个的GDT中,虽然每个process的TSS不同,但Linux2.6却不利用其中的hardwarecontextswitch(虽然低版本使用)以一个farjmp来实现任务转换,而用一系列的mov指令来实现。 阅读全文
posted @ 2013-09-20 14:48 jeremyatchina 阅读(549) 评论(0) 推荐(0)
摘要:关于CR0.WP我们知道CR0的WP位可以关闭内核写保护。他和页表的R/W位有关。Intel手册中的描述绕来绕去似乎一直没有说到重点。When the processor is in supervisor mode and the WP flag in register CR0 is clear (itsstate following reset initialization), all pages are both readable and writable (write-protection is ignored). When the processor is in user mode, 阅读全文
posted @ 2013-09-18 13:03 jeremyatchina 阅读(1002) 评论(0) 推荐(0)
摘要:selinux与kernel 0daykernel NULL pointer的利用需要把shellcode映射到内存0处, 大家在测试exp的时候,总能发现一个规律, 开着selinux就能溢出成功, 关闭就不能溢出成功了。 看了下内核源码,终于搞清楚了: mmap在做匿名映射的时候,会经过LSM层来做安全验证, LSM初始化的时候,会将selinux作为它的第一验证模块, capablity作为它的第2验证模块。这2个模块在做mmap映射的时候,都指向了dummy_file_mmap_addr这个函数:usr/src/debug/kernel-2.6.18/linux-2.6.18.i686 阅读全文
posted @ 2013-08-22 13:27 jeremyatchina 阅读(692) 评论(0) 推荐(0)
摘要:Nelson Elhage最近发现了一个内核设计上的漏洞, 通过利用这个漏洞可以将一些以前只能dos的漏洞变成可以权限提升的漏洞。当fork一个进程在的时候, copy_process执行如下操作:static struct task_struct *copy_process(unsigned long clone_flags,unsigned long stack_start,struct pt_regs *regs,unsigned long stack_size,int __user *child_tidptr,struct pid *pid,int trace){p->set_c 阅读全文
posted @ 2013-08-22 11:01 jeremyatchina 阅读(1624) 评论(0) 推荐(0)
摘要:在寫C的過程中,我們會很自然地以為,我連續宣告一堆大小不一的char array。經過Complier之後這些char array未必是連續擺放。至於為什麼就要談到我們今天的主角了alignment以x86-32bit為例,他喜歡一次讀取 4 Bytes (i.e. 32 bits),記憶中可以想成一格一格為 4 Bytes.其indes從 0 ~ 2^32 - 1我們可以用 printf(sizeof(void *)); 來得知。machine在讀取指令時以多少Bytes為單位。printf(sizeof(unsigned long));也行。好讓每次讀取的位置皆為4的倍數,e.g. 0, 阅读全文
posted @ 2013-08-21 16:37 jeremyatchina 阅读(219) 评论(0) 推荐(0)
摘要:CLONE_NEWUSER trickery: CVE-2013-1858Recent kernels (3.8+ something) introduced a feature calleduser-namespaces (user-ns,CLONE_NEWUSERflag)in which you can have your own UID 0.Think of it as a container solution, so you canset up compartments on a host. A nice thing,but it has some security implicat 阅读全文
posted @ 2013-08-21 12:51 jeremyatchina 阅读(411) 评论(0) 推荐(0)
摘要:__user表示是一个用户空间的指针,所以kernel不可能直接使用。#ifdef __CHECKER__# define __user __attribute__((noderef, address_space(1)))# define __kernel /* default address space */#else# define __user# define __kernel#endifnoderef告诉编译器,不应该解除该指针的引用,因为在当前地址空间中它是没有意义的。这里的CHECKER表示是否使用了Sprase(就是一种静态分析工具,用来分析内核源码中的BUG)。是不是想研究一下 阅读全文
posted @ 2013-08-20 18:46 jeremyatchina 阅读(4378) 评论(0) 推荐(0)
摘要:Table of Contents,Show Frames,No FramesChapter 15Linux Data StructuresThis appendix lists the major data structures that Linux uses and which are described in this book. They have been edited slightly to fit the paper.block_dev_structblock_dev_structdata structures are used to register block devices 阅读全文
posted @ 2013-08-20 18:25 jeremyatchina 阅读(375) 评论(0) 推荐(0)
摘要:author :deep_pro目前网上的这个exploit(http://www.milw0rm.com/exploits/8369)的分析是有些问题的(http://forum.eviloctal.com/viewthread.php?tid=34942&pid=154634&page=1&extra=page%3D1#pid154634)感谢乱雪给我提供了思路,解释了疑问有问题的内核代码( http://lxr.linux.no/linux+v2.6.29/kernel/exit.c#L951)if (tsk->exit_signal != SIGCHLD 阅读全文
posted @ 2013-08-20 13:53 jeremyatchina 阅读(673) 评论(0) 推荐(0)
摘要:udp_sendmsg空指针漏洞分析 by wzt漏洞描述:由于Linux ipv4协议栈中udp_sendmsg()函数设计上存在缺陷, 导致struct rtable *rt以空指针形式传递给ip_append_data(), 从而引发kernel oops,攻击者可以利用此漏洞提升进程权限。漏洞影响2.6.19以下的版本。漏洞成因:>> linux+v2.6.18/net/ipv4/udp.cint udp_sendmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg,size_t len){...// rt被 阅读全文
posted @ 2013-08-20 13:20 jeremyatchina 阅读(849) 评论(0) 推荐(0)
摘要:函數:void *mmap(void *start,size_t length,int prot,int flags,int fd,off_t offsize); 参數start:指向函數:void *mmap(void *start,size_t length,int prot,int flags,int fd,off_t offsize);参數start:指向欲映射的內存起始地址,通常設为 NULL,代表讓系統自動選定地址,映射成功後返回該地址。参數length:代表將文件中多大的部分映射到內存。参數prot:映射區域的保護方式。可以为以下幾種方式的組合:PROT_EXEC 映射區域可被執 阅读全文
posted @ 2013-08-19 14:13 jeremyatchina 阅读(6181) 评论(0) 推荐(1)
摘要:Exploit The Linux Kernel NULL Pointer Dereference Author: wztHome: http://hi.baidu.com/wzt85date: 2010/06/13Version: 0.3目录:1、引言2、NULL Pointer是如何引发OOPS的3、如何Exploit4、攻击实验5、NULL Pointer与Selinux的关系6、如何防御NULL Pointer漏洞7、附录1、引言在最近一系列的Linux kernel本地溢出漏洞中, 大部分是由于内核引用一个空指针而引发的, 看NULL Pointer... 阅读全文
posted @ 2013-08-19 11:26 jeremyatchina 阅读(1569) 评论(0) 推荐(0)
摘要:Exploit Linux Kernel Slub OverflowBy wzt一、前言 最近几年关于kernel exploit的研究比较热门,常见的内核提权漏洞大致可以分为几类:空指针引用,内核堆栈溢出,内核slab溢出,内核任意地址可写等等。空指针引用漏洞比较容易exploit,典型的例子如sock_sendpage,udp_sendmsg。但是新内核的安全模块已经不在允许userspace的code映射低内存了,所以NULL pointer dereference曾经一度只能dos,不能提权。但是CVE-2010-4258这个内核任意地址可写漏洞,可以将null pointer ... 阅读全文
posted @ 2013-08-18 19:18 jeremyatchina 阅读(807) 评论(0) 推荐(0)
摘要:/****************************************************************************** * .:: Impel Down ::. * * Linux 2.6.x fs/pipe.c local kernel root(kit?) exploit (x86) * by teach & xipe * Greetz goes to all our mates from #nibbles, #oldscho... 阅读全文
posted @ 2013-08-17 23:40 jeremyatchina 阅读(348) 评论(0) 推荐(0)
摘要:之前看了《新爆内核高危漏洞sock_sendpage的利用分析的讨论》这篇帖子,在九贱兄和诸位CUer的指引下,大致弄清了整个漏洞的始末。现与大家分享(引用自我的空间)。有什么不足之处还望多多指教~内核的BUG这个BUG首先得从sendfile系统调用说起。考虑将一个本地文件通过socket发送出去的问题。我们通常的做法是:打开文件fd和一个socket,然后循环地从文件fd中read数据,并将读取 的数据send到socket中。这样,每次读写我们都需要两次系统调用,并且数据会被从内核拷贝到用户空间(read),再从用户空间拷贝到内核 (send)。而sendfile就将整个发送过程封装在一 阅读全文
posted @ 2013-08-17 16:55 jeremyatchina 阅读(888) 评论(0) 推荐(0)
摘要:linux中是不可以依附别的进程的,更不可能创建远程线程,然而一种不太正规的方式却可以做到这一点,这就是ptrace接口,ptrace可以依附任何用户进程,用特殊的参数甚至可以更改任何进程的寄存器和内存映射,这个功力和创建远程线程不相上下,甚至比其更加灵活,如果理解了elf映像在内存的布局便可以通过ptrace修改被调试进程的任意内存。然而有一个限制就是ptrace接口只能调试属于自己用户的进程,也就是说它不能调试别的用户的进程,一种显而易见的限制就是普通用户的ptrace不能调试root进程,但是2.6.29内核有一个明显的漏洞使得普通用户可以提升本地权限。简单来讲就是在调用exec的时候需 阅读全文
posted @ 2013-08-17 15:31 jeremyatchina 阅读(1668) 评论(0) 推荐(0)
摘要:在Kernel 中,照理說能存取至 0 ~ 4GB。但是實作層面卻是只能讓我們使用到3GB ~ 4GB這會導致我們無法使用open(),write()這些在user space下的function。而這樣的限制,實作在current->addr_limit 中在Kernel中若真的想要能存取 0 ~ 4GB ,就要利用set_fs()與get_fs()來達成。因為有這樣的限制存在,所以當我們在Linux撰寫程式碼時,如果也叫用了這些系統呼叫的函式,由於這些函式(像是open(),write())被限定只能存取0—3GB的記憶體空間,可是因為我們目前是在核心程式碼使用這些系統函式,所以說我 阅读全文
posted @ 2013-08-17 13:03 jeremyatchina 阅读(5596) 评论(0) 推荐(0)
摘要:User namespaces – available toplay!Posted onMay 10, 2012bys3hhOver the past few months, Eric Biederman has been working on completing the user namespace. Briefly, unprivileged users can create a user namespace, where he can pretend to be root and start new namespaces (i.e. network and pid) which he 阅读全文
posted @ 2013-08-15 21:04 jeremyatchina 阅读(263) 评论(0) 推荐(0)
摘要:其中setresuid()具有最清晰的语法:setresuid()被执行的条件有:①当前进程的euid是root②三个参数,每一个等于原来某个id中的一个如果满足以上条件的任意一个,setresuid()都可以正常调用,并执行,将进程的ID设置成对应的ID。例子:如果ruid=100,euid=0,suid=300则setresuid(200,300,100)可以执行,因为原来的euid=0.如果ruid=100,euid=300,suid=200则setresuid(200,300,100)也可以执行,因为这三个新的id都是原来id中的某一个。但是setresuid(100,200,400) 阅读全文
posted @ 2013-08-15 18:51 jeremyatchina 阅读(881) 评论(1) 推荐(0)