SEC: MultiMC patch +jvmArgs 未过滤进入启动 JVM 参数 #9

Closed
opened 2026-11-09 14:23:55 +00:00 by layue13 · 1 comment
Owner

调研编号:扫描 2026-11-09 / G4

现象

组装 MultiMC 实例 artifact 时,对每个 patch 的 getJvmArgs() 不做过滤,直接 jvmArguments.add(new StringArgument(jvmArg)),随后进入启动命令行的 JVM 参数列表。恶意 patch 可注入任意 -javaagent: / -D… 等参数。

危害类与优先级

  • 危害类:SEC
  • 优先级:p0

证据(生效源码)

  • 载体:TDLM/HMCL + 分支 origin/main + pin/commit bdacd654734c3665995a8c779da34139b9bdf373
  • 位置:HMCLCore/src/main/java/org/jackhuang/hmcl/modpack/multimc/MultiMCInstancePatch.java:285-287;消费侧 DefaultLauncher.java:300-334(manifest JVM arguments 进入命令行)
  • 关键原文:
// MultiMCInstancePatch.java:285-287
for (String jvmArg : patch.getJvmArgs()) {
    jvmArguments.add(new StringArgument(jvmArg));
}
// DefaultLauncher.java:305-336(节选:manifest JVM 参数进入 res)
@Nullable List<Argument> jvmArguments = Optional.ofNullable(manifest.arguments()).map(Arguments::jvm).orElse(null);
// ...
res.addAll(Arguments.parseArguments(Objects.requireNonNullElseGet(jvmArguments, this::getDefaultJVMArguments), configuration));
// ...
for (String javaAgent : options.getJavaAgents()) {
    res.add("-javaagent:" + javaAgent);
}
  • 上游状态:未修

触发与复现

  • 触发条件:安装含任意 +jvmArgs 的 MultiMC patch 的整合包并启动;默认流程可达。
  • 复现程度:静态推演(patch JSON → jvmArguments → 启动命令行)
  • 包内相关性:模块 n/a/sides client/默认配置可达 是

落点

  • 主仓:TDLM/HMCL → HMCLCore/.../MultiMCInstancePatch.java:285
  • 协同:DefaultLauncher.java 消费侧

范式

引证

  1. 生效源码 permalink —
    for (String jvmArg : patch.getJvmArgs()) {
    jvmArguments.add(new StringArgument(jvmArg));
    }
  2. 生效源码 permalink(消费)—
    @Nullable List<Argument> jvmArguments = Optional.ofNullable(manifest.arguments()).map(Arguments::jvm).orElse(null);
    if (jvmArguments != null) {
    jvmArguments = rewriteUnsafeBootstrapLauncherIgnoreList(jvmArguments, libraryClasspath);
    }
    if (jvmArguments != null) {
    for (Argument jvmArgument : jvmArguments) {
    if (jvmArgument instanceof StringArgument stringArgument
    && stringArgument.argument().startsWith("-Djava.library.path=")) {
    // We conservatively handle parameters like "-Djava.library.path=${natives_directory}/java"
    // to avoid extracting native libraries to unexpected locations.
    String prefix = "-Djava.library.path=${natives_directory}/";
    if (stringArgument.argument().startsWith(prefix)) {
    try {
    String subDir = stringArgument.argument().substring(prefix.length());
    Path actualNativeFolder = FileUtils.toAbsolute(javaNativeFolder.resolve(subDir));
    if (actualNativeFolder.startsWith(javaNativeFolder)) {
    javaNativeFolder = actualNativeFolder;
    }
    } catch (IllegalArgumentException ignored) {
    }
    }
    break;
    }
    }
    }
    res.addAll(Arguments.parseArguments(Objects.requireNonNullElseGet(jvmArguments, this::getDefaultJVMArguments), configuration));
    Arguments argumentsFromAuthInfo = authInfo.getLaunchArguments(options);
    if (argumentsFromAuthInfo != null && argumentsFromAuthInfo.jvm() != null && !argumentsFromAuthInfo.jvm().isEmpty())
    res.addAll(Arguments.parseArguments(argumentsFromAuthInfo.jvm(), configuration));
  3. 范式 G4 — 12d2ebdc7a/sec/G4-信任边界.md

来源

  • 线索类型:内部代码审查(无外部报障)
  • 可解析指针:MultiMCInstancePatch.java:285-287;commit bdacd654734c3665995a8c779da34139b9bdf373
  • 来源标签:origin/scan
**调研编号**:扫描 2026-11-09 / G4 ## 现象 组装 MultiMC 实例 artifact 时,对每个 patch 的 `getJvmArgs()` 不做过滤,直接 `jvmArguments.add(new StringArgument(jvmArg))`,随后进入启动命令行的 JVM 参数列表。恶意 patch 可注入任意 `-javaagent:` / `-D…` 等参数。 ## 危害类与优先级 - 危害类:`SEC` - 优先级:`p0` ## 证据(生效源码) - 载体:`TDLM/HMCL` + 分支 `origin/main` + pin/commit `bdacd654734c3665995a8c779da34139b9bdf373` - 位置:`HMCLCore/src/main/java/org/jackhuang/hmcl/modpack/multimc/MultiMCInstancePatch.java:285-287`;消费侧 `DefaultLauncher.java:300-334`(manifest JVM arguments 进入命令行) - 关键原文: ```java // MultiMCInstancePatch.java:285-287 for (String jvmArg : patch.getJvmArgs()) { jvmArguments.add(new StringArgument(jvmArg)); } ``` ```java // DefaultLauncher.java:305-336(节选:manifest JVM 参数进入 res) @Nullable List<Argument> jvmArguments = Optional.ofNullable(manifest.arguments()).map(Arguments::jvm).orElse(null); // ... res.addAll(Arguments.parseArguments(Objects.requireNonNullElseGet(jvmArguments, this::getDefaultJVMArguments), configuration)); // ... for (String javaAgent : options.getJavaAgents()) { res.add("-javaagent:" + javaAgent); } ``` - 上游状态:未修 ## 触发与复现 - 触发条件:安装含任意 `+jvmArgs` 的 MultiMC patch 的整合包并启动;默认流程可达。 - 复现程度:静态推演(patch JSON → jvmArguments → 启动命令行) - 包内相关性:模块 n/a/sides `client`/默认配置可达 是 ## 落点 - 主仓:`TDLM/HMCL` → `HMCLCore/.../MultiMCInstancePatch.java:285` - 协同:`DefaultLauncher.java` 消费侧 ## 范式 - 命中范式:G4 信任边界(https://git.potatolab.uk/TDLM/mc-defect-patterns/raw/commit/12d2ebdc7a87175f936c2a67083be567e0e94301/sec/G4-信任边界.md) ## 引证 1. 生效源码 permalink — https://git.potatolab.uk/TDLM/HMCL/src/commit/bdacd654734c3665995a8c779da34139b9bdf373/HMCLCore/src/main/java/org/jackhuang/hmcl/modpack/multimc/MultiMCInstancePatch.java#L285-L287 2. 生效源码 permalink(消费)— https://git.potatolab.uk/TDLM/HMCL/src/commit/bdacd654734c3665995a8c779da34139b9bdf373/HMCLCore/src/main/java/org/jackhuang/hmcl/launch/DefaultLauncher.java#L300-L334 3. 范式 G4 — https://git.potatolab.uk/TDLM/mc-defect-patterns/raw/commit/12d2ebdc7a87175f936c2a67083be567e0e94301/sec/G4-信任边界.md ## 来源 - 线索类型:内部代码审查(无外部报障) - 可解析指针:`MultiMCInstancePatch.java:285-287`;commit `bdacd654734c3665995a8c779da34139b9bdf373` - 来源标签:`origin/scan`
layue13 added the
priority
p0
area/security
type
security
origin/scan
labels 2026-11-09 14:23:56 +00:00
Author
Owner

Fixed on main via PR #14 — MultiMC +jvmArgs filtered through JvmArgumentFilter before reaching the launch JVM.

Merge: #14
Commit: c4240a24bf

Fixed on `main` via PR #14 — MultiMC `+jvmArgs` filtered through `JvmArgumentFilter` before reaching the launch JVM. Merge: https://git.nest.potatolab.uk:8443/TDLM/HMCL/pulls/14 Commit: c4240a24bf7635a26d6e45721c77b33d94bcb252
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: TDLM/HMCL#9