CodeMirror 的 Markdown 模式中发现了一处 ReDoS 漏洞

作者: guiyi-he创建于 2025年6月9日更新于 2025年8月27日

页:1 在 CodeMirror 的 Markdown 模式中发现了 ReDoS 的弱点 。 特制的输入字符串在几个正则表达式中会触发灾难性回溯,使受影响的应用被冻结或显著地降低其性能. 这种脆弱性可以在任何使用CodeMiror的Markdown模式,导致拒绝提供“DoS”服务的环境(浏览器或服务器)中加以利用。

详细情况 模式/markdown/markdown中的多正则表达式模式. js文件容易被指数回溯. 问题在于使用贪婪的限定词(例如+或*)与无约束的捕捉组结合使用,这些组最终必须匹配一个终止的符. 当提供一个最终无法匹配模式的极长字符串(例如由于结尾处有一个额外的字符)时,引擎会过度回溯.

以下是一些具有代表性的脆弱模式,以及引发它们的攻击弦:

  1. 跟踪空间检查

脆弱代码 : {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你来干什么? 如果( stream.match (/ + $/, 假))

触发有效载荷 :
‘'"+".repeat(100000)+"@"

问题: " /+美元/ " 模式使用一种贪婪的限定词,在线末锚( " 美元 " )之前没有长度限制,导致输入的100,000个空格出现指数回溯,然后是非空间字符。

2. 图像/链接前缀检查
脆弱代码 :
{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你来干什么?
如果(ch QQ"!" ) QQ stream. match (/\ [[@]]]) ? (?:\ (|\/,假名)

触发有效载荷 : ‘''+". repeat(100000)+".

问题:[^\]]'的使用是无界限的,如果输入上千个重复的['字符,就会导致灾难性的倒退。

  1. 链接后缀检查

脆弱代码 : {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你来干什么? if (ch QQ'])' sate.linkText QQ stream. match (/\ (. ?) ) @? @ [.?]/, 假).

触发有效载荷 :
‘''+"(.repeat (100000)+"\n@".

问题:由于输入由许多重复(字符后为新线和不匹配字符)组成的总体模式复杂,不光彩的`.*? ' 仍然造成大规模倒退。

4. Angle  Bracket 电子邮件检查 :
脆弱代码 :
{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你来干什么?
如果(ch '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

触发有效载荷 : ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

问题:未绑定的字符类`[^[ >\] ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

  1. 嵌入式链接检查 脆弱代码 : {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你来干什么? 如果(ch ''''''' '''''''''''''''''''''''''''''''''''' ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
触发有效载荷 :
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

问题:使用无约束的`[^\]'和`(.*\)'进一步加大了用精心制作的投入进行指数回溯的风险。
使用负视前置的拟议修正 :
为了减轻脆弱性,我们建议用不需要灾难性倒退的模式来取代脆弱的正则模式。 对于
. . . . . . .

内容来源: codemirror/codemirror5