Skip to content
KitploitKITPLOIT
ツールブログ
提出
ツールブログ
提出

ハッキング、侵入テスト、サイバーセキュリティツールをあなたのセキュリティアーセナルに!

Kitploitはハッキング、サイバーセキュリティ、ペネトレーションテストのツールディレクトリです。最新のプロジェクトアップデートを見つけて、脆弱性の発見、システム分析、テストの自動化、セキュリティの強化を行いましょう。

··フィード·お問い合わせ·プライバシー·© 2026 Kitploit

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
CVE-2026-38361 — アドバイザリ: CVE-2026-38361 — dash-uploader (Python/PyPI) における複数のDoS脆弱性 (CWE-400/CWE-670) | Kitploit
ツール/GitHubGitHub/a1ohadance/cve-2026-38361
脆弱性分析エクスプロイトウェブセキュリティペネトレーションテスト学習と教育
GitHuba1ohadance/cve-2026-38361

CVE-2026-38361

アドバイザリ: CVE-2026-38361 — dash-uploader (Python/PyPI) における複数のDoS脆弱性 (CWE-400/CWE-670)

リポジトリを見る
3ヶ月前未レビュー

人気

すべて見る →

コミュニティで最も使われているツールを見つけましょう。

すべてのツールを探索

ツールコレクションを閲覧

すべてのツールを見る →
共有

CVE-2026-38361: dash-uploader における複数の未認証 DoS 脆弱性

CVE NVD CWE-400 CWE-670 Severity Patch Auth Version PyPI Downloads Total Downloads License

fohrloop/dash-uploader (Python、PyPI) には、複数の未認証の サービス拒否 (DoS) 問題があります。(これらに限定されませんが) メモリ不足 (OOM) によるプロセスクラッシュ、ファイルの 0 バイトへの切り詰め、永続的なディスク枯渇、文書化された max_file_size 制限の完全なバイパスが含まれます。同じサニタイズされていないパラメータセットを通じて、追加のリソース悪用経路も存在します。

⚠️ パッチは提供されておらず、今後も提供される予定はありません

このリポジトリは、アクティブなメンテナがいないまま 2025-07-19 にアーカイブされました。公開されているすべてのバージョン (0.1.0 から 0.7.0a2 まで) が影響を受け、今後も影響を受けたままです。このパッケージは現在も月間約 28,000 ダウンロードを記録しています。

dash-uploader を本番環境で実行している場合は、各自で緩和策を適用する必要があります。推奨される修正方法は、Plotly Dash に組み込みの dcc.Upload コンポーネントへの移行です。詳細な選択肢については 緩和策 を参照してください。

説明

dash-uploader の HTTP ハンドラは、攻撃者が制御するパラメータを含む未認証の POST リクエストを受け入れます。これらのパラメータは、境界チェック、レート制限、クリーンアップ機構が一切ないまま、メモリ割り当て、ファイル操作、ディレクトリ作成に流れ込みます。同じコードパスに 4 つの独立した問題があります。

1. OOM クラッシュ (検証済み)

7.7 GB のシステムで検証済み: resumableTotalChunks=30000000 を指定した 5 つの同時 POST リクエストにより、2 秒以内に Linux の OOM killer が発動しました。カーネルログは以下を裏付けています:

root@kitploit:~
Out of memory: Killed process 24203 (python3) total-vm:8302276kB, anon-rss:7068012kB

各リクエストは range(1, resumableTotalChunks + 1) に対するリスト内包表記により約 2.9 GB を割り当てます。サーバープロセスは終了し、アプリケーションは手動での再起動まで完全に利用不能になります。

2. ファイル切り詰め (検証済み)

42 バイトのデータを含むファイルが、resumableTotalChunks=0 を指定した 1 つの POST リクエストによって 0 バイトに縮小されました。根本原因は、Python の all() が空のイテラブルに対して True を返すことであり、これによりアップロードハンドラがゼロチャンクを完了したアップロードとして扱ってしまいます。既存のファイルは os.unlink() で削除され、空のファイルに置き換えられます。

3. 放棄されたアップロードの蓄積 (検証済み)

チャンクファイルを含む 10 個の孤立した一時ディレクトリが作成され、ディスク上に無期限に残り続けました。全ソースファイルに対するコードベース全体での cleanup、ttl、expire、garbage、purge、cron、schedule、periodic の検索では、結果はゼロでした。唯一のクリーンアップ呼び出し (shutil.rmtree) は完了したアップロードでのみ実行されます。未完了のセッションからディスク領域を回収する機構はありません。

4. max_file_size バイパス (検証済み)

サーバーは、resumableTotalSize=999999999999 (約 999 GB) を主張するファイルの 5 MB チャンクを HTTP 200 で受け入れました。max_file_size パラメータは React JavaScript コンポーネントにのみ渡されます。サーバーはファイルサイズ、チャンクサイズ、Content-Length、Flask の MAX_CONTENT_LENGTH を一切チェックしません。開発者が max_file_size=10 を設定しても、サーバー側の保護はまったくありません。

脆弱なコード

root@kitploit:~
# dash_uploader/httprequesthandler.py
def _post(self):
    resumableTotalChunks = request.form.get("resumableTotalChunks", type=int)   # attacker-controlled, no bounds
    ...
    chunk_paths = [
        os.path.join(temp_dir, get_chunk_name(resumableFilename, x))
        for x in range(1, resumableTotalChunks + 1)                              # unbounded; e.g. 30M -> ~2.9 GB -> OOM
    ]
    upload_complete = all([os.path.exists(p) for p in chunk_paths])              # all([]) is True -> truncation when chunks=0
    if upload_complete:
        target_file_name = os.path.join(temp_root, resumableFilename)
        if os.path.exists(target_file_name):
            os.unlink(target_file_name)                                          # existing file deleted
        with open(target_file_name, "ab") as target_file:
            for p in chunk_paths:                                                # empty list -> empty file written
                ...

同じコードパスが、OOM (大きな resumableTotalChunks) とファイル切り詰めプリミティブ (resumableTotalChunks=0) の両方を生み出します。

攻撃ベクトル

攻撃者は /API/resumable エンドポイントに未認証の POST リクエストを送信します。

  • OOM クラッシュ: resumableTotalChunks=30000000 を指定した 5 つの同時リクエストがそれぞれ約 2.9 GB を割り当て、OOM killer を発動させます。
  • ディスク枯渇: アップロードを開始しても完了させないことで、孤立した一時ファイルが永遠に蓄積されます。
  • ファイル切り詰め: resumableTotalChunks=0 を送信します。Python の all([])=True により、サーバーは対象ファイルを空の内容で上書きしてしまいます。
  • サイズバイパス: 開発者が設定したサイズ制限はクライアント側 JavaScript でのみ強制されるため、直接の HTTP リクエストで完全にバイパスされます。

認証や特権は不要です。

影響

  • ユーザーが制御する単一の POST パラメータ (resumableTotalChunks) による無制限のメモリ割り当てがトリガーとなる、Linux OOM killer によるサーバープロセスのクラッシュ
  • クリーンアップされることのない放棄されたアップロードセッションによる永続的なディスク枯渇 (コードベースには TTL、ガベージコレクション、有効期限機構が存在しない)
  • サニタイズされていない resumableIdentifier による os.makedirs() を介した任意の深さのディレクトリ作成によるファイルシステム inode の枯渇
  • resumableTotalChunks=0 のときに Python の all() が空のイテラブルに対して True を返すことによる、ファイルの 0 バイトへの切り詰めを介したデータ破壊
  • max_file_size がクライアント側 JavaScript でのみ強制され、サーバー側ハンドラがサイズ検証を一切行わず、Flask の MAX_CONTENT_LENGTH も設定しないため、すべてのファイルサイズ制限をバイパス可能

影響を受けるコンポーネント

  • dash_uploader/httprequesthandler.py (BaseHttpRequestHandler._post メソッド)
  • dash_uploader/upload.py (Upload 関数、max_file_size パラメータ)
  • dash_uploader/configure_upload.py (MAX_CONTENT_LENGTH の欠落)

緩和策

⚠️ パッチは提供されておらず、プロジェクトはアーカイブ済みです

現在デプロイ中のユーザー向けの選択肢を、優先順位の高い順に示します:

  1. dcc.Upload への移行: Plotly Dash に同梱されている公式のアップロードコンポーネントです。チャンク数パラメータがなく、ディスク上の一時状態も持たず、Flask の MAX_CONTENT_LENGTH を尊重します。ここに挙げた 4 つの問題はいずれも該当しません。小規模から中規模のファイルに最適です。非常に大きなアップロードについては項目 2 を参照してください。
  2. 小規模な Flask アップロードハンドラを作成する: リクエストごとの明示的なサイズ強制 (MAX_CONTENT_LENGTH)、クライアントが指定するチャンク数の上限、受け付けるファイル名の許可リストを備えます。
  3. dash-uploader を使い続ける場合: Flask の MAX_CONTENT_LENGTH をアプリケーションレベルで設定し (ライブラリは設定しません)、以下のいずれかに該当する入力をアプリケーションまたはリバースプロキシ層で拒否してください:
    • resumableTotalChunks <= 0
    • resumableTotalChunks が妥当な上限 (例: 10,000) を超えている
    • resumableTotalSize が開発者が設定した max_file_size を超えている
  4. レート制限を追加する: リバースプロキシまたは WAF 層でアップロードエンドポイントにレート制限を追加し、同時リクエストによる OOM ベクトルを緩和します。
  5. 孤立した一時ディレクトリを定期的にクリーンアップする: ライブラリには内部クリーンアップがないため、外部の cron ジョブで定期的にクリーンアップします。

開示のタイムライン

パッケージ情報

  • PyPI での月間ダウンロード数は約 28,000 (2026-05-07 までの 30 日間で 27,756。リポジトリのアーカイブ後も安定した日次ボリュームを維持)。出典: pypistats.org。
  • 最新の公開バージョン: 0.6.1 (安定版ライン)。プレリリースは 0.7.0a2 まで。
  • 必須依存関係: dash。任意依存関係: pyyaml。ライセンス: MIT。
  • 依存パッケージ 11 個、依存リポジトリ 6 個。
  • GitHub スター 153 個。
  • リポジトリは 2025-07-19 にアーカイブ済み (Issue #153)。
  • 過去の CVE はなし (2026-03-19 に NVD、GitHub Advisory Database、Snyk、OSV で確認済み)。

参照

  • https://www.cve.org/CVERecord?id=CVE-2026-38361
  • https://nvd.nist.gov/vuln/detail/CVE-2026-38361
  • https://github.com/fohrloop/dash-uploader
  • https://github.com/fohrloop/dash-uploader/blob/stable/dash_uploader/httprequesthandler.py
  • https://github.com/fohrloop/dash-uploader/issues/153
  • https://pypi.org/project/dash-uploader/
  • https://pypistats.org/packages/dash-uploader
  • https://libraries.io/pypi/dash-uploader
  • https://pepy.tech/project/dash-uploader
  • https://cwe.mitre.org/data/definitions/400.html
  • https://cwe.mitre.org/data/definitions/670.html
  • https://docs.python.org/3/library/functions.html#all

発見者

Muhammad Fitri Bin Mohd Sultan

ツールをダウンロード
CVE IDCVE-2026-38361 (NVD)
脆弱性リソース消費の制御不能 (CWE-400)、常に誤った制御フロー実装 (CWE-670)
CVSS 3.17.5 / 高 (AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H)
製品dash-uploader
影響を受けるバージョン0.1.0 から 0.7.0a2 まで (全 18 リリース)
修正バージョンなし (プロジェクトは 2025-07-19 にアーカイブ済み)
攻撃ベクトルリモート、未認証
発見者Muhammad Fitri Bin Mohd Sultan
割り当て元MITRE、2026-05-07
関連CVE-2026-38360 (同一ライブラリのパストラバーサル)
日付イベント
2026-03-19本番環境へのデプロイに対するセキュリティ調査中に脆弱性を発見。
2026-03-22CVE リクエストを MITRE に提出。
2026-05-07MITRE により CVE-2026-38361 が割り当てられる。
2026-05-07公開アドバイザリを公開。
2026-05-09CVE レコードが MITRE CVE データベース と NVD に公開。