熊喵君的博客

Thinking will not overcome fear but action will.

Linux 内核CVE:CVE-2022-0847

Linux 内核 DirtyPipe 任意只读文件覆写漏洞分析

0x00 前言 前文Linux 内核之旅(十五):管道的实现介绍了管道机制的内核实现原理,本文学习一个基于管道机制的非常有趣的CVE实现:CVE-2022-0847 本文基于漏洞影响版本v5.13来进行分析 0x01 CVE介绍 相关的poc代码参考此,抽象为如下代码结构,这里面包含的五个步骤缺一不可 // 1、创建管道 int p[2]; pipe(p); // 2、填...

Linux 内核之旅(十七):Linux Namespace

PidNamespace And MntNamespace

0x00 前言 命名空间用来实现内核对资源进行隔离,本文基于v4.11.6的源码分析下Mnt Namespace的若干细节 0x01 一个容器的case 几个问题: 容器内的进程pid的分配过程 容器(容器内进程)创建的过程,pivot_root/chroot的区别 容器内挂载树(mount tree)的生成过程 0x02 pidnamespace:容器内进程...

Linux 内核之旅(十六):内核视角下的IO读写(一)

基础知识 && 数据结构 && IO基础概念

0x00 前言 IO过程的性能开销 1、网络包接收流程中的性能损失 应用程序通过系统调用(如recv/read等)从用户态转为内核态的开销以及系统调用返回时从内核态转为用户态的开销 网络数据从内核空间通过CPU拷贝到用户空间的开销 内核线程ksoftirqd响应软中断的开销 CPU响应硬中断的开销 DMA拷贝网络数据包到内存中的开销 2、网络包发送流程中...

Linux 内核之旅(十五):管道的实现

有名/匿名管道实现原理:内核视角下的数据流转

0x00 前言 这篇文章来源于对一个问题的思考:Linux中两个进程通过有名(mkfifo)或者匿名(pipe)管道进行通信时,在这两个进程的内核VFS视图中,数据是如何流转的?代码基于 v4.11.6 版本 前置基础: 数据结构与算法回顾(四):环形内存缓冲区 ringbuffer 管道 管道应用场景: zero copy 进程间通信,又分匿名(pipe)与有名...

bpftrace 常用code收集

0x00 前言 0x01 进程类 0x02 网络类 0x03 VFS类 0x04 内存类 0x05 其他 1、sys_enter_finit_module #!/usr/bin/env bpftrace BEGIN { printf("Tracing init_module and finit_module syscalls... ...

Linux 内核之旅(十三):epoll

epoll机制在内核的运行原理

0x00 前言 Linux的IO 多路复用机制(I/O Multiplexing)是一种通过单个线程或进程同时管理多个 I/O 通道(如网络套接字、文件描述符)的机制,用来解决大量并发文件描述符fd场景下,如何快速发现哪些fd触发了事件(读/写)。为了解决遍历fds导致的性能浪费,内核提供了select、poll、epoll这几类机制,本文就以内核的角度来拆解下epoll机制的实现 ...

EBPF 内核态代码学习(三):network stack tracing

tcpstate、tcprtt、tcpconnlat等工具实现分析

0x00 前言 本文学习下基于ebpf技术的网络(协议栈)追踪 tcpstates:用于记录 TCP 连接的状态变化 tcprtt:用于记录 TCP 的往返时间(RTT, Round-Trip Time),同样也可以基于cgroup 统计一段时间内 tcp rtt 的分布,显示连接的状态信息 tcpconnect:基于 cgroup 监控 tcp 网络连接,显示源IP、目的I...

Linux 安全对抗收集(rootkit篇)

rootkit 介绍及攻防原理(持续更新)

0x00 前言 本文对rootkit进行一些原理上的整理 0x01 rootkit基础概念 rootkit是一种恶意程序,能够隐藏自身及相关活动(如模块、进程、文件、网络连接等),用以规避安全检测工具。一般分为用户态、内核态rootkit两种: 用户态rootkit:运行在用户空间,通过劫持库函数或注入进程实现隐藏 内核态rootkit:运行在内核空间,修改内核数据...

Linux 内核之旅(十二):内核视角下的三次握手

0x00 前言 本文从内核视角来跟踪下客户端与服务端的三次握手的流程,代码基于 v4.11.6 版本 上图是经典的TCP切换状态机,不过内核v4.11.6 TCP三次握手的状态有些许改变,服务端新增了一个TCP_NEW_SYN_RECV状态 TCP状态切换:三次握手 client:TCP_SYN_SENT server:TCP_NEW_SYN_RECV clien...

Linux 内核之旅(十四):Linux内核的页表体系

0x00 前言 前文介绍过内核的虚拟内存管理的基础知识,本文继续学习下Linux内核下的页表机制 Linux 内核之旅(三):虚拟内存管理(上) 虚拟内存是 CPU 和内核使用的一个障眼法,让进程误以为自己独占了全部的内存空间(对进程而言,它们各自看到的虚拟内存空间地址范围都是一样的)。如此内核为每个进程营造出一片独立的虚拟地址空间,使得进程与进程之间相互隔离,解决了多进程...