PERF: HttpRequest/IOUtils 读 HTTP 响应无体积上限 #10

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

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

现象

IOUtils.readFully 对输入流调用 readAllBytes(),HttpRequest.getString 与 authlib 元数据拉取走同一路径,未见 Content-Length 上限或流式截断。恶意/故障服务器对 JSON/元数据返回超大体时,可造成堆膨胀乃至 OOM。

危害类与优先级

  • 危害类:PERF
  • 优先级:p2

证据(生效源码)

  • 载体:TDLM/HMCL + 分支 origin/main + pin/commit bdacd654734c3665995a8c779da34139b9bdf373
  • 位置:HMCLCore/.../IOUtils.java:70-72;HttpRequest.java:131-140;AuthlibInjectorServer.java:60
  • 关键原文:
// IOUtils.java:70-72
public static byte[] readFully(InputStream stream) throws IOException {
    try (stream) {
        return stream.readAllBytes();
    }
}
// HttpRequest.java:131-140
public String getString() throws IOException {
    return getStringWithRetry(() -> {
        HttpURLConnection con = createConnection();
        con = resolveConnection(con);
        checkResponseCode(con);

        return IOUtils.readFullyAsString("gzip".equals(con.getContentEncoding())
                ? IOUtils.wrapFromGZip(con.getInputStream())
                : con.getInputStream());
    }, retryTimes);
}
// AuthlibInjectorServer.java:60
server.refreshMetadata(NetworkUtils.readFullyAsString(conn));
  • 上游状态:未修

触发与复现

  • 触发条件:连接返回超大 body 的 HTTP 端点(如 authlib 元数据 / API JSON);默认网络路径可达。
  • 复现程度:静态推演
  • 包内相关性:模块 n/a/sides client/默认配置可达 是

落点

  • 主仓:TDLM/HMCL → HMCLCore/.../IOUtils.java:70(及调用方 HttpRequest / AuthlibInjectorServer)

范式

引证

  1. 生效源码 permalink — https://git.potatolab.uk/TDLM/HMCL/src/commit/bdacd654734c3665995a8c779da34139b9bdf373/HMCLCore/src/main/java/org/jackhuang/hmcl/util/io/IOUtils.java#L70-L72
  2. 生效源码 permalink — https://git.potatolab.uk/TDLM/HMCL/src/commit/bdacd654734c3665995a8c779da34139b9bdf373/HMCLCore/src/main/java/org/jackhuang/hmcl/util/io/HttpRequest.java#L131-L140
  3. 生效源码 permalink — https://git.potatolab.uk/TDLM/HMCL/src/commit/bdacd654734c3665995a8c779da34139b9bdf373/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/authlibinjector/AuthlibInjectorServer.java#L60-L60
  4. 范式 N1 — https://git.potatolab.uk/TDLM/mc-defect-patterns/raw/commit/12d2ebdc7a87175f936c2a67083be567e0e94301/perf/N1-network-driven-alloc.md

来源

  • 线索类型:内部代码审查(无外部报障)
  • 可解析指针:IOUtils.java:70-72;commit bdacd654734c3665995a8c779da34139b9bdf373
  • 来源标签:origin/scan
**调研编号**:扫描 2026-11-09 / N1 ## 现象 `IOUtils.readFully` 对输入流调用 `readAllBytes()`,`HttpRequest.getString` 与 authlib 元数据拉取走同一路径,未见 Content-Length 上限或流式截断。恶意/故障服务器对 JSON/元数据返回超大体时,可造成堆膨胀乃至 OOM。 ## 危害类与优先级 - 危害类:`PERF` - 优先级:`p2` ## 证据(生效源码) - 载体:`TDLM/HMCL` + 分支 `origin/main` + pin/commit `bdacd654734c3665995a8c779da34139b9bdf373` - 位置:`HMCLCore/.../IOUtils.java:70-72`;`HttpRequest.java:131-140`;`AuthlibInjectorServer.java:60` - 关键原文: ```java // IOUtils.java:70-72 public static byte[] readFully(InputStream stream) throws IOException { try (stream) { return stream.readAllBytes(); } } ``` ```java // HttpRequest.java:131-140 public String getString() throws IOException { return getStringWithRetry(() -> { HttpURLConnection con = createConnection(); con = resolveConnection(con); checkResponseCode(con); return IOUtils.readFullyAsString("gzip".equals(con.getContentEncoding()) ? IOUtils.wrapFromGZip(con.getInputStream()) : con.getInputStream()); }, retryTimes); } ``` ```java // AuthlibInjectorServer.java:60 server.refreshMetadata(NetworkUtils.readFullyAsString(conn)); ``` - 上游状态:未修 ## 触发与复现 - 触发条件:连接返回超大 body 的 HTTP 端点(如 authlib 元数据 / API JSON);默认网络路径可达。 - 复现程度:静态推演 - 包内相关性:模块 n/a/sides `client`/默认配置可达 是 ## 落点 - 主仓:`TDLM/HMCL` → `HMCLCore/.../IOUtils.java:70`(及调用方 `HttpRequest` / `AuthlibInjectorServer`) ## 范式 - 命中范式:N1 网络驱动分配(https://git.potatolab.uk/TDLM/mc-defect-patterns/raw/commit/12d2ebdc7a87175f936c2a67083be567e0e94301/perf/N1-network-driven-alloc.md) ## 引证 1. 生效源码 permalink — https://git.potatolab.uk/TDLM/HMCL/src/commit/bdacd654734c3665995a8c779da34139b9bdf373/HMCLCore/src/main/java/org/jackhuang/hmcl/util/io/IOUtils.java#L70-L72 2. 生效源码 permalink — https://git.potatolab.uk/TDLM/HMCL/src/commit/bdacd654734c3665995a8c779da34139b9bdf373/HMCLCore/src/main/java/org/jackhuang/hmcl/util/io/HttpRequest.java#L131-L140 3. 生效源码 permalink — https://git.potatolab.uk/TDLM/HMCL/src/commit/bdacd654734c3665995a8c779da34139b9bdf373/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/authlibinjector/AuthlibInjectorServer.java#L60-L60 4. 范式 N1 — https://git.potatolab.uk/TDLM/mc-defect-patterns/raw/commit/12d2ebdc7a87175f936c2a67083be567e0e94301/perf/N1-network-driven-alloc.md ## 来源 - 线索类型:内部代码审查(无外部报障) - 可解析指针:`IOUtils.java:70-72`;commit `bdacd654734c3665995a8c779da34139b9bdf373` - 来源标签:`origin/scan`
layue13 added the area/network
priority
p2
type
perf
origin/scan
labels 2026-11-09 14:23:57 +00:00
Author
Owner

Fixed on main via PR #14 — HTTP body reads capped (IOUtils.DEFAULT_MAX_HTTP_BODY_BYTES, 16 MiB) in HttpRequest/NetworkUtils paths.

Merge: #14
Commit: c4240a24bf

Fixed on `main` via PR #14 — HTTP body reads capped (`IOUtils.DEFAULT_MAX_HTTP_BODY_BYTES`, 16 MiB) in HttpRequest/NetworkUtils paths. 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#10