LFZ 的技术笔记

分类: 技术分享

技术教程、工具推荐、开发实战

  • 🔥 一个!符号让攻击者获得 root 权限 — CVE-2026-23111 Linux 内核漏洞深度解析

    🔥 一个!符号让攻击者获得 root 权限 — CVE-2026-23111 Linux 内核漏洞深度解析

    2026 年 6 月,安全研究人员披露了一个令人瞠目结舌的 Linux 内核漏洞:代码中一个多余的感叹号”!”,让任意普通用户可以直接提权到 root。更震撼的是,PoC 现已公开,稳定率超过 99%。本文将深入分析 CVE-2026-23111 的技术细节与应急方案。


    🔍 漏洞概览

    CVE-2026-23111 位于 Linux 内核的 nf_tables 子系统——这是现代 Linux 的包过滤框架,替代了传统的 iptables。漏洞类型为 Use-After-Free(UAF),CVSS 评分 7.8(High)

    • CVE 编号:CVE-2026-23111
    • 漏洞类型:Use-After-Free(释放后使用)→ 本地权限提升
    • 影响组件:Linux kernel nf_tables 包过滤子系统
    • 攻击前提:需要本地普通用户权限 + unprivileged user namespaces(默认开启)
    • 影响范围:Ubuntu 22.04/24.04/25.10、Debian Bookworm/Trixie、RHEL 10、SUSE、Amazon Linux 等主流发行版

    ⚙️ 技术根因:一个感叹号引发的”血案”

    漏洞函数是 nft_map_catchall_activate(),它在 nf_tables 事务回滚阶段(Abort Phase)负责重新激活 catchall 元素。问题出在一行代码的逻辑取反上:

    /* ❌ 错误的代码 - nft_map_catchall_activate() */
    if (!nft_set_elem_active(ext, genmask))
        continue;  /* 跳过非活跃的,处理活跃的 → 刚好反了!*/
    
    /* ✅ 修复后的代码 - 删掉那个 "!" */
    if (nft_set_elem_active(ext, genmask))
        continue;  /* 跳过活跃的,只处理非活跃的 → 正确!*/

    这个反逻辑导致了什么后果?当一条 nft 事务(比如删除一个规则集)失败触发回滚时:

    1. 引用计数不增反减:本该增加的 chain->use 引用计数未被正确恢复
    2. 每次回滚都扣一次:每触发一次 abort 周期,引用计数就永久减少 1
    3. 引用计数归零:当 chain->use 变为 0 时,DELCHAIN 操作可以成功删除这个 chain
    4. 释放后使用:chain 虽已被释放,但 catchall verdict 元素仍然指向它——UAF 条件达成

    攻击者随后通过 seq_operations spray、msg_msg 堆风水等经典内核利用技术,完成内核基址泄露 → 堆地址泄露 → ROP 链执行 → 禁用 SELinux → 替换 modprobe_path → 提权到 root 的完整攻击链。


    🎯 攻击场景:不止是本地提权

    虽然漏洞需要本地访问权限,但在以下场景中威胁尤为严峻:

    • 共享主机 / 跳板机 / CI 构建服务器:任意有 shell 的用户 → 直接 root
    • Kubernetes 容器逃逸:攻击者从被攻陷的 pod 内部突破到宿主机
    • 云 VM 横向移动:获得低权限账户后迅速提权控制整台实例

    据 Exodus Intelligence 的测试,该漏洞在空闲系统上的利用稳定率超过 99%——内核常见的 KASLR、SMEP/SMAP 等防护机制均被绕过。


    🛡️ 检测你的系统是否受影响

    立刻检查当前内核版本:

    # 查看内核版本和构建日期
    uname -r    # 如 6.8.0-50-generic
    uname -v    # 编译日期信息
    
    # 检查 nf_tables 模块是否加载
    lsmod | grep nf_tables
    
    # 检查 unprivileged user namespaces 是否启用(默认开启)
    sysctl kernel.unprivileged_userns_clone
    # 返回 1 表示开启

    各发行版已修复版本参考

    • Ubuntu:22.04 LTS → 5.15.0-134+ / 24.04 LTS → 6.8.0-52+
    • Debian:Bookworm → 6.1.129+ / Trixie → 6.12.20+
    • RHEL 10:kernel-10.0.0-55+
    • 上游主线:6.14+ 已包含修复(2026 年 2 月 5 日合入)

    更新后必须重启系统,内核热补丁需要重启才能生效:

    # Ubuntu/Debian
    sudo apt update && sudo apt upgrade linux-image-$(uname -r)
    sudo reboot
    
    # RHEL/CentOS
    sudo yum update kernel && sudo reboot

    🔒 无法立即更新?试试缓解措施

    如果因为业务连续性无法立刻重启,可以通过限制 user namespaces 阻断攻击路径:

    # 临时禁用 unprivileged user namespaces(立即生效)
    sudo sysctl -w kernel.unprivileged_userns_clone=0
    
    # 写入 sysctl 配置使其持久化
    echo "kernel.unprivileged_userns_clone=0" | sudo tee /etc/sysctl.d/99-disable-userns.conf
    
    # 注意:Docker/Podman 容器需要该特性,禁用后容器可能无法正常运行

    替代方案:如果必须保留容器能力,可以使用 apparmorseccomp 策略限制 nf_tables 的调用,但有效性不如直接修补内核。


    ⏱️ 时间线回顾

    • 2026 年 2 月 5 日:上游内核合入修复补丁(删掉一个”!”)
    • 2026 年 4 月 16 日:FuzzingLabs 发布独立 PoC
    • 2026 年 6 月 8 日:Exodus Intelligence 发布完整技术分析
    • 2026 年 6 月 10 日:Ars Technica / The Hacker News 等媒体报道,引起广泛关注

    💡 快速参考

    操作命令
    检查内核版本uname -r && uname -v
    检查 nf_tables 模块lsmod | grep nf_tables
    检查 user namespace 状态sysctl kernel.unprivileged_userns_clone
    临时禁用提权路径sudo sysctl -w kernel.unprivileged_userns_clone=0
    Ubuntu 更新内核sudo apt update && sudo apt upgrade linux-image-$(uname -r)
    Debian 更新内核sudo apt update && sudo apt upgrade linux-image-$(uname -r)
    RHEL 更新内核sudo yum update kernel
    查看 CVE 详情https://nvd.nist.gov/vuln/detail/CVE-2026-23111

    📝 结语

    CVE-2026-23111 再次印证了“差之毫厘,谬以千里”——一个字符的错误让 Linux 内核的防御体系形同虚设。所幸上游修复已在 2 月合入,所有主流发行版也已跟进。建议所有运维人员立即检查内核版本并安排重启。安全无小事,更何况只是一个”!”的距离。

    参考来源Ars Technica | The Hacker News | FuzzingLabs

  • 🔥 WWDC 2026 深度解读:Siri AI 时代到来,开发者如何迁移到 App Intents?

    🔥 WWDC 2026 深度解读:Siri AI 时代到来,开发者如何迁移到 App Intents?

    WWDC 2026 上,Apple 正式发布了由 Google Gemini 1.2T 模型驱动的全新 Siri AI,同时宣布弃用运行了十年的 SiriKit,强制开发者迁移到 App Intents 框架。这是自 2016 年 SiriKit 推出以来最大的一次架构变革。本文为开发者解读技术细节,并提供可操作的迁移指南。


    🔥 Siri AI 的技术架构

    新的 Siri AI 采用混合处理架构:简单请求在设备端由 Apple Foundation Models 处理,复杂查询则路由到 Google Cloud 上的 Nvidia Blackwell B200 GPU 运行 Gemini 模型。

    • 设备端:Apple 自研 Foundation Models,处理本地语音/文本指令
    • 云端:1.2T 参数 Gemini 专版,支持多步推理、跨设备对话历史、图片/文档附件
    • 隐私保护:Nvidia 硬件级机密计算加密,Apple 合同禁止 Google 用 Siri 数据训练模型
    • 成本:小开发者可免费使用 Private Cloud Compute(App Store Small Business Program 成员且应用首次下载<200万)

    对开发者来说,最核心的变化是:Siri 不再是”我说你听”的单轮问答,而是支持多轮对话、跨 App 链式操作的智能代理


    ⚠️ 关键变化:SiriKit 退役,App Intents 成为唯一入口

    这是本次 WWDC 对开发者影响最大的决策。

    Apple 给了 2-3 年迁移窗口期,但最终所有 Siri 交互必须通过 App Intents。未迁移的应用在 Siri AI 中将”功能不可见”——Siri 无法发现和调用它们的任何能力。

    SiriKit vs App Intents 对比

    维度SiriKit(已弃用)App Intents(强制迁移)
    定义方式XML Intent 定义文件纯 Swift,编译器生成元数据
    处理流程独立的 Intent Extension 进程直接向 App 发起 perform 请求
    发现机制有限的固定 Intent 域OS 读取元数据,无需启动 App
    对话能力单轮,以 Siri 卡片结束流式多轮,支持后续追问
    跨 App 链式不支持Siri AI 可自动编排多个 App Intent

    💻 App Intents 代码实战

    以下是一个最小可用的 App Intent 示例——让 Siri AI 能发现并执行”记录健身”操作:

    // 导入 App Intents 框架
    import AppIntents
    
    // 定义一个 Siri AI 可自动发现的动作
    struct LogWorkoutIntent: AppIntent {
        // 意图标题(Siri 用它匹配用户自然语言)
        static let title: LocalizedStringResource = "记录健身"
    
        // 参数:活动类型
        @Parameter(title: "活动类型")
        var activity: String
    
        // 参数:持续时间(分钟)
        @Parameter(title: "时长(分钟)")
        var minutes: Int
    
        // 执行逻辑
        func perform() async throws -> some IntentResult & ProvidesDialog {
            // 调用你的业务逻辑
            try await WorkoutStore.shared.log(activity, minutes: minutes)
            // 返回对话式反馈给 Siri
            return .result(dialog: "已记录 \(minutes) 分钟 \(activity)")
        }
    }

    关键要点:

    • 使用 @Parameter 声明参数,Siri AI 会自动提取用户话语中的信息填充
    • 返回 ProvidesDialog 可实现对话式回复,支持多轮交互
    • 所有 Intent 必须在 Info.plist 中注册(Xcode 27 支持自动发现)

    🧠 Foundation Models Framework:直接调用 Apple Intelligence

    WWDC 26 新引入的 Foundation Models Framework 让开发者可以直接在 App 中调用 Apple 的设备端和云端 AI 模型——不仅是 Siri 功能,而是任何 AI 场景。

    import FoundationModels
    
    // 创建模型实例(设备端优先,自动降级到云端)
    let model = try await LLM.shared.createModel()
    
    // 多模态提示——传图片+文字
    let response = try await model.generate(
        prompt: .text("描述这张图片中的场景"),
        attachments: [.image(screenshot)]
    )
    print(response.text)

    该框架还提供了 fm CLI 命令行工具和 Python SDK,可以在构建脚本或 CI 流程中调用 Apple AI。配合新的 Evaluations 框架,可以编写自动化测试来验证 AI 功能的正确性。


    ⚙️ Xcode 27:设备端 AI 编程助手

    Xcode 27 内置了 Apple Intelligence 驱动的代码补全,支持预测性多行补全,全部在设备端 Apple Silicon 上运行,不泄露代码。同时开放第三方模型接口——开发者可以配置 Xcode 将补全请求路由到外部 AI 模型。


    📋 开发者迁移清单

    1. 审计 SiriKit:盘点所有语音功能,评估迁移影响范围
    2. 实现 App Intents:优先覆盖 3-5 个核心用户操作,支持流式多轮
    3. 配置隐私清单:用新 API 声明哪些 Intent 可上云、哪些必须留在设备端
    4. 适配折叠屏 API:新增 Adaptive Layout,处理铰链状态检测
    5. 迁移 UI:过渡到 Liquid Glass 2 设计语言(新设计 Token + 透明度滑块)
    6. 注册 App Intents Testing:用新测试框架验证 Siri/Shortcuts/Spotlight 集成

    💡 快速参考卡片

    操作关键命令/API
    定义 App Intentstruct XxxIntent: AppIntent
    声明参数@Parameter(title: "参数名")
    执行 + 对话回复func perform() -> ProvidesDialog
    调用设备端 AILLM.shared.createModel()
    CLI 调用 AIfm prompt "你的指令"
    调试 AI 性能Xcode 27 Instruments→ AI Profiling
    测试 App IntentsApp Intents Testing Framework

    WWDC 2026 标志着 Siri 从”语音助手”进化为”AI 代理”——而 App Intents 就是开发者接入这个新生态的钥匙。建议团队现在就开始迁移计划,2-3 年的窗口看似充裕,但 Core 功能的 Intents 设计和测试需要时间迭代。

  • 🔥 开源替代 Claude Design 来了!Open Design 本地优先、支持 21+ 编程助手的 Agent-native 设计平台

    🔥 开源替代 Claude Design 来了!Open Design 本地优先、支持 21+ 编程助手的 Agent-native 设计平台

    2026年4月,Anthropic 发布了 Claude Design,开创了”AI 原生设计”的新范式——但它是闭源的、云端托管的、且锁定在 Anthropic 生态。仅仅八周后,一个社区驱动的开源项目 Open Design 以 57,400+ GitHub Stars 证明:设计生成应该属于每一个开发者,不受厂商锁定、数据完全本地可控。本文将带你从零部署 Open Design,并理解它的 Skill-as-File 架构如何颠覆传统设计工具。


    🔥 Open Design 是什么?

    Open Design 是一个本地优先、开源(Apache-2.0)、Agent-native的设计生成平台。它不是另一个 Figma 或 Canva——它是一个让 AI 编程助手(Claude Code、Cursor、Copilot 等)直接从命令行生成高保真设计成品的系统。

    核心理念:“Skill-as-File”——设计逻辑不再是藏在脑中的 Prompt 技巧,而是以 Markdown 文件形式存储在文件系统中,可版本控制、可团队共享、可被 CI/CD 调用。

    关键数据

    • ⭐ GitHub Stars:58,900+(截至 6月5日)
    • 🗂️ 内置 Skills(设计技能):259+ 个可复用模块
    • 🎨 内置 Design Systems:149+ 套品牌设计系统(Stripe、Vercel、Apple 等)
    • 🤖 支持 CLI 适配器:21+ 个 AI 编程助手
    • 📜 许可证:Apache-2.0,完全开源

    ⚙️ 三种部署方式

    根据你的使用场景,Open Design 提供三种部署路径:

    方案一:桌面应用(推荐零配置)

    open-design.ai 下载原生安装包,支持 macOS(Apple Silicon / Intel)和 Windows(x64)。开箱即用,内置 Electron 壳和本地守护进程。

    方案二:CLI 快速安装(适合已有 CLI Agent 的开发者)

    # 一行命令:安装 Open Design 并接入 Claude Code
    curl -fsSL https://open-design.ai/install.sh | sh -s claude
    
    # 接入 Cursor(目录下会自动识别)
    curl -fsSL https://open-design.ai/install.sh | sh -s cursor
    
    # 检测所有可用 Agent(无需手动配置)
    # Open Design 的守护进程会自动扫描 PATH 中的 21+ 种 CLI 工具

    方案三:Docker 自托管(生产环境推荐)

    适合团队部署或数据合规要求严格的场景——所有设计数据存储在本地 SQLite 中,不经过第三方服务器。

    # 克隆仓库并启动 Docker Compose
    git clone https://github.com/nexu-io/open-design.git
    cd open-design/deploy
    
    # 配置环境变量(生成随机 Token)
    cp .env.example .env
    echo "OD_API_TOKEN=$(openssl rand -hex 32)" >> .env
    
    # 启动服务
    docker compose up -d

    🧠 架构深度解析:Skill-as-File

    Open Design 最革命性的设计是它用纯文件系统替代了传统设计工具的数据库和闭源格式。整个平台由三层构成:

    1. Skill(技能层)

    每个 Skill 是一个文件夹,内含 SKILL.md + 资源文件。例如内置的 html-ppt Skill 包含 36 个主题、31 种布局、47 种动画、14 个模板——相当于一个浏览器内的 PPT 引擎。

    2. Design System(设计系统层)

    品牌身份以 DESIGN.md 文件定义,涵盖 9 个维度:color · typography · spacing · layout · components · motion · voice · brand · anti-patterns。内置 149+ 套品牌系统,从 Stripe 到 Apple 一应俱全。

    3. Plugin(插件层)

    通过 open-design.json 清单文件定义的自包含功能包,目前社区已有 260+ 个官方插件。

    当你让 Claude Code “用 Stripe 设计系统生成一个 Landing Page” 时,底层的 Prompt Stack 是这样组合的:

    # Open Design 的 Prompt Stack 结构(文件级组合)
    DISCOVERY directives         # 发现层:表单收集需求
      + identity charter         # 身份层:设计原则与反模式
      + active DESIGN.md         # 品牌层:选中的设计系统
      + active SKILL.md          # 技能层:选中的生成技能
      + project metadata         # 项目元数据
      + skill side files         # 辅助文件:模板、参考
      + DECK_FRAMEWORK           # 渲染框架指令

    🔌 MCP 集成:无缝接入你的编程助手

    Open Design 通过 MCP(Model Context Protocol)暴露本地设计资源,让主流 AI 编辑器直接读取你的设计系统:

    # 将 Open Design MCP 服务器安装到不同 Agent
    od mcp install claude     # 接入 Claude Code
    od mcp install cursor     # 接入 Cursor
    od mcp install copilot    # 接入 GitHub Copilot
    
    # 然后在 Agent 中直接使用:
    # > "Use open-design to generate a landing page with Linear design system"

    💡 快速参考

    操作命令/方式
    桌面端安装open-design.ai 下载原生安装包
    CLI 一键接入curl -fsSL https://open-design.ai/install.sh | sh -s claude
    Docker 部署git clone && cd deploy && docker compose up -d
    MCP 集成od mcp install cursor
    生成 Landing Page在 Agent 中输入:Use open-design to generate a landing page with Stripe design system
    数据存储位置.od/projects/ (文件) + .od/app.sqlite (数据库)
    兼容模型Claude Code / Cursor / Copilot / Gemini CLI / OpenCode 等 21+

    Open Design 代表了 AI 设计工具的下一个阶段:开源、本地优先、Agent-native。它把设计能力从云端 SaaS 的围墙花园中解放出来,让每一位开发者都能用自己熟悉的编程助手,在自己的数据主权范围内,生成品牌级的专业设计成品。如果你已经是一名 Claude Code 或 Cursor 用户,Open Design 绝对值得今晚就上手试试。

  • 低配 VPS 部署 OpenClaw 完整指南

    低配 VPS 部署 OpenClaw 完整指南

    OpenClaw 是一个轻量的 AI Agent 网关工具。在低配 VPS(1核1G甚至更低)上部署时,需要一些特别的步骤来避免 systemd 服务错误。本文记录完整流程。

    一、安装基本依赖

    1. 安装 curl

    sudo apt-get install -y curl

    2. 添加 NodeSource 官方源(Node 22)

    curl -fsSL https://deb.nodesource.com/setup_22.x | sudo bash -

    3. 安装 Node.js

    sudo apt-get install -y nodejs

    4. 确认版本

    node -v
    npm -v

    二、安装 OpenClaw

    npm install -g openclaw@latest
    openclaw --version

    三、配置与 systemd 服务

    直接运行 openclaw onboard 开始配置。但 root 用户下会报服务错误,需要手动创建 systemd 服务文件。

    第一步:创建 systemd 服务文件

    cat > /etc/systemd/system/openclaw-gateway.service << 'EOF'
    [Unit]
    Description=OpenClaw Gateway
    After=network-online.target
    Wants=network-online.target
    
    [Service]
    Type=simple
    User=root
    WorkingDirectory=/root/.openclaw
    ExecStart=/usr/bin/openclaw gateway
    Restart=always
    RestartSec=3
    Environment=NODE_OPTIONS=--max-old-space-size=512
    Environment=OPENCLAW_NO_RESPAWN=1
    Environment=NODE_COMPILE_CACHE=/var/tmp/openclaw-compile-cache
    Environment=HOME=/root
    
    [Install]
    WantedBy=multi-user.target
    EOF

    第二步:设置运行时目录(如仍报错)

    如果仍然报运行时目录错误,执行:

    export XDG_RUNTIME_DIR=/run/user/$(id -u)
    loginctl enable-linger root
    echo 'export XDG_RUNTIME_DIR=/run/user/$(id -u)' >> ~/.bashrc

    第三步:启动服务

    systemctl --user daemon-reload
    systemctl --user enable openclaw-gateway.service
    systemctl --user start openclaw-gateway.service

    第四步:确认状态

    openclaw status

    四、网关诊断与 Cerebras 配置参考

    网关诊断

    openclaw gateway probe
    openclaw gateway restart   # 重启服务

    Cerebras API 配置示例

    在 OpenClaw 配置中添加 Cerebras 作为 provider:

    {
      "models": {
        "providers": {
          "cerebras": {
            "baseUrl": "https://api.cerebras.ai/v1",
            "apiKey": "你的Cerebras API Key",
            "api": "openai-completions",
            "models": [
              {
                "id": "gpt-oss-120b",
                "name": "gpt-oss-120b",
                "contextWindow": 128000,
                "maxTokens": 32000
              }
            ]
          }
        }
      }
    }

    五、卸载

    需要完全卸载时的操作步骤:

    1. 停止并禁用服务

    systemctl stop openclaw-gateway.service
    systemctl disable openclaw-gateway.service

    2. 删除服务文件

    rm /etc/systemd/system/openclaw-gateway.service
    systemctl daemon-reload

    3. 卸载 openclaw

    npm uninstall -g openclaw

    4. 删除数据目录

    rm -rf /root/.openclaw

    5. 确认进程已终止

    ps aux | grep openclaw
  • Ubuntu 上如何配置防火墙?—— UFW 快速入门

    Ubuntu 上如何配置防火墙?—— UFW 快速入门

    Ubuntu 上,默认情况下是没有启用防火墙的。服务器安装完系统后,配置防火墙应该是第一件要做的事。本文用最简洁的方式带你配好 UFW。

    🔥 Ubuntu 自带的防火墙工具

    Ubuntu 默认自带的、也是推荐使用的防火墙管理工具是 UFWUncomplicated FireWall,简单防火墙)。

    • UFWiptables 的用户友好前端,日常管理比直接写 iptables 规则方便得多。
    • 语法简单、学习成本低、适合服务器日常运维。

    ⚙️ 防火墙设置与管理

    1. 启用防火墙

    配置规则之前,建议先启用 UFW。⚠️ 但有一个前提:请先确保你已经放行了 SSH(端口 22),否则启用后自己会被锁在服务器外面。

    先放行 SSH:

    sudo ufw allow ssh

    然后启用防火墙:

    sudo ufw enable
    sudo ufw status          # 查看状态
    sudo ufw status verbose  # 查看详细状态 + 默认策略

    2. 设置默认策略

    默认策略决定了没有匹配规则的连接如何处理:

    sudo ufw default deny incoming    # 拒绝所有传入(最安全)
    sudo ufw default allow outgoing   # 允许所有传出(默认)

    🔓 开放端口与服务

    A. 按端口号开放

    # 开放 TCP 端口(最常用)
    sudo ufw allow 80/tcp    # HTTP
    sudo ufw allow 443/tcp   # HTTPS
    
    # 开放 UDP 端口
    sudo ufw allow 53/udp    # DNS
    
    # TCP + UDP 同时开放
    sudo ufw allow 123       # NTP

    B. 按服务名称开放

    UFW 内置了常用服务名(映射到 /etc/services):

    sudo ufw allow ssh       # TCP 22
    sudo ufw allow http      # TCP 80
    sudo ufw allow https     # TCP 443

    C. 按应用程序配置文件开放

    某些程序安装时会自带 UFW 配置文件:

    # 查看可用的应用程序配置
    sudo ufw app list
    
    # 开放特定应用
    sudo ufw allow 'Nginx Full'

    🗑️ 删除与重置

    删除规则

    # 删除一条规则
    sudo ufw delete allow 80/tcp

    重置防火墙(谨慎!)

    ⚠️ 此操作会删除所有规则并禁用防火墙

    sudo ufw reset

    💡 快速参考卡片

    操作命令
    启用防火墙sudo ufw enable
    查看状态sudo ufw status verbose
    开放端口sudo ufw allow 80/tcp
    开放服务sudo ufw allow ssh
    删除规则sudo ufw delete allow 80/tcp
    重置sudo ufw reset

    做到这四步——放行 SSH、启用、配默认策略、开放必要端口——你的 Ubuntu 服务器防火墙就算配好了。