#1353·arrow

Unix 时间戳 (X) 格式令牌解析中的二次时间 ReDoS

作者: router0mail创建于 2026年9月13日更新于 2026年9月13日

arrow/parser.py:169:

python
_TIMESTAMP_RE: ClassVar[Pattern[str]] = re.compile(r"^\-?\d+\.?\d+$")

这是"X"格式标记背后的正则表达式,例如由arrow.get(user_string, "X")使用。它具有两个相邻的无界 \d+ 组,它们之间由可选的.分隔,且都锚定在 $。对于像 "9"*N + "x" (N 个数字后跟一个非数字) 这样的输入,第一个 \d+ 会贪婪地消耗所有 N 个数字,可选的 \.? 从来不会匹配,而第二个 \d+ 则必须在整个匹配失败之前回溯到两个组之间的每个可能的分割点 - O(N) 分割 × O(N) 回溯工作,总共为 O(N²),然后才会抛出 ParserMatchError