Live2D:软件安全翻车现场
Last Updated:
Languages: 简体中文 (zh-cn) ・ English (en) ・ 日本語 (ja)
本文中文版翻译者为 Dianliang233。
情况更新:本文所述的漏洞已经被分配为 CVE-2023-27566。
Live2D Cubism 是一个热门的 2D 任务动画软件,闻名于其在 VTuber1 和一些手游中的使用。为了加载此软件生成的模型,开发者需要引用该公司专有的“Cubism SDK”,而且没有替代品。这个 SDK 的核心元件是“Cubism Core”,一个微型 C 语言库。它负责解析并加载 MOC3 文件,Live2D Cubism 用它储存 2D 人物。不幸的是,Cubism Core 是一个充满缺陷,甚至无法修复的软件。
如果你只对代码感兴趣,请看文末.
如果你觉得太长不看,请见要点.
初见 MOC3
MOC3 是一个专有二进制格式。它包含一个含有 2D 人物的相关数据的偏移(offset)列表,例如图层和可调整的参数。这种格式实际上是 C 语言数组和结构体的原始转储。虽然这个格式很丑,但它确实能用,我们也应该可以编写一个安全的加载器来加载这种格式。MOC3 文件并不包含实际的纹理。
对 MOC3 进行逆向
一个最简单的 MOC3 文件只需要两个组件:一个文件头,其中有魔法字符串“MOC3”、版本和字节序。还有一个分段偏移表,包含文件中每一段数据的偏移,这些条目都以 32 位有符号整数储存。该表紧密遵守数组结构体范式。
我在把玩了一阵子之后,发现了 MOC3 文件的准确布局,并用 ImHex 编辑器探索了一些属性。
ImHex 支持模式(pattern),可以定义二进制格式的结构和其他元素。这使得我们可以轻松地编写一个接口来读取和编辑 MOC3 文件的各个分段。
最终的模式文件大约有 400 行,比我预期的要短得多。一个值得注意的分段是计数信息表,它指定了每种类型的对象的数组中元素的数量。
MOC3ingbird(反舌鸟):安全问题
**虽然 Cubism Core 是仅有的加载器,但它毫无安全性可言!通过更改分段偏移表中的条目可以发现,Cubism Core 会盲目地将给定的偏移加到 MOC3 数据的内存基址上,这意味着一个恶意的 MOC3 文件可以随便指示 Cubism Core 覆盖 MOC3 数据所在位置的内存,最大可以覆盖大约 2 GiB。**整个文件基本上就是一个我让你写入什么你就写入什么,我让你写入哪里你就写入哪里(Write-what-where)的原语2。除此之外,计数信息表也没有边界检查,因此你可以在一个 8192 字节的 MOC3 文件中指定 500,000 个参数。总之,Cubism Core 的实现非常容易“翻车”。
MOC3ingbird(反舌鸟)是一个简单的 MOC3 文件,它可以让官方 Live2D 查看器和任何使用 Cubism Core 的第三方软件崩溃。
它本身并不包含任何有害代码,但它可以很容易被修改为可以执行任何代码。上图就展示了 MOC3ingbird exploit.moc3
文件的一部分分段。
缺陷是设计疏忽造成的吗?
MOC3 格式虽然技术上是可用的,但是它的设计完全失败。而 Cubism Core 有那么多的问题,它竟然在用于生产环境时还要求购买这么贵的许可。虽然这个格式可能是故意设计成这么糟糕的,但更有可能它就没有被仔细设计过。字段和分段就像是想什么时候添加就什么时候添加,根本没有合适的实现。当然,有一些解决方案可以让这种设计变得合理,最简单的就是使用标准的序列化格式,例如 JSON、MessagePack、CBOR 或者 Protocol Buffer。遗憾的是,我怀疑 Live2D 的开发者是故意不这么做的,目的就是为了让这个私有格式垄断市场,排除竞争。
这一切决定和“没有决定”的结果就是一个不透明、不安全的混乱的文件格式,而且没有从头重写就大概不可能解决。说实话,我并不关心他们是不是只是疏忽大意或者是为了赚钱,但是让用户面对这么简单且可以避免的漏洞是不可接受的。
隐私灾难
Live2D 公司公然对合适的安全事件视而不见甚至更加糟糕。考虑到他们的很大一部分用户(VTuber3)都会尽一切努力保护自己的隐私。人肉/开盒(dox(x)ing)4 在 VTuber 社区是一个很大的问题,而且恶意方可以轻易利用这些漏洞来在不知情用户的电脑上部署间谍软件。
为什么要公开这个?
说实话,我不认为 Live2D 公司会在没有强烈的反馈抗议的情况下修复这些问题。如果向他们直接汇报这个问题,他们就会认为它“不重要”。Live2D 公司表面似乎非常重视保密和安全性,但他们的手段只有含糊其辞,而不是重视透明度和真正的不是“半吊子”的安全。他们的真面目我已经在在 FreeLive5 事件和其他我不能透露的事情中所见到的那样。我很确定,如果这篇文章没有被发布,一个黑客组织最终会发现这些漏洞并在秘密中利用它们,而 Live2D 的用户将一无所知。
Live2D 的用户和社区必须推动他们修复这些问题,或者切换到开放的其他方案,比如 Inochi2D。至于 Live2D 公司喜欢不喜欢这样的手段,就不重要了。
反竞争
上文中,我提及了 Cubism SDK 是唯一可以加载 MOC3 模型的加载器。虽然从简单的角度理解,可能是因为这个格式太过复杂和难以理解,但可能还有另一个原因。
5.1.9 其他限制行为
- 输出文件不得同与 Live2D 公司开发的中介软件产生或可能产生冲突[原文如此]6的中介软件等组合使用
(摘自 Live2D EULA)
以防万一你没看清楚,或者不理解,Live2D 的 EULA 禁止用户把(用 Live2D 公司的既昂贵还需要付费许可的编辑器软件)创建的模型,放入 可能的更安全的 Cubism Core 的替代方案中使用。如果你使用他们的编辑器软件,你就必须使用他们的不安全、私有的 SDK。
如果你是一位使用 Live2D SDK 的开发者,我鼓励你或你的雇主用你们的钱来表达你们的不满。如果你需要一些鼓励的话,让我再提醒你一下:
- 您不得从事其他任何 Live2D 公司认为不合适的活动。
让我们再往下滑滑……
7.4 根据第 7.1 条规定,本协议终止后,您必须立即销毁本软件与所有相关副本、以及包括输出文件和其他任何因使用本软件而产生的衍生物在内的衍生作品。
他们很直白地说了,Live2D 公司可以字面上地把你们的生意一秒就抹杀干净。
尚不清楚如果一个人从第三方获得 Live2D 模型,是否会受到这些条款的约束(可能不会,因为他们从未同意过这份协议,假设他们没有自己安装 Live2D Cubism 编辑器)。
让我们再读一些限制……
- 未经 Live2D 公司授权[原文如此]7,您不得公开发布本软件以及输出文件软件中包含的本软件的任何代码与内容;
我可以确认 MOC3 文件不包含任何编辑器软件的迹象,至少不包含任何代码。事实上,我刚刚向你展示了如何从头开始制作 MOC3 文件,而没有从编辑器中提取任何东西。
不合法条款?
这些巨长的协议许可通常有一大堆“你必须”“你不得”,而这些条款甚至可能会触发你住的地方的法律。我可期待他们在欧洲试试用“禁止逆向工程”条款和谁对簿公堂呢。至少他们知道:
5.1 限制性行为
Live2D 公司保留所有在本协议中未经明确授予给您的权利,除非适用法律不受前述限制而给予您更多的权利。您只能依据本协议中明确许可的方式使用本软件。
要点
- 不要用 Live2D 软件打开从你不信任的来源获取的文件或者模型,这不安全!
- 在最坏的情况下,Live2D 文件可能会包含间谍软件、勒索软件或者其他恶意软件。
- 你不能知道 Live2D 模型到底安不安全,这就意味着你不能安全地从互联网上获取任何 Live2D 模型。
- 没有软件能够验证 Live2D 模型的安全性和完整性,且 Live2D 公司很可能会阻止这样的软件的开发。
- Live2D 公司涉嫌采取不应当被支持的反竞争措施。5
- 你应该支持 Live2D 的自由、免费、安全的替代品。
源代码
漏洞和 MOC3 格式的模式文件可以在 https://github.com/openl2d/moc3ingbird 获取。
MOC3ingbird © 2023 OpenL2D 项目开发者
-
Virtual YouTuber 的缩写。也就是一位使用电脑生成的虚拟形象的网上主播。见 https://zh.wikipedia.org/wiki/VTuber。译者注:在国内一般被成为“虚拟主播”,缩写为 VTb/Vup(后者因在 B 站上活跃而得名)。 ↩︎
-
攻击者能够将任意值写入任意位置的情形。通常是由于缓冲区溢出导致的。 参见 https://cwe.mitre.org/data/definitions/123.html. 译者注:常译为“任意写入”,为了方便理解并更贴合原文改译。 ↩︎
-
“2021 年,70% 的 Live2D Cubism Pro 用户都是 Vtuber……”。参见 https://en.wikipedia.org/wiki/Live2D#Software 和 https://s.inside-games.jp/article/2021/12/30/136055.html. ↩︎
-
在网上泄露某人的身份信息的行为。 参见 https://en.wikipedia.org/wiki/Doxing. ↩︎
-
还有人想要写一个 FOSS(译者注:自由及开放源代码软件)的 MOC3 加载器。参见 https://github.com/UlyssesWu/D2Evil/issues/1。我不会删除这个信息,但是如果你还是想要抱怨,我的邮箱是 ronsor (at) ronsor.com。 ↩︎ ↩︎
-
译者注:原文如此。此处摘录自官方中文 EULA,其中“compete”一词意为“竞争”,而官方文本有错译。(EULA 原文为日文,因译者能力有限,仅能从英文译版找出错误,若有理解错误,欢迎斧正。) ↩︎
-
译者注:没错,原文如此。此处摘录自官方中文 EULA,其中“under a license that is not from Live2D”应译为“不以 Live2D 公司提供的协议发布(内容)”,而官方文本又有错译。 ↩︎
#Security Reports: Full Disclosure #Live2D #Security #MOC3ingbird #Exploit #C #ImHex