[緊急解説] TinaCMS CLI にリモートコード実行 (RCE) の脆弱性 (CVE-2026-54074)
はじめに:TinaCMS CLIの脆弱性について
フロントエンド開発者の皆さん、本日はTinaCMS CLIに潜む深刻な脆弱性、CVE-2026-54074について解説します。この脆弱性は、特にForestryからTinaCMSへの移行を検討している方、または既にその機能を利用している方に直接的な影響を及ぼす可能性があります。
深刻度は「高」とされており、開発者のローカル環境で任意のコードが実行されてしまうリモートコード実行(RCE)の危険性があるため、早急な理解と対応が求められます。
脆弱性の概要と影響
この脆弱性は、`@tinacms/cli`に含まれるForestryからの移行コマンドに存在します。具体的には、悪意のあるForestryプロジェクトを移行処理にかけ、その後`tinacms dev`や`tinacms build`コマンドを実行すると、開発者のPC上で攻撃者が仕込んだ任意のJavaScriptコードが実行されてしまいます。
何が危険なのか? 開発者のPC上で任意のコードが実行されるということは、環境変数の漏洩、SSHキーや各種API認証情報の窃取、npmトークンやGitHub認証情報の悪用によるサプライチェーン攻撃、さらには開発者のソースコードの改ざんといった、非常に広範かつ深刻な被害に繋がる可能性があります。これは単なるデータ漏洩にとどまらず、プロジェクト全体、さらにはその先のユーザーにも影響を及ぼしかねません。
技術的な詳細:なぜRCEが発生するのか?
脆弱性の核心は、TinaCMS CLI内部の`addVariablesToCode`関数と`transformForestryFieldsToTinaFields()`関数における、ユーザー入力の不適切な処理にあります。
**ステップ1: 入力の不適切処理**
`transformForestryFieldsToTinaFields()`関数は、ForestryのYAMLファイル(`.forestry/**/*.yml`)内で定義される`label`や`name`といったユーザー指定の値を、TinaFieldオブジェクトに直接書き込みます。この際、悪意のあるJavaScriptコードが含まれていてもサニタイズ(無害化)が行われません。
**ステップ2: 特殊マーカーの展開**
内部ヘルパー関数`addVariablesToCode`は、文字列化されたJSONデータ内に含まれる`"__TINA_INTERNAL__:::(.*?):::"`という形式の特殊なマーカーを検出します。そして、このマーカーにマッチする値を「引用符なし」で展開してしまう、という挙動があります。これが、文字列をコードとして解釈させるための第一歩となります。
**ステップ3: `JSON.stringify`の特性の悪用**
TinaCMSはフィールド配列を`JSON.stringify`で文字列化してから`addVariablesToCode`に渡しますが、`JSON.stringify`はダブルクォート(`"`)はエスケープするものの、シングルクォート(`'`)やバックティック(`` ` ``)はエスケープしません。攻撃者はこの特性を悪用し、シングルクォートやバックティックを使ってペイロードを作成することで、`JSON.stringify`のエスケープを回避し、意図したJavaScriptコードを注入することが可能になります。
**ステップ4: 即時実行**
注入された悪意のあるコードは、`tina/templates.{ts,js}`ファイル内に書き込まれ、このファイルは`tina/config.{ts,js}`によってインポートされます。結果として、開発者が`tinacms dev`や`tinacms build`コマンドを実行し、`./templates`をインポートした瞬間に、モジュールトップレベルで注入されたコードが開発者の権限で即座に実行されてしまうのです。
あなたへの影響と推奨される対策
この脆弱性は、Forestryからの移行機能を利用する開発者全てに影響します。特に、信頼できないソースからForestryプロジェクトをインポートする可能性のある場合は、非常に注意が必要です。
**推奨される対応策(オプションBが最も確実です)**
**オプションA (ユーザー制御下の文字列をサニタイズする):** ユーザーが入力する`label`や`name`などの文字列に、脆弱性を引き起こす特殊マーカーが含まれないよう、適切にサニタイズ処理を施します。ただし、サニタイズ漏れがないよう細心の注意が必要となります。
**オプションB (推奨 - マーカーシーケンスを`JSON.stringify`でエスケープされるものに変更する):** TinaCMS内部で使用する特殊マーカーの形式を、`JSON.stringify`が自動的にエスケープするような文字(例: スペース)を含む形式に変更します。例えば、`" __TINA_INTERNAL__ (.*?)/__TINA_INTERNAL__ "` のようにすることで、ユーザー入力に偶然似た文字列が含まれても、エスケープされてコードとしては機能しなくなり、構造的に攻撃を不可能にします。これが最も確実な対策とされています。
**多層防御のための追加対策:**
・`label`や`name`などのフィールドに改行文字やNULLバイトが含まれる入力を拒否する。
・`prettier.format(...)`の失敗時にビルドが中断されるようなエラーハンドリングを徹底する。
まとめ
TinaCMS CLIのForestry移行機能におけるRCE脆弱性は、開発者のローカル環境に甚大な被害をもたらす可能性があります。ご自身のプロジェクトでTinaCMSを利用している方、特にForestryからの移行を検討している方、または既に実施された方は、この脆弱性の影響を十分に理解し、TinaCMSの最新バージョンへのアップデートや、提供されている修正パッチの適用を速やかに行うことを強く推奨します。
常にソフトウェアを最新の状態に保ち、信頼できないソースからのコード実行には最大限の警戒を払いましょう。