
PaperCut NG における認証タイミングサイドチャネルを介したユーザー名列挙
| フィールド | 詳細 |
|---|---|
| CVE ID | CVE-2026-8794 |
| 製品 | PaperCut NG |
| 影響を受けるバージョン | 25.0.11 (ビルド 75758) 以前 |
| CWE | CWE-208 — 観察可能なタイミング不一致 |
| CVSS スコア | 3.7 (低) — 単独の場合。CVE-2026-8793 と連鎖すると深刻度が上昇 |
| 研究者 | Vivien LEBAS (@Hazaz) |
| 報告日 | 2026年5月 |
| ステータス | 修正済み — PaperCut NG 26.0.3 |
PaperCut NG の認証エンドポイントでは、既存アカウントと存在しないアカウントに対するログイン試行の間に、測定可能なタイミング差が生じます。この差異は、一致するアカウントが見つかった場合にのみ bcrypt パスワードハッシュ化が実行されることに起因しており、認証されていない攻撃者が HTTP 応答時間を測定することで、特定のユーザー名がシステムに存在するかどうかを確実に判定できるようになります。
CVE-2026-8793 (ブルートフォース保護の欠如) と組み合わせると、この脆弱性により、完全な認証情報侵害の攻撃チェーンが可能になります。まず有効なユーザー名を列挙し、その後、ロックアウトのリスクなしに無制限の標的型パスワード推測を実行します。
このタイミング差は、古典的な実装パターンに起因します。アプリケーションは、送信されたユーザー名に一致するアカウントがデータベースで見つかった場合にのみ bcrypt 比較を呼び出します。存在しないアカウントの場合、認証ルーチンは bcrypt が呼び出される前に早期終了し、その結果、測定可能なほど短い応答時間になります。
Valid username: DB lookup (found) → bcrypt comparison → failure response ~2.1s avg
Invalid username: DB lookup (not found) → immediate failure response ~0.2s avg
このパターンは広く文書化されています (CWE-208 を参照)。標準的な対策は、アカウントが存在しない場合でもダミーの bcrypt 比較を実行し、両方のコードパスで応答時間を均等化することです。
制御された条件下で、PaperCut NG のログインエンドポイントに対して認証試行を行いました:
curl と --write-out "%{time_total}" を使用。すべてのケースで意図的に誤ったパスワードを使用2 つの分布は完全に重複しないため、中程度のネットワークジッターがあっても列挙は確実に行えます。
# Measure response time for an existing account (wrong password)
curl -s -o /dev/null -w "%{time_total}\n" \
-X POST "http://<target>:9191/app" \
-H "Origin: http://<target>:9191" \
--data "service=direct/1/Home/%24Form&inputUsername=admin&inputPassword=wrongpassword"
# Output: ~2.1s
# Measure response time for a non-existent account
curl -s -o /dev/null -w "%{time_total}\n" \
-X POST "http://<target>:9191/app" \
-H "Origin: http://<target>:9191" \
--data "service=direct/1/Home/%24Form&inputUsername=zz_doesnotexist_zz&inputPassword=wrongpassword"
# Output: ~0.2s
約0.5秒を大幅に上回る応答時間は、有効なユーザー名であることを確実に示します。簡単なスクリプトで、一般的な企業の命名パターン (firstname.lastname、flastname など) のワードリストに対する列挙を自動化できます。
この発見は、2 段階攻撃の最初のステップとして使用された場合に最も大きな影響を及ぼします:
ステップ 1 (CVE-2026-8794、本発見) — 認証応答のタイミングを測定して、有効な PaperCut NG アカウント名のリストを作成します。企業環境では、公開情報 (LinkedIn、会社の Web サイト、メールのフッター) から取得した firstname.lastname の組み合わせの短いワードリストで十分なことがよくあります。
ステップ 2 (CVE-2026-8793) — 確認された有効なアカウントに対して無制限のパスワード試行を送信します。レート制限やロックアウトがないため、クレデンシャルスタッフィングやパスワードスプレー攻撃を完全にオンラインでフルスピードで実行できます。
TCP/9191 へのネットワークアクセスを持つ認証されていない攻撃者は、以下を行うことができます:
一般的な企業展開では、PaperCut のユーザー名は Active Directory アカウントと一致します。したがって、確認された有効な PaperCut ユーザー名は、確認された有効なドメインアカウント名でもあり、PaperCut 自体を超えて偵察価値が増幅されます。
管理者向け (暫定緩和策):
ベンダー向け:
送信されたユーザー名がいずれのアカウントとも一致しない場合は、アカウントが存在するかどうかに関係なく応答時間が均等化されるよう、定数時間のダミー bcrypt 比較を実行します:
# Pseudocode — constant-time authentication pattern
user = db.find_user(username)
if user:
valid = bcrypt.verify(password, user.password_hash)
else:
bcrypt.verify(password, DUMMY_HASH) # always run, result discarded
valid = False
これは、認証フローにおける CWE-208 を緩和するための確立されたパターンです。
| 日付 | イベント |
|---|---|
| 2026年5月9日 | PaperCut セキュリティチームに初回レポートを提出 |
| 2026年5月10日 | 受領確認を受領 |
| 2026年5月 | PaperCut (CNA) により CVE-2026-8794 が採番 |
責任ある開示の原則に従って開示されました。完全な技術的詳細は公開前に PaperCut セキュリティチームと共有されました。
研究者: Vivien LEBAS — @Hazaz
| 条件 | 最小 (秒) | 最大 (秒) | 平均 (秒) | 標準偏差 |
|---|
既存アカウント (admin) | 2.08 | 2.19 | 2.13 | 0.031 |
存在しないアカウント (zz_doesnotexist_zz) | 0.18 | 0.24 | 0.21 | 0.018 |
| 差 | 約1.92秒 |
| 2026年8月 | パッチリリース — PaperCut NG 26.0.3 |
| 2026年8月 | ベンダーと調整の上、公開開示 |