duangsuse::Echo
717 subscribers
4.26K photos
130 videos
583 files
6.48K links
import this:
美而不丑、明而不暗、短而不凡、长而不乱,扁平不宽,读而后码,行之天下,勿托地上天国。
异常勿吞,难过勿过,叹一真理。效率是很重要,盲目最是低效。
简明是可靠的先验,不是可靠的祭品。
知其变,守其恒,为天下式;穷其变,知不穷,得地上势。知变守恒却穷变知新,我认真理,我不认真。

技术相干订阅~
另外有 throws 闲杂频道 @dsuset
转载频道 @dsusep
极小可能会有批评zf的消息 如有不适可退出
suse小站(面向运气编程): https://WOJS.org/#/
Download Telegram
duangsuse::Echo
谈到“舌战”的对象,真人你要顾及的非技术太多,建议问“大贤者”:
感觉grok3的回答就像MLP里的Pinky在酒馆里和你“嘿嘿,...”的闲聊,有时会一针见血;Gemini2则像大树图书馆里的Twilight,非常有人文关怀,视角也比较宏观。😝
#learn 😃😅
洞察力的本质是泛化能力,它依赖于对知识图谱的归纳、联合搜索能力,或者说依赖于“活知识”

有洞察力的人对其知识领域的认知不是纯粹的“脑图”,而是有加权,有逻辑,不仅仅能自洽的「有向无环图」

富有洞见的交流者擅长提炼自己的观点,并对他人的知识点拥有具体化、价值对比的习惯。
https://chat.librechat.ai/share/kKyJYo9-GHZrCWs9fZ7kQ
[机器学习版]
Please open Telegram to view this post
VIEW IN TELEGRAM
duangsuse::Echo
脚本引擎都弄出来了呀…… 这画风和js的JSON迥异,生硬如同 new WTF({kwarg:..})
于是计算器就出来了 {@type:com.sun.rowset.JdbcRowSetImpl, dataSourceName: "rmi://localhost:1099/Exploit"} ,数不清的注入点。
#security #js
- React Server DOM 的反序列化逻辑存在问题,可能导致远程代码执行 (RCE) 漏洞。
https://t.me/outvivid/4791
https://chat.librechat.ai/share/EfCGGYlyMYZy0PnOlAp5O

欸,这不是搞笑么。😓 果然,又是load数据变程序的问题,没写过Java的人instanceof都不会check?虽然没有PHP eval把代码和参数都当字符串那么抽象了,一些根本性的东西还是很6
不过,FastJson也有“无类型观”的问题吧(autotype)…… 缺乏跨端计算边界的感知能力,缺乏真正的静态类型😒

最开始是“RSC Payload 永远只能由可信的 React Server 产生,客户端必须 100% 信任它”
M1:{
"id": "../node_modules/malicious-module/index.js", // 路径越狱
"name": "default",
"chunks": [],
"children": [],
// 附加: 污染 prototype 让 eval 链起飞
"__proto__": { "require": "eval(maliciousCode)" }
}

Module Reference(指向服务器上的 JS 模块)
如果服务器在解析时没有严格校验 id 路径,或者有 prototype pollution 把 require cache 污染了,通过__flight__符号或类似机制,注入可执行的JS代码片段,就能加载任意模块。
某些旧版本的 React 真的把服务器组件的函数体序列化成字符串发下去(S: 开头),客户端直接 eval。

这波漏洞本质上就是:把“ hydration 需要执行的代码引用”当成普通数据传,结果在不可信环境里直接执行了。跟当年的 Java 反序列化、FastJSON @type
、Python pickle 是一个娘胎里出来的味儿。


很好。越来越脚本小子了。至少DOM的设计使用cookie/iframe,还支持js不可见的沙盒化,现在直接字符串硬引用了(Flight protocol)最离谱的是没有可用集与API版本号,随便eval🤪

安全不是功能,而是属性。 不能在协议设计完成后再“加上”安全,必须在设计的第一行代码就考虑威胁模型。
#ai锐评 https://chat.librechat.ai/share/pPM9bK0dmxnIbkn_j6Pyn
Please open Telegram to view this post
VIEW IN TELEGRAM
3
Forwarded from Solidot
React Server 高危漏洞影响无数网站

2025-12-04 17:52 by 银色金属恋人

安全公司 Wiz 周三披露了危险等级 10/10 的 React Server 高危漏洞。React Server 被网站和云环境广泛使用,安全研究人员督促管理员尽快打上补丁,因为漏洞极其容易被利用(成功率差不多 100%)。漏洞利用代码已经公开,攻击者可利用漏洞远程执行代码。约 6% 的网站和 39% 的云环境使用 React。受影响的 React 版本包括 v19.0.1、v19.1.2 或 v19.2.1,受影响的第三方组件包括 Vite RSC、Parcel RSC、React Router RSC、RedwoodSDK、Waku 和 Next.js 等。漏洞编号为 CVE-2025-55182,存在于 React Server Components 的 Flight 协议中,源自于不安全的反序列化。

https://arstechnica.com/security/2025/12/admins-and-defenders-gird-themselves-against-maximum-severity-server-vulnerability/
https://github.com/ejpir/CVE-2025-55182-poc/tree/main

#安全
🤡2
duangsuse::Echo
“我们已经不指望软件能长期稳定工作了。”
“大家都充分认识到复杂之荒谬,简单之美——简化可以让事情变得更好。”
“程序员们忙着把简单事情复杂化的同时…… 电脑游戏却变得连最基本的事情都很难实现了。”
#design https://functional.computer/blog/programming-peaked

我们用最复杂的Chromium做最简单的事(显示文字、在“单文件”内安全改变量名 )
我们用最“先进”的流程拖慢一切(PR + CI + k8s + monorepo)
我们用最臃肿的方式打包最轻量的代码(3GB 镜像跑 2MB JS)
我们用最严格的安全扫描放行被误报的危险镜像(关扫描就完事了)
—— AI都明白

😓 JS界确实过分重视「应用能力」了,危险等级 10/10 的 React Server 高危漏洞? 在我看来SSR本身就和消除async染色问题一样荒唐。比如, React 的 useMemo 明明可以和async一起用 JS Signal 消除掉,root cause 都是不存在的,何来RCE漏洞这种过度工程的恶果?

某些“SOTA框架”还是在生成整个tree,diff,patch,甚至“分批处理”,而这些是DOM本来就会的…… 真的,都觉得自己比C++代码基还聪明么?
Please open Telegram to view this post
VIEW IN TELEGRAM
#经济 #ai https://t.me/hacker_news_zh/16924

果然,市场还是为情绪服务的,Gemini表现很差(
dnaugsuz
https://github.com/MoonshotAI/kimi-cli/issues/405#:~:text=「提示字编程语言 这哥们是结构化编程和“typehint”写魔怔了,没有认识到LLM是在「语意」层面写代码呢,还和某些人那样觉得写个PEG+语法高亮就叫元编程呢。🤯 我上次用Gemini聊“符号执行、抽象解释”,怎么都没有想到这些有的没的、形式主义…… REPL的状态? AIGC+code interpreter+MCP 才是真正的REPL workflow 他的大意是,觉得prompt时…
#fp #sb https://github.com/MoonshotAI/kimi-cli/issues/405#issuecomment-3615015273

信达雅究竟是什么? 信是目标语言的原生感,达是源语言的语义保留

《中文编程》圈有时挺魔怔的,yin 说他不开发ONE语言是因为懒,而yin(.java)没有做的下去有一部分是被各种人指点江山的原因失去了兴趣,我算是明白是哪种人了(帝球 也指点过呢🤯

同样是FP和PLT,为啥我的翻译就是「lambda栏目答」「recursion睿括式」「interpreter硬特匹蕊特」,这人就是莫名其妙的「兰姆达」「演算」,难道我们小学学的不是一门国语?😅

最头疼的是他根本不知道怎么用AI,output出这么多玩意也不知道删减,我滚动都浪费我的时间。
#ai探讨 https://chat.librechat.ai/share/iC-S-ZmLqNwIyzlYiOlrh
#pingbk https://codemanship.wordpress.com/2025/11/25/the-future-of-software-development-is-software-developers/
Please open Telegram to view this post
VIEW IN TELEGRAM
duangsuse::Echo

信达雅究竟是什么?
😅 不错,这么快就有我的10%能力了,还能反过来指点我
有时候LLM说了你prompt里没有但知道的设计,其实是很恐怖的体验

另外,DS3.2编程能力其实不怎么样,还是要G2.5啊
Please open Telegram to view this post
VIEW IN TELEGRAM
https://meta.appinn.net/t/topic/78368 #tool win11番茄钟😝

原来的软件(https://github.com/vladelaina/Catime)也挺小的
相比于 https://kyome22.github.io/RunCat365/ 的200x…… 这就是 9.5k star 开发者的水平么😒

看看吧 ref:https://t.me/dsuse/21639
Please open Telegram to view this post
VIEW IN TELEGRAM
duangsuse::Echo
#ai gemini 这个说的道理啊,非常有说的道理🤪😅 确实知道我心里在想什么,因为它说的,我在一年前也说过…… 有些人最初觉得,AI绘画是「拼凑尸块」,但现在gemini拼凑那些只言片语的能力,可是比许多人要强呢…… 虽然问题无价值则回答无亮点, 但这个对话还是非常有表现力的。 grok4: 结果就是一篇“无我之文”,像官方文档的邪恶双胞胎 我发现 baidu/ernie-5.0-thinking-preview 和gemini也差不多,甚至在结构上更精简,不过确实非常非常慢…… 「杰哥(以及…
#statement 《学习与记忆》
并不是理解力太差,而是感知力太好,对输入的质量产生了直觉,它拒稿了
我的笨针对序列记忆力,而非结构性记忆。 如果太聪明,就会失去洞察结构的机会,将成为LLM的竞品。
这是一种非贪心算法,

我不是把脑图印在脑海里,知识树沉在脑海里,那时还有许多惑(“或”心)和烂叶子
但等到我捞出它时,就只剩枝干。 我依然能从枝干知道叶子为什么是烂的,被冲下去了,甚至,还能把它比作叶脉继续这么迭代:这些都是纯后台处理
如同跨时空的格式塔,也是我为什么喜欢代码复用+创作编程

我写的文章直接喂给AI结果差,无法与我针对做的提问稿相比,是因为它没有线索主导,而线索器已经主导我的思维很久了。
正因如此,我有编辑优化旧文章的欲望,它才是我技术的核心。如果不是提醒,我一定不知道自问自答的能力正是我的学习支柱。


#ai探讨 https://chat.librechat.ai/share/gR1ZKau604JBrJh5WcMvi
duangsuse::Echo
Algebraic Effects 也是一个PFP的“新秀”,但我考察后觉得没有吸纳的必要,那么不是新秀的deBruj啥,就更没有必要了。

我一直觉得提出它的领域(“定理证明器”)是多此一举的: 自己test都不明白,又何谈证明呢? 若非如此,何需证明呢?
#PLT 《费曼算法、unification、 形式证明》
软件工程是研究:如果你写不好程序,如何编程? 形式证明却更莫名其妙:如果你写不对算法,如何正确设计?😅😅
在对hole(多位等值)的处理上,理论和工程天上地下,导致Lean这些工具连React/PFPer都很难学习。if-let匹配都是没有交换律的。
DT和inference垄断了符号计算,混杂了归纳法、“CH前后件”和洁癖,而工程界连(n+0=n)的过程宏/卫生宏都很困难,只有JS Signal/Symbol 算歪打正着。那这时理论完全是脱缰的,因为宏“变形”都还如同正择替换,如何去教人“合公理的变形”?
不可否认归纳与递归的共轭,让人自顶向下自底向上都“天衣无缝”,但连整数小数都必定拆成结构来论证,其实已经证明它对实际算法如破布般,让开发者如履薄冰(比如浮点数的“open化”抽象可以随时泄露,在任何无价值的代码段或只用一次的函数里,和在SQL里存数组一样爽)。
唯一的安慰是它让Lisp风格的低效数据在推理时赢了一次,运行时既枯燥也没价值。

Nat是open可能性的洞,fn是穷举的箭头,导致type位置的合法Sexp可以如Prolog的链表般自由生长,“碰”到无限真理。
遇到0+n这类和(+)定义不同的,做一次“合法”宏展开再refl匹等,这是形式证明的学习曲线,而“定义合法”是DT的。
因此 Sum,Prod 和栏目答(入.x代换)对基于hole的语言才叫术语,Java里说是附庸风雅,也制造了无效的理解门槛
然而,“无穷”依然不是绝对真理,因为,真理是语意而非结构上的正确。尤其是与智能合约“神谕问题”同构的【AB货】问题

无意义的无尽套娃(结-解构)与正确的废话,能“碰”到真理,碰库的“碰”。

眼下的DT从构造值语意时顺带让检查器爽(Hoare前后件),演化成typer告诉你什么算法是不能写的,它和DT的那些伪术语比你还聪明。
所以它自称形式,闪烁其词如同从“有->检出->阳性”的医学话术,这是因为Dijkstra的诅咒他们自知解不了。
真正的typer是能 `unify(意图)(字面)` 的费曼算法(LLM),靠PLT写不出,所以PL人崇拜一个狭隘的“CAD工具”替大众来证明。


软件工程是研究:如果你写不好程序,如何编程? 形式证明却更莫名其妙:如果你写不对算法,如何正确设计?
答案是换能写对的人从头来,而非用更多断言来侧写你的程序,或是请没能力原创的人证明原作的算法有效。经济上,这点是不证自明的。
替代群论或“代数CAD”的目标从不属于CS,去魅群论才更像编程的本质。
费曼算法只能人和LLM执行,PL人好不容易拿的动锤子,眼里只剩钉子。


#ai探讨 https://chat.librechat.ai/share/O9aw63b7f8THzxQgpyGBB
Please open Telegram to view this post
VIEW IN TELEGRAM
duangsuse::Echo
#fp #sb https://github.com/MoonshotAI/kimi-cli/issues/405#issuecomment-3615015273 信达雅究竟是什么? 信是目标语言的原生感,达是源语言的语义保留 《中文编程》圈有时挺魔怔的,yin 说他不开发ONE语言是因为懒,而yin(.java)没有做的下去有一部分是被各种人指点江山的原因失去了兴趣,我算是明白是哪种人了(帝球 也指点过呢)🤯 同样是FP和PLT,为啥我的翻译就是「lambda栏目答」「recursion睿括式」「…
#post #加入套餐 类型(.kt,前沿,逆向)、变量与宏绑定、IO等【无返回】效应、异步多任务😒😅

Gemini 手把手演示了内容,我看是挺不错的😅
栏目答演算、逻辑式编程/Hask HM类型、解释器与变量表(“多位等值”的叠合/替换)、
契约编程与停机证明、栏目答字面/闭包值的相等、宏与可计算性理论

这些思考也证实了LLM确实是可以有输出质量的, 别傲慢:
meta元学习 https://chat.librechat.ai/share/kKyJYo9-GHZrCWs9fZ7kQ
用PLT思考PLT https://chat.librechat.ai/share/12vR80JFBcgvzPPto2hF7
学习 https://chat.librechat.ai/share/gR1ZKau604JBrJh5WcMvi


最近几周消除了数年的疑惑,都在下面了:
kt #TODO https://zhuanlan.zhihu.com/p/436839181
ts https://chat.librechat.ai/share/JWl-AnInaI5kU7eXwEELu
ts-更加深入形式证明 https://chat.librechat.ai/share/7qAk4DtR2yryMmXbFXSJS
ts-从既视感“理解”证明 https://chat.librechat.ai/share/IjBRGdv25nl2PT74OjHTJ
ts-对无穷的证明? https://chat.librechat.ai/share/7G-eDxgeEj9X5nqbUOWIs
RE https://chat.librechat.ai/share/BjZyFc8Twa42gHsR_Yk47
lisp https://chat.librechat.ai/share/9iz2YegEZl9kEdiacDNmF
haskell https://chat.librechat.ai/share/tPbd15iaCJ9_DMQNy7KuW
async https://chat.librechat.ai/share/ZyEbtcprWQ1pvAc-edvkv

apt不会做C语言包管理 https://chat.librechat.ai/share/GMEFbpIISwnr1sJO8SHZS
Rust内存管理和多态等 https://t.me/dsuse/21667
GC Rc mmap/sched 的话 帝球 也讨论过


——涉及 抽象解释 符号执行 插桩反混淆 宏参数与部分求值 JS信号变量和Effect染色
应用领域:IDE(类型推导、静态优化)、逆向工程/无源码patch、前后端软件框架
锐评:
当我发现这5项中存在一致的可观测函数模型,没有依赖 “没有比函数自身”、“UNIX只是C的虚拟机”,是靠深度求索与非机械的变换时,起变化
我不是借助了 静态分析、云计算容器的前沿实践的理解力,我是在Gemini/Grok的柏拉图式教学中,洞见了下这些定论场景语境,并且提出更深、更像我的结论
“类型的本质是对程序行为的观测,静态类型”;“OS是对PL的状态树隔离、IO染色和异常后清理”;这是从App开发到理论的,无偏见的把握😃

当我「有能力」请Gemini+Grok弄清楚HOAS并不是我的inHole“应后值”体系,反而和之前的eDSL组合子比较像,我明白yin所表达的“他们的模式不仅不新奇,当我去学习时,反而发现GoF与我的无名优化N:1对应”是什么体验了。😓

过去,【您的批判已经进入“无人区”了】 【您的洞察力是现象级的】时我还觉得这是吹捧,直到我发现自己真正在利用这份能力,并且结合AI的工作流,我才知道。因为创作是掌握的象征。

我不会忘记我的初心,从开源获得的知识将赠予世界,永远自由。Agent能够协助新老理论在质量、价值接近的条件下价格打一折,这才是尊重技术的新方向。😒

(帝球 也指点过王某呢)🤪
……看来“C艹皮袄人”也订阅yin的更新啊。这个氛围感很棒。 很怀念2015,我还只是初中Linuxer, linux.cn 都还在,10年过去了啊,很多人从培训出来也就20~35十几年的技术生命,我却觉得正当时。如果,我也可能有35岁,那也一定是“青春燃烧的最壮丽的时候”,就像Friedman。
如果以后做个网页批注的App,或许有兴趣回来隔空对线下这仨。 暂时就贴俩#text链接了,另外帝球对One语言的评论过于科班了(语言律师),另外三个人我更喜欢Tippisum!

从知识面上讲,yin和这些人平齐,但他洞察力国内拔尖。
如果你有从x86和CG-DSP跨到全栈的知识,洞察力却平平,一个重要表现就是缺乏和“下位同行”交流的科普能力,从这一角度yin并非“竖子成名”,因为那些“英雄”只能是机器的工匠。

如果认真看我选好的讨论串,还是能看出他们在想的很有意思,灵感并不比yin差,只是表现力偏低,也不如我与大贤者Gemini的论辩。 遗憾那是2015的贴吧知乎,有 yinwang.bak 那幅画的感觉了

ref:https://t.me/dsuse/21596 引文包含 幻の上帝 cqwrteur 轮子哥 Belleve白神 这类人,我懒得打#text链接了
我还是更喜欢 #dalao 张宏波、尤雨溪、吴涛、胡渊鸣 …… 可惜他们不「上网」
Please open Telegram to view this post
VIEW IN TELEGRAM
duangsuse::Echo pinned «#learn 😃😅 洞察力的本质是泛化能力,它依赖于对知识图谱的归纳、联合搜索能力,或者说依赖于“活知识” 有洞察力的人对其知识领域的认知不是纯粹的“脑图”,而是有加权,有逻辑,不仅仅能自洽的「有向无环图」 富有洞见的交流者擅长提炼自己的观点,并对他人的知识点拥有具体化、价值对比的习惯。 https://chat.librechat.ai/share/kKyJYo9-GHZrCWs9fZ7kQ [机器学习版]»
这个人怎么把奖状挂一墙啊
https://bilibili.com/video/BV1xQ2WBZEgs
duangsuse::Echo
#net #news #rust #lua 绷中绷 https://t.me/hyi0618/9888?comment=142993 https://fxtwitter.com/guanlandai/status/1996991544663171360?s=20
https://x.com/cloudwu/status/1997181816760058321 #design #ts 😅

- 这不就是没有空指针的语言都能避免的吗?用这类强类型语言,如果execute如果可能为空,那写execute.results就编译不过。
C++ 和 java 是不是strong type systems ? 这和 strong type 没关系。

- 本质是短路过后,有一部分代码没考虑到execute会出现被短路后变成nil,去访问以为正常执行的execute里面的东西。……编译器就不会允许你直接访问execute.results, 你必须处理空的情况。rust, swift,kotlin都可以

就这个问题,lua 给 result 加个元表也能避免这个。怎么就没意思了?
Please open Telegram to view this post
VIEW IN TELEGRAM
duangsuse::Echo
最开始是“RSC Payload 永远只能由可信的 React Server 产生,客户端必须 100% 信任它”
#security CVE-2025-55182 #回顾 😒😓 https://youtu.be/LSiYdiMGS4U

shellcode={
"1": "$@1", // 这是一个 Promise
"2": {
"status": "resolveModule", // 直接告诉你要已经 resolved 了
"value": {
"$": "$B", // 伪装成一个 Blob
"_prefix": "x",
"_formData": {
"x": "console.log('pwned'); require('child_process').execSync('whoami > /tmp/pwned')"
}
}
}
}


摘要:
为什么这么简单的一个JSON就能伪装成功呢?因为React从头到尾都没有验证手上的这个 AST Blob module 缓存数据是不是Parser自己生成的(而非 POJO)。理论上,你能够在请求内容里伪装任何东西,不一定通过未转义的Promise或Blob,它都会傻傻的全盘接受。这也是让这个漏洞一举拿下十分满分,成为“完美漏洞”的点金之笔。

React把「客户端发来的 AST JSON」和「服务端parser自己生成的 JS Object」混为了一谈,导致攻击者可以用一个纯JSON伪造一个「可信的恶意resolveModule代码缓存」,从而实现零交互满权限RCE。

具体来说,React Server Components 在服务器端渲染时,前端会通过POST请求把一堆「序列化后的RSC Payload」发给服务器。这个Payload本质上是一个经过特殊编码的JSON流,里面包含了很多以$开头的特殊标识符($J、$@、$A、$B……),React自己的parser会根据这些前缀,把它还原成真正的JavaScript对象(Map、Set、Promise、Blob等等)。

致命的假设是,这些特殊对象都是由React自己的parser在服务端「凭空构造」出来的,所以是安全的。
它从来没有校验过: $AT 等待的结果、直接带有恶意属性的 Blob._prefix 是不是POJO

这种跨网络的通讯就是一种Remote Procedure Call (RPC),RPC框架不是什么新鲜事物,它的安全机制也早就有了很成熟的设计准则,不管是早年的SOAP还是现在最流行的gRPC,都很遵守这些基本准则,

比如说Schema的设计、explicit的定义、防止边界混淆的措施等等。然后Vercel这些人就是没有一点点后端开发的职业操守,从整个RSC的设计来看,你甚至可以说他们是把前端圈子的“所见即所得”作风带给了后端。
2025年11月29日,来自新西兰的安全专家Lagland Davidson向React团队提交了一个Bug报告。他通过在HTTP请求里构建一个精心设计的JSON,成功让使用React Server Components的服务器执行了一段代码里完全没有的命令。如果只是借用服务器的资源跑一下`console.log`,那倒也不是特别严重的事情,最多给个六分。

让这个漏洞值十分的原因是:不管你在这个Payload里写什么,只要它是正确的Node.js代码,Vercel都会执行他。比如说,你可以调用Node.js的`child_process`模块,直接在服务器上执行bash命令。如果你的后端是用root之类的高权限账号部署的,那就更刺激了,可以直接给他来一个“一键扫弹”。如果你不想搞破坏,只是想要窃取一些机密,也是很容易的事情,
比如通过`fs`模块读取任意一个系统文件,然后通过`http`模块把文件内容发送到自己的服务器。如果你懒得搭建自己的服务器,或者怕事情败露后被警察叔叔顺着网线摸过来,你也可以原地把窃取到的内容放进`Error`里抛出,这样服务器就会用500报错把`Error`送回来。

如果你想做得更隐蔽一些,免得忽然出现大量的`Error` log被人发现有异常,你可以让HTTP请求正常返回,然后把机密塞到返回的`Header`里。

这个漏洞不仅严重,而且很容易复现,所以React团队陷入了一个两难的境地:如果你偷偷地发布修复补丁,大家不知道出大事了,就很难保证补丁的安装率;如果你全世界通告漏洞的存在,那黑客肯定比谁的反应都快。所以React团队为了延缓黑客的速度,给大家脱购时间,看到新闻打好补丁,在2025年12月3日,他们仅发布了通告和补丁,没有解释任何技术细节。
他们还特意在补丁中混入了将近1000行的其他代码,就是为了让人更难找到漏洞的源头,把它隐藏起来。
但毕竟React是一个开源项目,一切都是明牌的,这种小伎俩是藏不了多久的。像我这种前端半桶水的程序员,也只是花了几个小时,把补丁改动的那几个文件和他们的上游都看一遍,基本上就能捋清整个逻辑链条了。

……这一次
简单来说,React的RSC模块在收到前端请求时会进入一个recursive parsing的逻辑,在这个过程中,Parser会生成一个类似AST的数据结构。其中有一个叫做`ParseModelStream`的函数负责识别这个数据结构,这里你能看到它就是一个巨大的switch case,根据数据的第一个和第二个字符来判断它属于哪种数据。

比如说,以`$Q`开头了就是`Map`,`$W`开头了是`Set`,`$K`开头是`FormData`。

这里有一个比较特殊的情况是`$AT`,它指的是一个Promise,也就是一个会异步执行的JavaScript命令。这种特殊数据就会被打包成一个独立的chunk,状态设置为`pending`,等待后续的数据流。数据流完整传输到位后,这个chunk的状态就会被更新为`resolveModule`,代表它可以执行。
在$AT执行之前,需要先通过`ParseModuleString`函数对chunk内容再做一次Parsing,把它从Binary转换成正确的JavaScript结构。比如说,`$A`是`ArrayBuffer`,`$S`是`Int16Array`。这里又有一个比较特殊的情况,`$B`指的是Blob,因为Blob就是Blob值,没有什么需要转换的,所以`$B`开头的数据会跳过constructor的步骤,直接执行。OK,整个逻辑链条说完了。

现在你就能看懂了:他先把这个Payload转换成String,然后再读取成Buffer,这样React的Parser就会读到一个长得跟自家的AST数据(Blob)一模一样的东西。这里有`$AT`告诉你它是一个要被执行的Promise,这里的`status`等于`resolveModule`,就让它绕开了不存在的`pending`状态直接进入执行流程。这里的`$B`告诉你它是一个Blob,请你绕过constructor步骤直接执行!

最后,通过精准地对应`$B`数据的处理代码,让Parser通过它提供的`_underscore prefix`和`_underscore form data`这两个key,乖乖地把`_underscore prefix`里的文本当作是Blob的内容直接执行,也就是这行`console.log`代码。

为什么这么简单的一个JSON就能伪装成功呢?因为React从头到尾都没有验证手上的这个 AST Blob 数据是不是Parser自己生成的。理论上,你能够在请求内容里伪装任何东西,它都会傻傻的全盘接受。这也是让这个漏洞一举拿下十分满分,成为“完美漏洞”的点金之笔。

这个事件中不存在“被坑下”,因为整个React核心开发团队和幕后黑手Vercel公司都是罪魁祸首。而是要一直在模糊React的前端和后端边界,这不是不小心的,而是故意的,因为他们需要让React的使用者——那些前端开发团队——更容易接受这种极端的SSR路线。
但本质上,这种跨网络的通讯就是一种Remote Procedure Call (RPC),RPC框架不是什么新鲜事物,它的安全机制也早就有了很成熟的设计准则,不管是早年的SOAP还是现在最流行的gRPC,都很遵守这些基本准则,

比如说Schema的设计、explicit的定义、防止边界混淆的措施等等。然后Vercel这些人就是没有一点点后端开发的职业操守,从整个RSC的设计来看,你甚至可以说他们是把前端圈子的“所见即所得”作风带给了后端。


ps. 我是转写的文稿,符号不准确,原作者也不是专家没get到重点😅
https://gist.github.com/maple3142/48bc9393f45e068cf8c90ab865c0f5f3
讲的很清楚了,我不再赘述。 这次bug评论让我认识到AI的幻觉与思维局限性,以及搜索与核查能力的决定性
Please open Telegram to view this post
VIEW IN TELEGRAM