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

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

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

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

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
CVE-2026-34213 — 低権限のDocmostユーザーが、被害者のattachmentIdを汎用アップロードエンドポイントに指定し、同じワークスペース内の別のページに保存された添付ファイルを上書きする可能性があります。 | Kitploit
ツール/GitHubGitHub/0xmrma/cve-2026-34213
脆弱性分析ウェブアプリケーション悪用ペネトレーションテスト論文と研究学習と教育
GitHub0xmrma/cve-2026-34213

CVE-2026-34213

低権限のDocmostユーザーが、被害者のattachmentIdを汎用アップロードエンドポイントに指定し、同じワークスペース内の別のページに保存された添付ファイルを上書きする可能性があります。

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

人気

すべて見る →

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

すべてのツールを探索

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

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

CVE-2026-34213

低権限のDocmostユーザーが、攻撃対象のattachmentIdを汎用アップロードエンドポイントに送り、同じワークスペース内の別ページの保存済み添付ファイルを上書きできる可能性があります。

イントロ

私は、オープンソースのコラボレーションドキュメントプラットフォーム Docmost において、高重要度の認可の欠陥を特定し、責任を持って開示し、再現しました。

Docmostの公式サイトは、これをエンタープライズ対応のオンプレミスWikiとして紹介しており、300万以上のダウンロードがあり、ビリニュス市、Bechtle、オーストラリア政府、赤十字、ETS Quebecなどの組織のチームから信頼されていると述べています。

このバグは、Docmostが図の保存/更新フローでも使用する汎用ファイルアップロードパスに存在していました。

私はそのコードを非常に具体的な質問を念頭に置いてレビューしていました。

アップロードエンドポイントがあるページの編集アクセスを証明した場合、上書き対象が別のユーザー制御の添付ファイルIDで選択された場合はどうなるのか?

このケースでは、その質問が直接、実際のオブジェクトバインディングの失敗につながりました。

Docmostは、呼び出し元が次のものを送信することを許可していました。

  • 編集が許可されているページのpageId、および
  • 同じワークスペース内の別のページに属するattachmentId

サーバーは上書きの整合性チェックを実行しましたが、ガードは間違ったブール論理を使用していました。

つまり、リクエストは認可を通過し、それでも被害者の添付ファイルを上書きできたということです。

この問題は CVE-2026-34213 になりました。

Docmost: docmost/docmost
アドバイザリ: GHSA-89fp-2hch-j9gp
CVE: CVE-2026-34213
パッチ適用バージョン: v0.71.0

---
photo0

攻撃チェーン

攻撃者制御のpageId(編集アクセスあり) -> 攻撃者制御の被害者attachmentId -> 欠陥のある上書きガードがクロスページ上書きを有効として扱う -> 被害者attachmentIdからストレージパスが再構築される -> 攻撃者のバイトが被害者ファイルを置き換える -> 被害者ページは変更された添付ファイルを引き続き提供する


Docmostのこの部分の機能

Docmostは、アップロードされたページ添付ファイルをデータベースレコードとストレージ内のバックアップファイルとして保存します。

通常のアップロードでは、サーバーは新しい添付ファイルIDを作成し、新しいファイルを書き込みます。

ただし、図の保存/更新フローでは、クライアントは既存のattachmentIdを意図的に再利用して、毎回新しい添付ファイルレコードを生成するのではなく、同じ図ファイルをその場で更新できるようにします。

その動作自体は正当です。

問題は、それが高リスクのパスを生み出すことです。

  • 1つの入力が認可されるページを識別する
  • 別の入力が上書きされる添付ファイルを識別する

エンドポイントがこれら2つの責任を混在させるときはいつでも、実装はそれらを正確にバインドする必要があります。

Docmostはそうしませんでした。


この表面が調査に値する理由

作成/更新の混在エンドポイントは、認可バグが発生しやすい場所です。

その理由は単純です。

  • 作成フローは通常、コンテナオブジェクトに対して認可される
  • 更新フローは通常、既存のレコードに対して認可される
  • 1つのエンドポイントが両方を実行しようとする場合、最初に間違ったものを検証し、2番目の識別子を「単なるメタデータ」として扱うのは簡単です

まさにそれがここでのパターンです。

POST /api/files/upload は、呼び出し元がpageIdで指定されたページを編集できることを検証しました。

しかし、attachmentIdも提供された場合、サーバーは上書きパスに切り替わり、既存の添付ファイルレコードを別途選択しました。

これにより、重要なセキュリティ上の疑問が生じました。

上書きパスは、選択された添付ファイルが実際に認可されたページに属することを証明するか?

脆弱なバージョンでの答えは「いいえ」でした。


根本原因

根本原因は、ユーザー制御のキーによる認可バイパスと、上書きガードのブール論理バグの組み合わせでした。

脆弱なフローは次のようになりました。

  1. AttachmentController.uploadFile() はマルチパートフォームデータからpageIdを読み取りました。
  2. そのページをロードし、validateCanEdit(page, user) を呼び出しました。
  3. 同じリクエストからオプションのattachmentIdを別途受け入れました。
  4. AttachmentService.uploadFile() は、攻撃者によって提供されたIDで既存の添付ファイルをロードしました。
  5. 上書きガードは、既存の添付ファイルが認可されたページと一致することを確認しようとしました。
  6. ガードは、不一致を拒否する代わりに&&を使用しました。

脆弱なガードは次のとおりです。

root@kitploit:~
if (
  existingAttachment.pageId !== pageId &&
  existingAttachment.fileExt !== preparedFile.fileExtension &&
  existingAttachment.workspaceId !== workspaceId
) {
  throw new BadRequestException("File attachment does not match");
}

その条件は、次の場合にのみリクエストを拒否しました。

  • ページIDが不一致、かつ
  • ファイル拡張子が不一致、かつ
  • ワークスペースIDが不一致

すべて同時に。

それは、上書きガードがすべきことの逆です。

実際の攻撃ケースでは、攻撃者は意図的に同じワークスペース内に留まりました。

つまり:

  • existingAttachment.workspaceId !== workspaceId は false でした

そのオペランドがfalseになると、添付ファイルが別のページに属していても、&&条件全体がfalseと評価されました。

そのため、サーバーはクロスページ上書きを有効として扱いました。

それがバグの前半です。

後半は、影響を現実のものにした部分です。

チェックの後、サービスは攻撃者提供のattachmentIdとファイル名を使用して宛先ストレージパスを再構築しました。

root@kitploit:~
const filePath =
  `${getAttachmentFolderPath(AttachmentType.File, workspaceId)}/` +
  `${attachmentId}/${preparedFile.fileName}`;

その後、更新パスでは、DocmostはfileSizeやupdatedAtなどの可変メタデータのみを更新しました。

所有権を攻撃者ページに再バインドすることはしませんでした。

そのため、被害者ページは同じ添付ファイルレコードと添付ファイルIDを指し続けました。 変更されたのは、基になるファイルのバイトだけでした。

だからこそ、これは無害な不一致ではありませんでした。

これは、永続的な不正な上書きプリミティブでした。


これが単なる論理ミスではなくセキュリティ問題である理由

これは表面的なバグでも、ファイル名の衝突問題でもありませんでした。

攻撃者はレースを必要としませんでした。 攻撃者はランダムなパスを推測する必要もありませんでした。 攻撃者は被害者ページへの書き込みアクセスを必要としませんでした。

必要なのは次のものだけでした。

  • 被害者の添付ファイル参照を学習するための読み取りアクセス、および
  • 同じワークスペース内の他のページへの書き込みアクセス

そこから、攻撃者は別のページの添付ファイルの保存済みファイルバイトを置き換えることができ、被害者ページは何も変わっていないかのようにその添付ファイルを参照して提供し続けました。

これは直接的な整合性の失敗です。

現実的には、攻撃者は次のことが可能でした。

  • 図を改ざんする
  • 添付ファイルを誤解を招くコンテンツに置き換える
  • 参照されるファイルを破損する
  • 添付ファイルがまだ被害者ページに属しているように見えるため、混乱を招く監査証跡を作成する

重要な点はこれです。

サーバーは、攻撃者が選択した上書きターゲットを受け入れ、実際に編集権限がチェックされたページにそれをバインドしませんでした。

これはアクセス制御の失敗であり、単なる悪いブール演習ではありません。


悪用が現実的であった理由

エクスプロイトは、特に図の添付ファイルに対して現実的でした。

Docmostのクライアントは、図の保存のために意図的にattachmentIdを再利用し、決定論的なファイル名を使用します。

  • diagram.excalidraw.svg
  • diagram.drawio.svg

これは重要です。なぜなら、攻撃者の要件を引き下げるからです。

一般的な添付ファイルの場合、攻撃者は両方を必要とします。

  • 被害者の添付ファイルID
  • 被害者のファイル名

図の場合、ファイル名はすでに予測可能です。

そのため、攻撃者が被害者ページのコンテンツを読むことができれば、不足している唯一のピースを回復できることがよくあります。

  • 被害者のattachmentId

私の検証セットアップでは、まさにそのパスを使用しました。

  • 攻撃者は被害者スペースに対して読み取りアクセスのみを持っていた
  • 攻撃者は攻撃者制御の別のスペースに対して書き込みアクセスを持っていた
  • 両方のスペースは同じワークスペースに属していた

それで十分でした。

エクスプロイトは、欠陥のあるワークスペースチェックを満たしながら、同じワークスペース内のページ境界とスペース境界を越えました。


概念実証

私は**Docmost v0.70.3**に対して、docmost/docmost:0.70.3、Postgres、Redisから構築した使い捨てラボを使用して、問題をライブで検証しました。

PoCフローは次のとおりです。

  1. オーナーアカウントを作成します。
  2. 同じワークスペース内に被害者スペースと攻撃者制御のスペースを作成します。
  3. 2番目のユーザーを攻撃者として招待します。
  4. 攻撃者に次の権限を付与します。
    • 被害者スペースへの読み取りアクセス
    • 攻撃者制御のスペースへの書き込みアクセス
  5. 被害者スペースで、被害者ページに図の添付ファイルをアップロードします。
  6. 攻撃者として、被害者ページ情報を取得し、被害者のattachmentIdをメモします。
  7. 次のものを使用してPOST /api/files/uploadを送信します。
    • pageId = 攻撃者ページID
    • attachmentId = 被害者添付ファイルID
    • file = 被害者ファイル名を使用した攻撃者制御の置換ファイル
  8. 上書きの前後で被害者の添付ファイルをダウンロードし、ハッシュを比較します。

最小限のリクエスト形状は次のとおりです。

root@kitploit:~
POST /api/files/upload
Content-Type: multipart/form-data

pageId=<attackerPageId>
attachmentId=<victimAttachmentId>
[email protected];filename=diagram.excalidraw.svg

観察されたライブの結果は次のとおりです。

  • 攻撃者によって学習された被害者添付ファイルID: 019d18ae-b176-751c-8525-b5f3cede131d
  • 上書きリクエストに使用された攻撃者ページID: 019d18ae-b15b-70e9-ac67-64948e87cc5e
  • 被害者オーナーページIDはそのまま: 019d18ae-b12f-75ec-8c1c-5aff3ba6be9c
  • 上書きリクエストに対するサーバー応答: 200 OK
  • 上書き前の被害者ファイルSHA-256:
root@kitploit:~
686a0a0ede90ece1cbb975bb29304a6c3a90373a9c3ab2496345cf7ca59cc8fa
  • 上書き後の被害者ファイルSHA-256:
root@kitploit:~
e0168298846cdaf75c4d880f4b721d7c0ef0ef310f75617bf2b833af34cdbeba
  • 攻撃者ペイロードSHA-256:
root@kitploit:~
e0168298846cdaf75c4d880f4b721d7c0ef0ef310f75617bf2b833af34cdbeba
  • マウントされたストレージは、被害者パスに次のものが含まれていることを確認しました。
root@kitploit:~
Attacker replacement from another page

これは、完全なエンドツーエンドの上書き証明であり、単なる理論的なソースレビューではありません。


PoCがこの方法で選ばれた理由

トリアージ中に、私は2つのスタイルの証明を使用しました。

  • 脆弱な上書きロジックをミラーリングした狭いスタンドアロンハーネス、および
  • 使い捨てのDocmostインスタンスに対する完全なライブHTTPエクスプロイト

スタンドアロンハーネスは、ブール論理の失敗を分離するのに役立ちました。

ライブHTTP PoCは、完全なセキュリティストーリーを証明したため、より強力な成果物でした。

  • ページ認可は攻撃者ページで成功した
  • 被害者のattachmentIdが受け入れられた
  • 上書きリクエストは成功を返した
  • 被害者ページは論理的な所有者のままであった
  • ディスク上の保存されたバイトは攻撃者制御のコンテンツに変更された

この区別は、アクセス制御バグでは重要です。

「条件が間違っている」だけでは十分ではありません。

「条件が間違っており、アプリケーションをエンドツーエンドで永続的な不正な上書きに駆動できる」というのが完全なケースです。


修正分析

修正は**v0.71.0**で出荷され、上書きガードを&&から||に変更しました。

root@kitploit:~
if (
  existingAttachment.pageId !== pageId ||
  existingAttachment.fileExt !== preparedFile.fileExtension ||
  existingAttachment.workspaceId !== workspaceId
) {
  throw new BadRequestException("File attachment does not match");
}

そのパッチは最小限で、直接的で、報告されたバグに対して正しいです。

正しいルールを復元します。

上書きは、既存の添付ファイルが認可されたページ/ワークスペース/タイプの前提と完全に一致する場合にのみ許可されます。

ガードが不一致を拒否するようになったため、次のことが行われます。

  • クロスページの上書きは失敗する
  • クロスワークスペースの上書きは失敗する
  • タイプ/拡張子の不一致は失敗する

これは正しい種類の修正でした。

  • 再設計なし
  • 曖昧な互換性ロジックなし
  • 「ベストエフォート」リカバリの試みなし

認可されたページと上書きターゲットの間の厳密なバインディングだけです。

それでも、ここにはより広範なエンジニアリングの教訓があります。

インプレース更新フローも提供する汎用アップロードエンドポイントは、高リスクのAPIサーフェスとして扱う必要があります。

当面のバグが修正されたとしても、より強力な長期的な設計は次のとおりです。

  • 図の保存フロー専用の更新エンドポイント
  • ファイル名と添付ファイルIDの両方に対する不変のバインディングチェック
  • クロスページ上書き試行を明示的にモデル化する回帰テストカバレッジ

しかし、脆弱性自体については、公開されたパッチがコアの問題をきれいに閉じました。


重要となる回帰テストケース

プロジェクトが修正の周りに独自のプライベートテストを追加したかどうかに関係なく、長期的なカバレッジのために重要なケースは次のとおりです。

  • 同じページIDと同じ添付ファイルIDでの上書きは成功する必要がある
  • 異なるページIDと同じワークスペースでの上書きは失敗する必要がある
  • 異なるワークスペースでの上書きは失敗する必要がある
  • 一致しないファイル拡張子での上書きは失敗する必要がある
  • 既知の図ファイル名だが外部の添付ファイルIDを使用した上書きは失敗する必要がある
  • 上書きは、攻撃者制御のバイトが書き込まれた後、静かに被害者の所有権を保持してはならない

これらのテストのポイントは、単なる正確性ではありません。

それは、将来の「便利な」アップロードリファクタリングが同じクラスのバグを再び開かないように、認可バインディングをロックダウンすることです。


深刻度と分類

公開されたアドバイザリは、この問題を次のように分類しました。

  • CWE-639: ユーザー制御のキーによる認可バイパス
  • CVSS v3.1:
root@kitploit:~
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:H/A:L

これは7.1 / Highになり、正しい結論です。

ここで重要なメトリックはIntegrityです。

これは低グレードのメタデータバグではありませんでした。 攻撃者は、別のページの添付ファイルパスに書き込まれる置換バイトを完全に制御し、被害者ページはその後も変更されたオブジェクトを提供し続けました。

それはまさに、Integrity Highに値する、保存されたクロスレコード改ざんの種類です。

AvailabilityがLowのままであることも理にかなっています。図や添付ドキュメントを破損すると、被害者のコンテンツが使用できなくなる可能性がありますが、主な影響は完全なサービス中断ではなく、依然として不正な変更です。


開示

私はGitHub Security Advisoriesを通じて、以下の内容で問題を非公開で報告しました。

  • 根本原因分析
  • ライブHTTP PoC
  • リクエスト/レスポンスの証拠
  • 前後のファイルハッシュ
  • 固定された使い捨てラボのセットアップ

問題はメンテナーに受け入れられ、CVE-2026-34213が割り当てられ、2026年4月14日に公開されました。

公開アドバイザリには次のように記載されています。

  • 影響を受けるバージョン: >= v0.3.0
  • パッチ適用バージョン: v0.71.0

この履歴は、私のローカルソースレビューとも一致しました。 脆弱な上書きロジックは、脆弱な行でチェックした最初のタグ付けリリースに存在していました。


このバグが実際に教えること

ここでの興味深い教訓は、単に「&&の代わりに||を使用する」ではありません。

それは症状です。

より深い教訓は次のとおりです。

1つのユーザー制御フィールドが認可を証明し、別のユーザー制御フィールドが更新されるオブジェクトを選択する場合、これら2つのフィールドは明示的かつ正確にバインドされなければなりません。

このルールはどこにでも現れます。

  • ドキュメントの添付ファイル
  • プロフィールメディア
  • クラウドオブジェクト参照
  • 課題/コメントの編集
  • バックグラウンドジョブの再処理

システムが次のように言う瞬間、

  • 「ページXを編集してもよい」
  • 「更新する既存のレコードを教えてください」

それは、正確な一致不変条件で強制されなければならないセキュリティ境界を作成しました。

それよりも緩いものは、遅かれ早かれユーザー制御キーのバグになります。

この問題は、過小評価されがちな2番目のポイントも強化します。

ガードコードの小さなブールミスは、ファーストクラスのセキュリティ結果をもたらす可能性があります。

一目で「妥当に見える」3句条件は、上書きパスの保護モデルを逆転させるのに十分でした。

そのため、これらのサーフェスは、カジュアルな信頼ではなく、意図的なレビューに値します。


キーポイント

  • Docmostは、新しいアップロードとインプレース添付ファイル更新の両方に1つのエンドポイントを使用していました。
  • 認可は呼び出し元が提供したpageIdに対してチェックされましたが、上書きターゲットの選択には別の呼び出し元が提供したattachmentIdが使用されました。
  • 上書きガードは、すべての不一致条件が同時に真の場合にのみ拒否しました。
  • 同じワークスペースの攻撃ケースでは、そのチェックはオープンに失敗しました。
  • サービスは被害者の添付ファイルIDからストレージパスを再構築し、攻撃者制御のバイトをそれに書き込みました。
  • 添付ファイルレコードは、上書き後も被害者ページにバインドされたままになりました。
  • 決定論的な図ファイル名により、悪用が特に現実的になりました。
  • v0.71.0の修正は、ガードを正しく変更して、不一致を拒否するようにしました。

最後に

この脆弱性は、エキゾチックなストレージ動作に関するものではありませんでした。

それは、更新パスが攻撃者が選択したオブジェクト識別子を信頼しすぎたことに関するものでした。

Docmostはあるページの編集アクセスを証明し、別のページから既存の添付ファイルIDを受け入れ、欠陥のある上書きチェックによってその不一致を成功したクロスページファイルの置き換えに変えさせました。

だからこそ、それはCVE-2026-34213になりました。

v0.71.0のパッチは当面の問題をきれいに修正しましたが、より広範な教訓は依然として価値があります。

認可とオブジェクトの選択が別々のユーザー制御フィールドに分割されている場合、正確なバインディングがセキュリティプロパティです。

ツールをダウンロード