因为有很多分析这个漏洞的文章所以我不详细分析了,只是总结要注意的细节,抛砖引玉。

感谢非常棒的几篇文章:

  • https://www.freebuf.com/articles/terminal/160041.html

  • https://xz.aliyun.com/t/2383

  • https://xz.aliyun.com/t/2385

1. 如何用qemu+busybox搭建调试环境?

因为漏洞存在于内核的网络实现,需要在menuconfig中进行一些额外的设置。详情参考这篇文档:基于virtio的网卡使用。

开启虚拟机之后ifconfig lo up&ifconfig eth0 up启动网卡。

2. ip_mc_socklist对象是如何被double free的?

通过两次调用close最终调用到ip_mc_drop_socket中的kfree_rcu,使用RCU机制最终实现了ip_mc_socklist对象的释放。

简单来说:对于被RCU保护的共享数据结构,读者不需要获得任何锁就可以访问它,但写者在访问它时首先拷贝一个副本,然后对副本进行修改,最后使用一个回调机制在适当的时机把指向原来数据的指针重新指向新的被修改的数据。

这段等待的时间叫宽限期。如果每个CPU都经过一次抢占,就认为度过了宽限期。时钟中断处理函数会依次调用update_process_timers->rcu_check_callbacks->rcu_pending判断,之后在invoke_rcu_core中调用软中断处理函数rcu_process_callbacks,然后依次调用__rcu_process_callbacks ->invoke_rcu_callbacks->rcu_do_batch->__rcu_reclaim调用回调函数head->func(head)。

3. 为什么不能直接劫持ip_mc_socklist对象中的这个函数指针来劫持EIP?

因为kfree_rcu会依次调用__kfree_rcu->kfree_call_rcu->__call_rcu,在__kfree_rcu中func会被设置成该成员在对象中的偏移,最终在__call_rcu中再次赋值给head->func。

#define kfree_rcu(ptr, rcu_head)                  \

    __kfree_rcu(&((ptr)->rcu_head), offsetof(typeof(*(ptr)), rcu_head))
static void __call_rcu(struct rcu_head *head,

               rcu_callback_t func,

               struct rcu_ctrlblk *rcp)

{

    unsigned long flags;

    debug_rcu_head_queue(head);

    head->func = func;

    head->next = NULL;

    local_irq_save(flags);

    *rcp->curtail = head;

    rcp->curtail = &head->next;

    RCU_TRACE(rcp->qlen++);

    local_irq_restore(flags);

    if (unlikely(is_idle_task(current))) {

        /* force scheduling for rcu_sched_qs() */

        resched_cpu(0);

    }

}

所以需要一个多线程在__rcu_reclaim执行前再次修改ip_mc_socklist对象中的函数指针,但是我们并不能访问到堆喷的内核对象。刚好ip_mc_socklist对象的前8个字节是next_rcu指针,该指针指向rcu链表中的下一个ip_mc_socklist对象。可以通过伪造next_rcu指针使其指向我们在用户空间伪造的ip_mc_socklist对象,然后再通过伪造用户空间对象的函数指针来劫持EIP。

4. 如何寻找堆喷的对象?

ip_mc_socklist对象大小是0x30字节,由于slab分配机制所以需要找到在内核中稳定分配0x40字节大小并且能够控制分配内容的方法。首先想到的是类似的ipv6_mc_socklist对象。这个对象不合适的话可以从sock_kmalloc入手寻找调用链,最终找到适合的对象(这里采用的是ip_mc_source中的sock_kmalloc)。

在找到可能合适的对象之后还需要调试观察对象中是否包含其它干扰内核执行流程的数据,数据是否可控或者是固定的。一时找不到合适的对象也可以通过修改内核源码的方法强行构造出合适的对象,这就是源码在手的好处。

5. 为什么创建堆喷的socket会失败?

linux系统对于每个进程可以打开的文件数目是有限制的,可以通过ulimit -n修改,不过修改是需要root权限的。

6. 为什么堆喷时setsockopt会返回-1?

系统提示的错误信息是no such device。

这和当前的网络配置有关,因为系统中没有路由表,route add default gw 127.0.0.1即可。

7. 为什么不能调用commit_creds(prepare_kernel_cred(0))提权?

在commit_creds前面的注释中有一句:Install new credentials upon the current task。在代码中也是通过current宏获取当前task然后获取cred的。因为前面说了ip_mc_socklist对象的真正释放是在内核软中断处理中,不处于exp进程的上下文,所以这种方法并不能成功。可以修改exp进程的cred结构体来达到提权目的。

8. 剩下的ROP绕过SMEP这些都是常规操作了,不再展开。

最后给出qemu模拟环境kernel4.10.6下绕过SMEP提权的代码和截图,也是东拼西凑没啥技术含量。还是有一些时候会崩掉的,不过我不想浪费时间再完善它了。

代码:

https://github.com/houjingyi233/my-exploits/blob/master/CVE-2017-8890/exp-with-smep.c

- End -

看雪ID:houjingyi                              

https://bbs.pediy.com/user-734571.htm

本文由 houjingyi 原创

转载请注明来自看雪社区

热门图书推荐:

 立即购买!

热门技术文章推荐:

  • 看雪CTF.TSRC 2018 团队赛 第十题『侠义双雄』 解题思路

  • 从补丁到Root——CVE-2014-4323分析

  • 看雪CTF.TSRC 2018 团队赛 第九题『谍战』 解题思路

  • CVE-2014-6332学习笔记

公众号ID:ikanxue

官方微博:看雪安全

商务合作:wsc@kanxue.com

关于CVE-2017-8890的一点细节相关推荐

  1. win10安装mujoco一点细节

    2 人赞同了该文章 本文参考 浪子:WIN10系统安装gym.mujoco以及Atari​zhuanlan.zhihu.com 补充一点细节 还好 github 上有两个 issue 244, 192 ...

  2. 你与3D打印模型设计大师之间,只差这一点细节!

    你与3D打印模型设计大师之间,只差这一点细节! 1983年,世界上第一台3D打印技机被发明,打印原理是立体光刻技术,来自美国发明家Chuck Hall.随着SLS选择性激光烧结快速成型技术等更多技术被 ...

  3. 0816(032天 线程/进程03 一点细节+线程池)

    0816(032天 线程/进程03 一点细节+线程池) 每日一狗(田园犬西瓜瓜) 线程/进程03 一点细节+线程池 文章目录 0816(032天 线程/进程03 一点细节+线程池) 线程/进程03 一 ...

  4. linux内核安全数据,【漏洞分析】Linux内核XFRM权限提升漏洞分析预警(CVE–2017–16939)...

    0x00 背景介绍 2017年11月24日, OSS社区披露了一个由独立安全研究员Mohamed Ghannam发现的一处存在于Linux 内核Netlink socket子系统(XFRM)的漏洞,漏 ...

  5. 关于cv2.cvtColor(im, cv2.COLOR_RGB2BGR)的一点细节

    注意里面的一个参数: cv2.COLOR_RGB2BGR,这里只是表示一个通道的转换,例如:如果你用cv2读取了一幅图片,读进去的是BGR格式的,但是在保存图片时,要保存为RGB格式的,可以用cv2. ...

  6. php cve 2017 12933,18-017 (March 27, 2018)

    描述 * indicates a new version of an existing rule Deep Packet Inspection Rules: DCERPC Services - Cli ...

  7. 20220104[动态规划 图论 建模][衢州市赛2017]环游衢州

    20220104[动态规划 图论 建模][衢州市赛2017]环游衢州 题目描述 Jason 想要带着他新叫的朋友环游 QZ,于是他把 QZ 划分成了 n 个地方,已知这 n 个地方由 m 条双向边相连 ...

  8. Meta最新模型LLaMA细节与代码详解

    Meta最新模型LLaMA细节与代码详解 0. 简介 1. 项目环境依赖 2. 模型细节 2.1 RMS Pre-Norm 2.2 SwiGLU激活函数 2.3 RoPE旋转位置编码 3. 代码解读 ...

  9. 关于C和C++的一点观点

    嗯,我昨天写了一篇<我这一年>,表示最近有点时间了,可以写点博文了,网友们就很热情,马上在回帖中提问,其中有一篇比较引起我注意,就是和我讨论我的书<0bug-C/C++商用工程之道& ...

  10. SEO站内优化细节不可少,教你4个小技巧!

    对于一些企业想要做网络推广的技术人员来说,SEO优化就相对比较熟悉了.SEO优化是对网站进行站内优化和站外优化,使之关键词在搜索引擎中获得排名,从而来提高网站的知名度,把企业的产品或者消息推给有效的目 ...

最新文章

  1. fiddler设置抓取https请求后打开网页总是报“你的连接不是私密链接”的解决办法
  2. socket绑定指定网卡发包
  3. Cesium中Homebutton改变默认跳转位置 【转】
  4. 谷粒商城:16.商城业务 — 首页
  5. 软件设计师 下午题第4题
  6. Logisim元件用法详解一:Wiring 线
  7. 使用Python下载电视剧(二):下载ts片段
  8. Python Re正则表达式之group(0)、group(1)
  9. android 7 zip压缩文件,7-zip怎么把大文件压缩到最小
  10. 互联网赚钱骚操作,真的太骚了
  11. 对鸿蒙操作系统和AI Camera Hi3516dDV300 开发过程的记录和理解
  12. Plus版SBOM:流水线物料清单PBOM
  13. HyperLogLog 使用及其算法原理详细讲解
  14. 大数运算(高精度运算)
  15. mac系统中brew下载路径
  16. 项目管理:项目经理如何创建项目日程计划表
  17. 【I2C】i2c-tools的使用方法
  18. 用C#实现控制台进度条
  19. 捷径系统-健身房管理系统怎么选择?
  20. 命令行调节linux系统声音

热门文章

  1. JDBC+Servlet+JSP实现基本的增删改查(简易通讯录)
  2. FreeBSD11配置local_unbound做dns缓存和转发
  3. mybatis一简单one2one关系xml配置
  4. 工作回忆总结(第二年)
  5. java 构造函数 和 构造代码块
  6. 支持macOS Big Sur 11系统 mac系统维护优化OnyX 3.9.1中文版
  7. CTU 2019 Open Contest I.SixPack (WA39)
  8. 音乐混音怎么做?教你完美制作野狼disco与周杰伦双节棍合唱!
  9. Java中的并发工具类:Semaphore基本理解和底层实现
  10. Centos7.2下安装redis通用键值命令