CVE-2026-33228flatted是一个循环JSON解析器。在3.4.2版本之前,其parse()函数存在严重的安全漏洞。该函数在解析JSON时,直接将攻击者控制的字符串值作为数组索引键使用,而未验证其是否为数字。由于内部输入缓冲区是JavaScript数组,攻击者可以利用"__proto__"键访问并返回Array.prototype。该对象随后被视为合法的解析值并分配给输出对象的属性,从而向使用者泄露了Array.prototype的实时引用。任何随后写入该属性的代码都将导致全局原型污染,进而可能引发应用程序逻辑错误或远程代码执行等严重后果。
该漏洞的根源在于flatted库的parse()函数在处理JSON输入时缺乏对键名的类型检查。在JavaScript中,数组的索引通常应为数字,但如果使用字符串索引(如"__proto__"),JavaScript引擎会尝试在对象的原型链上查找该属性。攻击者可以构造恶意的JSON数据,其中包含"__proto__"作为键。当flatted解析此数据时,它会将"__proto__"作为键去访问内部数组对象。由于数组本身没有名为"__proto__"的属性,访问操作会沿着原型链找到Array.prototype对象。flatted随后将这个Array.prototype对象作为解析结果的一部分返回给调用者。这意味着调用者获得了一个对全局Array.prototype的直接引用。如果应用程序后续对这个返回的对象进行属性赋值操作(例如parsedObject.someProperty = value),实际上是在修改Array.prototype。由于JavaScript中的数组都继承自Array.prototype,这种修改会影响整个应用程序运行环境中的所有数组,造成原型污染。攻击者可以利用这一点篡改应用程序的逻辑,甚至结合其他漏洞实现远程代码执行(RCE)。