Mac 拦截了终端粘贴:这个警告到底是什么意思
macOS 会拦截你粘贴进 Terminal 的命令。本文讲清每种警告的含义、它为什么出现、什么时候可以放行,以及它并不能保护什么。
有人让你把一条命令粘贴到 Terminal 里。也许是某个支持页面说这样就能解决你的问题,也许是某个验证界面说这样就能证明你是真人,也许是某个下载页面说这是安装软件最快的方式。你复制了命令,打开 Terminal,按下 Command-V,然后 Mac 弹出一个安全警告把你拦了下来。
几乎所有人的第一反应都是:macOS 未免太神经质了。有时候这个反应是对的。合法软件确实会提供「粘贴这条命令」式的安装说明,而一项专门用来抓攻击者的保护机制,难免会把其中一部分也一并抓住。但有时候,这个警告是挡在陌生人和你的 Apple 钥匙串(Apple Keychain)、浏览器密码、以及这台机器上任何加密货币之间的最后一道防线。
这篇文章会告诉你,你属于哪种情况。文章会覆盖 Apple 新增的全部三层保护、每种警告的真实含义、能不能放行以及放行的真正代价、为什么你会遇到这个提示而你那位开发者朋友从来没遇到过、在 iTerm2 和 Ghostty 这类第三方终端上会发生什么,以及一条你可以在三十秒内套用、完全不需要看懂 shell 语法的判断规则。如果你已经粘贴并且执行了什么,下面有一份冷静、按顺序排列的处置清单。先从那里开始,解释可以之后再回来看。
核心要点
- 这是三项彼此独立的保护,而不是一项。 Apple 的平台安全文档把 Terminal Paste Protection(终端粘贴保护)、Pasteboard Command Blocking(剪贴板命令拦截)和 AppleScript 扫描描述为三种不同的机制,都在 macOS 26.4 或更高版本中引入。搞清楚是哪一项触发了,就知道该把它当回事到什么程度。
- 可放行和不可放行的警告,含义天差地别。 启发式匹配会给你一条通路;已知恶意软件的特征码匹配不会,从内存中执行的脚本也不会。如果 Mac 没有给你任何继续的按钮,那不是一个等着你绕过去的 bug。
- 第三方终端失去了提示,但保留了兜底。 Apple 把粘贴警告记录为 Terminal 应用自身的功能,而剪贴板命令拦截则明确覆盖任何终端模拟器,包括第三方应用,因为它是在 XProtect 层面针对产生的进程树工作的。
- 这些保护要拦住的攻击,会给不同访客展示不同页面。 Microsoft Threat Intelligence 在 2026-08-05 发布的研究描述了一场 macOS ClickFix 行动,其页面会对每一位访客做指纹识别并主动搜寻安全研究人员——这意味着你自己去点开链接看一眼,完全无法证明别人当时看到的是什么。
- 风险是你的整套凭据,而不是一个密码。 Huntress 的研究人员描述了一款用 Go 编写的 macOS 窃密程序,目标是浏览器密码数据库、Cookie 和 Apple Keychain,其加密货币盗取功能可以被调低到余额的 1%,好让盗窃保持安静。一台被监控的 Mac 在有人察觉之前,已经被入侵了大约三个月。
三层保护,以及你刚刚撞上的是哪一层
Apple 平台安全文档中关于终端与脚本保护的页面,描述了三种在 macOS 26.4 或更高版本中引入的机制。人们经常把它们当成同一个功能来讨论,这造成了大量混乱,因为它们的行为不同、覆盖的软件不同,而且只有其中一部分可以被放行。
先读这一节。一旦你知道自己撞上的是三者中的哪一个,这篇文章里其他所有内容都会更容易应用。
保护一:Terminal Paste Protection
当人们说「Mac 拦截了我的粘贴」时,多半指的就是这一项。它是 Apple 的 Terminal 应用在你从某一类来源应用粘贴文本时弹出的警告对话框——这类来源正是攻击者常用来投递命令的渠道:网页浏览器、Messages、Mail、Preview 以及各种通讯应用。
关键词是「警告」。这项保护针对的是社会工程学发生的那一瞬间。它在「你收到的指示」和「你即将执行的动作」之间设了一道减速带,而这个位置恰恰是整场攻击最依赖你不停下来思考的地方。
Apple 记录了必须全部成立才会触发这项保护的具体条件。它被刻意设计得很窄,这也是大多数人从未见过它的原因。我们稍后会详细过一遍这些条件,因为理解它们能回答关于这个功能最常见的问题:为什么它对某些人出现,对另一些人从不出现。
保护二:Pasteboard Command Blocking
这一项工作在完全不同的层面上,而且是各方报道最容易低估的一层保护。
Apple 的文档指出,当用户把文本粘贴到任何终端模拟器(包括第三方终端应用)时,XProtect 会追踪由此产生的进程树并检查其行为。接着会发生两件事:网络行为特征会与 Apple 的 Safe Browsing Service 进行比对,匹配已知恶意来源的进程会被拦截;另外,行为模式会与已知的恶意软件手法进行评估。
注意这段描述并不依赖什么。它不依赖终端弹出对话框。它不依赖终端是 Apple 自家的。它不依赖你事先收到过警告。这项检查发生在命令开始运行之后,靠观察产生的进程做了什么、向哪里发起连接来完成。这就是为什么这项保护能覆盖不是 Apple 编写的软件。
保护三:AppleScript 与 JXA 扫描
第三项保护把 XProtect 集成进了 OpenScripting 框架,也就是 macOS 中负责执行 AppleScript 和 JavaScript for Automation(通常简称 JXA)的那一部分。两种语言的脚本都会被扫描,一旦匹配到已知恶意特征码,执行就会被阻止并通知用户。
这里有一个重要的不对称,而且 Apple 说得很直白:用户可以放行基于文件的脚本,但无法放行从内存中执行的脚本。这个区分并非随意为之。存在于文件里的脚本,是你可以先打开读一遍再决定的东西。而一个直接从内存执行、磁盘上不留任何文件可供检查的脚本,是一种与「恶意软件试图不留痕迹」高度相关的模式,macOS 干脆不允许你硬闯过去。
macOS 上基于脚本的攻击由来已久,这也是这项保护存在的原因之一。我们对当前 Mac 恶意软件家族及其入侵方式的更广泛梳理,讲到了这个生态中有多大比例是依赖脚本而非利用软件漏洞。
把你看到的警告对应到触发的那层保护
快速定位如下:
- 你粘贴进 Apple 的 Terminal,在任何东西运行之前就收到了警告,并且有办法继续:Terminal Paste Protection。
- 你粘贴了,某个东西开始运行,然后被停了下来,可能发生在第三方终端里:Pasteboard Command Blocking。
- 警告提到的是脚本而不是粘贴:AppleScript 扫描,能否放行取决于那个脚本是文件还是从内存运行。
如果你不确定发生的是哪一种,下一节会更详细地逐条讲解各个警告。
逐条解读每种警告
开始之前先说一下措辞问题。Apple 维护着一篇面向普通用户的支持文章,标题是 If your Mac blocks a Terminal command paste or script,地址在 support.apple.com/en-us/127377,那个页面才是你的 Mac 所显示的确切字符串的权威参考。撰写本文时我无法直接读取该页面的正文,所以下面这些警告标题是以媒体报道中提到的措辞呈现的,而不是对 Apple 原文的逐字引用。如果你看到的内容略有出入,请以你的屏幕和 Apple 的文章为准,而不是任何二手描述,包括本文。
比确切字符串重要得多的,是这条警告属于哪一个类别,而这些类别是有充分文档依据的。
Possible malware, Paste blocked(可能是恶意软件,粘贴已拦截)
媒体报道称这个警告标题对应的是启发式匹配。启发式意味着 macOS 并没有识别出某个具体的已知威胁,它识别出的是一种在形态上与恶意粘贴惯常运作方式相似的行为。
据报道这条警告会提供 Paste Anyway(仍然粘贴)选项,同时 Apple 会提醒你继续操作仍可能危及你的 Mac 和你的隐私。
对这个按钮的含义要诚实一点。它不是一个写着「macOS 搞错了」的按钮,它是一个写着「后果由我承担」的按钮。因为这次匹配是启发式的而非基于特征码,误报确实可能发生,一位粘贴了不常见但合法命令的开发者就可能撞上。这正是放行选项存在的理由。但让误报成为可能的那个特性同时也意味着:这条警告对命令本身没有给出任何令人安心的信息。系统标记了一种模式,判断得由你来补上,而本文后面那条判断规则,正是为这一刻设计的。
唯一绝对不该做的,是把 Paste Anyway 当成一个走过场的按钮点下去。如果你发现自己下意识地伸手去点它,请停下来,先回答判断规则那一节的问题。只要半分钟。
Malware Detected, Paste Blocked(检测到恶意软件,粘贴已拦截)
媒体报道称这个警告标题对应的是与已知恶意软件特征码的匹配,并且报道称它不提供放行选项。
这与启发式那条在性质上完全不同。启发式警告说的是「这看起来像是那种通常没好事的东西」,而这一条说的是「我们见过它,我们知道它是什么」。没有按钮,是因为不存在任何合理场景,能让一个粘贴普通命令的普通用户在确认的已知威胁匹配之后还应该继续。
如果你收到的是这条警告,正确的反应不是去找绕过的办法,而是把给你这条命令的来源当作敌对来源看待、关掉它,如果有任何东西已经运行过,就转入处置步骤。不要手动重新敲一遍命令来绕开剪贴板检查。不要换个终端再试一次。不要转发给别人让他们试。命令不是你要解决的问题,把命令给你的那个页面或消息才是。
Malicious Script Blocked(恶意脚本已拦截)
媒体报道称这个警告标题对应的是第三层保护,也就是 AppleScript 与 JXA 扫描这条路径。当 OpenScripting 框架被要求运行一个内容匹配已知恶意特征码的脚本时,它就会出现。
这一条能否放行取决于脚本存放在哪里,Apple 把规则写得很清楚:基于文件的脚本可以由用户放行;从内存中执行的脚本则完全不能。
如果你是在做合法的事情时看到它,比如运行自己写的自动化脚本,或者你信任的软件附带的脚本,那么基于文件的脚本的放行路径是存在的,你可以用。但请先做那件显而易见的事:真的用文本编辑器打开那个脚本文件看一看。能读的脚本才是能评估的脚本,而 macOS 之所以对文件允许放行、对内存不允许,原因正是文件这种情况给了你这个选项。
放行到底意味着什么
放行并不会把这条命令标记为安全,不会让 macOS 学会「你是受信任的用户」,也不会豁免你其他几层保护。具体来说,在 Terminal 警告上点击 Paste Anyway 并不会关闭剪贴板命令拦截——那是一套独立的机制,在进程启动后于 XProtect 层面运作。你完全可能放行了警告,然后由此产生的进程在下一刻因为访问了某个已知的恶意目标而被拦截。
这种分层是设计,不是冗余。每一层保护都假定其他几层可能失效。
为什么你收到了提示,而你的开发者朋友从来没有
这是围绕粘贴警告最常见的困惑来源,而答案是有文档依据的,并不神秘。
Apple 的平台安全文档指出,Terminal Paste Protection 只有在以下条件全部成立时才会触发:
- 用户超过 30 天没有打开过 Terminal 应用。
- 系统上未检测到常见的开发者工具链。
- 粘贴来自特定的应用。
此外还有初始设置后的 24 小时宽限期,这样一台正在配置的全新 Mac,就不会朝一个确实在搭建环境的人不停弹提示。
把这些条件再读一遍,注意它们描述的是什么。它们描述的不是一条危险的命令,它们描述的是一类人。
30 天这一条
如果你经常使用 Terminal,这项保护对你实际上是隐形的,因为第一个条件永远不成立。任意 30 天窗口内打开过一次 Terminal,就足以让你处在触发范围之外。这就是为什么开发者、系统管理员,以及任何以 shell 为家的人,可以在一台 Mac 的整个生命周期里都没见过这个对话框。
如果你几乎从不打开 Terminal,而今天你打开它是因为有什么东西让你这么做,那你正是这个条件所描述的那个人。
开发者工具链这一条
第二个条件会检查系统上是否存在常见的开发者工具链。一台装有真实开发环境的机器,属于那种把粘贴命令当作日常工作一部分的人,而在这个人每次粘贴时都警告他,只会训练出「不读内容就关掉警告」的习惯,那样这项保护就一文不值了。
这个条件恰好也是给那些嫌提示烦人的开发者的诚实答案,我们会在故障排查一节回到这一点,因为解决办法并不是人们通常想要的那种。
来源应用这一条
第三个条件关乎粘贴的文本来自哪里。Apple 把这项保护描述为覆盖来自常见攻击渠道的粘贴:网页浏览器、Messages、Mail、Preview 以及通讯应用。你从自己写的文档里复制的文本,或者从另一个终端窗口复制的文本,和一个网页或陌生人的消息放进你剪贴板的文本,是两种不同的情况。
这个区分很有意义,因为 ClickFix 的投递几乎总是通过上述渠道之一。命令总得以某种方式抵达你,而它抵达你的方式,正是你用来阅读别人写的东西的那些应用。
为什么这样的定向是正确的设计
把三个条件放在一起,你得到的是这样一个过滤器:它只对「平时不用 Terminal、没有开发环境、刚刚从浏览器或消息里复制了一条命令」的人触发。这描述的不是一个倒霉的高级用户,这是对 ClickFix 受害者的高精度描述。
它也解释了一件让人恼火的事:两个用户粘贴完全相同的命令,只有一个人收到警告。命令本身没有任何变化。评估针对的是情境,而不只是内容。如果你想了解 Terminal 除了这一条警告之外究竟能做什么,我们的macOS Tahoe 终端完全指南是个不错的起点——说实话,成为一个有意识地使用 Terminal 的人,比任何对话框都是更好的长期防御。

iTerm2、Warp 和 Ghostty 的问题
大多数讨论正是在这里出错的,而且错的方式很关键。
常见的结论是:这只保护 Apple 的 Terminal,所以我用 iTerm2 就什么都得不到。这个结论对了一半错了一半,而这个区分很可能是本文最有用的部分。
粘贴提示确实是 Apple 的 Terminal 应用专有的。 Apple 的文档把 Terminal Paste Protection 描述为用户粘贴进 Terminal 时显示的警告。iTerm2、Alacritty、Warp、Ghostty、Kitty、WezTerm 以及其他所有终端都不会给你显示那个对话框,除非它们各自的开发者实现了等价的东西。如果你常驻 iTerm2,你不应该指望看到这个警告,也不应该把它的缺席解读为「一切正常」。
剪贴板命令拦截并不是 Apple 的 Terminal 专有的。 Apple 在这一点上的措辞很明确:当用户把文本粘贴到任何终端模拟器(包括第三方终端应用)时,XProtect 会追踪由此产生的进程树并检查其行为。它监视的不是终端的用户界面,它监视的是这次粘贴所催生的进程实际做了什么,并把网络行为特征与 Apple 的 Safe Browsing Service 比对,同时把行为与已知的恶意软件手法进行评估。
所以准确的说法是:第三方终端的用户失去了警告,但保留了兜底。 你失去的是面向人的那道减速带,那个设计用来在社会工程学进行到一半时打断你的东西;你保留的是事后运行的、面向机器的检查。
这个取舍值得理解而不是耸耸肩带过,因为两层保护捕捉的是不同的失败。警告在任何东西运行之前拦住你,此时判断错误的代价为零。兜底在进程已经启动之后才拦住它,此时判断错误的代价不为零,因为在拦截落地之前,已经有一部分代码执行过了。
这对你的行为方式也有一个实际的含义。如果你使用第三方终端,你就是下面那条判断规则最重要的适用者,因为你的操作系统不会在粘贴的那一刻打断你。你得自己充当那个对话框。
这些都不是对 iTerm2 或 Ghostty 的批评。它们是优秀的工具,而且它们的用户通常正是那批因为工具链条件而本来就会被排除在粘贴警告之外的开发者人群。这只是说明,实际的保护覆盖情况和很多人的假设并不一致,而且是双向的不一致。
ClickFix 究竟是什么
这些保护之所以存在,是因为一种具体且极其成功的社会工程学模式。它叫 ClickFix,有时也被称为 pastejacking(粘贴劫持),理解它比背下任何一条警告字符串都更有保护力。
模式很简单。一个网页或一条消息说服你复制一条命令并粘贴到 Terminal 里。包装方式几乎总是以下几种之一:
- 假的验证步骤。 你看到一个外观像 CAPTCHA 或人机验证挑战的东西,但不是让你点交通灯的图片,而是告诉你运行一条命令来完成验证。这是最常见的变体,之所以有效,是因为各种验证挑战早已把所有人训练成会照着奇怪的指示做而不加质疑。
- 假的错误加上配套的修复方案。 页面告诉你缺少某个组件、某个编解码器过期了,或者某个驱动出错了,然后热心地提供了解决它的命令。错误是虚构的,「修复」才是载荷。
- 假的安装程序。 某个真实且抢手的软件的下载页面,把一条命令呈现为快捷安装方式,往往还配着一个看起来很正常的下载按钮。
- 假的会议应用更新。 你点开一个会议链接,被告知你的会议应用需要先更新才能加入,然后拿到一条要运行的命令。你本来就已经迟到的会议所带来的时间压力,会完成剩下的工作。
为什么它对谨慎的人也奏效
ClickFix 不是一场智力测验。它有三个特性能击穿常规的警觉。
第一,动作是你自己执行的。没有下载被拦截,没有 Gatekeeper 提示弹出,没有未签名的应用被隔离,因为并没有以那些保护所预期的方式下载任何东西。是你亲手把攻击敲进去的。Mac 用户依赖的许多防御,守的是另外一扇门。
第二,包装提供了一个理由。每一种变体都在你发问之前就回答了「我为什么要做这个」。验证。缺少组件。更快的安装方式。人们不会抗拒一条附带解释的指示,尤其是一个平淡无奇的解释。
第三,它借用了合法实践的权威性。真实的软件确实会提供「粘贴这条命令」的安装说明。这场攻击并不是在假装成某种不寻常的东西,它模仿的是某种再正常不过的东西。
最后一点也解释了为什么另一类相关的攻击同样奏效。伪造的系统对话框索要你的密码之所以成功,原因完全相同,我们在关于伪造的 Mac 崩溃报告密码提示的文章里做过详细分析。同一套底层把戏,只是换了个表面。
Microsoft Threat Intelligence 的研究,以及它为什么改变了你评估链接的方式
Microsoft Threat Intelligence 在 2026-08-05 发布的研究,追踪了一场横跨超过 250 个前端域名的 macOS ClickFix 行动。光是这个规模就值得停下来想一想,但真正重要的是它的机制。
据该研究,一段很小的 JavaScript 代码会在决定给你看什么之前,先对每一位访客做指纹识别。报告中提到的信号包括平台字符串、屏幕与窗口尺寸、WebGL 数据、时区、页面是否处于 iframe 中,以及触控支持情况。它还专门搜寻安全研究人员:用一个在浏览器开发者控制台打开时不断累加的计数器——一个把分析人员自己的工具变成检测信号的巧妙手法。
不符合目标画像的访客会拿到空白页面或不相关的网站。符合条件的访客,也就是看起来像真实用户的 Mac 用户,会拿到一个 GitHub 风格的页面,上面提供 Download for macOS(为 macOS 下载)选项,还配有一枚伪造的 Verified Publisher(已验证发布者)徽章。该研究中报告的载荷是 MacSync 和 Atomic Stealer,后者通常简称 AMOS。
下面是真正会改变你行为方式的推论,值得直说:
因为页面会给不同访客展示不同内容,「我点开看过了,没问题」作为证据毫无价值。「我朋友打开过,什么也没发生」同样毫无价值。
你评估的不是一个固定的东西。你评估的是一个会根据「是谁在看」来决定自己是什么的东西。一位在 Windows 机器上、或者在打开了开发者工具的浏览器里、或者从另一个时区打开这个链接的同事,可能看到的是一个彻底空白的页面,并且诚实地告诉你这个链接无害。这份反馈完全说明不了你看到的是什么。
那枚伪造的 Verified Publisher 徽章也值得一提。信任徽章不过是一堆像素。合法网站能显示的任何东西,恶意网站都能一模一样地复制。徽章是一种主张,不是证据,把它当成证据,和因为一个密码提示「看起来像是 macOS 画的」就信任它,是同一类错误。
真正的风险是什么
这一切读起来很容易显得抽象,所以下面说说一次成功的 ClickFix 另一端的恶意软件到底会做什么。
Huntress 在 2026-08-06 发布的研究,描述了一款通过 ClickFix 投递、伪装成合法 macOS 组件的 Go 语言 macOS 窃密程序。该研究中描述的目标包括:浏览器密码数据库、Apple Keychain、Cookie 和凭据文件。
钥匙串才是重点
先聚焦在钥匙串上,因为它定义了这次事件的波及范围。你的登录钥匙串不是一个密码。它是 Wi-Fi 凭据、应用凭据、证书、安全备忘录,对许多人来说还有多年累积下来的网站登录信息。任何触及钥匙串的东西,偷走的都不是一个密码,而是整套。
这就是为什么怀疑被入侵之后,诚实的建议从来不是「把你刚输过的那个密码改掉」。这台机器上存在过的每一份凭据,都必须按已泄露处理。
DRAIN 函数与 1% 的设计
Huntress 的研究还描述了该窃密程序中一个名为 DRAIN 的函数。它会扫描 Bitcoin、Litecoin、Dogecoin、Ethereum 和 XRP 的钱包格式,并能转走由 DRAIN_PCT 变量控制的一部分余额。这个变量可以被配置低至 1%。
好好体会这个数字。清空钱包的攻击者会立刻暴露,因为受害者会发现,事件随之启动。只拿走 1% 的攻击者,可能永远不会被察觉。这个设计是刻意保持安静的,它优化的目标是长期驻留,而不是一次性的大额收割。
对你而言的实际推论是:「我的余额看起来没问题」并不是你干净的证据。 一场被设计得小到足以被忽略的盗窃,事实上就是会被忽略。如果你有理由相信有东西在你的 Mac 上运行过,不要把「没有明显损失」当成安全信号。
三个月
Huntress 的研究报告称,一台被监控的 Mac 在被检测出来之前,已经被入侵了大约三个月。
三个月的浏览记录。三个月的登录、会话、Cookie,以及一切经过那台机器的东西。如果你在衡量下面那份处置清单有多紧急,这个数字就是你的标尺。这类感染并不吵闹。什么都不会弹出来。Mac 不会以你能察觉的方式变慢。整个商业模式依赖的就是你不去看。
一条你真正用得上的判断规则
这是本文的实操核心。你不需要熟练阅读 shell 语法,也能在这里做出正确决定。你需要的是诚实地回答五个问题。
问题 1:是我主动去找的,还是有什么东西让我运行的?
这个问题的信号强度远超其他,而且回答它不需要任何成本。
你主动去找:你决定安装某个特定工具,你自己导航到了那个工具的文档,并在那里找到了安装命令。意图源于你。
有东西让你做:你偶然落地的页面、你并没有去找的错误、别人发来的消息,或者一个验证界面,产生了这条指示。意图源于别处。
几乎每一个 ClickFix 受害者都属于第二类。几乎每一次合法的粘贴都属于第一类。如果你属于第二类,默认答案就是「不」,而下面所有内容都是在讨论你有没有足够的理由推翻这个默认。
问题 2:这条命令的每一部分我都知道是干什么的吗?
不是大致意思,是每一部分。
如果答案是否定的,你有两个选择:在运行之前搞懂它,或者不运行。不存在第三个选项,让你因为某个页面向你保证没问题就去运行你不理解的东西。如果这条命令很长、被混淆过、经过 base64 编码,或者充满了你解释不了的字符,那就把混淆本身当成答案。合法的安装命令通常不会努力让自己不可读。
问题 3:它是不是把下载内容直接管道输送给 shell?
要警惕的形态,是一条从网络获取某样东西并立即执行它的命令,典型做法是把下载工具的输出通过管道送给 sh 或 bash。这种模式意味着你在运行一段你从未看过的、来自某台服务器的代码,而且是在它到达的那一刻运行。
这种模式并不天然就是恶意的。真实的项目也在用,我们会在下一节诚实地面对这一点。但它确实意味着你执行的代码,就是那台服务器在那一瞬间决定发给你的东西——而考虑到 Microsoft Threat Intelligence 关于访客指纹识别的发现,它发给你的未必是它发给别人的。
问题 4:它要求 sudo 和我的密码吗?
用 sudo 运行意味着交出管理员权限。这本身并不天然就是错的,因为大量合法安装程序确实需要它,但它把判断错误的后果从「糟糕」变成了「严重」。请按比例提高你的审视强度。一条来自你无法担保的来源、却想要 root 权限的命令,根本不是一个需要犹豫的选择题。
值得养成的相关习惯:你的管理员密码,应该只在你响应自己发起的操作时输入,绝不在响应一个自己冒出来的提示时输入。
问题 5:来源是不是这个项目自己的文档,而且是我自己导航过去的?
最强的信号是两件事的组合:这条指示位于该软件项目自己的网站或代码仓库上,而且你是自己导航过去的,而不是跟着别人递给你的链接过去的。
这个组合之所以重要,是因为单独任何一半都很弱。一个页面可以看起来和项目文档一模一样。一个链接可以显示成任何样子却指向任何地方。自己把项目名输进搜索、核对域名是否与真实项目一致、并在文档中它该在的位置找到安装说明,与点开一个告诉你该运行什么的页面,是性质完全不同的两件事。
运行之前怎么读一条命令
如果你已经判断某条命令大概率是合法的,但你想做验证而不是靠祈祷,方法如下。
把它粘贴到文本编辑器里,而不是 Terminal 里。 纯文本编辑器什么也不会执行。这一步立刻打断了整场攻击所依赖的模式——即你把它粘贴到一个按下回车就会执行的地方。
看完整个内容,包括滚出视野的部分。 一个确实阴险的伎俩,是用空格或换行填充命令,让你看到的部分人畜无害,而真正的载荷藏在很靠右的位置或下一行。开了自动换行的文本编辑器会把一切都展示给你,Terminal 不会。
检查末尾有没有换行符。 如果复制的文本以换行结尾,粘贴进 shell 就会立即执行,你连读一眼的机会都没有。这是一种刻意使用的技术,也正是粘贴警告存在的理由之一。
对于「下载并执行」型的安装程序,把步骤拆开。 不要把下载内容直接管道送给 shell,而是先把脚本下载成文件,用文本编辑器打开这个文件,读完,然后再运行。这大约会花掉你九十秒,却把一次信仰行为变成了一次检查行为。如果这个脚本是好几千行你评估不了的密集逻辑,你至少也真实地了解到了自己正在给出多大的信任。
解码所有编码过的内容。 如果命令中有一部分是 base64 或十六进制,就解码它并阅读结果,而不是运行它。如果一个合法的安装程序需要对你隐藏自己的内容,这本身就值得打个问号。
拿不准就别做。 不运行一条合法命令的代价,是你换个慢一点的方式安装软件;运行一条恶意命令的代价,写在上一节里。

为什么 Homebrew 式的安装程序看起来和攻击一模一样
该诚实面对令人不适的那部分了,因为假装它不存在会让这篇文章毫无用处。
这件事之所以真的很难,是因为合法的模式和攻击的模式形态完全相同。Homebrew 的安装程序就是标准范例:官方文档给出的安装方式,就是把一条下载脚本并运行它的命令粘贴到你的终端里。Homebrew 没有做错任何事。它是一个被广泛使用、广泛信任的项目,这种安装方式已经是标准做法十多年了。大量其他值得尊敬的工具也是这么做的。
所以任何归结为「永远不要往 Terminal 里粘贴命令」的建议,都等于让你别装 Homebrew,而人们理所当然地无视了它。这条规则的绝对主义版本之所以失败,是因为它与日常的合法实践相矛盾,而人们做不到的规则保护不了任何人。
真正区分这两种情况的不是命令本身,而是它周围的语境。
你是怎么走到这条指示面前的。 对 Homebrew 而言,是你决定要装 Homebrew,去了 Homebrew 的网站,读了安装说明。对 ClickFix 而言,是一个你并没有去找的页面,告诉你去运行某个东西来解决一个在它这么说之前你都不知道自己有的问题。意图的方向是反的,而这个反转就是破绽。
域名是不是项目自己的。 命令应该出现在项目真实的网站或真实的仓库上。不是镜像,不是博客文章,不是短链接,也不是一个品牌视觉恰好像那个项目的页面。核实域名要靠看域名本身,而不是看页面上的 logo。Microsoft Threat Intelligence 的研究描述了一个带着伪造 Verified Publisher 徽章的 GitHub 风格页面,这恰好精准地说明了为什么视觉品牌不等于验证。
命令是否与已公布、可交叉印证的说明一致。 独立地去查一下这个项目的安装命令。如果别人递给你的和项目自己公布的不一样,你就有答案了——而且你连一个 shell 语法字符都不需要看懂。
包装里是否含有紧迫感或验证要求。 合法的安装文档不会告诉你必须运行某个东西来证明你是人类,或者不运行就开不了会。紧迫感和验证式包装,几乎纯粹是攻击者的信号。
简单说:Homebrew 的命令之所以安全,不是因为命令写了什么,而是因为你在哪里找到它、你是怎么走到那里的。把同样的标准套用到其他一切上,你在这类判断上大部分时候都会是对的。
如果你已经粘贴并运行了,该怎么办
如果已经有命令运行了,请按顺序处理。不要试图同时做完所有事,也不要直接跳到最后那个戏剧性的步骤。
1. 把这台 Mac 从网络断开。 关掉 Wi-Fi,拔掉网线。窃密程序通过网络外传数据,切断连接能限制还能被带走的东西。这是唯一一个速度真正重要的步骤。
2. 不要惊慌重启,也不要随手开始删东西。 重启不会清除持久化机制,反而可能销毁关于发生了什么的有用证据。深呼吸。接下来的几个步骤比接下来的六十秒更重要。
3. 用另一台受信任的设备修改你的密码。 这是人们最容易做错的一步,做错了就会让其余努力白费。如果你在这台可能已被入侵的 Mac 上修改密码,你就是把新密码敲进了一台可能还在盯着你的机器。请用手机、平板,或另一台从未接触过这次事件的电脑。顺序很重要:先 Apple 账户,然后是你的密码管理器主密码,再是邮箱,再是金融账户,最后是其他一切。
4. 把钥匙串里的一切都当作已泄露并轮换掉。 Huntress 明确把 Apple Keychain 描述为攻击目标。这意味着 Wi-Fi 密码、应用凭据、保存的登录信息和安全备忘录。这很繁琐。优先处理那些保护资金、身份或其他账户访问权限的凭据。
5. 在所有能操作的地方吊销活跃会话。 被窃取的 Cookie 能让攻击者完全跳过你的密码,所以只改密码而不结束现有会话,可能让攻击者仍处于登录状态。大多数主流服务都有「从所有设备退出登录」或活跃会话管理功能。每改完一个密码就用一次。
6. 把加密货币转移到一个用干净设备生成种子的新钱包里。 如果那台 Mac 上有钱包,种子就已经泄露,而在同一台机器上生成新钱包只是把问题原样复制一遍。请在你信任的设备上生成,然后转移资金。另外,鉴于 Huntress 描述的 DRAIN_PCT 设计,不要让一个看起来正常的余额说服你跳过这一步。
7. 检查登录项和后台项目。 在「系统设置」的「通用」下,检查登录项以及后台项目列表,看有没有你不认识或解释不了的条目。
8. 检查配置描述文件。 在「系统设置」的「通用」下进入「设备管理」,查找你并未安装的描述文件。一个不是你放进去的描述文件是很严重的发现,因为描述文件能大范围改变系统行为。
9. 运行一款可靠的扫描工具。 扫描工具对捕获已知家族有用,也可以作为第二意见,尽管它面对真正新颖的载荷时最为薄弱。我们的Mac 杀毒软件选择指南讲了这类工具在现实中能抓到什么、抓不到什么。
10. 明白只有抹掉重装才能真正解决问题。 这是诚实的部分。抹掉 Mac 并重新安装 macOS,然后从事件发生之前的备份恢复数据,是唯一能真正把你带回已知良好状态的补救措施。任何低于此的方案,都是你自己判断「清理大概足够彻底了」。恢复时要小心:从事件之后的备份恢复应用程序或系统设置,可能把问题原封不动地带回来。恢复文稿;应用程序从各自的来源重新安装。
11. 盯着你的账户,时间要比你觉得必要的更长。 鉴于 Huntress 研究中那台被监控的 Mac 过了大约三个月才被检测出来,安静的一周说明不了什么。请在之后相当长一段时间里,留意金融账户以及邮件转发规则——后者是攻击者偏爱的持久化手段。
如果做完这份清单后你想做一次更全面的加固,我们的Mac 安全与隐私指南讲了那些值得在天下太平时就调整好的设置。
这些保护覆盖不到什么
把边界说清楚不是悲观主义,而是「可以依赖的防御」与「让你受伤的虚假安全感」之间的区别。
它们不是杀毒软件。 这些是针对一种投递手法的定向保护。它们不是通用的恶意软件扫描器,不会像安全产品那样持续监控你的整个系统,而且它们从设计之初就不打算这么做。
它们不检查你手动敲进去的内容。 Terminal Paste Protection 针对的是粘贴。如果攻击者说服你一个字符一个字符地手动输入命令,粘贴警告就没有作用对象了。剪贴板命令拦截仍会观察由此产生的进程行为,但那道面向人的减速带已经不在了。
它们对正常下载的安装程序帮不上忙。 如果你下载了一个 DMG 或 PKG 并以常规方式运行它,你身处的是 Gatekeeper 和公证的领域,不是终端粘贴的领域。那是另一套机制、另一套失效模式,我们在关于「应用已损坏,无法打开」错误与 Gatekeeper 隔离的文章里讲过。
新型攻击不会匹配到已知特征码。 特征码匹配按定义只能抓到已经被见过的东西。行为评估和 Safe Browsing 检查扩展了这个覆盖范围,但一个使用全新基础设施的全新载荷,可能从所有这些检查中溜过去。没有警告,不等于安全。
粘贴警告对大多数人根本不会触发。 这是设计使然。文档中的条件排除了任何在过去 30 天内打开过 Terminal 或安装了开发者工具链的人。如果你是一位开发者,并且以为这项保护在替你兜底,那它并没有,而且这是故意的。
第三方终端不显示这个警告。 上文已经讲过,但值得在「局限」这一节里重复一遍,因为这是最可能害到人的那个假设。
这一切都没有解决根本原因。 根本原因是一个陌生人说服了你运行他的代码。软件可以打断这件事,但它无法替你做决定。
常见问题排查
一条合法的安装命令被拦截了
Problem: 你正在按官方文档安装真实的软件,粘贴却被拦截或被警告。
Solution: 首先,独立地确认它的合法性,而不是想当然,因为这场攻击的全部要害就在于它感觉起来是合法的。自己搜索这个项目,导航到它的官方网站或仓库,把公布的安装命令和你手上这条对比。如果两者一致,而且你是自己导航到文档的,那这很可能是启发式误报,放行选项正是为这种情况存在的。如果警告没有提供放行选项,就不要绕过它,因为一条不可放行的警告表明这是已知威胁匹配,而不是启发式猜测。可以考虑改用项目提供的软件包或安装程序,而不是粘贴方式。
警告没有放行按钮
Problem: 没有 Paste Anyway 选项,也没有明显的继续方式。
Solution: 把这当作预期结果,而不是 bug。媒体报道把不可放行的警告与已知恶意软件特征码匹配联系起来,而 Apple 也记录了从内存中执行的脚本完全无法放行。不要手动重新输入命令,不要换一个终端试,也不要关闭任何保护。关掉给你这条命令的来源,并把那个来源当作敌对来源看待。如果在拦截落地之前已经有任何部分运行过,就启动上面那份处置清单,从断开网络连接开始。
同一条命令反复弹出警告
Problem: 你关掉警告,再试一次,它每次都回来。
Solution: 这些保护不维护按命令的白名单,所以并不存在一个可以累积的「已记住的决定」。反复出现的警告意味着反复评估得到了同样的结论,这是信息,不是故障。如果它是启发式警告,而你已经正确核实过来源,那么放行是按次生效的。如果它是已知威胁警告,重复只是系统在把同一个真实结论再说一遍。如果你确实需要这个软件,就换一种方式安装:签名的安装包、一个你本来就信任的包管理器,或者 App Store 版本(如果有的话)。
什么都没粘上,也不确定是不是被拦了
Problem: 你按了 Command-V,什么也没出现,也看不到警告。
Solution: 先排除那些平淡无奇的原因。确认 Terminal 确实拥有键盘焦点,通过粘贴到纯文本编辑器确认复制成功,再检查是否有警告窗口开在了别的窗口后面或另一块显示器上。如果文本粘进文本编辑器没问题、粘进 Terminal 却不行,那么某项保护就是合理的怀疑对象,而此时文本编辑器正好给了你阅读「你差点要运行的东西」的机会。先在那里读一遍再重试。如果粘贴成功了,但你按下回车后似乎什么也没发生,请把它当作可能的剪贴板命令拦截,并在「活动监视器」中检查有没有陌生进程。
你是开发者,想让这些提示消失
Problem: 粘贴警告打断了正常工作。
Solution: 说实话:Apple 没有为这些保护提供面向用户的开关,本文也不会介绍任何击穿它们的方法。不过,文档中记录的行为其实已经解决了你的问题。粘贴警告只在用户超过 30 天没有打开过 Terminal 且未检测到常见开发者工具链且粘贴来自特定应用时才会触发。如果你经常碰到它,有用的问题是:为什么在系统看来,你的机器不像一台开发机。让常规的开发者工具链存在于系统中、并把 Terminal 作为日常工作流的一部分来使用,才是摆脱这个提示的既定路径,而不是某个隐藏的偏好设置。
你已经点了 Paste Anyway,现在后悔了
Problem: 你放行了警告,命令运行了,事后你开始怀疑那个来源。
Solution: 回到上面的处置清单,从第一步开始,把 Mac 从网络断开。不要等待可见的症状,因为 Huntress 研究中描述的恶意软件正是被专门设计成不产生症状的,包括一个可以调低到余额 1% 的加密货币盗取功能。先从另一台设备修改凭据。放行警告并不会关闭剪贴板命令拦截,所以那个进程有可能事后仍被拦下了,但你不应该在没有证据的情况下这么假设。
常见问题
哪些 macOS 版本有这些保护?
Apple 的平台安全文档把 Terminal Paste Protection、剪贴板命令拦截和 AppleScript 扫描描述为在 macOS 26.4 或更高版本中引入。更早的版本没有它们。如果你运行的是更老的系统并往 Terminal 里粘贴命令,本文描述的所有行为都不适用于你的机器。
这在 iTerm2、Warp 或 Ghostty 里有效吗?
部分有效。Apple 把粘贴警告记录为 Terminal 应用的功能,所以第三方终端不会显示它,除非它们的开发者做了等价的东西。但 Apple 明确指出,剪贴板命令拦截覆盖任何终端模拟器,包括第三方应用,因为 XProtect 会追踪由此产生的进程树。你失去了警告,保留了兜底。
我能关掉这些保护吗?
Apple 没有为它们提供面向用户的开关,本文也不会介绍绕过方法。如果你是一位遇到误报的开发者,文档中记录的触发条件就是你的答案:在装有常见开发者工具链、或过去 30 天内打开过 Terminal 的机器上,粘贴警告不会触发。
Paste Anyway 有没有可能是正确选择?
有,在一种情况下:你自己主动去找这个软件,靠自己的导航到达了它的官方文档,而且命令与项目公布的一致。这是真实存在的误报场景,放行选项正是为它而设的。如果是一个你并没有去找的页面把命令递给你的,答案就是「不」。
如果什么都没被拦截,是不是意味着命令是安全的?
不是。这些保护捕捉的是已知特征码和已识别的行为模式,所以一场使用全新基础设施的真正新颖的攻击,可以在不触发任何东西的情况下通过。沉默不是背书。本文中的判断规则,尤其是「你是不是自己去找这条命令的」这个问题,仍然是你的主要防线。
如果真有东西溜过去了,我怎么可能知道?
多数情况下你不会知道,这正是令人不适的地方。Huntress 报告过一台被监控的 Mac 在被检测出来之前已被入侵大约三个月,还描述了一个可配置低至 1% 的加密货币盗取功能,其目的正是让受害者察觉不到。请去检查登录项、配置描述文件和账户会话,而不是等待症状出现。
结语
你的 Mac 拦截了一次粘贴。这是一件微小而无聊的事,偶尔却会被证明是那一年里发生在你机器上最重要的事。
有用的心智模型是「分层」。Terminal Paste Protection 是人的那一层,一次刻意收窄的打断,针对的是那些平时不用 Terminal、刚从浏览器或消息里复制了东西的人。剪贴板命令拦截是机器那一层,在 XProtect 层面针对产生的进程树工作,覆盖任何终端模拟器,包括第三方终端。AppleScript 与 JXA 扫描覆盖脚本这条路径,基于文件的脚本可以放行,从内存运行的脚本则完全不能。每一层都假定其他几层可能失效,而这正是正确的假定。
但这些保护是狭窄的,对其局限性的诚实总结是:它们不是杀毒软件,它们不读你手动敲进去的内容,它们抓不住没有已知特征码的新型载荷,而且按照设计,它们对大多数开发者永远不会触发。与此同时,它们要阻止的那场攻击资金充足、工程精良。Microsoft Threat Intelligence 报告了超过 250 个前端域名在对访客做指纹识别并搜寻研究人员;Huntress 描述了一款以 Apple Keychain 为目标的窃密程序,其盗取功能被调校到刚好低于会被察觉的阈值。
这就回到了软件无法替你完成的那一件事。在你把任何东西粘贴进终端之前,回答一个问题:这条命令是我主动去找的,还是有什么东西让我运行的? 如果是你主动去找的,就核实域名是项目自己的、命令与项目公布的一致,然后继续。如果是有东西让你做的,默认答案是「不」,举证责任在那个让你做的东西身上。这个问题只要五秒钟,它对这类攻击的每一个变体都有效——过去的和未来的——而且它不要求你读懂一行 shell。
如果已经有命令运行了,也别为此陷入焦虑循环。断开网络,从另一台设备修改凭据,轮换钥匙串里的一切,把任何加密货币转移到用干净机器生成的钱包里,然后计划抹盘重装。这场攻击本来就是被设计得很有说服力的。上当不是人品问题,善后是一份清单,不是一场灾难。
