AI 排障翻车复盘:Codex 沙箱 ACL 的视野盲区

日期: 2026-10-09 机器: 工作机(Windows 26H1,企业终端管控软件管控) 关联场景: 同期的 AI 协作与终端加固讨论 一、事件档案 1.1 症状(今天集中爆发) 双击打开桌面程序弹"打开文件 - 安全警告:无法验证发布者"(微软签名的记事本副本也弹); 程序图标全部变白页; 移动/编辑/压缩用户目录下的文件也弹确认框; 部分程序点击"运行"后仍无法正常打开。 1.2 真实根因(实测确认) Codex 系 AI 编码工具的 Windows 沙箱,把它的 ACL 模板套在了整个 %USERPROFILE%\Desktop 目录树上。 桌面文件夹上被写入的非标准安全描述符: Everyone:(DENY)(DC) ← 拒绝删除 S-1-4-<本地标识>:(OI)(CI)(W,D,DC) ← 非标准 SID 获写/删除权 <机器名>\CodexSandboxUsers:(OI)(CI)(RX) ← Codex 沙箱组 Mandatory Label\Low Mandatory Level:(OI)(CI)(NW) ← 低完整性标签,继承给全部子文件 关键机制链: 文件被继承打上 Low Mandatory Level(低完整性)标签 → Windows 沿用 IE 保护模式时代的信任语义,把低完整性文件视为"来自互联网的不可信来源" → Explorer 对这些文件的启动一律走附件管理器警告(“无法验证发布者”,签名有效也无效), 不加载内容图标(白页),移动/压缩等操作也弹确认。 完整因果链的每一环都由此闭环:为什么签名无效、为什么图标变白、为什么只有 C 盘用户目录触发(只有桌面树被套模板,TEMP/用户根/D 盘标签正常)、为什么移动文件也弹。 1.3 时间线 时间 事件 2026-09-16 18:29 CodexSandboxOffline/Online 沙箱账号创建(Codex 系工具入驻本机) 无日志可查 某次以桌面为工作区的沙箱会话,将 ACL 模板套上桌面目录树 2026-10-08 症状集中爆发;同日机器重启 9 次(期间还在用 AI 工具排查,可能反复触发) 2026-10-08 晚 本轮排障,定位并修复 1.4 叠加因素(独立事件,已顺手处理) 桌面另有 897 个带"网络下载标记"(Mark of the Web)的文档,移动/压缩时同样弹窗——Windows 原生行为,已批量解除锁定; Snipaste"绑定快捷键失败"为故障会话残留状态,干净重启后自愈; 误诊期间曾怀疑该 EDR DLP(它确实向 Explorer 注入了钩子 DLL),最终证明与本症状无关——但注入事实本身值得另案记录。 1.5 修复动作 移除桌面文件夹上的 3 条沙箱 ACE + 完整性标签 Low→Medium(继承自动传播到全部子文件),重启 Explorer 刷新图标缓存。自动化终测:桌面 exe 直接启动、零弹窗。原 ACL 已备份至 Temp\desktop_acl_backup.txt。 ...

October 9, 2026 · 3 min · 570 words

如何搭建多 AI 工具的提示词架构(1)

日期: 2026-10-09 一、现场:一台机器上并存的四个 AI 王国 实测本机同时驻留四家 AI 编码工具,各自拥有独立的配置目录(dot-dir),互不统属: dot-dir 工具 指令文件约定(勘误后修正) 目录里还有 ~/.claude Claude Code ~/.claude/CLAUDE.md 会话、缓存、settings ~/.codex Codex CLI ~/.codex/AGENTS.md auth、config.toml、日志 ~/.dsh DeepSeek harness ~/.dsh/AGENTS.md profiles、sessions ~/.zcode ZCode ~/.zcode/AGENTS.md(用户级,最先注入)+ 工作区向上扫描 会话流水 、db、插件 两个实测观察: 观察一:文件名趋同,作用域割裂。 .codex 和 .dsh 里都有叫 AGENTS.md 的文件,但互不相通——“AGENTS.md"成了事实标准的文件名,阅读范围却是各家私有的。勘误补充:ZCode 官方指南证实它支持私有域,但GLM 5.3自己对自己的harness产品一开始理解错误. ~/.agents/skills|commands|mcp.json 兼容层,跨工具共享体系比初稿断言的"名存实亡"更完整,“割裂"仅对全局指令文件这一层成立。 观察二:dot-dir 是工具的"全部家当”。 以 .zcode 为例:会话流水(rollout/*.jsonl,长会话一天可涨数 MB)、结构化数据库、执行现场、图片缓存、插件、配置,实测 988 个文件。每个 dot-dir = 该工具的身份、记忆与状态的总和。 二、架构整理:共识层与角色层分离 四工具并存时,提示词内容天然分两类: 共识层:所有工具都该知道的事实——机器环境、网络规则、服务器、工作习惯、分工地图; 角色层:每家"你是谁、负责什么”——有意不同,不应镜像。 原状态是反面教材:共识与角色混在一份文件里,四家各持一份陈旧副本,彼此漂移。 对"跨工具标准"的准确表述:每家 harness 都有自己的配置约定,AGENTS.md 只是部分厂商采纳的兼容层。真实生态是:文件名事实趋同,阅读范围各家私有,共享靠人为桥接。 三、勘误与正解:ZCode 有用户级指令槽 Zcode初稿此处曾断言:“ZCode 没有自己的提示词目录,全局指令写死在 ~/AGENTS.md(home 根,所有会话共享的公共位置),其配置文件里没有任何指令路径的可配置项”,并"建议厂商提供 ~/.zcode/AGENTS.md"。发布后复读官方配置指南(zcode-guide 插件),证实该结论错误: ...

October 9, 2026 · 1 min · 101 words

256 位密码 vs 256 位密钥:挑战-应答认证的本质

一、问题起源 给服务器做完 SSH 密钥加固后,产生一个疑问: “私钥就是一个 256 位随机数,那我把密码也换成 256 位随机字符串,效果不是一样吗?” 答案:不一样。熵相同,机制完全不同。 二、核心区别 密码认证:秘密必须出门 你 ──发送密码──→ 服务器 ↓ 服务器拿收到的密码与存储的凭证比对 ↓ 问题: 1. 秘密在认证过程中"离开"了你的电脑 2. 服务器必须持有可验证凭证(明文或哈希) 3. 服务器被拖库 → 全用户秘密泄露(哈希可离线爆破) 4. 中间人截获 → 直接冒充你 密钥认证:秘密一生不出门 你 ←──随机考题── 服务器 ↓ 私钥在本地对考题签名 ↓ 你 ──只发签名──→ 服务器 ↓ 服务器用公钥验签 ↓ 问题全部化解: 1. 私钥从不出本机 2. 服务器只有公钥(= 锁),公钥泄露无所谓 3. 服务器被拖库 → 攻击者拿到锁,没用 4. 截获签名 → 签名只对当次随机考题有效,下道题变了就作废 三、256 位随机数的双重身份 原料相同: 密码和私钥都用 256 位随机数做原料 用法不同: 密码 = 把原料"递给对方看" 私钥 = 把原料锁在保险箱,只展示"开锁结果" 暴力破解难度相同: 2^256 ≈ 1.15 × 10^77 ≈ 宇宙原子总数 → 都不可爆破 但风险面不同: 密码在传输和存储环节暴露面大 私钥的风险只剩"文件被偷"这一个点 四、SSH 挑战-应答认证完整流程 ...

September 16, 2026 · 1 min · 193 words

网站慢排查实录:证书、CDN 与诊断方法论的教训

一、今天做了什么 1. 域名解析:renjiaxing.ren 的 A 记录 → 154.8.147.160(10 分钟生效) 2. 免费证书:申请腾讯云 90 天免费 DV 证书(TrustAsia CA) 3. 配置 HTTPS:Nginx 加载证书,HTTP 自动跳转 HTTPS 4. 排查"网站加载慢":最终发现是模板引用的境外 CDN 资源被墙 5. 资源本地化:font-awesome、jquery 下载到本地 static/,删除 busuanzi、mermaid 二、排查全程回顾(走弯路的每一步) 现象 电脑浏览器打开网站要 15-30 秒才出页面。手机秒开。 弯路 1:怀疑 Let’s Encrypt 证书的 OCSP 被墙 当时的证书:Let's Encrypt Windows curl 报错:CRYPT_E_REVOCATION_OFFLINE(吊销服务器离线) 分析:LE 的 OCSP 服务器在国内被墙,Windows schannel 检查吊销失败 行动:换腾讯云 TrustAsia 证书 结果:curl 不报错了,但 TLS 握手还是 15 秒——问题没解决 弯路 2:怀疑 TrustAsia 证书链的吊销检查 测试了所有吊销检查端点: ✓ 叶子证书 OCSP —— 0.19 秒(快) ✓ 中间证书 OCSP —— 快 ✓ 中间证书 CRL —— 快 ✓ 交叉根证书 CRL —— 0.29 秒(快,762 字节合法 CRL) 分析:TrustAsia 的"根证书"实际是波兰 Certum 交叉签发的, 怀疑 Windows 把交叉根当中间证书查 CRL → 查 Certum 波兰服务器超时 行动:开启 OCSP Stapling(服务器把吊销状态钉在握手包里) 结果:stapling 生效了(OCSP Response Status: successful), curl 还是 15 秒——问题依旧 弯路 3:怀疑 Windows 客户端自身 测试: ✓ 所有吊销检查 URL 直连都快 ✓ 服务器本地握手 4 毫秒 ✓ curl --ssl-no-revoke 秒过(证明问题在吊销检查) ✓ 手机同一 WiFi 秒进(排除网络路径问题) 行动:禁用 Windows 自动根证书更新(CTL 更新) 结果:curl 变快了!但浏览器还是慢——问题还在 弯路 4:真正的答案——F12 网络面板 浏览器 F12 → Network 标签 → 刷新 → 看到两个请求卡 30 秒: https://cdn.jsdelivr.net/npm/font-awesome@4.7.0/css/font-awesome.min.css https://cdn.jsdelivr.net/npm/jquery@3.6.3/dist/jquery.min.js 真相:jsDelivr CDN 在国内被墙! 模板 extend_head.html 是从 sulv 博客样例复制来的, 里面带了三个境外 CDN 引用:jsDelivr(两个)+ busuanzi 统计。 浏览器加载页面时死等这些资源超时——这就是"网站慢"的真正原因。 三、为什么一开始找不到? 复盘诊断过程,犯了三个错误: ...

August 20, 2026 · 3 min · 536 words

SQL 注入 Impossible(4):PHP 源码分析与四级对比

概述 DVWA SQL 注入的四个等级中,Impossible 不是让你攻破的——它是安全样例,告诉你"如果一开始就写对,前面那些漏洞根本不会存在"。本文逐一拆解四级源码,以 Impossible 为重点,看它如何从根源上消除 SQL 注入。 一、Low:裸奔 $id = $_REQUEST[ 'id' ]; $query = "SELECT first_name, last_name FROM users WHERE user_id = '$id';"; $result = mysqli_query($GLOBALS["___mysqli_ston"], $query); 问题清单 问题 代码体现 后果 无过滤 直接 $_REQUEST['id'] 进 SQL 输入即代码 字符型拼接 WHERE user_id = '$id' — 引号包裹 ' 可用于闭合字符串上下文 报错暴露信息 or die(...mysqli_error()...) 攻击者看到语法错误,帮助调试 payload 为什么 1' or '1'='1' # 能打穿 -- 拼接后: SELECT ... WHERE user_id = '1' or '1'='1' #' -- ↑ 闭合 ↑ 注入 ↑ 注释吞尾 攻击者的 ' 提前结束了字符串字面量,or '1'='1' 进入代码上下文,# 吞掉尾部多余引号。数据越界变成了代码。 ...

August 4, 2026 · 4 min · 692 words

SQL 注入 High(3):分页注入与三级对比总结

High 的变化 DVWA High 的 SQL 注入与 Low/Medium 不同——输入页面和结果页面分开了。 Low/Medium: 一个页面 — 上面输入框,下面结果 High: 两个页面 — Session 页面(输入 payload)→ 结果页面(看输出) 在 SQL Injection 主页面看到的是 “Click here to change your ID”,点击后弹出新页面输入 ID,Submit 后回到主页面看结果。 后端做了什么 High 的 PHP 源码逻辑: // 结果页面(sqli.php): if (isset($_SESSION['id'])) { $id = $_SESSION['id']; $query = "SELECT first_name, last_name FROM users WHERE user_id = '$id'"; // 执行查询,显示结果 } // 输入页面(sqli_session.php): $_SESSION['id'] = $_POST['id']; Payload 存在 PHP session 变量里,两个页面通过 $_SESSION['id'] 共享同一个值。SQL 语句本身没有任何变化——字符型注入,没有任何过滤。 ...

August 4, 2026 · 2 min · 400 words

SQL 注入 Medium(2):数字型注入与 Burp Suite 绕过

Medium 的变化 DVWA Medium 相比 Low 加了三道防线: 防线 Low Medium 有效吗 输入方式 文本框 下拉菜单(1-5) ⚠️ 前端限制,可绕过 请求方式 GET POST ⚠️ 换种发请求的方式 后端过滤 无 mysqli_real_escape_string() 转义 ' ❌ 数字型没有引号可转 关键发现:Medium 后端 SQL 是数字型——WHERE user_id = 1,没有单引号包裹参数。 绕过下拉菜单:curl + Burp Suite 代理 环境 Kali Firefox → Burp Suite (127.0.0.1:8081) → DVWA (127.0.0.1:8080) SSH 隧道:Kali 8080 → mycvm 127.0.0.1:8080(DVWA 容器) Burp 代理:Kali 8081 → 截获/修改请求 → 转发到 8080 Burp Suite 配置 Kali 桌面搜 burp → Burp Suite Community → Temporary project → Use Burp defaults → Start Proxy → Options → Proxy Listeners → 确认/添加 127.0.0.1:8081 Firefox → Settings → Network Settings → Manual proxy → 127.0.0.1:8081 → 勾选 “Also use this proxy for HTTPS” 用 curl 绕过下拉菜单 DVWA Medium 的 SQL Injection 使用 POST 请求。curl 直接发 POST,不受前端下拉菜单限制: ...

August 4, 2026 · 4 min · 650 words

SQL 注入 Low(1):字符型注入与手工测试流程

第一部分:SQL 注入概述 什么是 SQL 注入 SQL 注入(SQL Injection)是将恶意的 SQL 语句片段插入到应用程序的输入参数中,让后端数据库误以为这是合法的查询指令并执行它。 简单说:你的输入被当作代码执行了。 正常请求: 浏览器 → 输入 user_id=1 → 服务器 → SQL: SELECT * FROM users WHERE id='1' → 返回 admin 注入请求: 浏览器 → 输入 user_id=1' or '1'='1' # → 服务器 → SQL 被篡改 → 返回全部用户数据 为什么 SQL 注入能成立 三个条件同时满足: 用户输入直接拼接到 SQL 语句中(没有参数化查询) 输入中的特殊字符('、"、--、#)没有被转义或过滤 数据库把拼接后的字符串当作 SQL 执行 这三个条件缺一个,注入就不成立。 注入的本质:脱离数据上下文,进入代码上下文 SELECT * FROM users WHERE id = '1' │ │ │ └── 后引号(后端写死的) └── 前引号(后端写死的,你的输入从它后面开始) -- 正常输入时,你的数据在引号里——是"数据" -- 你的输入里包含 ' 后,你提前闭合了引号——后面的内容进入了"代码"区域 -- 这就是注入的本质 什么是 Payload Payload = 攻击载荷 = 你精心构造的那段输入字符串。 ...

August 4, 2026 · 5 min · 1027 words

SQL 注入基础:字符型注入与手工测试流程

第一部分:SQL 注入概述 什么是 SQL 注入 SQL 注入(SQL Injection)是将恶意的 SQL 语句片段插入到应用程序的输入参数中,让后端数据库误以为这是合法的查询指令并执行它。 简单说:你的输入被当作代码执行了。 正常请求: 浏览器 → 输入 user_id=1 → 服务器 → SQL: SELECT * FROM users WHERE id='1' → 返回 admin 注入请求: 浏览器 → 输入 user_id=1' or '1'='1' # → 服务器 → SQL 被篡改 → 返回全部用户数据 为什么 SQL 注入能成立 三个条件同时满足: 用户输入直接拼接到 SQL 语句中(没有参数化查询) 输入中的特殊字符('、"、--、#)没有被转义或过滤 数据库把拼接后的字符串当作 SQL 执行 这三个条件缺一个,注入就不成立。 注入的本质:脱离数据上下文,进入代码上下文 SELECT * FROM users WHERE id = '1' │ │ │ └── 后引号(后端写死的) └── 前引号(后端写死的,你的输入从它后面开始) -- 正常输入时,你的数据在引号里——是"数据" -- 你的输入里包含 ' 后,你提前闭合了引号——后面的内容进入了"代码"区域 -- 这就是注入的本质 什么是 Payload Payload = 攻击载荷 = 你精心构造的那段输入字符串。 ...

August 4, 2026 · 5 min · 1027 words

Linux 基础:tmux 和 vim 操作

一、tmux — 终端复用器 它解决什么问题 SSH 连接到远程服务器时,一旦网络断开或关闭终端窗口,正在运行的程序(比如 hugo server、apt install)会被强制终止。 tmux 在用户和服务器之间插入了一个持久层——你关掉终端、断开 SSH,tmux 里的程序继续跑。下次连上,tmux a 一切恢复原样。 普通 SSH: SSH + tmux: 你 ──SSH── 服务器 你 ──SSH── 服务器 │ │ 跑程序 tmux(持久层) │ │ SSH 断开 → 程序死 SSH 断开 → tmux 里的程序继续跑 下次连上 → tmux a → 恢复 层级结构 tmux 服务 ├── session 0(工作区 A:博客开发) │ ├── window 0(这个窗口跑 hugo server) │ │ ├── pane 0(左边:编辑 config.yml) │ │ └── pane 1(右边:看日志) │ └── window 1(这个窗口跑 docker) │ └── pane 0 ├── session 1(工作区 B:渗透练习) │ ├── window 0(DVWA 目录) │ └── window 1(查资料) └── session 2 session = 独立工作区,window = 浏览器标签页,pane = 分屏。 你在一个 session 里"挂起"(detach),另一个终端可以"接入"(attach),无缝切换。 ...

August 1, 2026 · 5 min · 865 words