1.剖析Linux内核源码解读之《实现fork研究(二)》
2.Linux内核源码分析:Linux进程描述符task_ struct结构体详解
3.剖析linux内核源码,内核d内task_struct结构体详解
4.Linux kill命令原理及C/C++源码实现
5.安全干货DockerCVE-2018-6552
6.linux内核通信核心技术:Netlink源码分析和实例分析
剖析Linux内核源码解读之《实现fork研究(二)》
本文深入剖析了Linux内核源码中fork实现的源码核心过程,重点在于copy_process函数的核源解析。在Linux系统中,码下应用层可以通过fork创建子进程或子线程,内核d内而内核并不区分两者,源码易语言全部源码它们共享相同的核源task_struct结构,用于描述进程或线程的码下状态、资源等。内核d内task_struct包含了进程或线程所有关键数据结构,源码如内存描述符、核源文件描述符、码下信号处理等,内核d内是源码内核调度程序识别和管理进程的重要依据。
copy_process作为fork实现的核源关键,其主要任务是初始化task_struct结构,分配新进程的PID,并将其加入到运行队列。这个过程中,内核栈的初始化导致了fork()调用的两次返回值不同,这与copy_thread函数中父进程复制内核栈至子进程并清零寄存器值有关。这样,子进程返回0,而父进程继续执行copy_thread后续操作,最后返回子进程的capnp源码阅读PID。
对于线程的独有和共享资源,独有资源通常包括线程特定的数据结构和状态,而共享资源则涉及父进程与线程间的共享内存、文件描述符和信号处理等。这些资源的管理对于多线程程序的正确运行至关重要,需确保线程间资源的互斥访问和安全共享。
Linux内核源码分析:Linux进程描述符task_ struct结构体详解
Linux内核通过一个task_struct结构体来管理进程,这个结构体包含了一个进程所需的所有信息。它定义在include/linux/sched.h文件中,包含许多字段,其中state字段表示进程的当前状态。常见的状态包括运行、阻塞、等待信号、终止等。进程状态的切换和原因可通过内核函数进行操作。PID是系统用来唯一标识正在运行的每个进程的数字标识,tgid成员表示线程组中所有线程共享的PID。进程内核栈用于保存进程在内核态执行时的临时数据和上下文信息,通常为几千字节。内核将thread_info结构与内核态线程堆栈结合在一起,占据连续的两个页框,以便于访问线程描述符和栈。获取当前运行进程的股票图源码thread_info可通过esp栈指针实现。thread_info结构包含task字段,指向进程控制块(task_struct)。task_struct结构体的flags字段用于记录进程标记或状态信息,如创建、超级用户、核心转储、信号处理、退出等。而real_parent和parent成员表示进程的亲属关系,用于查找和处理进程树中的亲属关系。
剖析linux内核源码,task_struct结构体详解
在Linux内核中,进程与线程的统一数据结构是task_struct,它作为进程存在的唯一实体,通过双向循环链表连接所有task_struct。每个任务拥有唯一标识pid和线程组IDtgid,其中group_leader指向进程主线程。有了tgid,我们可以区分task_struct代表进程还是线程。
Linux kernel通过成员变量表示进程的亲缘关系,包括进程状态和权限控制。进程权限涉及进程访问文件、访问其他进程及执行操作的能力。操作权限由cred和real_cred成员表示,kubernate源码分析描述了当前进程和试图操作的进程之间的权限关系。
进程运行统计信息记录了用户态和内核态上消耗的时间以及上下文切换次数,反映了进程的运行情况。信号处理包括被阻塞、等待处理和正在处理的信号,信号处理函数可以忽略或结束进程,处理栈用于信号处理。
进程的虚拟地址空间分为用户虚拟地址空间和内核虚拟地址空间,每个进程有独立的用户虚拟地址空间,内核线程无用户地址空间。进程拥有文件系统数据结构和打开文件数据结构,涉及Linux文件系统操作。
每个task都有内核栈,用于在调用系统调用时从用户态切换到内核态。内核栈包含thread_info和pt_regs数据结构,其中thread_info由体系结构定义,pt_regs用于保存系统调用时的CPU上下文。在系统调用返回时,可以从进程的原来位置继续运行。
综上所述,task_struct结构体在Linux内核中扮演着关键角色,它管理着进程和线程的生命周期,从状态管理、权限控制、绝密obv源码运行统计、信号处理到内存管理与文件系统交互,以及系统调用的上下文切换,都是通过task_struct的成员变量和结构体实现的。这些特性使得Linux内核能够高效、灵活地管理多任务环境。
Linux kill命令原理及C/C++源码实现
在 Linux 环境中,遇到卡死的应用程序或命令行进程时,通常需要使用 kill 命令来终止。Linux 的内置命令 kill(位于 /bin/kill)用于处理这种场景,通过发送信号来告知进程需要关闭。默认情况下,kill 发送的是 TERM 信号,用于礼貌地结束进程。
信号是操作系统间进行异步通信的方式,用来通知进程某个事件。Unix和Linux系统中,如需终止进程,会发送 SIGTERM 或 SIGKILL 等信号。SIGTERM 是一种通用信号,可以被进程处理,而 SIGKILL 则是强制性的,无法被处理。
kill 命令的使用非常直观,基本语法为 "kill [选项] ",其中 pid 是要终止的进程ID。一般情况下,我们先使用 ps 命令获取进程ID,然后使用 kill 命令终止。对于权限问题,普通用户可以通过 sudo 获得 root 权限来终止其他用户或系统的进程。
源码层面,kill 命令通过向内核发送系统信号和进程标识来操作进程,而信号状态默认或忽略取决于程序的设置。例如,后台进程可能设置为忽略中断和退出信号。
理解信号和 kill 命令在 Linux 编程中的作用至关重要,特别是信号的处理方式。如果你想深入了解这方面的知识,可以关注我们的公众号程序猿编码或直接添加我微信(c)进行交流。
安全干货DockerCVE--
cve--
此漏洞未有公开分析,唯一的参考是长亭在滴滴安全大会的PPT,信息简略,仅在完成利用后发现一些未注意到的细节。漏洞基于条件竞争,主要影响未修复版本的is_same_as函数,通过特殊方法使其不执行正常逻辑,继续往下执行。
源码分析
展示了is_same_as源码,以及修复前后版本的对比。apport源码位于2..9版本,追踪源码找到更改过的pid进入get_pid_info,贴出源码。
apport为ubuntu程序,用于处理程序崩溃信息,配置文件如/sys/kernel/core_pattern影响生成core文件的命名方式。核心是确定生成的core文件路径,以及内核coredump.c传入的参数。
核心配置文件为/sys/kernel/core_uses_pid,值为1代表生成的core文件带.pid,0代表不带。同时,/proc/sys/kernel/pid_max限制最大pid值,影响核心循环计数。logrotate配置用于日志管理。
在Ubuntu .中,apport与漏洞版本差异大,选择替换整个apport文件。遇到程序不运行问题,可能涉及core_pattern配置。通过日志分析发现入参多了一个%E,删去后程序恢复正常。
逃逸步骤
利用条件竞争绕过分支,首先kill对应pid,然后通过大量fork等待创建进程,占用pid。利用docker内进程路径控制物理机中core生成路径。生成core前检查ulimit -c,限制core文件大小,设置ulimit -c unlimited。
逃逸第二步
通过logrotate定时任务触发执行core中的指令,将想运行的指令写成字符串形式,保存在core文件中。使用logrotate格式编写命令,确保成功执行。手动触发logrotate命令,监听对应端口以获取返回结果。
linux内核通信核心技术:Netlink源码分析和实例分析
Linux内核通信核心技术:Netlink源码分析和实例分析
什么是netlink?Linux内核中一个用于解决内核态和用户态交互问题的机制。相比其他方法,netlink提供了更安全高效的交互方式。它广泛应用于多种场景,例如路由、用户态socket协议、防火墙、netfilter子系统等。
Netlink内核代码走读:内核代码位于net/netlink/目录下,包括头文件和实现文件。头文件在include目录,提供了辅助函数、宏定义和数据结构,对理解消息结构非常有帮助。关键文件如af_netlink.c,其中netlink_proto_init函数注册了netlink协议族,使内核支持netlink。
在客户端创建netlink socket时,使用PF_NETLINK表示协议族,SOCK_RAW表示原始协议包,NETLINK_USER表示自定义协议字段。sock_register函数注册协议到内核中,以便在创建socket时使用。
Netlink用户态和内核交互过程:主要通过socket通信实现,包括server端和client端。netlink操作基于sockaddr_nl协议套接字,nl_family制定协议族,nl_pid表示进程pid,nl_groups用于多播。消息体由nlmsghdr和msghdr组成,用于发送和接收消息。内核创建socket并监听,用户态创建连接并收发信息。
Netlink关键数据结构和函数:sockaddr_nl用于表示地址,nlmsghdr作为消息头部,msghdr用于用户态发送消息。内核函数如netlink_kernel_create用于创建内核socket,netlink_unicast和netlink_broadcast用于单播和多播。
Netlink用户态建立连接和收发信息:提供测试例子代码,代码在github仓库中,可自行测试。核心代码包括接收函数打印接收到的消息。
总结:Netlink是一个强大的内核和用户空间交互方式,适用于主动交互场景,如内核数据审计、安全触发等。早期iptables使用netlink下发配置指令,但在iptables后期代码中,使用了iptc库,核心思路是使用setsockops和copy_from_user。对于配置下发场景,netlink非常实用。
链接:内核通信之Netlink源码分析和实例分析