[Important] Batch 校验缺少资源上限 #13

Closed
opened 2026-06-09 13:09:01 +08:00 by dailz · 0 comments
Owner

来源

Oracle 审核 docs/design.md Section 3.2 WAL

位置

Section 3.2 "WAL Batch 校验与重放"(~line 530)

问题描述

Recovery 校验 entryCountentriesSize 和 entry 边界,但未定义任何资源上限。恶意或损坏的 WAL 可能包含极大的 entryCountentriesSize,导致 recovery OOM 或无限循环。

例如:

  • entryCount = 2^32 - 1entriesSize 也极大 → 尝试分配巨大 fragment buffer
  • 单个 keyLen 或 valLen 的 varint 解码为极大值 → OOM
  • 合法 header 但 entry 内容精心构造导致解析死循环

建议修复

在 Section 3.2 添加硬性限制(可配置,建议默认值):

资源 默认上限
entryCount 10,000
entriesSize 4MB
单个 keyLen 4KB(不含 value)
单个 valLen (Inline) 4KB(超过走 ValueLogPointer)
fragment buffer entriesSize 上限
varint 最大 5 bytes(u64 varint 上限)

Recovery 解析时,超过任何上限即视为 WAL 损坏。写入侧也必须遵守这些限制,超出拒绝写入。

## 来源 Oracle 审核 `docs/design.md` Section 3.2 WAL ## 位置 Section 3.2 "WAL Batch 校验与重放"(~line 530) ## 问题描述 Recovery 校验 `entryCount`、`entriesSize` 和 entry 边界,但未定义任何资源上限。恶意或损坏的 WAL 可能包含极大的 `entryCount` 或 `entriesSize`,导致 recovery OOM 或无限循环。 例如: - `entryCount = 2^32 - 1` 但 `entriesSize` 也极大 → 尝试分配巨大 fragment buffer - 单个 keyLen 或 valLen 的 varint 解码为极大值 → OOM - 合法 header 但 entry 内容精心构造导致解析死循环 ## 建议修复 在 Section 3.2 添加硬性限制(可配置,建议默认值): | 资源 | 默认上限 | |------|----------| | entryCount | 10,000 | | entriesSize | 4MB | | 单个 keyLen | 4KB(不含 value) | | 单个 valLen (Inline) | 4KB(超过走 ValueLogPointer) | | fragment buffer | entriesSize 上限 | | varint | 最大 5 bytes(u64 varint 上限) | Recovery 解析时,超过任何上限即视为 WAL 损坏。写入侧也必须遵守这些限制,超出拒绝写入。
dailz closed this issue 2026-06-11 20:27:18 +08:00
Sign in to join this conversation.
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: dailz/go-kv#13