Doclingにおいて、信頼できないTikZを、オプションで有効にするTectonicエンジンを使用してレンダリングする際に、任意のファイル読み込み/書き込み(および、shell-escapeが有効になっている場合は、コマンド実行)の脆弱性が存在します。
### 概要
LaTeXバックエンドが、Tectonicエンジンを使用してTikZ画像をレンダリングするように設定されている場合 (`LatexBackendOptions(tikz_engine="tectonic")`)、TikZの本文と、入力ファイルからのドキュメントのプレアンブルが、TeXのファイルプリミティブに対する制限なしにTectonicによってコンパイルされます。 巧妙に作成された`.tex`ファイルを使用すると、プロセスが読み取れるファイルを読み込んだり、プロセスが書き込めるパスにあるファイルに書き込んだりすることができます。 また、呼び出し元が`tikz_engine_allow_shell_escape=True`を設定している場合、ドキュメントは`\write18`を通じてシェルコマンドを実行できます。
### 詳細
`docling/backend/latex/engines/tectonic.py`は、画像のソースを一時的なドキュメントに書き込み、`tectonic`バイナリを実行します。 `_resolve_local_dependency`は、どのファイルを一時ディレクトリに配置するかを決定するだけです。 これは、コンパイル時にTeXが何を開くかを制限するものではありません。 したがって、以下の操作が可能です。
- `\input{/abs/path}`、`\verbatiminput{...}`、および`\openin`は、任意のファイルを読み込み、その内容をレンダリングされた画像に組み込むことができます。 この画像は、最終的な変換出力に含まれます。 メモリ上の`DocumentStream`の場合、ステージングは完全にスキップされます。
- `\immediate\openout` / `\write`は、一時ディレクトリ外のファイルを作成または上書きします。 これらは、シェルエスケープを必要としません。 また、Tectonicの`--untrusted`フラグによってもブロックされません。
一方、`TectonicEngine`コンストラクタのデフォルト値は`allow_shell_escape=True`です。 LaTeXバックエンドは、常に`tikz_engine_allow_shell_escape`を明示的に設定します(デフォルトは`False`)。 したがって、このデフォルト値は、`TectonicEngine`を直接インスタンス化するコードにのみ影響します。
### 影響を受ける設定
- 影響を受けるもの: `tikz_engine="tectonic"`を設定し、`tectonic`バイナリが利用可能(`PATH`上またはdoclingのキャッシュ内)であり、信頼できないLaTeXを変換する呼び出し元。
- 影響を受けないもの: デフォルト設定 (`tikz_engine=None`)。 doclingは`tectonic`を自動的にインストールせず、CLIにはこれを有効にするオプションは存在しません。
### 影響
プロセスが読み取れるローカルファイルの情報が公開され、プロセスが書き込み可能なファイルの作成または上書きが行われる可能性があります。 スタートアップファイルや設定ファイルへの書き込みは、コードの実行につながる可能性があります。 シェルエスケープが有効になっている場合、コマンドが直接実行されます。
### 実証
```latex
\documentclass{article}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
\immediate\openout15=/tmp/docling-tectonic-poc.txt
\immediate\write15{written by the input document}
\immediate\closeout15
\node {x};
\end{tikzpicture}
\end{document}
```
`LatexBackendOptions(tikz_engine="tectonic")` を使用してこのファイルを変換すると、`/tmp/docling-tectonic-poc.txt` が作成されます。
### 修正
docling 2.132.0 で、[#4419](https://github.com/docling-project/docling/pull/4419) により修正されました。
- `TectonicEngine` のデフォルト値は、`allow_shell_escape=False` になりました。 シェルエスケープが無効になっている場合、Tectonic は `--untrusted` および `--only-cached` オプションで実行されます。
- コンパイル前に、docling は生成されたドキュメントと、ステージングされたすべてのファイルをチェックします。 ソースが `\openin`、`\openout`、`\XeTeXpicfile` または `\XeTeXpdffile` のプリミティブを使用している場合、または `\input`、`\include`、`\includegraphics`、`\InputIfFileExists` または `\graphicspath` で絶対パス、ホームディレクトリ、ドライブレター、または親ディレクトリのパスを指定している場合、docling はレンダリングをスキップし、図を TikZ コードとして保持します。
このチェックは、可能な範囲での対応策です。 ソーステキストを読み取りますが、TeX はテキストチェックでは検出できない方法でファイルを開く可能性があります。たとえば、パッケージコマンドやマクロによって構築された名前を使用する場合などです。 [パイプラインオプションのリファレンス](https://github.com/docling-project/docling/blob/main/docs/reference/pipeline_options.md) に記載されているように、`tikz_engine="tectonic"` でレンダリングされた信頼できない LaTeX は、依然として隔離された環境で処理する必要があります。
### 対策
バージョン 2.132.0 にアップグレードしてください。 古いバージョンの場合:
- 信頼できない入力に対しては、`tikz_engine="tectonic"` を有効にしないでください。 または、変換を OS レベルのサンドボックス (コンテナ、ホストマウントなし、読み取り専用ファイルシステム、ネットワークなし) で実行してください。
- 信頼できない入力に対しては、`tikz_engine_allow_shell_escape=True` を設定しないでください。
影響を受けるパッケージ:
- pip (Python) docling: 影響を受けるバージョンは 2.94.0 以降、2.132.0 未満。修正されたバージョンは 2.132.0。
- pip (Python) docling-slim: 影響を受けるバージョンは 2.94.0 以降、2.132.0 未満。修正されたバージョンは 2.132.0。