diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md new file mode 100644 index 00000000..ffc6ba30 --- /dev/null +++ b/.github/CONTRIBUTING.md @@ -0,0 +1,15 @@ +Thank you for your interest in helping with documenting the Fractureiser malware outbreak. + +Please keep the following things in mind: +- Pull requests that perform bulk reformatting, automated or otherwise, **will be rejected**. This is because reformatting creates unwieldy diffs that result in cascading merge conflicts. Please just enable word-wrapping in your editor. +- Pull requests to add translations are very welcome; more languages makes it easier for non-English speakers to learn about the outbreak. Please see [#79](https://github.com/fractureiser-investigation/fractureiser/issues/79) for general discussion the translation community has had about how translations should be implemented. Our team primarily speaks English, and are not knowledgeable in translation, so we've delegated this to the community to ensure we wind up with a reasonable implementation. +- Many forms of "strange" formatting in this repo are wholly intentional, and PRs attempting to "correct" them will be rejected. A non-exhaustive list: + - We refer to Fractureiser stages as e.g. "Stage0" — always capitalized and with no space. + - "Fractureiser" is indeed not well-formed English; it should be "fracturizer" or "fracturiser", depending on dialect. It's kept as-is from the CurseForge account that spread the first samples we learned of. +- We do, however, welcome non-controversial formatting/grammar fixups. A lot of the documentation was written in a hurry and it's got various mistakes we've not caught. + - This is not carte blanche to run automated grammar/spelling tools on the repo, such as Grammarly — the unguided output from these has a very obvious and poor style which we will reject on sight. +- The Discord guild is not official, and attempts to add links and references to it will be rejected. The mitigation team meets on IRC. +- Please tread carefully when attempting to add new guidance, as we've been pretty careful about how we're presenting the situation and how people should respond. We don't want to encourage people to be reckless when what's at stake is considered. +- ***Do not ask for samples***. If you have experience and credentials, that's great, but we have no way to verify this without using up tons of our team's limited time. Sharing malware samples is dangerous, even among people who know what they're doing. +- **Do not witchhunt, or encourage witchhunting, the author.** Online witchhunts do not go anywhere productive, and our focus is on the effects this has had on the community and how we can prevent it in the future. +- Any mention of blockchain or AI technology as a "solution" to future outbreaks is an instant ban. diff --git a/README.md b/README.md index 7fdea76c..271b6ec8 100644 --- a/README.md +++ b/README.md @@ -1,28 +1,29 @@
- +
*Pardon our dust, documentation still in progress* +[简体中文版本见此](./lang/zh-CN/) + ## What? -`fractureiser` is a [Virus](https://en.wikipedia.org/wiki/Computer_virus) found in several Minecraft projects uploaded to CurseForge and CraftBukkit's dev website. The malware is embedded in multiple mods, some of which were added to highly popular modpacks. The Malware is only known to target Windows and Linux Systems. +`fractureiser` is a [virus](https://en.wikipedia.org/wiki/Computer_virus) found in several Minecraft projects uploaded to CurseForge and BukkitDev. The malware is embedded in multiple mods, some of which were added to highly popular modpacks. The malware is only known to target Windows and Linux. If left unchecked, fractureiser can be **INCREDIBLY DANGEROUS** to your machine. Please read through this document for the info you need to keep yourself safe. -We've dubbed this malware `fractureiser` because that's the name of the CurseForge account that uploaded the most notable malicious files. +We've dubbed this malware fractureiser because that's the name of the CurseForge account that uploaded the most notable malicious files. ## What YOU need to know ### [Modded Players CLICK HERE](docs/users.md) -If you're simply a mod player and not a developer, the above link is all you need. It contains surface level information of the malware's effects, steps to check if you have it and how to remove it, and a FAQ. +If you're simply a mod player and not a developer, the above link is all you need. It contains surface level information of the malware's effects, steps to check if you have it and how to remove it, and an FAQ. Anyone who wishes to dig deeper may also look at * [Event Timeline](docs/timeline.md) * [Technical Breakdown](docs/tech.md) -### I have never used any minecraft mods - +### I have never used any Minecraft mods You are not infected. ## Current Investigation Status @@ -30,21 +31,21 @@ We have a good idea how fractureiser works, from Stages 0 to 3. There are certai unknowns, but the attack servers are offline and to our knowledge, *new* infections are not possible. Old infections may still be active. -We are currently working on refining user-facing documentation, please check there for -resources. +User-facing documentation is more or less finished. We're working with community members to get it translated into other languages to further spread awareness. -## Follow up Meeting +## Follow-Up Meeting On 2023-06-08 the fractureiser Mitigation Team held a meeting with notable members of the community to discuss preventive measures and solutions for future problems of this scale. See [this page](https://github.com/fractureiser-investigation/fractureiser/blob/main/docs/2023-06-08-meeting.md) for the agenda and minutes of the event. ## Additional Info -If you have files relevant to this malware, please upload them to https://wormhole.app and email the URL to fractureiser.investigation@opayq.com — this inbox is controlled by unascribed, and anything sent to it will be shared with the rest of the team. If you need to get in touch more generally, please send mail to jaskarth4@gmail.com. +If you have files relevant to this malware, please upload them to https://wormhole.app and email the URL to fractureiser@unascribed.com — anything sent to it will be shared with the rest of the team. If you need to get in touch more generally, please send mail to jaskarth4@gmail.com. If you copy portions of this document elsewhere, *please* put a prominent link back to this [GitHub Repository](https://github.com/fractureiser-investigation/fractureiser) somewhere near the top so that people can read the latest updates and get in contact. -The **only** official public channel you may join without being personally invited that's *run by the same team that wrote this writeup* is [#cfmalware on EsperNet IRC](https://webchat.esper.net/?channels=cfmalware). -**Joining an IRC channel will expose your IP address.** +The **only** official public channel you may join without being personally invited that's *run by the same team that wrote this writeup* is [#cfmalware on EsperNet IRC](https://webchat.esper.net/?channels=cfmalware). **Joining an IRC channel will expose your IP address.** + +**Do not ask for samples.** If you have experience and credentials, that's great, but we have no way to verify this without using up tons of our team's limited time. Sharing malware samples is dangerous, even among people who know what they're doing. --- diff --git a/docs/2023-06-08-meeting.md b/docs/2023-06-08-meeting.md index 970174ca..b4df57a8 100644 --- a/docs/2023-06-08-meeting.md +++ b/docs/2023-06-08-meeting.md @@ -6,6 +6,10 @@ In the interest of keeping the meeting productive, we invited a narrow set of me from the community, mostly people working on mod repositories, and people who helped organize the incident response. +## Recordings + +The meeting has been recorded and edited to include speaking identifiers. You can watch the recording on [YouTube](https://www.youtube.com/watch?v=L52Hu334Q90) or [PeerTube](https://tube.sleeping.town/w/c48e7df1-cf9b-43d2-84a8-4bce404ee836). + ## Time 2023-06-08 16:00 UTC diff --git a/docs/credits.md b/docs/credits.md index cda55191..588cc2c5 100644 --- a/docs/credits.md +++ b/docs/credits.md @@ -1,9 +1,9 @@ ## Credits -Nonextensive! Thank you to all that pitched in. We'll flesh this out after this all blows over. +Nonexhaustive! Thank you to all that pitched in. -[**Emi**](https://github.com/emilyploszaj/): Coordination, initial discovery (for this team), and early research -[**Jasmine**](https://github.com/jaskarth/): Coordination, writing the decompiler we've been using ([Quiltflower](https://github.com/QuiltMC/quiltflower/)) -[**unascribed**](https://github.com/unascribed/): Coordination of documentation, crowd control +[**Emi**](https://github.com/emilyploszaj/): Coordination, initial discovery (for this team), early research, meeting organization +[**Jasmine**](https://github.com/jaskarth/): Coordination, research, writing the decompiler we've been using ([Quiltflower](https://github.com/QuiltMC/quiltflower/)) +[**unascribed**](https://github.com/unascribed/): Coordination of documentation, crowd control, logo [**williewillus**](https://github.com/williewillus/): Coordination, journalist [**Vazkii**](https://github.com/vazkii/): Documentation, public communications [**Col-E**](https://github.com/Col-E/): Reverse engineering, writing the deobfuscator we've been using ([Recaf](https://www.coley.software/Recaf/)) @@ -12,4 +12,4 @@ Nonextensive! Thank you to all that pitched in. We'll flesh this out after this [**aurelium**](https://github.com/autumnaurelium/): Coordination, deobfuscation [**D3SL**](https://github.com/D3SL/): Extensive reverse engineering, early discovery learned of later [**Luna Pixel Studios**](https://lunapixelstudios.github.io/): Quick detection of unauthorized uploads -**Nia**: Extensive Stage 3 reverse engineering \ No newline at end of file +**Nia**: Extensive Stage 3 reverse engineering diff --git a/docs/tech.md b/docs/tech.md index 5fb191ad..c8d83b06 100644 --- a/docs/tech.md +++ b/docs/tech.md @@ -12,12 +12,12 @@ mods, as it was an interesting new upload. ### Known affected mods & plugins Note: This list is **non-comprehensive**. It was constructed in the early days of -investigation and quickly we realized the scope of this was much larger than we though, +investigation and quickly we realized the scope of this was much larger than we thought, making tracking of individual cases pointless. It's left here for historical purposes. See also CurseForge's [list](https://support.curseforge.com/en/support/solutions/articles/9000228509-june-2023-infected-mods-detection-tool/) -of affected projects +of affected projects. |mod/plugin|link(s)|SHA1|"Uploader"| |---|---|---|---| @@ -199,7 +199,7 @@ Thus, if a user copies a file and goes to paste it elsewhere they will instead p ### Data theft -**MSA Tokens**: Since this mod is targeting Minecraft mods, its only natural to attempt to steal the MSA token used to login to Minecraft with. Some launchers keep this data in a local file, which this malware will attempt to read from. This affects a variety of launchers such as: +**MSA Tokens**: Since this mod is targeting Minecraft mods, it's only natural to attempt to steal the MSA token used to login to Minecraft with. Some launchers keep this data in a local file, which this malware will attempt to read from. This affects a variety of launchers such as: * The vanilla/mojang launcher * The legacy vanilla/mojang launcher @@ -227,7 +227,7 @@ The change from this strategy to the vanilla launchers is that the Json has an a The change from this strategy to technic is that technic stores credentials using Java's built-in object serialization, wrapping the `com.google.api.client.auth.oauth2.StoredCredential` type. -**Discord tokens**: Everyone's seen a token-stealer before. Affects the standard client, canary, ptb, and lightcord clients. +**Discord tokens**: Everyone's seen a token-stealer before. Steals token and extra information such as payment methods, linked phone number, etc. Affects the standard client, canary, ptb, and lightcord clients. Relevant source: [`dev/neko/nekoclient/api/stealer/discord/DiscordAccount.java`](https://github.com/clrxbl/NekoClient/blob/fd76c5f9d40d1e10de11f00a6b4e0cca3d6221a3/dev/neko/nekoclient/api/stealer/discord/DiscordAccount.java) **Cookies & Saved credentials**: Steals saved cookies and login credentials saved in affected browsers. Relevant source: [`dev/neko/nekoclient/api/stealer/browser/impl/BrowserDataStealer.java`](https://github.com/clrxbl/NekoClient/blob/main/dev/neko/nekoclient/api/stealer/browser/impl/BrowserDataStealer.java) diff --git a/docs/timeline.md b/docs/timeline.md index 6a7b0fe3..9cc636bf 100644 --- a/docs/timeline.md +++ b/docs/timeline.md @@ -2,6 +2,11 @@ The timeline is from bottom-to-top. Topmost events are the most recent. +--- +*2023-06-09 07:48 UTC* + +Creators of Stage3b (skyrage) have apparently lost their domain skyrage.de (nameserver and registrar entries changed, dns entries vanished) + --- *2023-06-08 10:50 UTC* diff --git a/fractureiser.png b/fractureiser.png new file mode 100644 index 00000000..5f75fef7 Binary files /dev/null and b/fractureiser.png differ diff --git a/lang/zh-CN/README.md b/lang/zh-CN/README.md new file mode 100644 index 00000000..84447169 --- /dev/null +++ b/lang/zh-CN/README.md @@ -0,0 +1,57 @@ ++ +
+ +*施工现场,如有疏漏,还请海涵* + +译者注:本文为译文,仅为扩散正确信息、方便不熟悉英语的读者而提供。 +本文将尽最大努力保持与上游内容同步,但考虑到上游更新速度极快,仍可能有部分内容过期,还请海涵。鉴于此,请务必时刻参考原文获取最新信息! +如译文与原文冲突,请以原文为准。传播时,请无论如何都要传播原文地址。 + +Last updated at Jun 9th, 2023 +最后更新于二〇二三年六月九日 + +## 这是什么? +`fractureiser` 是在 CurseForge 及 CraftBukkit 网站上发现的[计算机病毒](https://zh.wikipedia.org/wiki/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%97%85%E6%AF%92)。这种病毒,或者说恶意软件,内嵌在了数个模组(Mod)中,这其中有一部分模组还进入了热门整合包中。目前该恶意软件已知仅针对 Windows 和 Linux 两大类操作系统。 + +若不加以处置,fractureiser 将会对你的设备构成**极为严重的安全威胁**。请阅读整个文档以了解如何在当下保证安全。 + +我们将该病毒/恶意软件称为 `fractureiser`。这个名字是某个 CurseForge 账号的用户名,而该账号的持有者正是最明显的含该恶意软件文件的上传者。 + +## **你**需要知道的事项 + +### [模组玩家**点这里**](docs/users.md) + +如果你只是普通模组玩家,不是开发者,那么你只需要阅读上面的这个链接中的内容。这其中包括了该恶意软件危害的简明描述、协助你排查是否受感染的教程、以及一份常见问题解答。 + +如果你学有余力,想进一步了解细节,可浏览下列内容: + +* [事件时间线](docs/timeline.md) +* [技术分析](docs/tech.md) + +### 我从未使用过任何 Minecraft 模组 + +你没有感染。 + +## 目前调查进展 + +我们目前已经对 fractureiser 从「阶段 0」到「阶段 3」的工作流程有了充分了解。虽然仍然有一些细节没有查明,但根据我们所掌握的情况,攻击者的服务器已下线,**新感染**已不可能,但已感染的设备仍会受影响。 + +我们正在改进针对普通用户的文档,请查阅相关文档了解更多信息。 + +2023 年 6 月 8 日,Fractureiser Mitigation Team 召集了一场社区会议,与会成员均为社区知名成员,会议讨论了同类事件的预防措施,及在未来彻底解决此类问题的方案。这次会议的议程及会议纪要可在[此页](docs/2023-06-08-meeting.md)找到。 + +## 其他信息 + +如果你持有该恶意软件的样本,请上传至 https://wormhole.app 然后将文件地址通过电邮发送到这个邮箱地址:`fractureiser.investigation@opayq.com`。该邮箱由 unascribed 控制,所有收到的样本将会分享给其他团队成员。若你需要就其他事项联系,请向 `jaskarth4@gmail.com` 发电邮咨询。 + +如果你把本文档部分复制、转载到了别处,**请务必**在开头或其他位置显著标明[本 GitHub 仓库的链接](https://github.com/fractureiser-investigation/fractureiser),这样其他人可以在第一时间内了解事态的最新进展。 + +我们**只有一个**__由本文档撰写者原班人马维护__,可以无需邀请即可加入的聊天频道:[EsperNet 上的 IRC 频道 #cfmalware](https://webchat.esper.net/?channels=cfmalware)。 +**注意:加入 IRC 频道会暴露你的 IP 地址。** + +IRC 聊天日志:待补全 + +--- + +\- [fractureiser Mitigation Team](docs/credits.md) diff --git a/lang/zh-CN/docs/2023-06-08-meeting.md b/lang/zh-CN/docs/2023-06-08-meeting.md new file mode 100644 index 00000000..3b241d3c --- /dev/null +++ b/lang/zh-CN/docs/2023-06-08-meeting.md @@ -0,0 +1,528 @@ +Last updated at Jun 9th, 2023 +最后更新于二〇二三年六月九日 + +Note from translator: minutes portion are intentionally bilingual parallel text. +译者注:纪要部分为有意保持的双语平行文本。 + +# Fractureiser Mitigation 会议 2023-06-08 + +本文为在 2023 年 6 月 8 日召开的针对是次事件的会议之日程安排及会议纪要。 + +为保证会议的高效运行,我们仅邀请了部分社区成员与会,其中多数为模组仓库的工作人员以及在应对是次事件时提供帮助的人。 + +## 回放 + +我们全程录制了会议发言,并标记了所有发言者的身份。你可以在 [YouTube](https://www.youtube.com/watch?v=L52Hu334Q90) 或 [PeerTube](https://tube.sleeping.town/w/c48e7df1-cf9b-43d2-84a8-4bce404ee836) 上观看回放。 + +## 时间? + +2023-06-08 16:00 UTC + +## 出席者 + +会议组织者: + +- Emi(最初响应者,组织者) +- Jasmine(组织者) + +会议秘书、纪要编辑整理 + +- williewillus(事件记者,来自 Violet Moon) + +社区成员(字母排序): + +- Adrian(来自 Modrinth) +- cpw(来自 Forge) +- Doctor Oyster(Overwolf 社区团队领导) +- Emma(来自 Modrinth) +- Fury(Overwolf CEO) +- gdude(来自 Quilt) +- Geometrically(来自 Modrinth) +- IMS(来自 CaffeineMC) +- Jared(来自 BlameJared Maven) +- kennytv(来自 PaperMC) +- Mikey(来自 FTB) +- modmuss(来自 Fabric) +- Slowpoke(来自 FTB) +- Starchild(来自 Quilt) +- timoreo(来自 Prism Launcher) +- ZekeZ(来自 Prism Launcher) + +## 事件总结及响应 + +(这一段仅供与会者快速了解事态全貌,到时候不需要读出声来或者别的什么) + +`fractureiser` 是近期出现的计算机病毒,拥有自我复制能力,会感染 Bukkit 插件、Forge 模组、Fabric 模组以及原版 Minecraft jar 文件。受感染的文件在加载时虽会继续正常运行,但会在后台悄无声息地下载一系列程序,这些程序可以窃取登录令牌、浏览器保存的密码和支付信息、加密货币等。在一台计算机感染后,受攻击计算机上全部符合条件的 jar 文件都将会感染相同病毒,一旦用户将受感染文件分享给他人,便会引发病毒传播。攻击者使用由此窃取而来的 CurseForge 登录令牌获取大型模组项目的访问权,并藉由此试图向更多用户传播感染后的 jar。 + +对此问题的讨论及应对在 6 月 6 日正式开始。社区成员逐渐找到并识别了各种样本,并对样本进行反编译以进行进一步分析。随后,社区成员找出了用于下发恶意软件传播程序及密码窃取程序的服务器,并及时通知该服务器所属的提供商 Serverion,使得 Serverion 能及时切断该服务器与外界的连接。在此之后,受感染的 jar 已无继续运行或传播恶意软件的可能,然而在服务器「断网」前就已感染的设备或仍向外传播恶意程序。 + +截至本文写就之时,我们团队仍在对该恶意软件进行逆向工程分析,以期在攻击者试图利用变种发起下一次攻击时,能在最短时间内找出其指挥控制(Command & Control)服务器地址,并及时通知其提供商下架。攻击者在 6 月 7 日试图创建一新主控节点,然而该节点很快被发现并遭断网。我们随后找到了一个指向该失效节点的 URL,并在持续监控此 URL。 + +## 日程安排 + +我们有大约一小时的时间,所以我建议我们每个话题只花最多 15 分钟。 +我已按我(williewillus)所认为的可行性从高到低将话题排列如下。 +越是不可能实现的项目越靠后。如果时间有限,我们还可能会放弃某些话题。 + +### 审核流程不透明 /「隐晦式安全」 + +#### 讨论及行动事项 + +- CurseForge/Modrinth 在审核模组的时候**到底做了什么**? + - 此处应有「what do you do here」表情包(笑) +- 哪些检查**是自动的**? + - ? +- 哪些自动检查**应该有**? + - 静态分析? + - 我们能说服模组仓库在这方面发力吗? +- 半跑题:我们能说服 CurseForge 换一个不是 MD5 的散列码算法吗?MD5 已经被攻破数年了,再这样等下去我们迟早有一天会等来针对 CurseForge 上模组的碰撞攻击。 + - Modrinth 在用什么? + +纪要: + +Fury: CEO of overwolf. Eng is working on mitigations, so I'm here + Re: checks. From a high-level perspective. Don't want to be too open about the checks + because people can find ways to bypass. Understand that the ambiguity is a concern, + will share as much as I can. + All mods have auto checks. Manual checks for some. + Technically, start by running antivirus/antimalware scans. Check file type/adherence to file structure. + API actually supports SHA-1. + More clientside improvements to enforce this in a good way. + Manual checks when an auto check flags it, human reviews the mod. Changing text/images also involves manual review. + Continuously evolving process, have updated automated tests to look for this vuln. + +Fury:Overwolf CEO。工程师们在部署应对方案,所以我来这了。 + 关于审核:大体上我们不能透露太多信息,因为用户会找到绕开的方法的。我们认知到「模糊」本身会引发担忧,所以在此我会尽可能透露多的信息。 + 所有模组都会过自动检查。某些会触发人工检查。 + 技术角度来看,审核流程首先是反病毒检查,然后是文件类型和完整性检查。我们的 API 实际上支持 SHA-1。(译注:迄今为止 CurseForge 仍然只显示 MD5 哈希值。) + 还有更多客户端侧的改进来落实检查。 + 自动检查若认为可疑则会触发人工介入检查。改头图和文本介绍也会触发人工检查。 + 该过程还在不断更新换代,目前已部署专门针对此威胁(译注:指 Fractureiser)的检查。 + +Emi: Moving to modrinth to keep things quick + +Emi:节约时间,话筒交给 Modrinth 代表。 + +Geo/Jay: Founder of Modrinth. Our moderation is pretty robust. + New project: manual review. Check description, images. Also check the source code, esp. for new/unknown authors. + Closed source, will occasionally decompile mods, but not often. + Checks on backend for file structure. + Malware in modded mc is generally never detected by antivirus. + Have rejected mods in the past for suspicious code. + Understand this process is flawed. After initial review, we rely on reports afterwards. + Our code is open source, we want a transparent tool the community can use. + Relies on community trust (known author), but this is also flawed. + +Geometrically/Jay:Modrinth 创始人。我们的监管相当健壮(robust)。 + 新项目:手动检查。检查描述和图像,还有源代码,尤其是对新作者、未知作者。 + 针对闭源模组偶尔还会反编译。反编译并不常见。 + 后端检查文件结构。 + 模组社区的恶意软件基本上杀软探测不到。 + 曾因可疑代码拒审过模组。 + 我们认识到这过程有缺陷。在初步审查之后我们就只仰仗举报了。 + 我们的代码完全开源,我们希望做一套足够透明的工具,这样社区也可以使用。 + 仰仗社区信任(已知作者),但这也有缺陷。 + +Emi: When you check open source mods, do you verify the source corresponds to the jar? + +Emi:你们检查开源模组的时候,是否会检查 jar 和源码确实相匹配? + +Geo: No, but we could do something where users can upload the source for a verified badge, +like what npm has recently does. Might not be most ideal. + +Geometrically:并不,但我们可以让上传源码的用户拿到一个「已验证」的徽章,就 npm 最近搞的那样的。 + 恐怕也不是最理想方案。 + +Emi: Which hash is used by Modrinth + +Emi:Modrinth 使用哪些摘要算法来计算哈希值? + +Geo: We use SHA-1/SHA-512. Avaiable in API. Launcher we're building validates +them. Rehashed all files in SHA-512 a year ago. + +Geometrically:我们用 SHA-1 和 SHA-512。API 支持二者。我们正在开发中的启动器会验证哈希值。 + 一年前我们把所有文件的 SHA-512 都计算了一遍。 + +### 可重现构建(Reproducible Build) + +实现「扫描被窜改后的模组」这个需求的一大挑战是「确保某一个特定版本的模组只可能有一种编译结果」。 +换言之,我们需要实现模组源码的可重现构建。如此一来,我们只需要重新从源码构建模组,并将其哈希值与可疑文件比对, +就可以排除掉阶段 0 的感染,而不必绕路去拿着特征码比对 jar 文件中的所有内容。 + +有多少模组的构建脚本里指定了版本号带 `-SNAPSHOT` 的插件和前置库? + +我打赌是所有,因为 [Fabric](https://github.com/FabricMC/fabric-example-mod/blob/1.20/build.gradle#L2) 和 +[Forge](https://github.com/MinecraftForge/MinecraftForge/blob/1.19.x/mdk/build.gradle#L4) 的模板仓库都有类似操作。 + +诸如 Loom 和 FG 这样的插件一直都有使用动态版本号的传统,其出发点则是在不需要用户介入的情况下推送新版修复,然而现在 Auditability(可审计性?)成为了首要需求。 + +从被黑的模组开发相关 Maven 仓库发起的供应链攻击,现在来看,是真实存在的安全威胁。 + +#### 讨论及行动事项 + +- 停止在示例项目里宣传 `-SNAPSHOT` 的使用,鼓励使用固定版本号 +- 更新 fabric-example-mod 及 forge MDK 示例项目,加入 Gradle checksum verification 及 locking 的用例? + - https://docs.gradle.org/current/userguide/dependency_verification.html + - 这是传统意义上的「把文件 hash 保存起来以供检查」的 lockfile 策略 + - https://docs.gradle.org/current/userguide/dependency_locking.html + - 这是「把形如 `[1, 2)` 的带范围版本号声明锁死在某一特定版本,直至用户主动要求更新」的策略 +- 在 Loom/FG 中成立工作小组,调研如何在[启用 Gradle 的 可重现构建](https://docs.gradle.org/current/userguide/working_with_files.html#sec:reproducible_archives)后成功实现可重现构建。 + 目前,模组开发工具链中存在诸如 jar 重混淆之类的不确定性(non-determinism)。 + 这些不确定性都应该尽力消除,以确保我们可以有开箱即用的可重现构建。 +- 未曾设想的道路:走 F-Droid 风格,直接提交源码,由平台负责构建? + - 考虑其成本,不太可能实现。 + +Starchild: For Quilt, one issue here is signing. We can't reproduce a signature. + +Starchild:对 Quilt 来说最大的问题是我们没法复现签名。 + +willie: But if the signature is distributed separately, should be fine? + +williewillus:如果签名是单独分发的呢? + +Geo: We can never be 100% secure. We can spend a lot of time reviewing every file. One +important thing is accessibility. Many people don't know how Gradle works/what +reproducible builds are. Template mods exist, but even code signing is hard for mobile devs. +We get thousands of submissions a day. + +Geometrically:我们没法百分百安全。我们可以加大在审核上投入的时间。但关键是便于理解(Accessibility)。 + 我们中很多人根本不知道 Gradle 是怎么工作的,遑论可重现构建。有模板模组,但仅仅是代码签名就足够绕晕开发者了。 + 我们一天能收到几千个新模组发布。 + +Fury: One thing we suggest, for authors that opt to go through extra verification have a +tag on their mod for gamers to see to increase trust. + +Fury:我们建议可以给通过额外验证的作者加点标签,这样玩家知道这些作者更可信。 + +### 从外部下载文件的模组 + +从外部下载含有可执行代码文件的模组,均会受到供应链攻击的威胁。 + +一些会这么做的行为的模组案例: + +- [Essential](https://modrinth.com/mod/essential) + - 内置自动更新器,会不经用户提示更新模组。 + 若 Essential 服务器被攻破,攻击者可透过其将代码下发至客户端。 +- 依赖 [owolib](https://modrinth.com/mod/owo-lib) 的模组,例如 [gadget](https://modrinth.com/mod/gadget) + - 会提示用户需要下载 owo-lib,用户同意后会从 Modrinth 下载文件。 + 若攻击者在 Modrinth 上传了版本正确的模组,将构成供应链攻击。 + +只要有一个热门模组,比如 Essential,的服务器被攻破,恶意软件就可以在短时间内影响数百万用户。 + +#### 讨论及行动事项 + +- 上传至专门的平台(Modrinth、CurseForge 等)的模组是否应允许包含「从外部下载可执行代码」的代码? + - 我认为应该禁止,但我们如何强制执行这一点?启动游戏并检查其是否会往 `mods` 文件夹里下载文件? + +Fury: Manually review when we see this pattern happen + +Fury:在发现此类代码时即触发手动检查 + +willie: But you can push malicious code later + +williewillus:但你可以以后再推送恶意代码 + +Fury: look at the author's reputation and other attributes of safety. + +Fury:调查作者的声誉和其他和安全相关的属性 + +Starchild: Not too down to ban downloading everything from the internet. See some +legitimate usecases. We can mark the mod on the platform as downloading external code. +Can have policies like must do over https, etc. We can draft it in the community. + +Starchild:我不建议一杆子打死所有「下载东西」的模组。这有合理用途。 + 我们可以直接在平台上标记「这个模组会下载外部代码」。 + 我们可以有诸如「必须走 HTTPS」这样的规则。我们可以起草一份草案之类的。 + +willie: Clarification: I mean talking about downloading code, not data + +williewillus:澄清,我想说的是下载代码,不是数据 + +Lambda: TODO(willie i missed first half) Quilt had a proposal to do dependency +downloading. More generally, only allow downloading of things that were predeclared +(e.g. with a hash). Even if we allow mods that do this, I will still stay suspicious. + +LambdAurora:(译注:这里缺失一段,待补)Quilt 曾有提议建议增加前置自动下载功能。 + 更一般地来说,只允许下载提前声明过的东西(例如记录了哈希值的)。 + 即便我们允许这样做,我也会保持怀疑。 + +### 代码签名 + +模组作者应为他们发布的二进制文件签名。 + +Fabric Loom、ForgeGradle 等工具链应提供足够多的关于下列主题的文档以及模板,以最大限度保证用户体验; + +- 如何在 CI 中构建模组 +- 如何在 CI 中为模组签名 +- 如何在 CI 中将签名后的模组自动发布到模组仓库中 + +使用 CI 构建这件事本身就已经超出了绝大多数模组开发者的能力范围(大多数模组开发者甚至都不会给新版发布打标签)。 +请记住,很多模组开发者都只是编程爱好者,从未有过在业界工作的经验,很可能对上述概念一无所知。 + +我实在无法再继续强调「文档完整、简单易学、开箱即用」这几个事有多重要了。做不到的话,那只有一个结果:没有人用。 + +我们的最终目标应当是要求每一次上传都应有有效签名,签名无效或缺失者直接拒绝。为此,我们需要一段时间过渡期, +并且需要有人编写合适的教材。 + +#### 讨论及行动事项 + +- 我们应该在哪建立公钥和模组作者的关系?换言之,如何阻止骇客将公钥和签名后的二进制文件同时替换? + - 存在 2FA 保护的 Modrinth 用户账号里? + - 若 Modrinth 不支持组织账号,会不会给那些「允许多人上传新版模组」的开发团队制造麻烦? + - 如果 Modrinth 自己被攻破了,骇客就能把公钥和签名后的二进制文件同时替换掉了。 +- PGP 签名还是 Java 自带的 jarsigner? + - PGP 是 Maven Central 使用的标准。我个人印象是没人用 Java 自己的那一套签名机制。 + OpenSSH 签名也是可选项,然而这套标准仍然不成熟,且没有稳定的生态。 + 很不幸,PGP 可能是眼下最好的选项。 + 我们可以利用 Gradle 插件来自动化所有 PGP 签名中的垃圾设计(译注:原文如此,crappy parts)。 +- 前车之鉴 + - Forge 一直以来都有对签名相关的支持,但无人使用(译注:据会议中 cpw 所述,事实上此特性确有「不少」用户)。 + 我们能从中学到什么? +- 启动器应在其 UI 中展示模组的签名情况。 +- 需要即刻跟进的事项 + - Modrinth 和 CurseForge 应开始设计公钥关联及存储机制 + - 模组加载器开发者应提供下列内容的详细文档及说明: + 1. 在 CI 中基于 `git tag` 发布新版 + 2. 在 CI 中自动签名并上传文件 + +Emi: this doesn't necessitate a required process + +Emi:这个流程是必须的,但这个理由不成立 + +Starchild: What do we want to prevent here and where? Mod repo can just associate a key +with the user and require it in upload, but enforcement/verification can also happen in +the loader. + +Starchild:我们究竟想要阻止什么?从哪阻止?模组仓库只需要把密钥跟用户关联上,然后要求其在上传文件的时候验明身份, +但这个强制检查流程还可以在模组加载器那完成。 + +Jasmine: I recently uploaded to Maven Central which enforces code signing. Process was +mostly painless via buildscripts, hardest part was finding the docs. + +Jasmine:我最近往强制要求签名的 Maven Central 传了点东西。因为有构建脚本所以基本上是一气呵成,但最难的是找文档。 + +Emi: Relaying from text chat, what is the point of signing? The main reason is for +identifying actors. + +Emi:转自文字聊天,「签名的意义是什么?主要是为了验明操作者身份。」 + +cpw: Wrote codesigning for Forge, been there around 10y. It might have detected stage0 and +probably stage3 if the signature wasn't stripped. We've wanted people to do it. Most +people in Forge use it these days. Fingerprints for signatures show up in debug logs, +etc. That's the primary purpose. IMO needs to be pushed a layer up. There is no mechanism +to distribute trust. A modder can tell their *own* jar is good, but the user doesn't. That +requires a trust authority in the mc ecosystem. Setting one is a complex endeavour. Only +viable actor is CF and Modrinth, since they already track the stuff you need to track. +1 +on badging on the mod repos. Doing it on the clientside? We're far too late for that at +the moment. If the entire ecosystem was signed, we could revisit. + +cpw:10 年前就给 Forge 写了代码签名支持,至今都在。如果恶意软件不删签名,也许可以检测到阶段 0 甚至是阶段 3。 +我们一直都想让其他人做这个。Forge 这边大部分人都在签名。我个人认为还需要再进一步。目前并没有传播信任的机制。 +模组开发者当然能证明**自己的** jar 没问题,用户不行。这需要整个 MC 生态里有个权威机关来担保,而这是个复杂的过程。 +目前有能力充当这个的只有 CurseForge 和 Modrinth,因为他们早已追踪了所有必须信息。同意「在模组仓库里给受信 +模组加标签」。在客户端侧验证?现在说这个可能太迟了。倒是如果全社区都转向签名了,我们可以回过头来再看一下。 + +Emi: Is it possible to have a collaboratively controlled third party CA? Adding two steps +is a bit much. + +Emi:有没有可能有个集体控制的第三方 CA?(译注:Certifiacte Authority,证书颁发机构)(在模组发布流程中)加两步有点太多了。 + +cpw: You can sign with multiple CA's at once, so that isn't necessary + +cpw:你可以同时用多个 CA(颁发的证书)签一个名,没必要分两步。(译注:意指如果有模组同时在 CurseForge 和 Modrinth 上发布, +且 CurseForge 和 Modrinth 均各自颁发了一个签名用证书,可在构建模组时一次使用两个证书签名。) + +Fury: We can look into it. + +Fury:我们可以调研一下。 + +cpw: If you're committing to it, that's awesome :) + +cpw:能在这方面有所承诺的话那再好不过(笑) + +Geo: IMO would be best if a trusted third party does it. Diff platforms have diff +policies. Modrinth interested in this as well, but we have to move carefully. + +Geometrically:个人认为让受信第三方来做这个最好。每个平台政策都不一样。Modrinth 对此也有兴趣,但我们仍需小心行事。 + +Emi: Are you willing to work with CurseForge for a third party CA? + +Emi:你们愿意跟 CurseForge 合作共建一个第三方 CA? + +Geo: Yeah. Everyone should put their differences aside for security, even though Modrinth +wasn't affected it still was indirectly since " + +Geometrically:没错。面对现在的安全威胁,我们应该放下成见共同努力,尽管 Modrinth 没直接受影响,但间接影响还是有的。 + +cpw: Would be nice to see movement after 10y + +cpw:10 年后能见到进展了真是太好了 + +### 沙箱 + +另一种防御策略是把整个 Minecraft 进程放进沙箱,这样我们便能控制住恶意代码的杀伤半径。 + +基本上是个老大难问题。 + +Minecraft 需要只能访问: + +- 互联网:正版验证、登入服务器进行联机游戏等。 +- 访问文件系统:只需要 `.minecraft` 目录,并可以递归访问其下所有子目录。 + +主要目标是限制文件系统的访问权限。 + +对于 Windows,似乎并没有沙箱化操作系统的简单途径(除了「直接去玩基岩版」)外。最接近的方案是 Chromium 的 [`model`](https://chromium.googlesource.com/chromium/src/+/master/docs/design/sandbox.md),然而需要对 Minecraft 游戏本身做出重大修改。 + +对于 macOS,我们**可以**使用苹果内置的 ["Seatbelt"](https://www.chromium.org/developers/design-documents/sandbox/osx-sandboxing-design/) 机制来实现沙箱。苹果公司早已对其旗下 AppStore 上架的应用强制要求这个了,但这个强制要求还没覆盖到 AppStore 外的应用(比如 Minecraft)。然而这仍然不能用来阻止对某些网站的访问。 +下图展示了我们可以使用的权限配置。这些配置理论上可以应对恶意软件发起的攻击了。 +![image](../../../docs/media/sandboxfile.png) + +对于 Linux,我们有数个选项。第一个便是 SELinux/AppArmor。这些框架的配置难度之高可谓是臭名昭著,也因此这些框架的部署范围并不大。 +然而,我们需要的防御策略也不复杂,所以这个选项也并非不可能。 + +用 OpenBSD 的话来说,我们只需要 [`unveil(2)`](https://man.openbsd.org/unveil) 游戏实例根目录下的所有路径就行了,然而 Liunx 上没有这个。 + +第二个选项是用 Flatpak 这样的(打包)系统。 + + +timoreo: Executing untrusted code is always unsafe, regardless of what sandboxing you +have. Sandboxing is always your last resort. We have a flatpak of Prism which is sandboxed +and restricts a lot of access. Prevented this specific attack. Can be difficult, e.g. you +might think you can restrict mic, but what if a mod adding voice chat wants it? Needs to +be restricted but allow freedom for modders. Linux has a lot of techniques, can restrict +pretty much everything. + +timoreo:不管你用了啥沙箱,执行不受信代码一直都不安全。沙箱始终都应是你的最后手段。我们有 Flatpak 打包的 +PrismLauncher,不仅有沙箱还限制了一堆权限,使得我们免遭此次攻击。配置沙箱实际上还挺棘手的,举个例子,你觉得 +你可以限制麦克风权限,但如果有模组加了游戏内置语音聊天?(译注:这种模组真实存在。)这就需要在限制的同时还得 +给模组开发者留出空间了。Linux 下有很多技术可用,基本上啥都可以限制。 + +ZekeZ: Main issue is Windows and macOS, especially Windows. + +ZekeZ:问题主要是在 Windows 和 macOS 上,尤其是 Windows。 + +Emi: Concern for several mods. Locking down fs access can be problematic for mods that +want global instance-independent configs + +Emi:为某些模组感到担忧。如果锁死文件系统(译注:File System,常缩写为 fs)访问权限,对于那些需要 +「独立于游戏实例外的全局配置」的模组来说不好办了。 + +ZekeZ: What was the problem with EMI? + +ZekeZ:EMI 有啥问题? + +Emi: There is a user-facing option to store stuff in ~/.minecraft instead of the instance +local one + +Emi:有个用户选项是存在 ~/.minecraft 里的,而不是游戏目录下 + +timoreo: You can case-by-case allow files. Anyways, what about network? + +timoreo:你可以根据具体情况加例外。总之,网络连接权限? + +--- + +Recap + +总结 + +kennytv: Hi from Paper. Some overlap with modding, and have our own plugin repo. Would be +interested in one maintainable scanner for identifying current malware. There is a bunch +right now. On signing, Sponge also had that for a while. They basically gave on it, +because people didn't know how to use it. Very hard to get novices to understand it. + +kennytv:大家好,这里是 Paper 的代表。我们跟模组社区有点交集,同时我们也有自己的插件仓库。 +我们对能识别时下流行的恶意软件,且有维护性的扫描器感兴趣。恶意软件实际上有不少。 +Sponge 曾经那么做过,但现在放弃了,因为用户根本不知道怎么用。让新人理解这个还是太困难了。 +(译注:当时话题在数字签名上,此处 kennytv 指的是 Sponge 旗下插件发布平台 Ore +曾经强制要求插件上传时携带 PGP 签名。) + +Lambda: Would like to see mod hosting to add more 2FA. Or even only allowing API/CI to +upload. That can be a bit annoying but can avoid token stealing resulting in bad +uploads. Currently don't know if Modrinth has 2fa. CurseForge has it but only for +payouts. Want to see this expanded. + +LambdAurora:希望看到模组托管平台增加更多 2FA 方式。或者只支持 API/CI 上传。对,是会很麻烦,但可以避免 +令牌失窃导致的恶意上传。目前我不知道 Modrinth 是否支持 2FA。CurseForge 支持这个,但仅在兑现(激励计划的 +收入)时要求检查。希望能看到覆盖范围扩大。 + +Geo: Were working on 2fa before this started. Will also allow scoped tokens (e.g. unsigned +builds only from this token, signed builds only from this token) 2fa has a flaw which is +your session token is still vulnerable to compromise. LTT YouTube was compromised by +this. Planning on launching new auth stuff in a couple of weeks. + +Geometrically:会议之前我在写 2FA 支持。未来计划支持令牌权限限制(举例,这个令牌只产生不带签名的构建,那个 +令牌只产生带签名的构建)。2FA 有个问题是会话令牌(Session Token)还是会失窃。LinusTechTips 的 YouTube 号 +曾经就这样被盗过。未来数周内计划启动新的登录验证支持。 + +Emi: To point out, LPS authors did have 2fa. + +Emi:有必要指出 Luna Pixel Studios 的开发者们都启用了 2FA。 + +willie: Reiterating the point about building, signing, releasing **in CI** + +williewillus:再次强调了在**CI**里构建、签名、发布的重要性。 + +Geo: one thing platforms to do is a general checklist when they're first uploading a +project. On Modrinth we have a guide for literally everything. When we added descriptions +and icons to the new upload checklist, rates of doing so jumped up. + +Geometrically:平台还可以在新人第一次上传项目的时候准备一个「待办清单」。在 Modrinth 上基本上干什么都有教程。 +我们在给「上传前要做的事」清单加上「给项目加介绍」和「上传图标」后,这么做的人数马上就多了。 + +Emi: Recently implemented CI publishing. Just copied another Github workflow file. This +isn't maintainable. + +Emi:最近刚实现了 CI 中发布。实际上就是复制粘贴的另一个 GitHub 仓库里的 workflow 文件。完全没办法维护。 + +Lambda: CI is not a thing a first time modder will do. There's a learning curve to +modding: experimentation, then publishing, then fix stuff after you get popular. It's very +daunting for a beginner due to lack of documentation *for modding workflows*. CI not +really in the example mod templates. + +LambdAurora:初次接触模组开发的人绝对不会去搞什么 CI 的。这里有个学习曲线:实验、发布、然后在出名之后修问题。 +缺少**模组开发的流程**这事实在是太劝退新人了。样板模组里压根儿就没 CI 什么事。 + +Jared: Host the BlameJared maven with lots of projects. Encourage people to use CI as much +as possible. Default MDK just publishes artifact, not even source. Need more examples and +guides to set up jenkins, etc. + +Jared:托管了一堆项目的 BlameJared maven 的维护者。应该尽可能鼓励开发者使用 CI。默认的 MDK 实际上只会发布 +制品(artifact),甚至不会发布源码。我们需要更多的例如配置 Jenkins 的教程。 + +willie: GH Actions is probably easier for beginners than Jenkins no? + +williewillus:GitHub Actions 对于初学者来说难道不比 Jenkins 简单? + +Jared: Not familiar with GH does it now. All files on my maven are built locally, not sure +how remote publishing would work. + +Jared:我不太了解 GitHub 那边的情况。我 maven 上所有的文件都是本机构建的,不太确定发布到远端仓库是个什么操作。 + +Emi: For a lot of mods, Maven is not strictly necessary. Can use CurseMaven/Modrinth's +maven. Useful for mods that don't intentionally expose themselves as API's. + +Emi:对于很多模组来说甚至不需要 Maven。直接用 CurseMaven 和 Modrinth 的 maven 仓库就行了。 +尤其是对那些没有公开 API 的模组来说,足够了。 + +willie: +1 that Maven's are second order, most mods are leaf content mods that don't need +Maven publishing. + +williewillus:+1 Maven 仓库应该是第二个选项,大部分模组都是内容相关的,不需要发布到 Maven 仓库。 + +Jared: CurseMaven is not a long term option. No one noticed, but CurseGradle has been +taken off Github. Its source is gone. Nobody has noticed or spoken up about it. + +Jared:CurseMaven 不是长久之计。估计你们还没注意到,CurseGradle 从 GitHub 上下架了。源码也没了。 +没人注意到也没人提起这事。 + +willie: overall action item recap + +williewillus:[会议最终回顾总结] + +Fury: Thanks everyone. Overwolf has grown over the years. Some folks reached out and +provided valuable information. If you have further information, feel free to contact us it +would help a lot. + +Fury:感谢各位。Overwolf 这些年来一直在成长。一些人主动联系我们并提供了宝贵信息。如果你有其他问题,请务必联系我们, +不胜感激。 \ No newline at end of file diff --git a/lang/zh-CN/docs/credits.md b/lang/zh-CN/docs/credits.md new file mode 100644 index 00000000..05739934 --- /dev/null +++ b/lang/zh-CN/docs/credits.md @@ -0,0 +1,19 @@ +Last updated at Jun 9th, 2023 +最后更新于二〇二三年六月九日 + +## 鸣谢 + +不一定完整!感谢所有社区成员的努力。我们会在尘埃落定时整理出完整名单。 + +[**Emi**](https://github.com/emilyploszaj/):团队协调、首个发现者(本团队内)、早期研究、会议协调 +[**Jasmine**](https://github.com/jaskarth/):团队协调、研究、我们目前使用的反编译器([Quiltflower](https://github.com/QuiltMC/quiltflower/))的开发维护 +[**unascribed**](https://github.com/unascribed/):文档编纂协调、人流控制、LOGO +[**williewillus**](https://github.com/williewillus/):团队协调兼职记者 +[**Vazkii**](https://github.com/vazkii/):文档编纂、对外沟通 +[**Col-E**](https://github.com/Col-E/):逆向工程、我们目前使用的反混淆器([Recaf](https://www.coley.software/Recaf/))的开发维护 +[**quat**](https://github.com/quat1024/):文档编纂、初步感染样本分析 +[**cortex**](https://github.com/mcrcortex/):逆向工程 +[**aurelium**](https://github.com/autumnaurelium/):团队协调、反混淆 +[**D3SL**](https://github.com/D3SL/):深入逆向工程,后了解到其为本次事件中恶意软件的最早发现者之一 +[**Luna Pixel Studios**](https://lunapixelstudios.github.io/):在短时间内发现未授权文件上传 +**Nia**:深入阶段 3 逆向工程 diff --git a/lang/zh-CN/docs/media/localappdata.png b/lang/zh-CN/docs/media/localappdata.png new file mode 100644 index 00000000..ce95fc26 Binary files /dev/null and b/lang/zh-CN/docs/media/localappdata.png differ diff --git a/lang/zh-CN/docs/media/stages.png b/lang/zh-CN/docs/media/stages.png new file mode 100644 index 00000000..c1fec5a9 Binary files /dev/null and b/lang/zh-CN/docs/media/stages.png differ diff --git a/lang/zh-CN/docs/tech.md b/lang/zh-CN/docs/tech.md new file mode 100644 index 00000000..1fc8d475 --- /dev/null +++ b/lang/zh-CN/docs/tech.md @@ -0,0 +1,369 @@ +Last updated at Jun 9th, 2023 +最后更新于二〇二三年六月九日 + +# 技术分析 + +## 传播 + +一些整合包在作者不知情的情况下突然发布了新版,而这些新版整合包则包含了含恶意软件的模组。当事方在发现后旋即存档了这些版本,这意味着「通过 CurseForge 网页界面无法访问这些版本,只可能通过 API 访问」。 + +这些含恶意软件的模组的上传时间可追溯到过去数周前。其中,大部分文件的上传者均为一次性小号,用户名也明显是随机生成的, +可能是传染的「种子」。Luna Pixel Studios 的开发者之一为更新整合包而试用了其中一个模组,其因此被感染。 + +### 已知受影响的模组及插件 + +注:该列表**并不完整**。该列表是在调查初期整理出来的,但在我们意识到该恶意软件的传染规模比想象中要大得多时, +追踪个案已然毫无价值。该列表目前仅因历史考量而保留。 + +同时,亦可参考 [CurseForge 给出的受影响项目列表](https://support.curseforge.com/en/support/solutions/articles/9000228509-june-2023-infected-mods-detection-tool/)。 + +|模组/插件|链接|SHA1|「上传者」| +|---|---|---|---| +|Skyblock Core|[www.curseforge.com/minecraft/mc-mods/skyblock-core/files/4570565](https://www.curseforge.com/minecraft/mc-mods/skyblock-core/files/4570565) |`33677CA0E4C565B1F34BAA74A79C09A3B690BF41`|Luna Pixel Studios| +|Dungeonz|[legacy.curseforge.com/minecraft/mc-mods/dungeonx/files/4551100 (removed)](https://legacy.curseforge.com/minecraft/mc-mods/dungeonx/files/4551100) |`2DB855A7F40C015F8C9CA7CBAB69E1F1AAFA210B`|fractureiser| +|Haven Elytra|[dev.bukkit.org/projects/havenelytra/files/4551105 (removed)](https://dev.bukkit.org/projects/havenelytra/files/4551105) [legacy.curseforge.com/minecraft/bukkit-plugins/havenelytra/files/4551105 (removed)](https://legacy.curseforge.com/minecraft/bukkit-plugins/havenelytra/files/4551105) |`284A4449E58868036B2BAFDFB5A210FD0480EF4A`|fractureiser| +|Vault Integrations|[www.curseforge.com/minecraft/mc-mods/vault-integrations-bug-fix/files/4557590 (removed)](https://www.curseforge.com/minecraft/mc-mods/vault-integrations-bug-fix/files/4557590)|`0C6576BDC6D1B92D581C18F3A150905AD97FA080`|simpleharvesting82| +|AutoBroadcast|[www.curseforge.com/minecraft/mc-mods/autobroadcast/files/4567257 (removed)](https://www.curseforge.com/minecraft/mc-mods/autobroadcast/files/4567257)|`C55C3E9D6A4355F36B0710AB189D5131A290DF26`|shyandlostboy81| +|Museum Curator Advanced|[www.curseforge.com/minecraft/mc-mods/museum-curator-advanced/files/4553353 (removed)](https://www.curseforge.com/minecraft/mc-mods/museum-curator-advanced/files/4553353)|`32536577D5BB074ABD493AD98DC12CCC86F30172`|racefd16| +|Vault Integrations Bug fix|[www.curseforge.com/minecraft/mc-mods/vault-integrations-bug-fix/files/4557590 (removed)](https://www.curseforge.com/minecraft/mc-mods/vault-integrations-bug-fix/files/4557590)|`0C6576BDC6D1B92D581C18F3A150905AD97FA080`|simplyharvesting82 +|Floating Damage|[dev.bukkit.org/projects/floating-damage (removed)](https://dev.bukkit.org/projects/floating-damage)|`1d1aaccdc13244e980c0c024610ecc77ea2674a33a52129edf1bb4ce3b2cc2fc`|mamavergas3001 +|Display Entity Editor|[www.curseforge.com/minecraft/bukkit-plugins/display-entity-editor/files/4570122 (removed)](https://www.curseforge.com/minecraft/bukkit-plugins/display-entity-editor/files/4570122)|`A4B6385D1140C111549D95EAB25CB51922EEFBA2`|santa_faust_2120 + +Darkhax 整理了这个列表:https://gist.github.com/Darkhax/d7f6d1b5bfb51c3c74d3bd1609cab51f + +可能的受影响项目:Sophisticated Core、Dramatic Doors、Moonlight lib、Union lib + +## 阶段 0(被感染的模组文件) + +受影响的模组或插件的入口类中,会多出一个 `static void` 方法,并在同一个类的静态初始化块(译注:`static {}` 块,或者说,`