超簡単 Node.js 脆弱性チェック

2024/10/21に公開

はじめに

この Node.js 公式ポストの紹介記事。

https://x.com/nodejs/status/1847305907698319394

実行

下記コマンドで使用している Node.js のバージョンに脆弱性が含まれているかどうかチェックできる。

npx is-my-node-vulnerable

is-my-node-vulnerable は Node.js のセキュリティチームが作成したツール。リポジトリはこちら。

https://github.com/RafaelGSS/is-my-node-vulnerable

内部では Node.js 脆弱性リストを参照している。

脆弱性リストの実態はこんな感じで json ファイルになっている。

{
  "145": {
    "cve": ["CVE-2024-22020"],
    "vulnerable": "18.x || 20.x || 22.x",
    "patched": "^18.20.4 || ^20.15.1 || ^22.4.1",
    "ref": "https://nodejs.org/en/blog/vulnerability/july-2024-security-releases/",
    "overview": "A security flaw in Node.js allows a bypass of network import restrictions.\nBy embedding non-network imports in data URLs, an attacker can execute arbitrary code, compromising system security.\n\nVerified on various platforms, the vulnerability is mitigated by forbidding data URLs in network imports.\n\nExploiting this flaw can violate network import security, posing a risk to developers and **servers**.",
    "affectedEnvironments": ["all"],
    "severity": "medium"
  },
  "146": {
    "cve": ["CVE-2024-37372"],
    "vulnerable": "20.x || 22.x",
    "patched": "^20.15.1 || ^22.4.1",
    "ref": "https://nodejs.org/en/blog/vulnerability/july-2024-security-releases/",
    "overview": "The Permission Model assumes that any path starting with two backslashes \\\\ has a four-character prefix that can be ignored, which is not always true. This subtle bug leads to vulnerable edge cases.\n\nThis vulnerability affects Windows users of the Node.js Permission Model in version v20.x and v22.x",
    "affectedEnvironments": ["all"],
    "severity": "unknown"
  }
}
  • cve: 脆弱性の CVE 番号 (一意の識別子)
  • vulnerable: 脆弱性が含まれるバージョン
  • patched: 脆弱性が修正されたバージョン
  • ref: 詳細リンク
  • overview: 脆弱性の概要
  • affectedEnvironments: 影響を受けるプラットフォーム (Linux, Windows, macOS, etc.)
  • severity: 脆弱性の深刻度

コマンドの出力結果例

※ 出力結果はリポジトリの README より引用

  • 脆弱性が含まれる場合

json に記載の CVE 番号や概要、修正バージョンなどが表示される。

$ node -v
v20.3.0
$ npx is-my-node-vulnerable


██████   █████  ███    ██  ██████  ███████ ██████
██   ██ ██   ██ ████   ██ ██       ██      ██   ██
██   ██ ███████ ██ ██  ██ ██   ███ █████   ██████
██   ██ ██   ██ ██  ██ ██ ██    ██ ██      ██   ██
██████  ██   ██ ██   ████  ██████  ███████ ██   ██


The current Node.js version (v20.3.0) is vulnerable to the following CVEs:

CVE-2023-30581: The use of proto in process.mainModule.proto.require() can bypass the policy mechanism and require modules outside of the policy.json definition
Patched versions: ^16.20.1 || ^18.16.1 || ^20.3.1
==================================================================================================================================================================================
  • 脆弱性が含まれない場合
$ node -v
v20.17.0
$ npx is-my-node-vulnerable


 █████  ██      ██           ██████   ██████   ██████  ██████         ██
██   ██ ██      ██          ██       ██    ██ ██    ██ ██   ██     ██  ██
███████ ██      ██          ██   ███ ██    ██ ██    ██ ██   ██         ██
██   ██ ██      ██          ██    ██ ██    ██ ██    ██ ██   ██     ██  ██
██   ██ ███████ ███████      ██████   ██████   ██████  ██████         ██


  • EOL になったバージョンの場合
$ node -v
v15.14.0
$ npx is-my-node-vulnerable


██████   █████  ███    ██  ██████  ███████ ██████
██   ██ ██   ██ ████   ██ ██       ██      ██   ██
██   ██ ███████ ██ ██  ██ ██   ███ █████   ██████
██   ██ ██   ██ ██  ██ ██ ██    ██ ██      ██   ██
██████  ██   ██ ██   ████  ██████  ███████ ██   ██


v15.14.0 is end-of-life. There are high chances of being vulnerable. Please upgrade it.

CLI 以外の実行方法

  • スクリプト
const { isNodeVulnerable } = require('is-my-node-vulnerable');

isNodeVulnerable('19.0.0'); // true

// プラットフォーム指定
isNodeVulnerable('19.0.0', 'linux'); // true
  • Github Actions
name: 'Node.js Vulnerabilities'
on:
  schedule:
    - cron: '0 0 * * *'

jobs:
  is-my-node-vulnerable:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - name: Check Node.js
        uses: RafaelGSS/is-my-node-vulnerable@v1
        with:
          node-version: '18.14.1'
          # プラットフォーム指定
          platform: 'linux'

まとめ

Dependabot などを使用して依存関係の脆弱性チェックを行っているプロジェクトは多いが、Node.js 本体のチェックはあまり実施されていないことが多い。(LTS の変更時にバージョンアップを行う程度が一般的だろう。)

導入にはそれほど手間がかからないため、Node.js自体のバージョンも定期的にチェックする習慣をつけたい。

あとはこの辺りを読んでおくと良さそう。

https://nodejs.org/en/learn/getting-started/security-best-practices

GitHubで編集を提案

Discussion