[速報] CVE-2026-59179: @openhop/serverの深刻なPath Traversal脆弱性を徹底解説
はじめに:@openhop/serverの深刻な脆弱性
OpenHopというオープンソースプロジェクトのサーバーコンポーネントである`@openhop/server`で、Path Traversal(パス・トラバーサル)の脆弱性(GHSA-g72f-jw3w-mgh7 / CVE-2026-59179)が報告されました。CVSSスコア8.3(High)と評価されており、迅速な対応が求められます。この脆弱性は、特にNode.jsベースのバックエンドを開発・運用している日本のフロントエンドエンジニアの皆さんにとっても、無視できないものです。
Path Traversal(ディレクトリトラバーサル)とは?
Path Traversalとは、アプリケーションがユーザーから提供されたファイルパスを適切に検証しないために発生する脆弱性です。攻撃者は「../」(親ディレクトリへの移動)のような特殊なシーケンスを挿入することで、本来アクセスが許可されていないシステム上の任意のファイルやディレクトリにアクセスできるようになります。これにより、機密情報の読み取りや、ファイルの削除・改ざんが可能になります。これは、ファイルシステムの構造を悪用する代表的な攻撃手法の一つです。
@openhop/serverの脆弱性の詳細
今回の脆弱性は、`@openhop/server`の`FlowStore.filePath()`関数内で、ユーザーから送信される`id`パラメータがサニタイズされずに`path.join()`に直接渡されることが原因で発生します。
具体的には、`GET /api/flows/:id` および `DELETE /api/flows/:id` のAPIルートにおいて、FastifyのルーティングによってURLエンコードされた`id`(例: `..%2Fvictim`)がデコードされて`../victim`となり、それがそのままファイルパス構築に使われます。Node.jsの`path.join()`関数は、`path.join('/data/flows', '../victim.yaml')`のような形式でパスを結合すると、結果として`/data/victim.yaml`と正規化してしまい、設定されたデータディレクトリ(`/data/flows`)の外にあるファイルにアクセスできてしまいます。
この不適切な処理により、認証されていない攻撃者はシステム上の任意の`.yaml`ファイルを読み取ったり、削除したりすることが可能になります。
フロントエンドエンジニアが特に注意すべき点:CORS設定とローカル環境への影響
この脆弱性がさらに深刻なのは、サーバーのCORS設定が`origin: true`(すべてのオリジンからのクロスオリジンアクセスを許可)となっている点です。これにより、悪意のあるウェブページから、ユーザーのブラウザを介してローカルで実行されているOpenHopインスタンス(例: `localhost:8799`)に対してクロスオリジンリクエストを行い、この脆弱性を悪用することが可能になります。
つまり、ローカル開発環境でOpenHopを利用しているフロントエンドエンジニアが、悪意のあるウェブサイトを閲覧するだけで、ローカルマシンの機密情報(例えば`~/.config/app/secrets.yaml`のような設定ファイル)が読み取られたり、重要なファイルが削除されたりするリスクがあるのです。また、Dockerデプロイではデフォルトで`HOST=0.0.0.0`が設定されているため、外部ネットワークから直接攻撃される可能性も指摘されています。
潜在的な影響とリスク
この脆弱性が悪用された場合、以下のような重大な影響が考えられます。
<ul><li><strong>情報漏洩 (Confidentiality: Low)</strong>: サーバープロセスがアクセス可能な任意の`.yaml`ファイルの内容が読み取られ、アプリケーションの機密設定、APIキー、ユーザーデータ、その他のYAML形式で保存された機密情報が漏洩する可能性があります。</li><li><strong>データ破壊 (Integrity: High, Availability: High)</strong>: サーバープロセスがアクセス可能な任意の`.yaml`ファイルが永続的に削除され、データ損失や、システムが依存する構成ファイルの消失によるサービス停止につながる可能性があります。</li></ul>
特に、Node.jsアプリケーションの環境変数や設定ファイルとしてYAML形式を使用している場合、それらのファイルが直接的な攻撃対象となる可能性があります。
対策と推奨される修正
根本的な対策は、ユーザー入力に基づいてファイルパスを構築する際に、**入力値を厳格に検証(サニタイズ)**することです。許可された文字パターンのみを受け入れる「ホワイトリスト方式」が最も堅牢なアプローチです。
開発元が推奨する修正は、`id`パラメータに対して正規表現`FLOW_ID_PATTERN = /^[A-Za-z0-9_-]+$/`のようなパターンマッチングを適用し、許可された文字のみを含むことを強制することです。これにより、`../`のようなPath Traversalシーケンスが挿入されることを防ぎます。
推奨される修正の差分は以下の通りです。
```ts // packages/server/src/store.ts const FLOW_ID_PATTERN = /^[A-Za-z0-9_-]+$/ private filePath(id: string): string { if (!FLOW_ID_PATTERN.test(id)) { throw new Error('Invalid flow id') } return join(this.dir, `${id}.yaml`) } ```
`@openhop/server`を使用している場合は、速やかに最新バージョンへのアップデートを検討してください。また、CORS設定についても、`origin: true`ではなく、信頼できるオリジンのみを許可するよう、厳格に見直すことを強く推奨します。
まとめ
`@openhop/server`で報告されたPath Traversal脆弱性は、Node.jsアプリケーションにおける入力値検証の重要性を改めて浮き彫りにしました。フロントエンドエンジニアの皆さんも、利用しているライブラリやフレームワークが、今回のようなPath Traversalや、他のセキュリティ脆弱性に対してどのような対策を講じているかを常に意識することが重要です。
特に、バックエンドのセキュリティ脆弱性がローカル開発環境や、CORS設定を通じてウェブ経由で攻撃される可能性があることを認識し、利用している依存関係のセキュリティ情報を常にチェックする習慣をつけましょう。安全なアプリケーション開発のために、常に最新のセキュリティプラクティスを適用することが不可欠です。