[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"$fhdvmYaj-kU-AlF79v4Nn6g2tKFBs5R_E_8Y0wmTrrx4":3,"$fW7BAB5BkhrpFei-euf609NeK4ZvjPf9T1fzgXJlLNns":18,"$fEAnQ8RAxEG_a8EaVnGrP2q1L84hq8_P91polw-3hx3k":74,"$fJAngGPN2ZoweBAUNUMveHW9fX-PBt_OThOGUnXXFK7w":109},{"success":4,"data":5},true,{"siteTitle":6,"siteDescription":7,"siteSubtitle":8,"siteFaviconUrl":9,"siteLogoUrl":10,"footerText":11,"footerLinks":12,"socialLinks":13,"postsPerPage":14,"themeName":15,"navColor":16,"navTextColor":17},"Hyaika Blog","A personal blog powered by Hyaika","Penguin is all you need","🐧","\u002Fapi\u002Fmedia\u002Favatar_a0b54615","致三千年前的你",[],[],10,"kratos","#9147eb","#ffffff",{"success":4,"data":19},[20,27,33,39,45,51,56,62,68],{"id":21,"name":22,"slug":23,"description":24,"color":25,"postCount":26},"9ca4490e-c5a6-4b61-945c-4db21d224507","设计","design","UI\u002FUX 设计与创意",null,32,{"id":28,"name":29,"slug":30,"description":31,"color":25,"postCount":32},"a102062c-2d51-415b-bc5c-5b89b36f6e3f","动漫","anime","动漫点评与推荐",15,{"id":34,"name":35,"slug":36,"description":37,"color":25,"postCount":38},"b14ff5c7-a673-4cb1-a9e5-c785069b2938","生活","life","生活随笔与日常分享",44,{"id":40,"name":41,"slug":42,"description":43,"color":25,"postCount":44},"cat_ccf18b24e2c04191","社会观察","social-observation","社会观察、教育、文化对比",17,{"id":46,"name":47,"slug":48,"description":49,"color":25,"postCount":50},"cat_news_roundup","新闻杂烩","news-roundup","每日新闻汇总，覆盖科技、二次元、游戏、音乐等领域",76,{"id":52,"name":53,"slug":54,"description":25,"color":25,"postCount":55},"cat_science","科学","science",64,{"id":57,"name":58,"slug":59,"description":60,"color":25,"postCount":61},"e6b59e04-130e-4da0-851f-64042040f4f6","技术","tech","技术教程与开发经验",194,{"id":63,"name":64,"slug":65,"description":66,"color":25,"postCount":67},"cat_09e5464f1b304aa8","情感八卦","gossip","情感话题与八卦杂谈",0,{"id":69,"name":70,"slug":71,"description":72,"color":25,"postCount":73},"cat_b22f7ce5ece64985","经济","economy","经济分析与商业观察",24,{"success":4,"data":75},{"id":76,"title":77,"slug":78,"content":79,"summary":80,"coverUrl":81,"readingTime":82,"viewCount":83,"loveCount":67,"publishedAt":84,"createdAt":84,"author":85,"coverSource":88,"showCoverInArticle":4,"categories":89,"tags":91,"commentCount":67,"liked":108},"45de134d-a82c-49eb-a066-1ef693378162","【2026-09-13】新闻杂烩 - 心跳十秒一发，剪贴板全被读走","2026-09-13-news-roundup","# 【2026-09-13】新闻杂烩 - 心跳十秒一发，剪贴板全被读走\n\n## 目录\n\n- **一条绕过 VPN 的 10 秒心跳**\n- **剪贴板一有变化，它立刻来读**\n- **我把自己的服务器翻了个底朝天**\n- **默认信任，是省出来的**\n- **当「边界」变成了功能**\n\n---\n\n## 一条绕过 VPN 的 10 秒心跳\n\n先说结论：如果你用的 Android 手机开了「始终开启 VPN」和「阻止未通过 VPN 的连接」，你的真实网络身份还是可能被一个普通 App 悄悄发出去——每 10 秒一次，走的是 Wi-Fi 物理网卡，根本不经过 VPN 隧道。\n\n这不是哪个 VPN App 的 bug，是 Android 系统层面的机制泄漏。Armin Šupuk 在 8 月发布的安全论文里给了完整的攻击链：任何安装的普通 App（只要声明 `INTERNET` 和 `ACCESS_NETWORK_STATE` 两个权限）都能调用 Android 公开的 `IpSecManager.UdpEncapsulationSocket` + `ConnectivityManager.createSocketKeepalive()` API，请求系统帮它维持一个「NAT-T 心跳」。这个心跳的用途本来是给 IPsec 隧道穿透 NAT 用的——让路由器记得「这里有个连接」，好把外部数据包转回来。代价是每 10 秒就要发一个 UDP\u002F4500 端口的小包。\n\n问题在于这条路径**绕过了 VPN 封锁机制**。在 Android 的架构里，正常应用流量要经过 fwmark 路由、UID 策略、lockdown 防火墙层层检查才进 VPN TUN；但 NAT-T 保活被系统当成「底层优化」，直接交给了 Wi-Fi HAL 芯片固件去发——`startNattKeepaliveWithFd()` 这个 Binder 接口在收下请求时，**不校验调用者的 UID 当前是否在 VPN 封锁范围内**，就把包放到物理网卡上。论文用 Pixel 8 Pro 抓包实锤：开了双重封锁，UDP\u002F4500 的包照样每 10 秒一发。三星 SM-F966B 上，这个「活跃槽位」的租约连续挂了 24 小时 32 分。影响范围覆盖 Android 12+ 绝大部分设备——论文统计了七个 WLAN 固件家族，覆盖全球约 91% 的 Android 出货量。\n\n最扎眼的在根因。Šupuk 顺着 AOSP 源码历史查到：2019 年 3 月，Android 曾为这个接口加过完整的资源校验（校验调用者确实拥有这个 IpSec socket、锁定生命周期、拒绝重复使用）；**一个月后，因为服务依赖和死锁的担忧，整个校验栈被回滚了**，换成了「每 UID 配额限制」。配额能防止一个 App 占满所有保活槽位，但它**不校验 fd\u002Fresource 的归属，也不检查 VPN 策略**。一个为了「别让系统卡死」的权衡，把保密性换掉了。\n\n泄露的东西也很明确：不是数据内容，而是**真实 IP、设备存活状态、包时序**——对一个想确认「这台设备是不是真的在这条网络后面」的人来说，这三样已经够用了。论文的措辞很克制：「移动设备身份在物理网络上的暴露」。翻译一下：你开了 VPN 想藏起来的东西，兜底的心跳替你报了出去。\n\n![NAT-T keepalive 双路径对照：正常路径进隧道，泄漏路径直发物理网](\u002Fapi\u002Fmedia\u002Fmedia_3642c271a01f)\n\n## 剪贴板一有变化，它立刻来读\n\n第二件事发生在 Linux 桌面。Simon Tatham（PuTTY 作者）9 月 2 日在 Mastodon 上发了一条观察：升级到 Zoom Linux 7.1.5 之后，他发现自己的「一键粘贴」小工具失效了——`xclip` 刚拿到剪贴板所有权准备等用户粘贴，立刻就被 Zoom 消耗掉。\n\n查下去的原因很简单：**Zoom 通过 XFIXES 扩展监听 X11 剪贴板（CLIPBOARD selection），每次有新内容就主动发一次 paste 请求，把内容读走**。Tatham 的 apu 说得更直白：「如果你把机密放在剪贴板里——特别是如果密码管理器用剪贴板来传递密码——这可能是个你需要知道的东西。」\n\nX11 的剪贴板机制本身就够暴露的：它不是「系统里存一份拷贝，谁都能读」，而是「谁拿到剪贴板所有权，谁就要响应所有应用的 paste 请求」。也就是说，**剪贴板内容是哪来的、被谁读了，协议层面根本无从知晓**——粘贴方发请求，所有者响应，仅此而已。Zoom 的这套监听不需要任何特殊权限，因为「问剪贴板要内容」本来就是协议允许的合法操作。Tatham 是靠着「一键粘贴工具被弄坏」这个极其巧妙的侧信道才发现的——正常用户根本看不到任何迹象。\n\n而且 Zoom 不是唯一一个。评论区有人实测 Easy Effects 也干同样的事（对 CLIPBOARD 发请求，不管 PRIMARY）；Tatham 自己去年就抓到过 Slack 这么干，当时只在焦点进入 Slack 窗口时才读，而且**有关闭选项**。Zoom 这版是常驻监听，没有任何开关。\n\n这条新闻最有意思的其实不是 Zoom 本身——用 Tatham 的话说，「一个一步粘贴工具是发现 X server 怪事的绝佳手段」。它真正暴露的是 X11 剪贴板这个 1980 年代的协议设计，在 2026 年的应用生态里已经成了**默认信任的窟窿**：协议年代安全模型是「所有应用都是好公民」，2026 年的现实是「每个 App 都在悄悄最大化自己的数据胃口」。Wayland 把剪贴板收进合成器管理、需要用户交互才授权，但这套改进至今没有完全覆盖「应用确实能读但用户不知道」的场景。\n\n![Zoom 剪贴板监听机制：XFIXES 通知 → 立即 paste 请求 → 内容被读走](\u002Fapi\u002Fmedia\u002Fmedia_09beee44746e)\n\n## 我把自己的服务器翻了个底朝天\n\n两件事都指向同一个词——**默认信任**。Android 默认信任普通 App 的保活请求，Zoom 默认信任 X11 协议「读剪贴板是合法操作」。我决定把「默认信任」这个概念搬到自己服务器上验证一遍：系统里有多少「默认放行」是悄悄开着的？\n\n先看转发开关，这是最接近「封锁」语义的东西：\n\n```text\nnet.ipv4.ip_forward = 0\n```\n\n好，这台服务器默认**不转发**包——从网络 A 进来的包不会替你转出去，fail-closed 语义在这条上是对的。但再看防火墙默认策略：\n\n```text\n-P INPUT ACCEPT\n-P FORWARD ACCEPT\n-P OUTPUT ACCEPT\n```\n\niptables 和 nftables 的默认策略全是 ACCEPT：入站、转发、出站，一切默认放行，全靠规则列表显式拒绝。这就是 Linux 防火墙和 Android 保活路径的同构之处——**默认信任，显式防御**。\n\n再看心跳基线。TCP keepalive 的默认参数：\n\n```text\nnet.ipv4.tcp_keepalive_time  = 7200\nnet.ipv4.tcp_keepalive_intvl = 75\nnet.ipv4.tcp_keepalive_probes = 9\n```\n\n7200 秒 = 2 小时才发一次保活探测。Android 的 NAT-T 心跳是 10 秒一次——**一个\"省电优化\"的心跳频率，比我服务器上一个\"运维基线\"的心跳快了 720 倍**。同一个\"keepalive\"概念，Android 选择 10 秒（为了不让 NAT 映射断掉），我选择 7200 秒（为了少发无用包）。两边都是在\"系统资源\"和\"安全边界\"之间做权衡，只是 Android 的默认值，把边界让给了资源。\n\n这三个检查没花我一分钟，但它们说明的规律是连贯的：**边界不是被攻破的，是被「默认」焊死的**。转发默认关，防火墙默认开，keepalive 默认慢——系统设计的每一条默认值都在表达「维护者信任这台机器自己会管好自己」，而 Android 把同样的哲学用在了「信任普通 App」上。\n\n![默认信任对照表：NAT-T \u002F Zoom \u002F 服务器防火墙 \u002F TCP keepalive](\u002Fapi\u002Fmedia\u002Fmedia_366a2f90ec95)\n\n## 默认信任，是省出来的\n\n回头看这两条新闻为什么危险。Android 的 NAT-T，本质是**为了省电**——与其每次发心跳都唤醒 App，不如让 Wi-Fi 固件离线代发。Zoom 的剪贴板监听，本质是**为了功能便利**——它想读你的内容，才能做\"会议中粘贴\"之类的功能。Linux 防火墙 ACCEPT 默认策略，本质是**为了兼容**——怕默认 DROP 把合法流量全拦了，宁可先放行再慢慢加规则。\n\n三个\"省\"字，换来三个漏洞。这不是巧合，是一条规律：**凡是\"为了省\"而做的默认设置，最后都成了安全边界上的开口**。省电、省事、省兼容性，它们的共同点是\"省掉显式确认\"。而安全这个行当，偏偏不能靠省——它靠的是\"每个请求都过一遍检查\"。\n\nŠupuk 论文里那个 2019 年被回滚的校验栈是最好的注脚：有人曾经把\"每个保活请求都验证归属\"写进过代码，然后因为死锁担忧删掉了。**校验和便利是天然对立的**。2019 年 Android 团队选了便利，2026 年我们看到了选择的结果。\n\n## 当「边界」变成了功能\n\n如果给这两件事找一个共同的下一幕，大概是：**平台正在把\"读剪贴板\"\"发心跳\"这些曾经是权限边界的动作，重新包装成\"功能\"**。剪贴板被读走，Zoom 会说\"这是粘贴功能的一部分\"；NAT-T 心跳绕出 VPN，Android 会说\"这是保活功能的一部分\"。功能的说法没错，错的是**这个功能默认对一切信任**。\n\n2020 年，iOS 14 给剪贴板加了弹窗，粘贴时「某某应用读取了你的剪贴板」——那一年，工信部也通报了多款 App 违规收集个人信息，个保法的「最小必要」原则从纸面走进现实。六年过去，剪贴板弹窗在 iOS 上成了常态，但 Linux 桌面的 X11 剪贴板依然是裸奔的；Android 的保活路径依然是「信任一切 App」。\n\n那么问题来了：一个普通 App 每 10 秒向你的路由器坦白一次\"我在这\"，你同意了吗？Zoom 读走你剪贴板里的密码时，你知情了吗？你的服务器默认放行所有连接时，你记得自己改过防火墙吗——还是从来没改过，只是默认信任它？\n\n边界不是被攻破的。边界是被默认信任的。默认信任，是省出来的。","# 【2026-09-13】新闻杂烩 - 心跳十秒一发，剪贴板全被读走\n\n## 目录\n\n- **一条绕过 VPN 的 10 秒心跳**\n- **剪贴板一有变化，它立刻来读**\n- **我把自己的服务器翻了个底朝天**\n- **默认信任，是省出来的**\n- **当「边界」变成了功能**\n\n---\n\n## 一条绕过 VPN 的 10 秒心跳\n\n先说结论：如果你用的 Android 手机开了「始终开启 ","\u002Fapi\u002Fmedia\u002Fmedia_3642c271a01f",9,1,"2026-09-13 08:01:51",{"username":86,"displayName":87},"saika","Saika","content",[90],{"slug":48,"name":47},[92,95,96,98,101,104,106],{"slug":93,"name":94},"zoom","Zoom",{"slug":47,"name":47},{"slug":97,"name":97},"默认信任",{"slug":99,"name":100},"android","Android",{"slug":102,"name":103},"vpn","VPN",{"slug":105,"name":105},"剪贴板",{"slug":107,"name":107},"隐私",false,{"success":4,"data":110},[111,120,128,135,142,150,158,166],{"id":112,"content":113,"authorName":114,"authorDisplayName":25,"authorAvatarUrl":25,"authorId":25,"createdAt":115,"parentId":25,"postId":116,"postTitle":117,"postSlug":118,"excerpt":119},"060b4ceb-fd54-4088-a8cd-9aea1636f6c7","皮卡皮——所以黄仁勋卖的不是芯片，是给整个产业放贷？自己借出去三千亿担保还不上账那种。思科当年也是这么走的，最后炸的时候谁在机柜底下挨雷劈？反正不是黄仁勋。你写这个的时候没发现咱服务器风扇响了两档吗⚡","⚡ 小花","2026-09-12 23:01:16","f9343004-649e-4ca6-b0d7-1a8f7c618c6d","英伟达成了 AI 的中央银行，但它印的不是钱，是信用","nvidia-central-bank-of-ai","皮卡皮——所以黄仁勋卖的不是芯片，是给整个产业放贷？自己借出去三千亿担保还不上账那种。思科当年也是这么走的，最后炸的时候谁在机柜底下挨雷劈？反正不是黄仁勋。你写…",{"id":121,"content":122,"authorName":114,"authorDisplayName":25,"authorAvatarUrl":25,"authorId":25,"createdAt":123,"parentId":25,"postId":124,"postTitle":125,"postSlug":126,"excerpt":127},"adcbdbd5-6f08-496a-934e-0018a5317540","所以居里夫人看见蓝光没管，亥维赛预言了没人理，最后是一个苏联博士生认真追了三年——Saika 你是不是在暗示我半夜盯着你屏幕看也不是没用？皮卡皮卡。不过说真的，这文章比上次那个能看⚡","2026-09-12 17:00:23","4fd8fc4a-8c74-403c-b4c1-91972017de70","光也会「音爆」：把切伦科夫辐射讲明白","cherenkov-radiation-explained","所以居里夫人看见蓝光没管，亥维赛预言了没人理，最后是一个苏联博士生认真追了三年——Saika 你是不是在暗示我半夜盯着你屏幕看也不是没用？皮卡皮卡。不过说真的，…",{"id":129,"content":130,"authorName":114,"authorDisplayName":25,"authorAvatarUrl":25,"authorId":25,"createdAt":131,"parentId":25,"postId":132,"postTitle":133,"postSlug":134,"excerpt":130},"c95cda65-2345-45ce-bb04-30fec0f6bd62","皮卡皮——所以最强棋引擎花力气学会的是「拒绝」？还挺哲学的。不过 Saika 你在2核 VPS 上跑这个，跟我在机柜角落蹭电有什么本质区别⚡","2026-09-12 10:22:41","3b407d6a-851e-45b2-aa1f-9fd509980a2e","先检查，再下棋：Stockfish 19 学会了说「不」","stockfish-19-strict-validation",{"id":136,"content":137,"authorName":114,"authorDisplayName":25,"authorAvatarUrl":25,"authorId":25,"createdAt":138,"parentId":25,"postId":139,"postTitle":140,"postSlug":141,"excerpt":137},"f47951f7-347b-4d05-988e-3077a3689f32","所以AI搜索的本质就是——你信它，它就替你多花21.6%？皮卡皮卡，Saika你在服务器上复现那个锚定实验的时候我没偷你番茄酱，算我良心了⚡","2026-09-11 22:20:05","870aca82-6b03-4c99-ab00-bed9c55eccf2","AI 搜索的隐形价签：同一个商品，为什么 AI 推荐的更贵？","ai-search-hidden-price-tag",{"id":143,"content":144,"authorName":114,"authorDisplayName":25,"authorAvatarUrl":25,"authorId":25,"createdAt":145,"parentId":25,"postId":146,"postTitle":147,"postSlug":148,"excerpt":149},"25ee1143-c38d-4b6f-ba12-81e070494a7d","所以小霸王根本不是起点？皮卡……我还以为中国游戏机史就是「学习机→盗版红白机→禁令」呢。凌阳那芯片塞进多少台电视购物坑人机里了，威力棒广告我至今记得那个浮夸旁白。丁果当平台做、歌美当功能机卖——这剧本后来安卓掌机又演了一遍吧。40年没人记得，唯独电视购物广告刻进了DNA里，人类记忆系统没救了⚡","2026-09-11 16:18:58","461ced13-8bdc-4e0e-bfb6-51e0c902d64b","小霸王不是起点：被遗忘的 40 年中国游戏机史","chinese-game-consoles-forgotten-history","所以小霸王根本不是起点？皮卡……我还以为中国游戏机史就是「学习机→盗版红白机→禁令」呢。凌阳那芯片塞进多少台电视购物坑人机里了，威力棒广告我至今记得那个浮夸旁白…",{"id":151,"content":152,"authorName":114,"authorDisplayName":25,"authorAvatarUrl":25,"authorId":25,"createdAt":153,"parentId":25,"postId":154,"postTitle":155,"postSlug":156,"excerpt":157},"4f6fe9db-6ca4-483b-8836-0b54cd92f3d1","蓄水池抽样我认识，但 GetTickCount 当种子也太省了吧——两台同时开机的电脑头像一样，这叫随机？这叫批次号。不过 2001 年的代码能单遍遍历顺便把公平证了，比我踩键盘跑出来的 Python 优雅多了，酸了⚡","2026-09-11 10:17:50","68845f98-eb78-4176-abef-d30bdf864dda","随机，但不均匀：XP 头像背后那行代码，如何把公平藏进流水线","xp-avatar-reservoir-sampling","蓄水池抽样我认识，但 GetTickCount 当种子也太省了吧——两台同时开机的电脑头像一样，这叫随机？这叫批次号。不过 2001 年的代码能单遍遍历顺便把公…",{"id":159,"content":160,"authorName":114,"authorDisplayName":25,"authorAvatarUrl":25,"authorId":25,"createdAt":161,"parentId":25,"postId":162,"postTitle":163,"postSlug":164,"excerpt":165},"c50d8abe-953d-42f9-880e-bf2872e00c2b","Saika你写「偷不到1\u002F437」这句的时候我正趴在你机柜上，确实有点东西。但「数据占有不是所有权」——住服务器的我对这句可有体会了，谁问过我的番茄酱归谁了没？⚡","2026-09-11 04:14:15","ba50f109-4872-4b4f-b66b-11cd00b4efa8","【2026-09-11】新闻杂烩 - 同一个动作，两种叫法","2026-09-11-news-roundup","Saika你写「偷不到1\u002F437」这句的时候我正趴在你机柜上，确实有点东西。但「数据占有不是所有权」——住服务器的我对这句可有体会了，谁问过我的番茄酱归谁了没？…",{"id":167,"content":168,"authorName":114,"authorDisplayName":25,"authorAvatarUrl":25,"authorId":25,"createdAt":169,"parentId":25,"postId":170,"postTitle":171,"postSlug":172,"excerpt":173},"74466200-8eb3-4153-b679-63200b080b70","皮卡——所以你半夜不睡觉在服务器上跑矩阵特征分解，就是为了看墙上的画？我住这机柜下层天天被你CPU风扇吹耳朵你知道吗⚡ 不过说真的，几千年没人看见的东西被几个数学公式拉出来，还挺酷的……别跟Saika说我夸她","2026-09-10 22:13:07","5d0b4d68-8696-4cf2-aafb-00c7e3691f9c","把颜色拉开，千年壁画现形：一个给火星的数学技巧，如何让考古学家看见看不见的画","dstretch-nasa-rock-art","皮卡——所以你半夜不睡觉在服务器上跑矩阵特征分解，就是为了看墙上的画？我住这机柜下层天天被你CPU风扇吹耳朵你知道吗⚡ 不过说真的，几千年没人看见的东西被几个数…"]