Modern Frontend CVEs

対象CVE: CVE-2026-96780

[解説] figletのDoS脆弱性 (GHSA-62ch-8vmq-8xm7) とその対策

Node.jsライブラリ『figlet』において、特定の条件下で無限ループによるサービス拒否(DoS)が発生する脆弱性 GHSA-62ch-8vmq-8xm7 (CVE-2026-96780) が報告されました。本記事では、この脆弱性の詳細、影響、そしてフロントエンドエンジニアが取るべき対策について解説します。

はじめに:figletとは?

figletは、テキストをアスキーアートに変換する機能を提供する人気の高いNode.jsライブラリです。主にCLIツールや、Node.jsバックエンドでユーザーに装飾的なメッセージを表示する際などに利用されます。フロントエンド開発者が直接ブラウザ上で利用することは稀ですが、Node.jsベースのビルドツール、開発サーバー、あるいはBFF(Backend For Frontend)などで間接的に利用されている可能性も考慮に入れる必要があります。

脆弱性の概要 (GHSA-62ch-8vmq-8xm7 / CVE-2026-96780)

今回報告された脆弱性 GHSA-62ch-8vmq-8xm7(CVE-2026-96780)は、`figlet`ライブラリのバージョン1.11.2以前に存在します。深刻度は「High」と評価されており、特定の条件下でNode.jsアプリケーションが無限ループに陥り、CPUリソースを消費し尽くすことでサービス拒否(Denial of Service, DoS)を引き起こす可能性があります。

技術的な詳細と影響

このDoS脆弱性は、`figlet`の `text()` または `textSync()` 関数を利用する際に、以下の**2つの条件が同時に満たされた場合**に発生します。

1. `whitespaceBreak: true` オプションが設定されていること。

2. `width` オプションの値が、レンダリングされる単一のFIGlet文字の幅よりも小さく設定されていること。

これらの条件が揃うと、`figlet`内部の `breakWord()` 関数が有効な改行点を見つけられなくなり、結果としてワードラッピングを担当する `generateFigTextLines()` ループが無限に実行され続けます。これにより、Node.jsのイベントループがブロックされ、CPUコアが継続的に消費され、メモリが無制限に増加してしまいます。

この脆弱性の深刻度は「Low」から「Medium」と評価されています。その理由は、`figlet`が通常は固定されたオプションで利用されることが多く、攻撃者が`width`の値を操作できるような状況が限定的であるためです。しかし、**ユーザーからの入力(例:URLクエリパラメータ、APIボディなど)を`width`の値として受け取り、かつ`whitespaceBreak: true`を有効にしているアプリケーションは、この脆弱性の直接的な影響を受ける可能性があります。** 例えば、CLIツールでユーザーが指定した幅をそのまま使う場合や、特定のAPIエンドポイントで生成されるアスキーアートの幅を動的に変えるようなケースがこれに該当します。

対策と回避策

この脆弱性は、`figlet` の**バージョン1.11.3**で修正されています。速やかにこのバージョンへのアップグレードを強く推奨します。

パッチでは、`breakWord()` 関数が常に前方へ進行し、オーバーワイドな文字でもそれ自身の行に排出されるように改善されました。また、FIGletヘッダーのパース時に、ゼロや負の値のような無効な値が拒否されるようになっています。

もし直ちにアップグレードが難しい場合は、以下のいずれかの回避策を検討してください。

1. **`width` オプションに信頼できない入力を渡さない。** ユーザーからの入力や外部からのデータに由来する値を直接`width`として使用するのを避け、常に信頼できる固定値やバリデーション済みの値を使用してください。

2. **`whitespaceBreak` オプションを無効のままにする(デフォルト値)。** このオプションを`true`に設定する必要がない場合は、デフォルトの`false`のままにしておくことが最も簡単な回避策です。

フロントエンドエンジニアが考慮すべきこと

`figlet`は主にNode.js環境で使用されるため、ブラウザ上で動作するフロントエンドアプリケーションが直接このライブラリを利用することは稀でしょう。しかし、以下のようなシナリオでは、間接的に影響を受ける可能性があります。

1. **Node.jsベースのビルドツールや開発サーバー:** プロジェクトのビルドプロセスや開発サーバーの起動時に、ログ出力などで`figlet`が使用されている場合があります。プロジェクトの`package.json`や`package-lock.json`(または`yarn.lock`など)を確認し、`figlet`が依存関係に含まれていないか確認しましょう。

2. **BFF(Backend For Frontend):** フロントエンドが利用するAPIを提供するBFF層がNode.jsで構築されており、その中で`figlet`が利用されている場合、ユーザーからのリクエストパラメータが`width`に渡される可能性があります。

もし`figlet`がプロジェクトの依存関係に含まれている場合は、バージョンを1.11.3以上にアップデートすることを強く推奨します。また、外部からの入力を扱うNode.jsアプリケーションを開発する際は、常に適切な入力バリデーションとサニタイズを行うことで、このようなDoS攻撃を含む様々な脆弱性からアプリケーションを保護する意識を持つことが重要です。

まとめ

今回解説した`figlet`のDoS脆弱性は、特定の条件下でNode.jsアプリケーションに深刻な影響を与える可能性があります。直接的な利用が少なくても、依存ライブラリとして含まれていたり、開発環境のツールで使われていたりする可能性も考慮し、常に最新のセキュリティ情報にアンテナを張り、適切なバージョン管理と脆弱性対応を行うことが、セキュアな開発を続ける上で不可欠です。フロントエンドエンジニアであっても、依存関係ツリーのセキュリティを意識し、アプリケーション全体の安全性を高める努力を続けましょう。

← ブログ一覧に戻る