精华内容
下载资源
问答
  • 内核漏洞:各种内核漏洞
  • Windows内核漏洞 简介 Windows内核漏洞 进攻清单 #安全公告#KB#说明#操作系统 [Windows后台智能传输服务特权提升漏洞](Windows 7/8/10,2008/2012/2016/2019) [Microsoft Server Message Block 3.1.1(SMBv3...
  • Linux内核漏洞浅析

    2020-09-16 01:24:30
    Linux内核漏洞浅析
  • 内核漏洞的利用与防范内核漏洞的利用与防范内核漏洞的利用与防范
  • 内核漏洞利用 内核漏洞利用库
  • 收集了CCS和NDSS两大会议2015-2020年发表的与操作系统内核漏洞相关的论文
  • 初步理解内核漏洞:(内核开发人员必读) 内核开发人员,如果不了解内核漏洞的话,容易在开发时引入漏洞,轻则导致内核崩溃,影响上面的所有应用程序;重则导致内核提权,即可以突破应用层的沙箱,进入内核,并在...

    初步理解内核漏洞:(内核开发人员必读)

    内核开发人员,如果不了解内核漏洞的话,容易在开发时引入漏洞,轻则导致内核崩溃,影响上面的所有应用程序;重则导致内核提权,即可以突破应用层的沙箱,进入内核,并在内核里面为所欲为。

    本文章就是讲解一下常见的内核漏洞类型,让内核开发人员有个初步的了解,从而在开发时就会有潜意识,不会制造比较明显的漏洞了。(对于专门挖过内核漏洞的人来说,该文章就没必要看了:)。

    常见的内核漏洞有下面几种:栈溢出(stack overflow)、堆溢出(heap overflow)、整型溢出漏洞(integer overflow)、释放后重用(use-after-free)、双重释放(double free)、线程竞争(race condtion).

    下面通过例子,一一进行简单地介绍:

    栈溢出:

    例子:

    static size_t deviceA_write(struct file *filp, const char __user *buf, size_t len, loff_t *data) 
    {
         int ret = 0;
         char tmp[100] = { 0 };
    
         /* write data to the buffer */
         if (copy_from_user(tmp, buf, len)) {
                    return -EFAULT;
    }

    上述是一个设备驱动的代码,提供了write的接口。即用户在应用层可以调用write函数,向该设备写数据。 内核开发人员都知道copy_from_user是从应用层往内核层拷贝数据,其第一个参数tmp为拷贝的目的地址;第二个参数buf 为拷贝的源地址;第三个参数为拷贝的数据的长度。在这里目标地址的长度为100,但是由于没有对拷贝的长度(len)做限制,当用户传入的长度大于100时,用户的数据就会覆盖掉tmp的100个字节以外的数据。由于栈是从高往低的,因此覆盖的数据会是比tmp的高地址的数据。程序的返回地址一般在进行函数调用时放到栈上,在这里如果将返回地址覆盖掉了,那么就可以控制指令计数器IP,从而可以在内核层任意执行代码了。(这里暂时不考虑内核的缓解措施)

    堆溢出:

    堆溢出和栈类似,只不过溢出的对象为堆而已。比如将上述例子中的char tmp[100] 换成char *tmp = kmalloc(100); 那么就变成堆溢出漏洞了。

    整型溢出:

    整型溢出,就是在进行整数运算时没有考虑到整数本身的上下限。比如unsigned int的下限是0, 上限是0xffffffff. 当a,b,c都是unsgined int 类型时, a = b + c,就有可能发生溢出,溢出的结果会导致a比b或者c都小。 比如b = 0xffffffff, c = 2, 那么a = b + c = 0xffffffff + 2 = 1, 如果对整型溢出不了解,是不是觉得很神奇? 两个数相加的和竟然变小了!

    例子:

    1  int driver_create_buffer(Command *userCommand)
    2  {
    3       ...
    4       uint32_t totalCount = 0;
    5       uint32_t *regAddrBuf = NULL;
    7       uint32_t kernelCount = 1000;
    8       const uint32_t userCount = userCommand->count;
    9       ...
    10      totalCount = kernelCount + userCount;
    11      regAddrBuf = kzalloc(totalCount * sizeof(uint32_t), GFP_KERNEL);
    12      copy_from_user(regAddrBuf, userCommand->buffer, userCount*sizeof(uint32_t));
    13       ...
    14   }

    上述代码的第10行, 将正整数kernelCount与userCount相加,存储到totalCount中。 而userCount是用户可以控制的,当将该值设为很大时,就会导致溢出,比如userCount= 0xffffffff - 1000 + 1时, 那么totalCount的大小就为1。在11行,分配的空间时按照totalCount 进行分配的,在而在12行拷贝的内容长度为userCount, 而userCount明显比totalCount大。因此会导致溢出漏洞。

    释放后重用:

    顾名思义,就是一个内核对象在释放后又使用该对象。这种的漏洞的利用技术已经很成熟了,这里先不介绍利用了:)

    1.  static int dealloc_session(void *core_handle,
    2.      struct session *session)
    3. {
    4.      ...
    5.      deregister(session->handle);
    6.      mutex_destroy(&session->lock);
    7.      sessions[session->id] = NULL;
    8.      kfree(session);
    9.      session = NULL;
    10.     ...
    11. }

    初一看,没什么问题, 将session的所有内容成员都释放以后,然后对session本身进行kfree以后,并且马上设置为NULL。 但是这里没有考虑多线程的问题。比如一个线程在第8行,将session内核对象释放以后,此时另外一个线程正在第5行访问该对象。那么就造成了释放后重用漏洞。

    双重释放:

    双重释放,顾命思义,就是将一个对象释放两次。那么开发人员说了,释放两次就释放两次,那能利用吗? 那么我要说了: 可以利用! 双重释放的漏洞是可以转化为释放后重用漏洞的。并且技术也很成熟。 下面看一个例子:

    1. static long deviceB_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
    2  {
    3.     ...
    4.     if (__copy_from_user(idc, (void __user *)arg, tmp)) {
    5.         kfree(idc);
    6.         err = -EFAULT;
    7.     } else {
    8.         err = spi_message(spi, idc, n_ioc);
    9.     }
    10.    kfree(ioc);
    11.    return 0;
    13. }

    ioctl是内核开发人员很熟悉的,通过ioctl可以给设备驱动添加新的功能。用户层可以直接调用ioctl来使用设备的新功能。 在上述例子中,第5行,将idc内核对象释放了,但是没有返回。在第10行又被释放了一次,造成了内核对象idc的双重释放。

    线程竞争:

    线程竞争漏洞并不是独立的漏洞,一般由于线程竞争会导致释放后重用漏洞或者双重释放漏洞或者堆溢出漏洞等。比如上述的释放后重用漏洞就是由于线程竞争导致的,这里不再进一步说明啦!

    Linux 内核学习经验总结

    学习内核,每个人都有自己的学习方法,仁者见仁智者见智。以下是我在学习过程中总结出来的东西,对自身来说,我认为比较有效率,拿出来跟大家交流一下。

    这份是整理的学习路线思维导图,下面有Linux内核相关视频学习资料:

    Linux内核相关学习视频,清晰版导图可以点击:学习资料 获取

     

     

    展开全文
  • 在过去,我们往往直接使用Linux内核漏洞完成Android root权限的提升。不过自Android 4.4以来,Android系统安全性得到了不少改善。其中主要的一点就是借助内核DAC、SELinux等安全特性,将app对内核资源的访问权限进行...
  • 内核漏洞利用技术文章集合,一共23篇 内核漏洞利用技术文章集合,一共23篇
  • 内核漏洞学习

    2014-05-05 21:52:32
    一个内核漏洞的学习过程: 漏洞重现,漏洞分析,漏洞利用,漏洞总结

    一个内核漏洞的学习过程:  漏洞重现,漏洞分析,漏洞利用,漏洞总结

    漏洞重现: 环境搭建,POC编译

    漏洞分析:源码分析,反汇编分析,POC分析,补丁对比,内核调试跟踪,蓝屏分析

    漏洞利用:特权提升,远程溢出,本地溢出,远程DOS,本地DOS

    漏洞总结:根本原因,修补方法


    编写安全驱动程序:

    检查输入输出: 

    KPROCESSOR_MODE PreviousMode = KeGetPreviousMode()

    if(PreviousMode != KernelMode)

    {

    ProbeForWrite(Buffer,length,1);

    }

    验证驱动调用者::

    检查调用者进程EPROCESS,进程文件MD5,用户态程序和驱动程序的通信加密,对于解密失败或非法通信数据的情况不予处理


    白名单机制的挑战

    只要白名单中的驱动存在漏洞,利用漏洞进行提权等操作,同样可以实现需要的功能

    解决方法是对白名单设立 “准入制度” ,定期审计,发现该驱动的漏洞或外部公布的漏洞,需要第一时间通知用户,提供补丁升级服务






















    展开全文
  • 内核漏洞审计工具 强大的驱动漏洞审计工具,可以发现驱动存在的各种溢出漏洞。
  • Linux内核漏洞异步触发模型的安全分析.pdf
  • 内核漏洞利用技术

    2019-09-28 14:01:17
    有漏洞的驱动exploitme.sys 在Ring3可以通过设备名称“\\.\ExploitMe”打开设备,得到设备句柄,进而使用DeviceIoControl函数调用驱动的派遣例程,与驱动进行交互。...内核漏洞利用思路 能够篡改系...

    有漏洞的驱动exploitme.sys

    在Ring3可以通过设备名称“\\.\ExploitMe”打开设备,得到设备句柄,进而使用DeviceIoControl函数调用驱动的派遣例程,与驱动进行交互。

    输入、输出地址都是由Ring3程序指定,读写是在Ring0中完成。因此Ring3可以将输出缓冲区地址指定为内核高端地址,可以篡改内核中任意地址的数据。

    内核漏洞利用思路

    能够篡改系统内核内存数据或执行Ring0 Shellcode的漏洞,主要为三种:任意地址写任意数据,固定地址写任意数据,任意数据和任意地址写固定数据类型的内核漏洞。

    内核漏洞利用方法

    1、篡改内核内存数据。2、执行Ring0 Shellcode

     ProfileSource不为ProfileTime或者ProfileAlignmentFixup 就是我们想要的了

    内核漏洞利用实战与编程

    Explitme.sys漏洞:存在于对IOCTL_EXPLOIT_ME的IoControlCode处理过程。由于IOCTL_EXPLOIT_ME最后两位为3,代表所使用的通信方式为METHOD_NEITHER方式,派遣例程中没有使用ProbeForRead和ProbeForWrite探测输入输出地址是否可读,可写。

    1.获取HalDispatchTable表地址x

      HalDispatch Table 是由内核模块导出的。得到他在内核中的准确地址,首先要得到内核模块的基地址,再加上HalDispatchTable与内核模块基址的偏移

    2.在0x0处申请一段内存,并写入Ring0 Shellcode

    3.利用漏洞向地址y写入0x0

    4.调用NtQueryIntervalProfile函数

    5.Ring0 Shellcode被执行

    Ring0 Shellcode的编写

    提权到SYSTEM:

    恢复内核Hook/Inline Hook:

    添加调用门,中断门,任务门,陷阱门《rootkit ring3进ring0之门系列》 四篇:

    内核方面 以后涉及到了,再学吧

     

    转载于:https://www.cnblogs.com/Ccmr/p/7363474.html

    展开全文
  • 文章目录内核漏洞的成因不要随便使用MmIsAddressVaild函数在驱动中如果要对用户态地址进行操作请使用try,__except长度为0的缓存或者为NULL的指针长度为0的缓存一个为NULL的指针缓存对齐不正确的内核函数的调用...

    内核漏洞的成因

    不要随便使用MmIsAddressVaild函数

    MmIsAddressValid这个函数的作用是不够准确的,因为它只会判断该地址的一个字节的有效性,例如:

    if(MmIsAddressValid(p1))
    {
    	memcpy(p1,p2);
    }
    

    那么攻击者只需要传入一个字节在有效页,比如0x8000这一页是有效的的,0x9000这一页是未分配的,传入0x8FFF将会使得系统崩溃。

    其次MmIsAddressValid并不能准确地判断pageout的页面。来源于微软的说明:
    在这里插入图片描述

    在驱动中如果要对用户态地址进行操作请使用try,__except

    典型的错误:

    try{
    	ProbeForRead(Buff,Len,Alig);
    }
    __except(EXECUTE_HANDLER_EXCEPTION)
    {
    ...
    }
    if (memcmp(Buff , Buff2 , Len)
    .....
    

    ProbeForRead 只检查在 probe 的那一刻, buff 地址是在用户态地址范围内。
    在try,except块之外进行读写,这个时候并不能保证buff还是用户态的地址。

    长度为0的缓存或者为NULL的指针

    长度为0的缓存

    当一块缓存长度为0的时候,很多函数都不会对其进行检验而直接跳过,比如曾经的ProbeForXXXX:
    在这里插入图片描述
    所以当使用了ProbeForXXX验证了参数,一样要当心长度为0的时候的情况:

    __try{
    ProbeForRead(Str1,Len,sizeof(WCHAR));
    if(wcsnicmp(Str1,Str2,wcslen(Str2))
    {
    ....
    }
    __except(EXECUTE_HANDLER_EXCEPTION)
    {
    ....
    }
    

    当Lenth = 0的时候,这样的代码一样会导致系统崩溃。而且还有一点需要特别注意:
    长度为空的缓存如果用做一些函数的参数可能具有特别的意义,比如:对于 ObjectAttributes->ObjectName的 Length,如果为空,系统会以对应的参数打开ObjectAttributes->RootDirectory 的句柄,攻击者可以先以低权限得到一个受保护对象的句柄,再以长度为空的缓存,将句柄填入RootDirectory 来获取高权限的句柄。

    一个为NULL的指针

    千万不要判断用户态的指针是否为NULL来判别是否放行,因为Windows7及其之前是允许用户申请地址为0的内存的,所以导致了可绕过这类型的判断,

    由此拓展的还有就是缓存对齐的绕过方式和不正确的内核函数的调用。

    缓存对齐

    ProbeForRead 的第三个参数 Alig 即对齐, 如果没有正确地传递这个函数, 也会导致问题,例如对于 ObjectAttributes ,系统默认按 1 来对齐,如果在对其参数处理中使用 sizeof(ULONG)来对齐,就会对本来可以使用的参数引发异常,绕过保护或检查。

    不正确的内核函数的调用

    ObReferenceObjectByHandle

    对于用户态句柄使用 ObRefenceObjectByHandle, 不指定类型仍可以获得对应的对象地址,但如果你直接访问这个对象,就会引发漏洞,
    比较常见的错误:

    ObReferenceObjectByHandle(FileHandle , Access , NULL(ObjectType) ,...&fileobject);
    if(wcsnicmp(fileobject->FileName....)
    

    攻击者可以传入非文件类型的句柄从而造成系统漏洞。

    不正确的Zw函数调用

    不能将任何用户态地址传入Zw函数来传递给内核,用户态内存未经过校验传递给 ZwXXX 会让系统忽略内存检查(因为 ZwXXX 调用时认为上个模式已经是内核模式),即使你进行了校验,传递这样的内存给系统也可以引发崩溃(例如内存页在调用时突然无效),即使你在外部有异常捕获,也可能造成内核内存泄露、对象泄露,甚至权限提升等严重问题。
    常见的错误:

    __try{
    ProbeForRead(ObjectAttrbutes,sizeof(OBJECT_ATTRIBUTES),1);
    ProbeForRead(ObjectAttributes->ObjectName , sizeof(UNICODE_STRING),1);
    ProbeForRead(ObjectAttributes->ObjectName->Buffer ,
    ObjectAttributes->ObjectName->Length,sizeof(WCHAR));
    ZwOpenKey(&hkey,ObjectAttributes....)
    //未校验全部参数就传递给 Zw 函数, ObjectAttributes 还有多个域
    //即使全部校验了也不能传递给 Zw 函数,例如内存如果是无效的用户态内存,
    //最后会被我们驱动的异常捕获,但是内核函数的数据回收很可能没有进行
    }
    

    不要接受任何用户输入的内核对象传递给内核函数。

    接受用户输入的内核对象意味着可以轻易构造内核任意地址写入漏洞,不要在设备控制中接受任何用户输入的内核对象并将其传递给内核函数。
    例如:

    if(IoControlCode==IOCTL_RELEASE_MUTEX)
    {
    KeReleaseMutex((MY_EVT_INFO)(Irp->AssociatedIrp->SystemBuffer)->Mutex);
    }
    

    用户态程序只需要传递一个精心构造的 Mutex 对象 (可以位于用户态内存 ),就可以做到任意地址写入,提升权限。

    给驱动程序提供功能接口需要小心

    例如可以对注册表、文件、内核内存、进程线程等操作的功能性接口,一定要非常小心, 如果不能完全杜绝存在被恶意利用的可能, 一定要限制设备控制的调用者,禁止一切非受信进程的调用。
    如果不小心控制的话很可能会造成白利用这种攻击。


    更新时间于9.20号下午5点。
    如有更深一步的理解再更新。

    展开全文
  • Linux内核漏洞利用技术:覆写modprobe_path 安全架构 安全架构 业务风控 系统安全 APT
  • 基于自适应热补丁的Android内核漏洞生态修复方案.pdf
  • 3DS内核漏洞<= 11.2这是Nintendo 3DS版本<= 11.2中ARM11内核漏洞的漏洞。 核心1(SYSCORE)运行一个处理同步事件队列的线程。 添加到队列中的对象的引用计数不会增加。 当线程去获取一个对象时,它会锁定调度...
  • 内核漏洞主要的作用包括:远程任意代码执行,本地权限提升,远程。拒绝服务攻击,本地拒绝服务攻击。从漏洞的利用来看,远程拒绝服务和本地拒绝服务类型的内核漏洞利用起来比较简单,不必过多地考虑“构造”(构造...
  • 我写的一些内核漏洞: CVE-2009-2692-sock_sendpage.c CVE-2009-2698-udp_sendmsg.c Intel_sysret.c can_bcm_exp.c csaw文件 nfs_mount.c perf_exp.c perf_stack.c
  • Linux内核漏洞 简介 Linux内核漏洞 进攻清单 #CVE#描述#内核 [glibc] (glibc <= 2.26) [Sudo] (须藤1.8.6p7-1.8.20) [由于UFO到非UFO路径切换而导致的内存损坏] [由BPF验证程序引起的内存损坏]( 之前...
  • 内核漏洞利用指南一

    2021-09-05 23:56:05
    内核漏洞利用指南–攻击核心 在这个领域知识与最佳的实践一直在相互促进不断发展。新研究与试验会加深我们对事物的理解,这种理解反过来也改变了研究事物的方式, 让其变的更加专业,更加有效。 从业人员和研究人员...
  • Liunx 内核漏洞

    2020-12-24 08:13:08
    利用Linux kernel漏洞过程中掌握linux kernel的运行机制和原理 一个国外黑客写的四篇系列文章 https://blog.lexfo.fr/cve-2017-11176-linux-kernel-exploitation-part1.html 参考:一步步利用Linux ...
  • 本演讲将介绍系统性模糊测试和挖掘OSX内核漏洞的方法,及如何利用Python提升模糊测试和漏洞挖掘分析效率,并最终分析我们发现的数个OSX内核中的0day。我们将介绍如何利用Python实现自动化提取驱动攻击面和生成测试...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 36,930
精华内容 14,772
关键字:

内核漏洞