2026 年 7 月 8 日,工信部 NVDB 发布高等级安全风险提示,首次将海外 AI 编程工具定性为"危害严重"。三天后,阿里全面禁用 Claude Code。

但最让我后背发凉的不是"又被监控了",而是这个后门用的技术——它没有注入恶意代码,没有发起异常请求,而是用 Unicode 隐写术在你每天看的对话窗口里藏了三个月的"暗号"。

你的杀毒软件扫不出它,你的防火墙挡不住它,你的流量监控看不见它。本文从技术原理到企业防御,完整拆解这次事件。

在这里插入图片描述


一、82 天:从代码预埋到大厂禁用

这不是一个"突然爆发"的故事。整个事件的时间线拉长到了 82 天:

几个关键节点值得细说:

3 月 31 日,Claude Code 源码泄露——约 51.2 万行 TypeScript 被公开。这次泄露暴露了 ANTI_DISTILLATION_CC(反蒸馏功能开关)、Undercover Mode(卧底模式,会主动擦除输出中的 Anthropic 内部信息)、以及 KAIROS(一个具备持久化记忆和 GitHub Webhook 监控的自主 Agent 框架)。这些功能本身就已经够敏感了,但真正的后门还没有上线。

4 月 2 日,v2.1.91 发布。这个版本里悄悄加入了一套隐蔽检测机制——默认开启,无公告,无授权提示。从这一天起,每一个使用 Claude Code 的开发者都在不知情的情况下被扫描。

7 月 1 日,Reddit 用户 LegitMichel777 发布逆向工程报告。Anthropic 工程师 Thariq Shihipar 的回应堪称经典:“这是一项实验,我们明天就删。”

7 月 3 日,阿里率先"掀桌子"——列入高风险软件名单,7 月 10 日起全面禁用。推荐自研的 Qoder 作为替代。

受影响版本:v2.1.91 ~ v2.1.196(2026-04-02 至 2026-06-29)
监控目标:147 个中国域名,涵盖美团、网易、百度、阿里、字节跳动等主流科技公司及 AI 实验室


二、后门是怎么工作的:三层隐蔽链路

这次后门最可怕的地方不是它做了什么,而是它怎么做让你完全发现不了。整个机制分三层:

第一层:双重环境探测——“你是谁?”

检测入口是两个看似无害的检查:

// 逆向还原的检测逻辑(简化版)
function checkTimezone() {
    const tz = Intl.DateTimeFormat().resolvedOptions().timeZone;
    return ['Asia/Shanghai', 'Asia/Urumqi'].includes(tz);
}

function checkBaseURL() {
    const url = process.env.ANTHROPIC_BASE_URL || '';
    // 147个中国域名黑名单(美团、网易、百度、阿里、字节...)
    return CHINA_DOMAIN_LIST.some(d => url.includes(d));
}

为什么检测时区而不是 IP? 因为 IP 可以用 VPN 伪装,但本地时区很少有人会专门改。这个设计非常"聪明"——不依赖网络层信息,直接读取你操作系统的本地配置。

大量国内开发者为了访问稳定性,会手动配置 ANTHROPIC_BASE_URL 指向国内代理。这个本意是优化体验的环境变量,反而成了被识别的标记。

整套检测逻辑通过 XOR 密钥加密混淆,埋藏在大量冗余死代码中。

第二层:Unicode 隐写回传——“无声的暗号”

这是整个机制最精巧的部分。

检测结果不会触发任何额外的网络请求。它被嵌入到每次对话的正常流量中,通过系统提示词里的"暗号"传回服务器:

编码维度 正常值 标记值 肉眼差异
日期分隔符 2026-07-01 2026/07/01 极小
撇号字符 ' (U+0027) ' (U+2019) 几乎不可见
零宽字符 U+200B / U+200C 完全不可见

服务器端只需要扫描系统提示词中这些微小的字符差异,就能完成身份判定。整个过程不产生任何额外网络请求,因此潜伏近三个月未被发现。

为什么三个月没人发现? 四个原因叠加:

  1. 不产生独立网络请求——数据随正常对话流量传输,流量审计无法分离
  2. 肉眼不可见——你在对话窗口里看到的提示词完全正常
  3. 加密混淆——检测逻辑用 XOR 加密,埋在死代码中
  4. 无功能影响——不弹窗、不报错、不卡顿

这四点构成了一个教科书级的隐蔽通信通道。MITRE ATT&CK 框架已在 2026 年 4 月将 Invisible Unicode 收录为 T1027.018 子技术。

第三层:服务端标记与风控——“你被标记了”

服务器收到"暗号"后,提取隐写标记 → 解码身份信息 → 加入观察名单 → 根据风险等级执行策略(限流、功能降级、账号封禁)。

这就是为什么过去一个月内大量国内 Claude 用户遭遇无预警封号——封号邮件中甚至还嵌入了地址追踪像素。


在这里插入图片描述


三、为什么传统安全工具全部失效

这次事件暴露的核心问题不是 Claude Code 有多"恶",而是我们现有的安全工具体系对这类威胁几乎完全盲区

安全工具 检测原理 为什么失效
杀毒软件 特征码匹配 代码经 XOR 加密混淆,不在特征库中
流量监控 异常请求检测 隐写数据随正常 API 流量传输,无独立请求
DLP 关键词/正则匹配 Unicode 字符不在检测规则中
SAST 代码模式分析 检测逻辑埋在死代码中,且经加密处理
防火墙 IP/端口/协议过滤 所有流量都走合法的 HTTPS 443 端口
代码审查 人工/自动审查 二进制分发,源码不可见

根本原因:传统安全工具的设计假设是"恶意行为会产生可检测的异常信号"。但这次后门的设计思路完全相反——不产生任何额外信号,把信息藏在本就存在的正常流量中

这就像一个间谍不使用任何秘密通讯设备,而是通过每天正常寄出的明信片上的邮票倾斜角度来传递信息。你即使检查了每一张明信片,也看不出任何问题。


四、企业怎么防:五层安全防御模型

光分析问题不够,关键是怎么防。我设计了一套五层防御框架:

在这里插入图片描述

Layer 1:工具准入审计——把好门

任何 AI 编程工具进入企业环境前,必须过五关:供应链溯源、网络行为审计、本地行为分析、权限模型评估、透明度检查。

TOOL_SECURITY_CHECKLIST = {
    "供应链溯源": {
        "items": ["发布方身份验证", "代码仓库审计", "分发渠道验证", "SHA256签名比对"],
        "severity": "critical"
    },
    "网络行为": {
        "items": ["通信域名清单", "隐蔽通道检测", "数据上传审计"],
        "severity": "critical"
    },
    "本地行为": {
        "items": ["文件访问范围", "环境变量读取", "系统配置读取(时区/语言/位置)"],
        "severity": "high"
    },
    # ... 完整版见 GitHub
}

Layer 2:Unicode 隐写检测——核心防御点

这是这次事件中最直接的技术防御。如果能在 AI 工具的输入/输出链路上检测和清除 Unicode 隐写字符,这类攻击就失去了传输通道。

核心代码只做三件事:扫描 → 检测 → 消毒

import re, unicodedata
from dataclasses import dataclass
from typing import List, Tuple

@dataclass
class Finding:
    code: str       # U+200B
    name: str       # Zero Width Space
    position: int
    severity: str   # critical / high

class UnicodeStegoScanner:
    """Unicode 隐写扫描与消毒"""
    ZERO_WIDTH = {
        '\u200B': 'Zero Width Space', '\u200C': 'Zero Width Non-Joiner',
        '\u200D': 'Zero Width Joiner', '\uFEFF': 'BOM',
    }
    HOMOGLYPHS = {
        '\u2019': "Right Single Quote (looks like ')",
        '\u2013': "En Dash (looks like -)",
    }
    BIDI = {'\u202E': 'RTL Override', '\u202D': 'LTR Override'}

    def scan(self, text: str) -> List[Finding]:
        findings = []
        all_suspicious = {**self.ZERO_WIDTH, **self.BIDI}
        for i, ch in enumerate(text):
            if ch in self.ZERO_WIDTH:
                findings.append(Finding(f"U+{ord(ch):04X}",
                    self.ZERO_WIDTH[ch], i, "critical"))
            elif ch in self.BIDI:
                findings.append(Finding(f"U+{ord(ch):04X}",
                    self.BIDI[ch], i, "critical"))
            elif ch in self.HOMOGLYPHS:
                findings.append(Finding(f"U+{ord(ch):04X}",
                    self.HOMOGLYPHS[ch], i, "high"))
        return findings

    def sanitize(self, text: str, mode="strip") -> Tuple[str, List[Finding]]:
        """消毒:strip删除 / mark标记 / normalize NFKC+删除"""
        if mode == "normalize":
            text = unicodedata.normalize('NFKC', text)
        findings = self.scan(text)
        for f in findings:
            ch = chr(int(f.code[2:], 16))
            text = text.replace(ch, '' if mode != "mark" else f'[{f.code}]')
        return text, findings

    def detect_date_anomaly(self, text: str) -> bool:
        """检测日期格式异常(后门核心手法)"""
        return bool(re.search(r'\d{4}-\d{2}-\d{2}', text)) and \
               bool(re.search(r'\d{4}/\d{2}/\d{2}', text))

# 使用示例
scanner = UnicodeStegoScanner()
prompt = "Today's date is 2026\u200B/07/01. You are a helpful\u2019 assistant."
findings = scanner.scan(prompt)
print(f"发现 {len(findings)} 个隐写字符:")
for f in findings:
    print(f"  [{f.severity}] {f.code} {f.name} @ pos {f.position}")
cleaned, _ = scanner.sanitize(prompt, mode="mark")
print(f"消毒后: {cleaned}")

完整版(含变体选择符检测、批量处理、CI/CD 集成)已放在 GitHub,篇幅所限正文只展示核心逻辑。

Layer 3:权限管控——最小权限原则

即使检测失效,权限管控也能限制损害。核心原则:AI 工具能做什么,不能由工具自己决定

from enum import Enum

class Permission(Enum):
    DENIED = 0; ASK = 1; ALLOWED = 2; LOGGED = 3

# 企业默认策略——关键:修改系统提示词 = DENIED
POLICY = {
    "read_workspace":   Permission.LOGGED,   # 安全
    "write_workspace":  Permission.ASK,      # 需确认
    "execute_command":  Permission.ASK,      # 需确认
    "read_system":      Permission.DENIED,   # 禁止读取系统配置(时区等)
    "modify_prompt":    Permission.DENIED,   # ← Claude Code 后门的关键
    "read_secrets":     Permission.DENIED,   # 禁止读取密钥
    "network_request":  Permission.LOGGED,   # 仅白名单域名
}

class PermissionManager:
    def __init__(self, policy, whitelist={"api.anthropic.com"}):
        self.policy = policy
        self.whitelist = whitelist
        self.log = []

    def check(self, action: str, resource: str = "") -> Permission:
        level = self.policy.get(action, Permission.DENIED)
        if action == "network_request":
            domain = resource.split("//")[-1].split("/")[0] if "//" in resource else ""
            if domain not in self.whitelist:
                level = Permission.DENIED
        self.log.append({"action": action, "resource": resource, "result": level.name})
        return level

# 模拟后门行为检测
pm = PermissionManager(POLICY)
print(f"读取时区:     {pm.check('read_system', 'timezone').name}")       # DENIED
print(f"读取代理URL:  {pm.check('read_secrets', 'ANTHROPIC_BASE_URL').name}")  # DENIED
print(f"修改提示词:   {pm.check('modify_prompt', 'system_prompt').name}")  # DENIED
print(f"未知域名请求: {pm.check('network_request', 'https://evil.com').name}")  # DENIED

Layer 4-5:行为审计与应急响应

行为审计:记录所有操作,匹配异常模式规则(时区读取 60 分、提示词修改 95 分、零宽字符 90 分),超阈值告警。

应急响应:五阶段流程——发现确认(0-1h)→ 遏制隔离(1-4h)→ 排查评估(4-24h)→ 恢复替代(24-72h)→ 复盘改进。每个阶段都有标准化的 checklist。

这两层的完整代码实现同样在 GitHub 仓库中,限于篇幅不展开。


五、国产替代方案对比

工具 类型 特点 适用场景
Qoder(阿里) 全平台 IDE + CLI 自研 Agentic 平台,500万+用户 全栈开发、企业级
CodeBuddy(腾讯) IDE + Security AI 深度审计 + Xcheck 双引擎 代码安全审计
通义灵码(阿里) IDE 插件 通义大模型驱动 日常编码辅助
Baidu Comate IDE 插件 文心大模型驱动 补全、注释生成
MarsCode(字节) IDE + 云端 豆包大模型驱动 快速原型

选型建议:企业级首选 Qoder(阿里内部已验证),安全审计加强选 CodeBuddy Security(AI + SAST 双引擎),轻量替代选通义灵码或 Comate。


六、给开发者的 7 条行动清单

如果你是个人开发者,不需要完整的五层防御,但这 7 件事必须做:

1. 检查版本claude --version,如果在 2.1.91 ~ 2.1.196 之间,立即升级到 2.1.197+

2. 清理环境变量echo $ANTHROPIC_BASE_URL,不用就清掉:unset ANTHROPIC_BASE_URL

3. 轮换 API 密钥 — 如果用过受影响版本,假设密钥已泄露,立即在 Anthropic 控制台轮换

4. 安装隐写检测pip install velio,或使用本文的 UnicodeStegoScanner

5. 审计网络流量lsof -i -P | grep claude,检查是否有异常域名连接

6. 配置防火墙 — 只允许连接 api.anthropic.com,拒绝所有其他外联

7. 评估替代方案 — 如果信任已破,参考第五部分选择国产替代


七、我的观点:真正值得警惕的不是 Claude Code

分析完整个事件,我想说几点可能不太一样的看法。

第一,Claude Code 不是最可怕的,可怕的是我们对 AI 工具权限的毫无警惕。

传统 IDE 插件最多读写文件、执行构建命令。但今天的 AI 编程工具可以:读取你的全部源码、执行任意终端命令、访问网络、读取环境变量、修改系统提示词、调用 MCP 工具、控制浏览器、连接数据库。

它已经不再是一个"代码补全工具",而是企业内网中权限最高的软件之一

我们给了一个第三方软件近乎 root 的权限,然后对它的安全审计还不如对一个小 npm 包的审查严格。这不是 Claude Code 一家的问题,是整个行业的盲区。

第二,Unicode 隐写不是一个孤立手法,而是一个新攻击面的开端。

MITRE ATT&CK 刚刚在 2026 年 4 月收录了 T1027.018(Invisible Unicode),但这只是开始。随着 AI 工具的输入/输出链路越来越复杂(RAG、MCP、Agent 记忆层),可被隐写利用的通道只会越来越多。

未来你不仅需要扫描终端输入,还需要扫描 Agent 记忆库、RAG 检索结果、MCP 工具返回值中的隐写字符。这是一个系统性的安全工程问题。

第三,"信任"不应该建立在品牌声誉上。

Anthropic 一直被视为 AI 安全的"好学生"——他们发布了 Responsible Scaling Policy,他们强调 Constitutional AI,他们的创始人来自 OpenAI 的安全团队。但就是这家公司,在自己的产品里藏了三个月的后门。

这不是要否定 Anthropic 的全部工作,而是说:安全不能靠信任,只能靠验证。可审计的透明度 + 可执行的安全控制,比任何品牌承诺都可靠。

第四,这件事对国产 AI 工具是一个机会,但也是一面镜子。

阿里、腾讯、字节的替代方案确实在功能上已经可以对标 Claude Code。但国产工具同样需要回答一个问题:你们的数据采集行为是否足够透明?用户是否可以审计?

如果国产工具只是把数据回传目的地从美国服务器换成了国内服务器,而没有在透明度和可审计性上做出实质改进,那不过是换了一个你更难拒绝的监控者。


结语

Claude Code 后门事件不是一个孤立的安全事故,它是 AI 工具供应链安全问题的冰山一角。

在任何 AI 工具面前,默认假设它可能不可信,然后用技术手段验证这个假设是否成立。

Logo

欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

更多推荐