Prhub

#47595 fix(security): guard lm-format-enforcer regex compile with timeout

原始 PR 作者 jperezdealgaba 合并时间 2026-07-14 15:18 文件变更 1 提交数 2 评论 0 代码增减 +14 / -1

执行摘要

修复 lm-format-enforcer 正则编译超时漏洞

lm-format-enforcer 后端在 GHSA-rwxx-mrjm-wc2m 安全修复中被遗漏,未对正则表达式编译施加超时保护,存在 ReDoS 风险。PR body 明确提到 'The lm-format-enforcer backend was left unguarded after the fix for GHSA-rwxx-mrjm-wc2m'。

建议合并。这是一次轻量但必要的安全补丁,填补了之前安全修复的遗漏,代码简洁且模式成熟。

讨论亮点

无实质性 review 讨论:claude bot 因 PR 来自 fork 自动跳过审查,khluu 直接批准。

实现拆解

  1. 导入超时工具函数:在 vllm/v1/structured_output/backend_lm_format_enforcer.py 顶部添加 from vllm.v1.structured_output.utils import compile_regex_with_timeout。
  2. 替换 RegexParser 调用:在 compile_grammar 方法的 REGEX 分支中,将直接构造 lmformatenforcer.RegexParser(grammar_spec) 替换为 compile_regex_with_timeout(lmformatenforcer.RegexParser, grammar_spec),使正则编译受超时保护。
  3. 提前验证正则:在 validate_structured_output_request_lm_format_enforcer 函数中,当 so_params.regex 存在时,先调用 compile_regex_with_timeout 进行编译,若抛出异常则转换为 ValueError,实现早期失败,避免请求进入后续处理后才暴露问题。
文件 模块 状态 重要度
vllm/v1/structured_output/backend_lm_format_enforcer.py 前端 modified 6.31

关键符号

compile_grammar validate_structured_output_request_lm_format_enforcer

关键源码片段

vllm/v1/structured_output/backend_lm_format_enforcer.py dependency-wiring

唯一修改文件,添加超时保护和提前验证

# 新增导入:从工具模块引入带超时的正则编译函数
from vllm.v1.structured_output.utils import compile_regex_with_timeout
​
class LMFormatEnforcerBackend(StructuredOutputBackend):
    def compile_grammar(self, request_type, grammar_spec):
        # ...
        elif request_type == StructuredOutputOptions.REGEX:
            # 原来 : character_level_parser = lmformatenforcer.RegexParser(grammar_spec)
            # 现在 : 通过 compile_regex_with_timeout 增加超时保护,防止 ReDoS
            character_level_parser = compile_regex_with_timeout(
                lmformatenforcer.RegexParser,
                grammar_spec,
            )
        # ...
​
def validate_structured_output_request_lm_format_enforcer(params: SamplingParams):
    # ...
    if so_params.regex:
        # 新增:在请求验证阶段就尝试编译正则,提前捕获无效或恶意模式
        try:
            compile_regex_with_timeout(
                lmformatenforcer.RegexParser,
                so_params.regex,
            )
        except Exception as err:
            raise ValueError(
                f"Failed to compile regex for lm-format-enforcer: {err}"
            ) from err
        return

评论区精华

没有提炼出高价值讨论线程

当前评论区没有形成足够清晰的争议点或结论,后续有更多讨论时会体现在这里。

风险与影响

低风险。变更范围极小(仅 1 个文件,+14/-1),且调用的是已存在的工具函数 compile_regex_with_timeout,该函数已在 xgrammar 和 outlines 后端中经过验证。唯一潜在风险是 compile_regex_with_timeout 在极端情况下可能对合法但复杂的正则造成误杀,但超时阈值应已考虑典型使用场景。

影响范围仅针对使用 lm-format-enforcer 后端的用户,且仅在处理正则表达式时生效。对于不使用 structured output 或使用其他后端(xgrammar、outlines)的用户无影响。安全收益明确,可防范 ReDoS 攻击。

微小变更 低影响

关联 Issue

未识别关联 Issue

当前没有检测到明确关联的 Issue 链接,后续同步到相关引用后会出现在这里。

完整报告

参与讨论