本文记录一次IPsec VPN检测时ESP解密失败问题的定位过程。涉及到IPsec VPN协议、加密算法、内核xfrm框架等知识。

阅读全文 »

eBPF和systemtap这两个非常强大的工具,它们弥补了静态调试工具的不足,可以完成很多静态调试工具无法完成的事情。例如很多跟时序相关的问题、概率性偶发的问题、压力测试下才能出现的问题、以及像云上这种不方便调试的环境,可能只能通过动态调试的手段来定位分析问题。

它们将进程本身当作是一个数据库,从中获取所关心的信息进行活体分析。当然前提是你得对这个数据库本身有足够的了解,知道去哪里获取信息,以及获取什么信息。对于内核态就是对内核本身的理解,在用户态则是对用户程序的理解。

本文只是浅浅地试用评估了一下两者,并做了简单对比。要想熟练使用,功夫在诗外!

阅读全文 »

OpenSSL异步框架是在OpenSSL-1.1.0上引入的一个新特性。它理论上可以应用于任何的异步操作,但当前主要是用于在引擎框架中执行的加密学操作。本文首先介绍其底层原理,接着介绍OpenSSL的异步基础设施,最后着重分析ASYNC_JOB(OpenSSL中的协程)的处理流程(dispatcher和job之间是如何切换的)。

阅读全文 »

在本系列之前的两篇文章无中生有移花接木中,我们探究了Linux中的进程创建,它可以说是进程管理中最重要的内容之一(另一个是进程调度)。本文我们将介绍的内容则更多地属于是内存管理范畴。(当然这也是相对而言的,作为Linux内核中最核心的部分,进程管理、内存管理、中断管理相互之间都是紧密联系的。)

也许你已经注意到了,无论是fork还是execve都没有主动去分配内存执行拷贝或读取的动作。fork时只是拷贝了页表并设置为用户只读,而execve时则只是准备了新的LDT局部表以及堆栈中的参数和环境表,而并没有实际读程序到内存中。

这就是本文将讨论的页异常中断:写保护异常/写时复制机制缺页异常

阅读全文 »

之前在Linux内核中隐藏的兵法—无中生有一文中,我们探究了Linux中的进程创建,着重介绍了进程0和fork系统调用。本文我们将继续探究,另一个与进程创建相关的重要系统调用:execve。看看它又是葫芦里卖的什么药。

阅读全文 »

虽说标题写的是SSL性能测试,但其实是不是SSL都无关紧要,只是测试的配置有所不同罢了。相比具体某个指标的测试方法,我们更应该关注的是性能测试的一般原则。具体的测试指标可能随着测试业务、测试环境而千差万别,但是核心的测试方法论是不变的。

因为笔者对SSL的性能测试比较熟悉,所以将以SSL性能测试主要关注的3个指标为例进行分享:每秒新建连接数、最大吞吐量、最大连接数。

阅读全文 »

不管是什么领域,建造往往比销毁困难得多。建造一个大楼可能需要几年的时间,而销毁它也许就是几秒钟的事情。究其根本,因为建造是个熵减的过程,必须有来自系统外的能量输入。而创建中有一类问题显得更为特殊,那就是起源的问题。第一个生命如何诞生?人类又是如何起源的?诸如此类的问题,人类从未停止探究。。。

而今天我们要探究的主题是Linux中的进程创建。大部分的人可能都知道fork,都知道进程就是像细胞分裂一样分出来的。那么你是否清楚下面这些:为了分裂它需要准备什么?所谓分裂到底分了什么,又遗传了什么?遗传物质是如何传递的?第一个进程又是怎么来的?

接下来就让我们一起来探索这些问题吧!

阅读全文 »

本文介绍CVE-2022 0778漏洞及其复现方法,并精心构造了具有一个非法椭圆曲线参数的证书可以触发该漏洞。

阅读全文 »

本文介绍Linux内核的引导启动以及初始化流程,从你按下电源开始到你最终进行终端登录,这期间到底发生了什么?

阅读全文 »

初次了解到slab算法,是在学习Linux内核时。内核中采用了伙伴系统(Buddy System)算法对内存页面进行管理。但是对于小对象,还用页面分配器就显得有些浪费了,于是slab就应运而生了,内核的kmalloc()就是使用slab进行管理的。nginx中的共享内存管理使用了相同的思想,当然它没有Linux内核中的slab那么复杂。

阅读全文 »