[緊急解説] Node.jsの一時ファイルライブラリ「tmp」における深刻なディレクトリトラバーサル脆弱性 (GHSA-ph9p-34f9-6g65 / CVE-2026-44705)
はじめに:Node.js「tmp」ライブラリの脆弱性概要
日本のフロントエンドエンジニアの皆さん、こんにちは。今回は、Node.js環境で一時ファイルやディレクトリの作成に広く利用されている`tmp`ライブラリにおいて、深刻な脆弱性(GHSA-ph9p-34f9-6g65 / CVE-2026-44705)が発見された件について緊急解説します。この脆弱性は「高」の深刻度と評価されており、攻撃者がシステム上の任意の場所にファイルを生成・上書きできる「ディレクトリトラバーサル」に分類されます。直接Node.jsのバックエンドを触れていない方でも、ビルドプロセスやCLIツール、またはフルスタックフレームワークの内部でこのライブラリが利用されている可能性があり、決して他人事ではありません。早急な対応が求められます。
脆弱性の詳細と仕組み
`tmp`ライブラリは、一時ファイルやディレクトリを作成する際に`prefix`(接頭辞)、`postfix`(接尾辞)、`dir`(ディレクトリ)といったオプションを受け取ります。問題は、これらのオプションにユーザーからの入力を適切に検証せず、そのまま使用していた点にあります。具体的には、攻撃者がこれらのオプションに`../`(親ディレクトリへ移動するパス)やパス区切り文字(`/`、`\`)、あるいは絶対パスを挿入すると、Node.jsの`path.join()`関数がパスを結合する際にこれらを正規化して解決してしまいます。
これにより、意図された一時ディレクトリの範囲外、つまりシステム上の任意の場所にファイルを生成・上書きすることが可能になります。アプリケーションが動作しているプロセスの権限でファイル操作が行われるため、機密情報の漏洩、設定ファイルの改ざん、さらには悪用されてリモートコード実行(RCE)につながるなど、非常に深刻な被害を引き起こす可能性があります。
フロントエンドエンジニアが意識すべき影響範囲
「自分はフロントエンド専門だから関係ない」と思うかもしれません。しかし、現在のWeb開発ではNode.jsが多くのレイヤーで利用されており、あなたの開発環境やプロダクションコードに間接的に影響する可能性があります。
具体的な影響シナリオをいくつか見てみましょう:<ul><li><b>Node.jsバックエンドAPI</b>: Next.jsのAPI Routesや、Node.jsで構築されたBFF (Backend For Frontend) などでユーザーからのファイルアップロードや設定処理を行う際、`tmp`を使って一時ファイルを生成している場合、攻撃者は悪意のあるファイル名を送りつけ、設定ファイルなどを改ざんする可能性があります。</li><li><b>ビルドツールやCLIツール</b>: `esbuild`や`Webpack`、`Vite`などのビルドツール、または`npm`や`yarn`のスクリプトで利用されるカスタムCLIツールが、内部で`tmp`を使って一時的なキャッシュファイルやビルド成果物を生成している場合、開発環境やCI/CDパイプラインが侵害されるリスクがあります。例えば、攻撃的なプルリクエストを通じてCI/CDパイプラインが不正なファイルを生成し、本番環境にデプロイされる事態も考えられます。</li><li><b>ローカル開発環境</b>: 開発用サーバーやテストスクリプトがこの脆弱性を持つ`tmp`の利用パターンを含んでいる場合、悪意のある入力によって開発環境のファイルシステムが改ざんされる可能性もゼロではありません。</li></ul>
この脆弱性は、データ整合性の破壊、サービスの中断、セキュリティ機能の回避といったビジネスへの甚大な影響に加え、個人情報の漏洩などコンプライアンス違反にもつながりかねない重大なリスクをはらんでいます。
いますぐ実施すべき対策
残念ながら、本記事執筆時点(2026年のリリースを想定)では`tmp`パッケージの修正版はリリースされていません。そのため、あなたのアプリケーション側で直ちに対策を講じる必要があります。
<ol><li><b>入力値の厳格なサニタイズと検証</b>:<ul><li>`prefix`や`postfix`には、パス区切り文字(`/`、`\`)やパス操作を示す文字(`.`)が含まれないように、ファイル名として安全な文字のみを許可する正規表現(例: `/^[a-zA-Z0-9_-]+$/`)でフィルタリングするか、`path.basename()`を用いてファイル名部分のみを抽出する処理を必ず導入してください。</li><li>`dir`オプションに、ユーザーからの入力を<b>絶対に許可しないでください</b>。もし指定する必要がある場合でも、絶対パスではなく、アプリケーションが意図した一時ディレクトリのサブディレクトリのみを許可するよう、厳しく検証してください。`path.resolve()`と`path.relative()`を組み合わせ、意図した範囲内に収まっていることを確認し、範囲外への脱出を検出した場合は即座にエラーとするべきです。</li></ul></li><li><b>ファイルパス生成後の最終的な検証</b>: `tmp`パッケージが実際に生成した最終的なファイルパスが、意図した一時ディレクトリの外に出ていないことを、`path.resolve()`と`path.relative()`を使用して検証するロジックを別途組み込むことが強く推奨されます。ファイル操作を行う直前にこのチェックを行うことで、二重の防御となります。</li><li><b>セキュアな実装パターンの採用</b>: ユーザーから受け取った値を直接`tmp`のオプションに渡すことを避け、必ず上記のような安全なサニタイズ・検証関数を通して利用するようにしてください。最も安全なのは、`prefix`や`postfix`にユーザー制御の要素を含めず、`dir`オプションも利用しないことです。</li></ol>
回避策と継続的な監視
具体的なコードレベルでの回避策としては、以下のような対応を検討してください。<ul><li>`tmp`に渡す`prefix`は、必ず`path.basename()`でファイル名部分のみを安全に抽出してから使用する。</li><li>`postfix`は、英数字、アンダースコア、ハイフン、ドットなど、ファイル名として安全な文字のみを許可する正規表現で厳しくフィルタリングする。</li><li>`dir`オプションは、ユーザー制御を許可せず、`undefined`にするか、アプリケーション内部で固定されたリテラル値のみを使用する。</li><li>`tmp`が生成したファイルパスが、意図したベースディレクトリの外に出ていないかを検証する独自の関数を導入し、ファイル操作前に毎回チェックを行う。</li></ul>
また、セキュリティチームやDevOpsチームと連携し、静的コード解析ツール(SAST)を用いて`tmp`パッケージの利用箇所とその引数にユーザー入力が流れているパターンを検出したり、ランタイム監視機能(RASPなど)を導入して不審なファイル作成を検知・警告する仕組みを構築することも重要です。ファイルシステム監視ツール(例: Linuxの`inotifywait`)の活用も有効な手段となるでしょう。
まとめ
Node.jsの`tmp`ライブラリにおけるディレクトリトラバーサル脆弱性は、あなたのWebアプリケーションや開発環境に深刻な影響を及ぼす可能性があります。修正版がリリースされていない現状では、開発者自身が厳格な入力検証とパスの安全な取り扱いを徹底することが不可欠です。この機会に、ご自身のプロジェクトにおける一時ファイルやユーザー入力の取り扱いについて再確認し、強固なセキュリティ対策を講じてください。セキュリティは、フロントエンド・バックエンドの境界なく、開発者全員で取り組むべき最重要課題です。