CVE_2026_31431漏洞复现与分析纪实

缘起

上周四早上通勤时,我瞥了一眼兰舍微信群,有兰友提到Linux的提权漏洞(如下图),当时并未太在意。

但到了下午,看雪安全公众号推送了一篇相关文章:《732字节,通杀所有Linux!一个潜伏十年的“隐形杀手”终曝光》,这个推送瞬间勾起了我的兴趣

接下来正好五一假期有空,我便决定深入研究一番。

所谓通杀,其实不然

看雪的文章出于安全考虑没有直接给出相关链接,这时回想起兰舍群里曾有人发过GitHubxint的链接,于是认真翻看起来(顺便也练练英文),

附仓库(https://github.com/rootsecdev/cve_2026_31431)截图如下

看到有PoC脚本,我便想亲自试一下。用什么环境呢?我手边正好有一台“幽兰本(格蠹3588 Linux 笔记本),尝试运行检测脚本,结果如下:

并没有成功,这与通杀所有Linux!一个潜伏十年的漏洞的结论不太相符啊。

再试云主机

于是我又想到用云主机试试,但这次栽在了Python 版本上——该漏洞的利用脚本要求 Python 3.10 及以上版本,我云主机上的是3.6.8。 

python3 test_cve_2026_31431.pyTraceback (most recent call last): File "test_cve_2026_31431.py", line 65, in <module> def attempt_trigger(target_path: str) -> tuple[bool, bytes]:TypeError: 'type' object is not subscriptablepython3 --versionPython 3.6.8sudo yum install python310Loaded plugins: fastestmirrorLoading mirror speeds from cached hostfilebase                                                                                            | 3.6 kB  00:00:00extras                                                                                          | 2.9 kB  00:00:00updates                                                                                         | 2.9 kB  00:00:00No package python310 available.Error: Nothing to do

反复尝试通过 yum 安装 Python 3.10 均告失败,真是考验耐心(欲速则不达)。求助 AI 后,找到了一种源码编译安装的方法:

wget https://www.python.org/ftp/python/3.10.16/Python-3.10.16.tgztar -xzf Python-3.10.16.tgzcd Python-3.10.16./configure --enable-optimizations --prefix=/usr/localmake -j $(nproc)sudo make altinstall

然而又遇到了编译错误:

反复询问 AI,对方给出了一堆安装选项,但都不在点上。后来终于发现关键是要禁用链接优化(--disable-lto): 

如果使用 yum (RHEL 7)

sudo yum groupinstall "Development Tools"

sudo yum install gcc openssl-devel bzip2-devel libffi-devel zlib-devel readline-devel sqlite-devel tk-devel

最终瞄到了关键点是禁用链接优化(--disable-lto):

./configure --prefix=/usr/local --disable-optimizations --disable-lto

加上 --disable-lto 后,Python 3.10 终于编译成功。但此时已经过去了好几个小时,兴趣难免有所消退。

在云主机(内核版本 5.18.1)上再次尝试检测脚本,结果显示确实存在漏洞

# python3.10 test_cve_2026_31431.py[*] CVE-2026-31431 detector kernel=5.18.1  arch=x86_64[i] Kernel 5.18.1 predates the affected 6.12/6.17/6.18 lines; trigger may not apply even if prerequisites match.[+] AF_ALG + 'authencesn(hmac(sha256),cbc(aes))' loadable - precondition met.[!] VULNERABLE to CVE-2026-31431.[!]   Marker b'PWND' (AAD seqno_lo) landed in the spliced page-cache page at offset 0.[!]   Surrounding bytes: 50574e444641494c2d53454e (b'PWNDFAIL-SEN')[!] Apply the upstream fix or block algif_aead immediately.接着运行利用脚本(注意必须带上 --shell 参数,否则看不到效果): [steve@aiyun17735 cve_2026_31431]$ python3.10 exploit_cve_2026_31431.py --shell[*] CVE-2026-31431 LPE user=steve  uid=1000[*] /etc/passwd: steve UID field at offset 1188 = '1000'[*] Patching '1000' -> '0000' in page cache...[*] Page cache now reads b'0000' at offset 1188[*] getpwnam('steve').pw_uid = 0[+] /etc/passwd page cache now lists steve as UID 0.[+] Run:   su steve[+] Enter your own password. su will setuid(0) and drop a root shell.[i] Cleanup after testing (from the root shell):[i]   echo 3 > /proc/sys/vm/drop_caches[+] Executing `su steve` now...Password:[root@aiyun177350 cve_2026_31431]#

命令提示符变成了root,提权成功!几小时的折腾总算没有白费。

举一反三

这时我又想起幽兰本上尚未成功,于是在兰舍群里发了一条消息询问群友: 

有兰友说内核老,其实不对,这个漏洞号称隐藏十年了啊。我继续与AI聊天,向AI提出了一串问题,让AI给我解答疑惑:

1.该漏洞对云服务器有影响吗?如果云服务器是容器环境呢?

2Android手机手机受影响吗?

3algif_aead是什么,是驱动吗?

4.如何判断是否在容器中?

5.云主机一般是什么环境?

6.这篇文章中提及的Copy Fail是什么术语:https://xint.io/blog/copy-fail-linux-distributions

7.”Copy Fail“这个词背景及来源

其中第 3 个问题的回答顺带解决了幽兰本不成功的原因::

我在幽兰本上检索编译选项CRYPTO_USER_API_AEAD,确实没有设置(is not set):

看来幽兰本上没有这个漏洞的原因是没有把有漏洞的代码编译进来。


漏洞原理仍难于理解

此时,我对漏洞的原理还是模糊的,下面这样的概括,你能看懂吗(截取自https://github.com/rootsecdev/cve_2026_31431)?

Vulnerability summary

algif_aead runs AEAD operations in-place (req->src == req->dst). When the source data is fed in via splice() from a regular file, the destination scatterlist contains references to the file's page-cache pages — i.e. the kernel will write into them. The authencesn(hmac(sha256), cbc(aes)) algorithm then performs a 4-byte "scratch" write of the AAD's seqno_lo field (bytes 4–7 of the sendmsg-supplied AAD) into that destination, corrupting the page-cache copy of the file.

Because the on-disk file is never modified, there is no on-disk signature; the corruption is observed only by readers that share the page cache. /etc/passwd and /usr/bin/su are both world-readable, so an unprivileged local user can corrupt the running kernel's view of either.

Affected: kernels carrying commit 72548b093ee3 (in-place AEAD, 2017) without the upstream revert. The disclosure confirmed Ubuntu 24.04 LTS, Amazon Linux 2023, RHEL 14.3, and SUSE 16, but the underlying primitive predates that range.

scatterlistthe file's page-cache pagessplice这术语超出我的知识,splice是个关键的概念,看雪有篇文章(https://mp.weixin.qq.com/s/HO_kS4OSIMFAMdvNKxxFqA)提供了中文解释。

把漏洞代码编译为内核模块

我深知纸上得来还是不深刻(古人云:纸上得来终觉浅,绝知此事要躬行),我想在幽兰或者gdk8上调试。虽然漏洞代码没有编译进内核,但可以手工编译啊。

我在crypto/Makefile下找到了对应源码algif_aead.oóalgif_aead.c(后来发现在gdk8上,还要另一个模块af_alg.oóaf_alg.c),如下图:

整一个Makefile文件(我参考的是llaolao驱动),内容如下:

WFLAGS := -Wstrict-prototypes -Wno-trigraphs -Wunused-resultLDFLAGS = -Map /var/tmp/algif_aead.txtEXTRA_CFLAGS := $(WFLAGS)# EXTRA_CFLAGS += -g -Wa,-adhln=$(<:.c=.lst)EXTRA_CFLAGS += -D_DEBUG -g3-fno-stack-protectorMODULE = algif_aeadMODULE2 = af_algKERNELDIR?=/lib/modules/$(shell uname -r)/buildobj-m := $(MODULE).oobj-m += $(MODULE2).oall:make -C $(KERNELDIR) M=$(shell pwd) modulesmake $(MODULE).lst $(MODULE2).lst#$(MODULE)-objs := $(MODULE).o%.lst:%.koobjdump --source --line-numbers --all-headers --demangle --disassemble $^ > $@clean:rm -rf *.o *~ .*.cmd *.ko *.mod *.mod.c *.order *.symvers .tmp_versions built-in.o

如果要为gdk8编译ko(我是在幽兰本上为其编译),则需要export KERNELDIR目录,我编写一个mybuildgdk8.sh,内容如下

export KERNELDIR=/gewu/home/geduer/gedulab/gdk8ktime bear --output compile_commands.json -- make KBUILD_VERBOSE=2 V=1 quiet="" -j1 ARCH=arm64

编译成功后,通过insmod ./algif_aead.ko加载,试了下,不出意外exploit是成功的。

gdk8上的python3.6.9,我还是把python3.10源码编译了一番(注意加上--disable-lto)。

gdk8上,insmod ./algif_aead.ko insmod ./af_alg.ko, 执行python3.10 exploit_cve_2026_31431.py –shell竟然出现异外情况,输出su: Cannot determine your user name.

cat /etc/passwd可以看到geduerUID1002变成了0000了,至少内存是被改掉的,那可能su版本有差异。

使用挥码枪调试

这里我选择gdk8作为调试目标,当然选择幽兰本也可以,选择gdk8主要它更轻便些,幽兰用来构建驱动或者看文档。

操作步骤:

1.按上面左图连好挥码枪与gdk8盒子,打开nanocode软件进入调内核调试并设置好符号路径等

2.对文档中提及的函数下断点bp crypto_authenc_esn_decrypt

3.ssh连接上gdk8,输入python3.10 test_cve_2026_31431.py,此时下图内容输出了一半停下

4.此时nanocode断点命中,敲入kn可以看到调用栈,如下图

5.继续敲dt lk!aead_request 0xffffffc0e30fd300

6.可以看到srcdst如文档所说是同一个,类型为struct scatterlist

7.继续观察dt lk!scatterlist 0xffffffc0`e30fd010

这里page_link字段是多用途字段,它可以指向另一个scatterlist(bit01),注意dst(0xffffffc0`e30fd010)指向数组,通过SG_END标记它是最后一个,当前bit1没有置1,显然它不是最后一个。

#define SG_CHAIN   0x01UL#define SG_END     0x02UL/** We overload the LSB of the page pointer to indicate whether it's* a valid sg entry, or whether it points to the start of a new scatterlist.* Those low bits are there for everyone! (thanks mason :-)*/#define sg_is_chain(sg)    ((sg)->page_link & SG_CHAIN)#define sg_is_last(sg)     ((sg)->page_link & SG_END)#define sg_chain_ptr(sg)   \   ((struct scatterlist *) ((sg)->page_link & ~(SG_CHAIN | SG_END)))

8.继续观察dt lk!scatterlist 0xffffffc0`e30fd010 +0x20(sizeof(lk!scatterlist))第二个scatterlist

9.继续下断bp lk!scatterwalk_map_and_copy,跳过前3次的下断,直接看改写内存那个断点(即这行    scatterwalk_map_and_copy(tmp + 1, dst, assoclen + cryptlen, 4, 1);

10.继续下断lk!scatterwalk_copychunksg,断下我们看到PWND字串,这个要写到目标缓存的内容

11.我们继续对memcpy_dir下断,可惜它是内联函数,我们打开汇编窗口找到lk__memcpy这行,bp/1 ffffff800862442c下断

12.我们观察改写的即将发生,

x1指向4字节将改写x0指向内存。(x0指向的就是文件缓存地址)

13.接下来是关键的splice操作,另起一章吧。

splice系统调用

splice() Linux 内核提供的一个高效的零拷贝系统调用,其核心价值在于在内核空间直接移动数据,避免数据在内核缓冲区用户空间缓冲区之间不必要的来回拷贝。但它有一个严格的使用限制:两个文件描述符中至少有一个必须是管道(pipe

函数原型:

ssize_t splice(int fd_in, off_t *off_in, int fd_out, off_t *off_out, size_t len, unsigned int flags);

调用成功时返回实际传输的字节数,失败则返回-1 并设置 errno。参数看似复杂,但存在固定的配对关系,可以分三组理解:

1. 基础I/O 与长度控制

  • int      fd_in & int fd_out:数据流入和流出的文件描述符(文件、套接字、设备或管道的句柄)。

  • size_t      len:想要移动的最大字节数。

2. 偏移量操作

文件描述符类型

off_in/off_out 参数值

具体行为
管道必须为 NULL从管道的当前读写位置操作,管道不支持随机访问。
非管道

NULL

使用文件内核维护的当前文件偏移量(操作后自动更新)。
非管道非 NULL使用指针指向的值作为起始偏移量,但不更新文件本身的文件偏移量,实现独立的偏移量控制。

3. 行为控制标志

  • SPLICE_F_MOVE:性能优化提示,指示内核尽可能通过移动内存页面取代复制数据(从 Linux 2.6.21 起该标志暂时是空操作,但传递它合法)。

  • SPLICE_F_NONBLOCK:使 splice 的管道操作非阻塞(注意:若 fd_in  fd_out 本身没有 O_NONBLOCK 标志,整个调用仍可能阻塞)。

  • SPLICE_F_MORE:性能优化提示,常用于网络传输,建议内核后续还有更多数据到来。若 fd_out 是套接字,则与 send(2) 中的 MSG_MORE 标志效果类似,有助于减少网络数据包。

  • Pythonsplice封装:

    os.splice(src, dst, count, offset_src=None, offset_dst=None, flags=0)

scatterList布局图

splice系统调用就像一个魔法,把文件缓存引用给传递了下去,在内核端实际是数组scatterlist dst[],有两个元素,AAD占一个元素,剩下的占另一元素。

结语

找资料,看代码,上调试器,五天假期忙得不亦乐乎,感觉时间过得好快,明天又到上班的时间了(时间又不属于自己了)。今天把几天忙碌的过程写下来,作为自己学习的记录,也分享给格友和同行们,写的不好的地方,欢迎大家批评指正。这个五一假期过的好充实。


参考资料:

https://github.com/rootsecdev/cve_2026_31431

https://xint.io/blog/copy-fail-linux-distributions

https://mp.weixin.qq.com/s/HO_kS4OSIMFAMdvNKxxFqA

***

正心诚意,格物致知,以人文情怀审视软件,以软件技术改变人生

扫描下方二维码或者在微信中搜索“盛格塾”小程序,可以阅读更多文章和有声读物

Image

也欢迎关注格友公众号

Image

内容概要:本文提出了一种面向通信优化的微电网分布式二次电压频率调控功率均分方法,并通过Simulink平台进行了仿真实现。该方法针对孤岛微电网中多分布式电源的协同控制问题,采用分布式控制架构以减少对中央控制器的依赖,提升系统的可靠性可扩展性。通过引入高效的通信机制事件触发策略,在确保电压和频率快速精确恢复的同时,实现了各电源间有功无功功率的均衡分配。文章详细阐述了控制算法的设计原理、稳定性分析过程以及关键参数的整定方法,并依托Simulink搭建完整的仿真模型,验证了所提方法在动态响应性能、抗干扰能力及通信资源利用率方面的优越性。; 适合人群:具备一定电力系统基础知识和仿真能力的研究生、科研人员及从事微电网、分布式能源系统相关工作的工程技术人员。; 使用场景及目标:①用于研究微电网中分布式电源的协调控制策略;②适用于需要实现电压频率恢复负载功率均分的实际微电网系统设计;③为应对通信资源受限场景下的控制优化提供解决方案;④作为教学案例帮助理解分布式控制二次调控机制。; 阅读建议:建议结合Simulink仿真模型同步学习,重点关注控制结构设计参数整定部分,同时可延伸阅读文中提及的事件触发机制弹性协同控制相关内容以加深理解。
内容概要:本文针对高比例清洁能源接入下的配电网重构问题,提出了一种融合需求响应机制的优化模型,并基于标准IEEE33节点系统进行仿真验证。研究通过引入需求响应策略,动态调节用户侧负荷,增强系统对风电、光伏等波动性可再生能源的消纳能力,同时结合网络拓扑重构以降低网损、改善电压分布,提升配电网运行的经济性安全性。文中详细构建了计及辐射状约束、功率平衡设备容量限制的混合整数非线性优化模型,采用智能优化算法求解开关操作序列需求响应调度方案的协同最优解。通过Matlab编程实现仿真分析,验证了该方法在多重运行场景下的有效性鲁棒性。; 适合人群:具备电力系统分析基础、熟悉Matlab编程工具,从事新能源并网、智能配电网优化、需求响应等领域研究的科研人员、高校研究生及工程技术人员。; 使用场景及目标:①应用于高渗透率分布式能源接入的配电网运行优化;②实现需求响应网络重构的协同调度,提升系统灵活性稳定性;③为智能配电网的规划、调度决策支持提供技术参考仿真平台。; 阅读建议:建议读者结合所提供的Matlab代码深入理解建模逻辑算法实现流程,优先复现基础案例并逐步调整参数设置以探究不同需求响应强度、新能源出力波动等情景下的优化效果,亦可进一步扩展至多时段动态重构、储能协同优化等更复杂场景的研究。
内容概要:本文研究了基于QLearning自适应强化学习的PID控制器在自主水下航行器(AUV)运动控制中的应用,旨在解决传统PID控制器在复杂动态水下环境中参数整定困难、适应性不足的问题。文章首先建立了AUV的动力学模型并分析了其在水下扰动环境中的运动特性,进而提出一种将QLearning算法PID控制相结合的自适应优化策略。该方法通过构建合理的状态空间、动作空间及奖励函数,使控制器能够依据实时控制误差和外部干扰自主调整PID参数,从而提升系统的响应速度、稳定性和抗干扰能力。研究在Matlab平台上进行了仿真实验,涵盖了稳态、恒定扰动和随机扰动等多种工况,结果表明所提出的QLearning-PID控制器在各项性能指标上均优于传统PID控制,验证了其有效性鲁棒性。; 适合人群:具备自动控制理论、机器人建模强化学习基础知识,从事水下机器人控制、智能控制算法开发及相关领域研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①用于提升AUV在复杂海洋环境下的轨迹跟踪精度姿态控制性能;②为自适应控制策略强化学习算法在实际工程系统中的深度融合提供技术参考实现范例;③适用于智能控制器的设计、仿真验证、算法对比及优化研究。; 阅读建议:建议读者结合Matlab代码实现部分,深入理解QLearningPID融合的程序逻辑,重点关注状态设计、奖励函数构造参数更新机制,并可通过修改环境扰动或控制目标进行拓展实验。
内容概要:本文围绕并网离网模式下的风光互补制氢合成氨系统,开展容量配置运行调度的联合优化分析,提出基于Python代码实现的双层优化模型。该模型充分考虑风能太阳能出力的不确定性,结合电解水制氢及合成氨工艺的能量转换特性,构建涵盖设备选型、容量规划多时段运行调度的协同优化框架,旨在实现系统在经济性、能源自给率运行可靠性之间的综合平衡。通过典型场景的仿真分析,验证了模型在不同运行模式下的有效性,深入探讨了系统在离网并网条件下的最优配置方案、调度策略差异及关键设备的运行特性,为可再生能源深度耦合化工生产过程的综合能源系统规划设计提供了重要的理论依据和技术支撑。; 适合人群:具备一定能源系统建模、优化算法及可再生能源技术基础,从事新能源、综合能源系统、氢能绿色化工等领域的科研人员及工程技术人员,特别适用于研究生及以上学历的研究者。; 使用场景及目标:①研究风光等可再生能源在离网或并网条件下驱动制氢、合成氨系统的最优容量配置运行调度策略;②掌握基于数学规划(如混合整数线性规划)的能源系统多目标优化建模方法,实现投资成本、运行成本碳排放的综合优化;③为实际电-氢-氨耦合示范项目的系统设计、经济性评估运行决策提供仿真工具量化分析支持。; 阅读建议:建议结合提供的Python代码进行实践操作,重点关注模型的目标函数构建、约束条件(如能量平衡、设备运行特性、电解槽动态响应等)的数学表达求解器调用流程,宜配合相关专业文献深入理解合成氨反应热力学、电解槽效率模型等关键技术细节,并尝试对不同边界条件(如电价、氢气价格、风光资源禀赋)进行敏感性分析,以深化对系统优化机理的理解。
内容概要:本文《2026外贸出海下半年新打法白皮书》系统梳理了2026年上半年中国外贸发展的五大关键转折六大新变量,揭示了外贸行业从“总量增长”转向“结构性分化”的现实。文中指出,传统代工模式和单一市场依赖型企业正面临生存危机,而“新三样”(电动汽车、锂电池、光伏)及“新新三样”(AI算力、机器人、创新药)成为出口增长新动能。同时,AI正重构B2B采购决策链路,合规门槛全面提升,市场重心向“一带一路”国家转移。在此背景下,作者提出下半年三大出路:换赛道、做减法、用AI优化流程,并提供了90天落地行动路径。; 适合人群:从事外贸出口业务的企业主、管理者及从业者,尤其是面临转型压力的传统制造型外贸企业负责人,以及希望把握新兴市场技术趋势的中小企业决策者。; 使用场景及目标:①帮助企业识别当前外贸环境中的结构性变化风险点;②指导企业制定切实可行的转型或优化策略,如市场多元化、AI工具应用、合规升级等;③提供可执行的三个月行动计划,助力企业止血、试水复盘。; 阅读建议:此白皮书兼具宏观洞察微观实操,建议结合企业自身情况进行逐项对照分析,重点关注客户集中度、现金流、合规状态等诊断指标,并优先落地AI工具市场多元化试点,避免空谈战略而忽视执行细节。
内容概要:本文围绕基于AICBIC准则的三变量Copula联合分布概率测算展开研究,系统阐述了如何利用赤池信息准则(AIC)和贝叶斯信息准则(BIC)科学选择最优的单变量边缘分布函数,并进一步通过AIC准则筛选出最适宜的三变量Copula函数类型,从而构建高精度的联合概率分布模型。研究采用Matlab编程实现全流程,涵盖数据预处理、边缘分布拟合、Copula函数族比较、模型评估及联合概率计算等关键环节,特别适用于存在非线性依赖和尾部相关性的复杂多变量系统,如能源、金融、环境等领域的风险联合分析。文中强调了模型选择的统计严谨性算法实现的可重复性,为极端事件的风险评估不确定性量化提供了可靠的技术路径。; 适合人群:具备扎实的概率统计学基础和Matlab编程能力的科研人员、工程师及数据分析从业者,尤其适合从事电力系统可靠性分析、金融风险管理、气候变化研究、水资源管理等涉及多变量联合概率建模的领域研究人员; 使用场景及目标:①解决传统线性相关假设无法捕捉的复杂非线性依赖尾部相关问题;②精确评估多个极端事件同时发生的联合发生概率,提升系统风险预警可靠性分析水平;③为不确定性量化、风险情景生成、优化调度及决策支持系统提供坚实的概率基础; 阅读建议:建议读者结合所提供的Matlab代码进行动手实践,深入理解AIC/BIC在模型选择中的判别机制,掌握边缘分布拟合Copula函数选取的核心技术细节,并尝试将该方法迁移应用于自身的实际研究数据中,以验证和拓展其应用价值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值