- 博客(68)
- 资源 (3)
- 收藏
- 关注
原创 CVE-2026-99999 deferred-metadata trust inversion 原理分析.md
本文分析了CVE-2026-99999漏洞的利用原理,基于GitHub高分POC复现于6.6+内核。该漏洞利用virtio-net的VIRTIO_NET_HDR_F_NEEDS_CSUM功能,在TUN设备处理报文时触发skb校验偏移错误,导致内存越界读写。通过构造特殊IP头部与IPv4选项,实现堆喷射与信息泄露,最终达成提权。需开启veth、xfrm、tun等内核模块支持。
2026-10-21 17:19:43
255
原创 CVE-2026-64600 XFS文件系统 写入任意仅可读文件
摘要: CVE-2026-64600漏洞影响启用xfs reflink特性的系统,利用clone文件(FICLONE)与COW(写时复制)机制间的竞态条件,攻击者可通过克隆任意可读文件并写入数据来篡改原文件内容(如suid、密码文件)。漏洞源于COW过程中短暂释放INODE排他锁的间隙,导致数据被错误写入原文件块而非COW块。需检查xfs挂载点是否存在reflink=1以确认受影响。静态利用竞态窗口极小但可稳定复现,需手动构造关键路径延迟。漏洞不影响page cache,需drop cache后查看篡改内容
2026-07-29 17:39:54
172
原创 CVE-2026-43284 CVE-2026-43500 CVE-2026-46300 Dirty Frag 漏洞分析 --前车之鉴,后事之师
这篇文章分析了两个Linux内核漏洞CVE-2026-43284和CVE-2026-43500,重点剖析了CVE-2026-43284的利用过程。漏洞利用涉及IPsec ESP协议的序列号高位(seq_hi)覆盖问题。攻击者首先在新命名空间中创建多个SA(安全联盟),每个SA携带4字节的恶意payload到seq_hi字段。然后通过vmsplice和splice系统调用,将构造的IPsec报文与目标文件的page cache结合,利用网络协议栈处理漏洞实现对文件内容的逐4字节修改。整个过程展示了如何通过内核
2026-06-08 16:44:07
428
原创 CVE-2022-0847 Dirty Pipe 漏洞分析--圣人千虑,必有一失
文章摘要: 本文分析了Linux内核中的Dirty Pipe漏洞(CVE-2022-0847),该漏洞允许攻击者通过pipe机制覆盖任意只读文件。漏洞核心在于pipe_buffer->flags的PIPE_BUF_FLAG_CAN_MERGE标志未正确重置,导致后续写入可合并到目标文件的缓存页中。POC通过分步填充pipe缓冲区(如2048字节部分写入)触发漏洞,利用pipe_write函数的逻辑缺陷实现越界写入。漏洞最初因CRC校验异常被发现,影响Linux 5.8+内核。修复需确保CAN_MERGE标志
2026-05-29 09:53:58
408
原创 CVE-2016-5195 dirty cow 脏牛漏洞分析 --任何可能出错的事情最终都会出错
脏牛漏洞分析摘要 脏牛漏洞(CVE-2016-5195)是Linux内核中的一个竞态条件漏洞,利用写时复制(COW)机制与内存丢弃(madvise)的竞争关系实现权限提升。该漏洞由Phil Oester在分析服务器攻击时发现,攻击者可在5秒内稳定获取root权限。 漏洞核心在于: 通过mmap创建私有只读映射 线程通过/proc/self/mem写入触发COW 竞态窗口出现在__get_user_pages()中follow_page_mask和faultin_page的交互 内核4.7.9版本存在该漏洞,
2026-05-24 18:05:46
454
原创 CVE-2026-31431 Copy Fail 漏洞分析 --通往地狱的道路充满了善意
Linux内核漏洞CVE-2026-31431分析 该漏洞存在于Linux内核4.13-rc1版本中,涉及加密子系统的AEAD接口实现。漏洞允许通过特殊构造的splice操作修改文件缓存页内容,可能导致权限提升。 漏洞原理: 攻击者首先通过AF_ALG套接字发送AAD(附加认证数据) 使用splice系统调用将文件页直接绑定到加密套接字的TX SGL中 在recv操作执行解密时,内核会直接修改绑定的文件页内容 关键点: splice路径不拷贝数据而是直接传递页引用 解密操作会直接写入绑定页 攻击者可利用此特
2026-05-18 15:19:18
477
原创 BPF KPROBE编程中的ctx是什么?
本文基于strace与内核源码分析eBPF kprobe实现原理。用户态通过BPF_PROG_LOAD加载BPF字节码,借助perf子系统注册kprobe事件,再通过BPF_LINK_CREATE绑定事件与程序。内核触发时,利用ftrace跳板激活kprobe,将寄存器上下文struct pt_regs作为参数传递给BPF程序。开发中可通过PT_REGS_PARMX或BPF_KPROBE宏提取函数参数,实现内核函数动态追踪与数据采集。
2026-04-02 10:57:02
257
原创 kprobe函数入口时的汇编跳板执行流程与栈帧机制
本文分析了Linux内核中kprobe通过ftrace机制在函数入口处插入跳板指令的执行流程。重点展示了当开启CONFIG_FRAME_POINTER选项时,跳板代码如何通过一系列push指令保存寄存器状态并构建完整的调用栈帧。文章通过调试器指令级跟踪,详细记录了跳板执行过程中栈指针(SP)和基址指针(BP)的变化情况,以及各寄存器值的保存位置,揭示了内核如何在不破坏原有函数栈帧结构的前提下实现探测功能。这种机制为性能分析和问题诊断提供了完整的调用链信息。
2026-03-31 18:11:30
383
原创 eBPF debugfs中的追踪点format实现原理
原来以为这些内容来自内核的.BTF节,现在发现是来自于定义追踪点时的宏保存的。分别是在定义追踪点时通过宏创建出的参数/参数名称列表,接下来看看这个列表如何被使用到。接下载在f_next函数中,第一次进入的v参数即f_start函数中初始化的。被分步解析,很像lsm框架的用法,每一次步骤替换一下某些宏的实现。重要的前三个函数,首先open这个文件时候是f_start。时候通过分步的宏解析,参数列表和参数名列表都直接被存储到。根据上面的一点点信息,内核中直接搜索。中以供读取format文件时使用。
2026-02-02 20:42:01
638
原创 eBPF hornet 签名功能实现解析
本文解析了eBPF Hornet签名功能的实现原理。签名过程采用use_loader模式,在加载器指令(opts_insn)和用户bpf信息map(opts_data)生成签名。通过gen_sig工具生成签名后,需修改.skel.h文件添加签名内容。内核验证时通过LSM钩子触发,调用hornet_check_program进行签名验证,并从签名中提取hash数组与map数据进行比对。该实现与bpftool -S签名功能原理相似,主要区别在于针对加载器模式进行了适配。签名验证过程包括证书验证、hash提取和m
2026-01-09 16:13:10
859
原创 bpftool -S 签名功能实现解析
本文解析了bpftool工具中-S签名功能的实现原理。签名功能通过use_loader模式启动,需准备私钥和证书,并在内核编译时添加证书。签名过程会对eBPF加载器程序进行签名,生成哈希值进行校验。加载器通过emit_signature_match函数添加校验逻辑,确保加载的eBPF程序完整性。实现涉及内核编译选项配置、证书管理以及加载器程序的签名验证机制。
2026-01-09 16:12:29
758
原创 libbpf map重定位实现解析
本文解析了libbpf中map重定位的实现原理。通过分析simple_bpf项目生成的.o文件,重点研究了.rel重定位节的收集过程。当加载BPF程序时,bpf_object__collect_relos函数会遍历所有.rel节,根据sh_info字段确定重定位发生的目标节。对于程序节(如kprobe/handle_mm_fault),调用bpf_object__collect_prog_relos解析并记录重定位信息到prog->reloc_desc。文章还展示了调用栈信息,说明该过程发生在BPF对
2026-01-09 16:10:36
600
原创 eBPF use_loader 加载器实现解析
文章摘要: 本文解析了eBPF加载器(use_loader)的实现机制。当使用bpftool生成骨架代码时,通过-S/-L参数会启用use_loader功能。文章通过strace跟踪展示了加载过程中的关键系统调用序列,包括BPF_MAP_CREATE、BPF_PROG_LOAD等。重点分析了bpf_load_and_run函数的实现,详细说明了opts_data和opts_insn的结构组成及其在加载过程中的作用。文章还探讨了JIT编译后的指令执行流程,指出需要内核配置CONFIG_BPF_JIT等选项才能
2026-01-09 16:09:51
880
原创 eBPF CO-RE 实现方式.md
本文分析了eBPF CO-RE(Compile Once - Run Everywhere)的实现机制。通过研究simple_bpf仓库代码和欧拉24.03环境下的.o文件,重点探讨了__builtin_preserve_access_index宏和BPF_CORE_READ宏的作用。这些宏在编译时会生成包含结构体/联合体偏移信息的记录,使得BPF程序能够通过CO-RE机制在不同内核版本上运行。文章还跟踪了bpf_object__relocate_core函数的执行过程,这是CO-RE实现的核心,负责处理.
2025-12-17 15:18:52
437
原创 ELF文件解析 elf.o 文件主要内容.md
本文分析了基于eBPF的ELF目标文件结构,重点研究了.o文件中kprobe/handle_mm_fault节的内容。通过readelf和llvm-objdump工具展示了该节的属性信息及反汇编结果,揭示了BPF指令的存储格式(8字节对齐)和SEC宏的实现机制。文章还探讨了libbpf对SHT_PROGBITS类型节的处理流程,包括符号表扫描规则和程序加载过程,为理解eBPF程序的ELF文件组织结构提供了实用参考。
2025-12-17 15:17:17
927
原创 网易云音乐前端一面算法题
本文探讨了跳跃游戏问题,给出两个解法判断是否能从数组起点跳到终点。第一种使用动态规划(空间复杂度O(n)),记录各位置可达性;第二种优化方案(空间复杂度O(1))实时跟踪最大可达位置。代码示例展示了两种解法在Go语言中的实现,分别测试了可达和不可达的输入案例,验证了算法的正确性。重点在于通过贪心策略优化空间使用,同时保持线性时间复杂度。
2025-11-10 13:18:53
151
原创 面试三面 手撕代码 手写sqrt 开平方
摘要:视频展示了两种实现平方根计算的方法。第一种使用递归二分查找,通过调整步长精度来处理小数位,支持指定小数位数。第二种方法分两步:先用整数二分查找确定整数部分,再逐位处理小数部分。两种方法都采用二分法原理,当mid的平方等于x时直接返回,否则根据比较结果调整查找范围。示例调用sqrt(2,4)返回1.4142,验证了算法的正确性。这些实现展示了面试中手写算法时对边界条件和精度控制的处理技巧。
2025-11-04 13:33:34
160
原创 glibc pthread_mutex_lock/unlock futex 互斥锁的实现
ys_futex (uaddr=0x4041a0, op=128, val=2, utime=0x0 <fixed_percpu_data>, uaddr2=0x0 <fixed_percpu_data>, val3=0) at kernel/futex/core.c:3806 #4 0xffffffff8119115a in do_syscall_x64 (nr=<optimized out>, regs=0xffff
2025-09-26 13:22:43
1023
原创 ftrace function_graph 函数劫持实现方式
本文摘要: Linux内核ftrace机制实现分析,主要包含三个阶段: 准备阶段:通过gcc -pg编译选项在内核函数开头插入call _mcount指令,ftrace_init时将这些地址保存并替换为nop指令。 过滤设置:通过/sys/kernel/debug/tracing/set_ftrace_filter接口设置过滤条件,将过滤函数分别存入filter_hash和notrace_hash两个哈希表。 过滤执行:ftrace_startup时调用__ftrace_hash_rec_update,检查
2025-09-25 15:41:39
415
原创 linux内存管理-写时复制COW在内核代码实现
这篇文章通过代码跟踪分析了Linux写时复制(COW)的实现机制。作者首先设计了一个父子进程共享内存的测试程序,在内核缺页异常处设置断点进行调试追踪。通过分析调用栈发现,当子进程尝试修改共享页面时,内核会触发缺页异常,进入handle_pte_fault和do_wp_page函数处理写保护页。关键步骤是wp_page_copy函数会申请新页面、复制内容、更新页表项,并调整原页面的引用计数。文章还推测了clone时对页表和页面引用计数的操作。整个过程展现了Linux如何通过缺页异常处理机制实现高效的写时复制功
2025-09-23 17:10:06
683
原创 内存管理-伙伴系统:__find_buddy_pfn 函数解析与伙伴查找机制
本文分析了Linux伙伴系统中__find_buddy_pfn函数的实现原理。该函数通过位运算page_pfn ^ (1 << order)计算指定页框的伙伴位置,使得相邻块能按阶合并。文章详细解释了伙伴系统的初始化过程,通过__ffs()确定页框的初始阶数,并给出了1-13页的分配示例。还说明了不同阶数下伙伴页的合并规则,如0阶时4和5互为伙伴,1阶时4和6可合并为更高阶块。这些机制有效减少了内存碎片。
2025-09-19 11:18:14
196
原创 抓虫:unshared后执行命令dump
摘要:在执行unshare -m bash -c "mount --bind /opt/cmt/.venv/lib64 /lib64 && ls"命令时,bash进程出现段错误并产生核心转储。通过strace跟踪发现,进程在加载和卸载/lib64下的动态库(如libselinux.so.1)时,先通过mmap映射内存,随后执行munmap取消映射,最终因SIGSEGV信号(内存访问错误)崩溃。问题可能源于挂载新命名空间后动态链接库路径冲突,导致bash在准备执行ls时因内
2025-09-10 14:21:37
472
原创 通过重新构建依赖libtiff的软件包方式进行libtiff升级兼容性分析
文章摘要:本文通过对比动态库和测试程序的变化,分析了结构体新增成员、常量值修改和函数参数变更对程序的影响。检测结果显示,这些变化导致栈空间分配、变量偏移位置和全局变量值都发生了相应改变。此外,文章还探讨了libtiff依赖的ELF文件检测结果,指出29个无异常文件中存在4个汇编比对无差异但MD5不一致的情况。最后提出了构建环境一致性和调试包处理的相关建议。
2025-09-05 10:49:20
522
原创 抓虫:login进程的权能未获取
Linux权限能力调试分析 通过分析pam_cap.so模块发现: 该模块大部分符号未定义,仅实现少数与权限无关的函数 实际权限功能由libcap.so.2动态库提供 调试方法:替换系统login程序,将进程PID写入伪终端供调试 发现的异常:capsh --print命令输出的当前权限集不正确,存在格式错误问题 该案例展示了Linux权限管理模块的依赖关系和调试技巧,可用于排查权限设置异常问题。
2025-09-05 10:42:13
360
原创 抓虫:FD_SET访问非法栈地址溢出
Java调用so库时发生SIGSEGV错误,错误地址指向FD_SET操作。分析发现由于未对fd值进行<1024的校验,导致在计算__FD_ELT时发生栈溢出。通过objdump和寄存器回溯定位到问题代码位置,发现FD_SET宏定义中直接进行fd/64计算而未做边界检查,违反了POSIX规范要求fd必须为有效文件描述符的规定。建议使用gcc预编译检查宏展开情况,并注意fd_set的固定缓冲区特性,避免传入过大fd值导致未定义行为。
2025-09-05 10:37:32
190
原创 抓虫:loongarch64架构selinux强防开启程序执行报错execmod
摘要: 在loongarch64架构下开启强防后,发现strace、gdb等命令无法执行,审计日志显示缺少execmod权限。经分析,这是由于程序启用了TEXTREL(代码段重定位)特性,该特性在SELINUX下需要execmod权限保护。TEXTREL通常出现在位置无关代码(PIC)违反规范时,可能导致共享库加载问题或安全漏洞。通过readelf工具可查看程序的TEXTREL属性,验证其存在于二进制文件中。此情况在x86架构下运行正常,但在loongarch64架构下需额外处理。解决该问题需关注程序的PI
2025-09-05 10:33:19
1210
原创 抓虫:sw架构防火墙服务启动失败 Unable to initialize Netlink socket: 不支持的协议
Firewalld服务启动失败,调试发现是由于Netlink协议初始化失败导致。通过gdb追踪发现错误发生在nft_mnl_socket_open()函数中,该函数调用mnl_socket_open(NETLINK_NETFILTER)失败。分析依赖库发现该函数由libmnl.so.0提供,底层实际调用系统调用socket(AF_NETLINK,...)失败,可能是内核不支持NETLINK_NETFILTER协议或相关模块未加载。问题表现为"Unable to initialize Netlink
2025-09-05 10:24:53
933
原创 linux内存管理-四级页表映射计算
本文介绍了Linux内核地址映射机制,重点分析了从虚拟地址到物理地址的转换过程。通过0xffffea0000200000虚拟地址示例,详细说明了五级页表转换的步骤:PGD(39位偏移)、P4D(与PGD同级)、PUD(30位偏移)、PMD(21位偏移)和PTE(12位偏移)。每个页表项9位索引,通过位运算获取下一级页表地址,最终解析出物理地址。文中还展示了如何通过gdb调试工具查看各级页表内容,包括init_mm.pgd的初始位置和各级页表项的具体数值,帮助理解Linux内核地址映射的实现原理。
2025-08-28 17:58:27
478
原创 linux面试题:操作系统是怎么知道 IO 就绪的
这篇文章探讨了Linux系统中IO就绪后唤醒进程的机制。作者通过分析V站帖子中提到的面试问题,重点研究了ttwu(try to wake up)唤醒进程的过程。通过使用bpftrace工具追踪sched_wakeup事件,作者捕获到一个内核态调用栈,展示了从TTY终端写入到唤醒对端进程的完整路径。进一步通过gdb调试内核,作者详细分析了ttwu_do_activate函数调用栈,揭示了IO就绪后通过工作队列(worker_pool)唤醒阻塞进程的具体实现机制。文章最后指出,唤醒操作会从worker_pool
2025-08-15 10:15:18
1155
原创 从内核源码角度理解cgroup cpu中的cfs_period_us、cfs_quota_us配置
摘要:Linux内核5.10.202版本中,CFS调度器通过定时器机制实现带宽控制。当定时器周期到期时,会调用sched_cfs_period_timer回调函数,将任务的剩余可用时间(runtime)重置为预设的配额值(quota)。该机制通过__refill_cfs_bandwidth_runtime函数实现,确保任务在每个周期内获得固定的CPU时间配额。定时器初始化时配置了回调函数,并在到期时触发时间补充,从而维持公平调度。
2025-08-07 09:07:53
633
原创 抓虫:xfce桌面丢失权能
摘要:系统发现secadm用户登录后权能丢失问题。经排查,发现lightdm启动的xfce4-session进程未通过pam_cap.so模块继承权能。在/etc/pam.d/lightdm中添加auth required pam_cap.so keepcaps后,终端bash权能恢复。该问题一小时定位,但最终修复方案需仓库管理员根据lightdm三个PAM文件的具体作用进一步确认。
2025-08-06 10:18:02
249
原创 linux面试题:Ctrl+Alt+Fx 切换 tty 这个功能是在哪里实现的?
Linux终端切换功能实现分析 文章探讨了Linux系统中Ctrl+Alt+Fx切换tty功能的实现机制。通过分析发现: 终端切换功能主要由systemd-logind服务实现,通过ioctl(fd, VT_ACTIVATE)系统调用来完成 使用chvt命令可以直接切换终端,其核心逻辑是调用VT_ACTIVATE和VT_WAITACTIVE的ioctl操作 在SSH的pts终端中执行chvt可能无效,需要在真实tty终端中操作 通过strace跟踪发现,按键切换时会触发systemd-logind服务读取/
2025-07-31 15:13:52
982
原创 c++,lambda是匿名函数也可能不是函数,从汇编底层角度深入理解带捕获的lambda如何转化为std::function
摘要:本文通过分析C++中std::function的汇编实现,揭示了其内部工作机制。std::function是一个类而非单纯别名,其构造函数接收lambda捕获变量的地址而非函数指针。关键实现细节包括通过_Base_manager初始化函数对象,存储_M_invoker调用地址,以及利用完美转发传递参数。汇编代码显示function对象保存了lambda的调用器地址和管理器指针,验证了其作为通用函数包装器的类实现本质。(149字)
2025-07-22 16:07:34
875
原创 c++,从汇编角度看lambda
本文通过汇编分析揭示了C++ lambda表达式的工作机制。实验通过4个不同lambda示例,发现每个lambda都会生成对应的函数符号。不带捕获的lambda调用时传入无意义地址参数(类似this指针但大小为1);带捕获的lambda会将捕获变量按顺序排列形成内存块,调用时传入该内存块地址(类似结构体指针传参)。参数传递方式与常规函数一致,其中带默认参数的lambda会直接传入默认值。这些发现为后续研究lambda如何转换为std::function奠定了基础,展示了编译器对lambda的底层实现方式。
2025-07-22 14:39:09
328
原创 c++,stl库阅读之std::forword完美转发
摘要:完美转发通过std::forward解决模板函数中的引用丢失问题。它利用模板类型推导和引用折叠规则:当参数为通用引用(T&&)时,左值推导为T&,右值推导为T&&;通过remove_reference获取原始类型,再配合static_cast<_Tp&&>实现引用类型的完美转发。关键点包括:1)必须在模板函数中使用以自动推导类型;2)引用折叠规则确保引用类型正确传递;3)避免手动指定类型以保持自动化特性。示例代码演示了左值/右值的转发
2025-07-21 17:47:24
270
原创 c++,邪恶的花括号!列表初始化构造实现方式
文章摘要:讨论了C++中花括号初始化{}的使用场景,重点分析了std::vector的初始化列表构造实现。通过汇编代码解析,展示了initializer_list的内部工作机制:编译器会将{64,64}转换为数组指针和大小参数,并调用vector的初始化列表构造函数。文中还对比了四种初始化方式的适用场景,强调应根据代码意图选择最清晰可读的初始化方式,而非强制使用单一语法。最后指出initializer_list通过私有构造函数实现,编译器可直接调用。
2025-07-18 11:19:47
209
原创 C++无用的知识,inline不是宏,没有魔法!
摘要:《More Effective C++》指出,静态成员函数使用inline不会导致静态变量被复制,这与宏不同。示例代码显示,内联后的static_member()函数中静态变量i仍保持单一实例,输出结果为1和2,符合预期。相比之下,宏替换可能导致变量多次自增,产生意外结果(如4)。说明内联函数不会改变代码语义,而宏可能带来副作用。关键区别在于内联保持程序逻辑,而宏可能破坏设计意图。
2025-07-12 12:22:08
462
原创 c++,用 delete [] 释放 new 对象,会发生什么???
摘要:文章通过分析C++汇编代码,揭示了delete和delete[]的内存管理机制差异。delete[]通过访问数组对象前8字节获取元素个数(如new string[2]会在内存-8处存储2),而普通delete仅处理单个对象。在示例中:1) delete_normal(s)正确,2) delete_array(s)会越界访问;3) delete_normal(s2)会内存泄漏,4) delete_array(s2)正确。关键发现:new[]返回地址实际是"数组头-8",delete[
2025-07-11 14:21:48
416
原创 C++,从汇编角度看《虚拟继承的邪恶》
摘要:文章通过分析一个C++虚继承案例揭示了反直觉的输出结果(123和0)。代码中D(456)输出0的原因是虚继承初始化规则:1)虚基类A由最底层派生类D初始化;2)在D构造过程中,中间类C的构造函数未实际调用A(a),导致A被默认初始化为0。通过反汇编验证发现,编译器会生成两个版本的C构造函数,分别处理直接实例化和作为中间类的情况,解释了虚继承的底层实现机制。
2025-07-11 13:21:55
492
原创 c++的拷贝省略,返回局部类,如何实现?
本文探讨了C++中的拷贝省略(copy elision)优化机制。通过分析函数返回局部对象时的汇编代码,展示了编译器如何优化掉不必要的拷贝构造。在默认情况下,编译器会将返回对象的地址直接传递给调用方,避免临时对象的构造和拷贝。当使用-fno-elide-constructors选项时,编译器会生成完整的拷贝构造流程。文章通过对比两种编译方式的汇编代码,揭示了拷贝省略优化的实现机制,说明编译器如何通过参数传递优化来避免对象拷贝的开销。
2025-07-09 14:33:37
465
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅