🐷

polyfill .io問題のQuarto・R Markdownへの影響

2024/06/26に公開

どういう問題なのか

よく使われていた JavaScript のライブラリが、ホスティングされていたドメインごと買収されて、変なマルウェアが仕込まれるようになった、という話らしいです。

https://gigazine.net/news/20240626-polyfill-supply-chain-attack/

なぜQuartoユーザー・R Markdownユーザーはこの問題を気にしないといけないのか

なぜかというと、Quarto や R Markdown には数式を表示できますが、HTMLドキュメントに数式を表示する方法のひとつの MathJax が polyfill に依存しているからです。たとえ数式を使っていなくても、おそらく MathJax はデフォルトで有効になっているので[1]、影響を受けます。

頭の痛いことですが、これは「最近Quartoにそういう悪意あるコードが仕込まれた」みたいな話ではなく、依存していたライブラリがドメインごと乗っ取られたわけなので、これまで生成されたドキュメントも影響を受けます(ただし、後述のようにここ1年半くらいの話なので、昔のものはたぶん大丈夫です)。これまでに、数式を使ったウェブサイトやブログなどをQuartoもしくはR Markdownで生成した覚えがあるなら、まず影響を受けていると思っていいでしょう。私もQuartoでつくっていた自分のブログが影響を受けていました...

これは、HTMLドキュメントだけの話なので、その他のフォーマット(PDFとかMarkdownとか)しか生成していない場合は問題ないはずです。

どのバージョンが影響を受けるのか

MathJax

まず、MathJax側の事情ですが、MathJax自体はpolyfillに依存しているわけではなくて、「IE11で動かしたいならpolyfillを使ってね」という案内をしていただけのようです。

https://github.com/mathjax/MathJax-src/issues/62

IE11は2022年にサポート終了になったので、さすがに2024年にもなってIE11のことを気にする人はいません。MathJaxの公式ドキュメントにはもうpolyfillの案内はありません。なんですけど、MathJaxを組み込んでいるPandocには色々な行き違いでそれが残ってしまっている、ということのようです。

https://www.mathjax.org/#gettingstarted

ちなみに、↑のissueを見ると、IE11でのエラーはMathJaxのバージョン3(2019年にリリース)で起こったもののようなので、おそらくバージョン2の時代はpolyfillを使ってなさそうです。

R Markdown

R Markdownの場合は、Pandocのテンプレートに入っているのでPandocのバージョンが問題になります。

v3.1.12.3で修正されました。それ以前のバージョンが影響を受けます。今のところ、RStudioに同梱されている Pandoc のバージョンは 3.1.11 のようなので、影響を受けてしまいます。

rmarkdown::pandoc_version()
#> [1] ‘3.1.11’

ではいつから影響を受けるのかというと、実はけっこう最近です。
Pandocがpolyfillを入れたのは2023年2月のこのコミットでした。バージョン3.1.1としてリリースされたので、それ以降が影響を受けます(なぜ2023年にもなってpolyfillを入れようと思ったのかわからないんですが、この当時はMathJaxのドキュメントではpolyfillの案内がされていたので入れた方がいいと思った、という感じみたいです)。

https://github.com/jgm/pandoc/commit/4bcce62c904e10eb4352d4d7d645a6c49e773ac5

ちなみに、「そもそもpolyfill要らなくない?」というissueを立てたところ、すぐ対応されてpolyfillは削除されました。次の Pandoc のリリースからは polyfill 自体が入らなくなります。

https://github.com/jgm/pandoc/issues/9918

Quarto

上記のPandoc v3.1.1の変更がQuarto側に取り込まれたのがこのコミット、2023年3月です。バージョンで言うと、v1.3.255以降を使っていると影響を受けるようです。

https://github.com/quarto-dev/quarto-cli/commit/cc17f6ea06d9a94c68306a87e3011b21201b82f1

v1.5はv1.5.24で修正され、今のstable版であるv1.4系もv1.4.556で修正されました。

回避方法は?

ドキュメントを直接編集

もういちどknitするのは重いので避けたい、というケースは往々にしてあると思います。
生成されたドキュメントをテキストエディタなどで開いて、polyfillへのリンクを取り除きましょう。polyfillはIE11のようなクソ古いブラウザをサポートするためのものなので、なくても問題ないはずです。

Quarto

Quartoの場合は、単純にバージョンを最新版に上げてましょう。

もしどうしてもバージョンを上げられない事情がある場合は、MathJaxではなくKaTeXを使うのも手でしょう。html-math-methodで設定できます。

R Markdown

R Markdown の場合は、あまりお手軽な解決方法がなさそうです。 Pandocのバージョンを上げるのは難しいですが、KaTeXが使えるみたいなので[2]切り替えるのがいいでしょう。指定の仕方は、?rmarkdown::html_documentmath_methodにサンプルのYAMLがあるのでそこを見てください。

output:
  html_document:
    math_method:
      engine: katex
      url: https://cdn.jsdelivr.net/npm/katex@0.11.1/dist

https://rmarkdown.rstudio.com/docs/reference/html_document.html

自分で Pandoc をインストールしてそれを使うという手はありますが、このあたりはパスの設定などに慣れていないとちょっと難易度が高いかもです。

https://bookdown.org/yihui/rmarkdown-cookbook/install-pandoc.html

あるいは、MathJax を無効にすることもできます。自分で URL を指定することもできますが、これはあくまで MathJax の URL の指定なので、polyfill の URL を指定できるかどうかはよくわかりませんでした。

https://bookdown.org/yihui/rmarkdown/html-document.html#mathjax-equations

脚注
  1. Quartoだと、単体のドキュメントの場合は、実際に数式があるときのみMathJaxが挿入されるようです(heavywatalさん、情報ありがとうございます)。ただし、私のブログは数式を使っていませんが、エントリー一覧ページには勝手にMathJaxが入るようになっていました。設定によって違うようなので、数式が入っていなくても念のため注意した方がよさそうです。 ↩︎

  2. atusyさん、情報(そしてrmarkdownパッケージへの実装)ありがとうございました。 ↩︎

Discussion