脆弱性・CVE速報深刻度: 緊急

Signal K Server 2.34.0 より前、resources API のパストラバーサルで JWT 署名鍵が漏れ、管理者権限の奪取とコマンド実行に至るおそれ(GHSA-4xm8-rg9h-jhq2、CVSS 9.8)

目次(5)

船舶向けのデータサーバー Signal K Server(signalk-server)の resources API に、パス区切りを含む識別子で保存先の外のファイルを読み書きできるパストラバーサルがあり、GitHub が重大(Critical、CVSS v3.1 で 9.8)の勧告を公開しました(GHSA-4xm8-rg9h-jhq2)。CVE は未採番で、CISA の KEV にも載っていません。EPSS は CVE が無いため算出されていません。修正版は signalk-server 2.34.0 と @signalk/resources-provider 1.5.3 です。

何が起きるのか

v2 の REST API GET /signalk/v2/api/resources/:resourceType/:resourceId は、resourceId を検証せずに FileStore.getResource() へ渡し、path.join() で保存先のパスを組み立てます。%2F でエンコードした ..%2F..%2F を入れると保存先ディレクトリの外へ出られ、サーバーが読める JSON ファイルを返してしまいます。勧告は、同じ問題が resources と applicationData の API にあり、保存先の外のファイルを読む・書く・消すことができると説明しています。

JWT の署名鍵は <config>/security.json に平文で保存されているため、この設定ファイルを読まれると、次の流れで被害が広がります。

  1. <config>/security.json を読み、JWT の署名鍵とユーザーのパスワードハッシュを得る
  2. 得た鍵で管理者の JWT を偽造する(/skServer/loginStatus が userLevel: "admin" を返すことを、勧告は再現手順で示しています)
  3. 管理者として Execute 型のプロバイダーを登録し、任意のコマンドを実行する。このプロバイダーは settings.json に保存され、再起動後も残ります

最初の読み取りが認証なしで通るのは、匿名の読み取りを許す allow_readonly=true の設定のときです。勧告によると、この設定は管理画面から切り替えられる、サポートされた構成です。既定の allow_readonly=false の環境でも、読み取り専用ユーザーのトークンがあれば同じ読み取りが通ります。

数値で見る

項目内容
CVSS v3.1(GitHub 評価)9.8 Critical(AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H)
弱点の種類CWE-22(パストラバーサル)
EPSSCVE が無いため算出なし
CISA KEV掲載なし
勧告の公開2026-10-31 7:57(日本時間。GitHub)

対象と修正版

パッケージ影響を受ける版修正版
signalk-server(npm)2.0.0 以上 2.34.0 未満2.34.0
@signalk/resources-provider(npm)1.0.0 以上 1.5.3 未満1.5.3

修正は GitHub 上のコミット 83689f0(マージ日 2026-10-18)で入りました。リソース ID・プロバイダーの種類・コレクション名・applicationData の ID の検証を足し、パスを保存先の直下に限定する内容で、signalk-server 2.34.0 に含まれます。npm の最新版は signalk-server 2.35.1、@signalk/resources-provider 1.5.3 を確認しました。

対応の考え方

  • signalk-server を 2.34.0 以降(できれば最新)へ更新してください。@signalk/resources-provider を単体で使っている場合は 1.5.3 以降にします。
  • インターネットや共用ネットワークから届く環境では、更新までの間、匿名の読み取りを許す allow_readonly を無効にし、アクセスを信頼できる範囲に絞ってください。ただし勧告によれば、無効でも読み取り専用ユーザーのトークンで同じ読み取りができるため、これだけでは防げません。
  • 更新後は、署名鍵が漏れた可能性を考えて JWT 署名鍵を作り直し、管理者パスワードを変えてください。2.34.0 のリリースノートには、JWT の鍵を security.json の外に保存する変更(PR #3192)が載っています。
  • 管理画面のプロバイダー一覧に、身に覚えのない Execute 型がないかを確認してください。settings.json にも保存されるため、再起動では消えません。
  • アクセスログに、/signalk/v2/api/resources/ へ %2F や .. を含む要求が来ていないかを確かめてください。

確認できていない点

  • 実環境での悪用の報告は、GitHub 勧告と KEV のいずれにも見当たりません。
  • CVE が未採番のため、NVD の評価は確認できていません。
  • 勧告の再現コードは手元では実行していません。
  • 勧告は修正版を 2.34.0 としています。リリースノートの一覧に、このトラバーサルの修正を名指しした項目はありません。修正コミットの内容と勧告から、2.34.0 に含まれると読み取れます。

この記事について

出典

この記事を共有