
Stirling-PDF v3.2.0 - 高 - リモート - IDOR - processing-folder ストレージルートがピアPDFを一覧表示および上書き
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · stirling-storage-folder-idor
Stirling-PDF 3.2.0 - Stirling Tools
クラス: IDOR。到達範囲: リモート ROLE_USER。
POST /api/v1/processing-folders には、ログイン済みユーザー以外の @PreAuthorize がありません。FolderAccessGuard は、policies.allowedFolderRoots が空であっても、ローカルストレージ全体の basePath (./storage) を暗黙的に許可します。LocalStorageProvider は {ownerId}/{uuid}_{filename} を書き込みます。ROLE_USER は directory: "storage/<victimUserId>" を設定し、その所有者の PDF を一覧表示し、replace=true でその場で一括処理できます。
直接の /api/v1/storage/files/{id} はパッチ済みです (findByIdAndOwner)。被害者のファイルをピアとして取得するラボ GET は 403 です。残存するのは、ストレージ CRUD API ではなく、processing-folder の暗黙のルートです。
ROLE_USER が別ユーザーの保存済み PDF 名を一覧表示し、それらの BLOB を上書きします。被害者のダウンロードは改ざんされたファイルを返します。
| ID | CVE 未割当 |
| CWE | CWE-639 / CWE-73 |
| CVSS | 7.1 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:H/A:N |
| 製品 | Stirling-PDF |
| 影響範囲 | v3.2.0 (a7e593728dd9aa81e75318a949789d3c2e9ee754)、イメージ stirlingtools/stirling-pdf:3.2.0-fat、login-on、storage.enabled=true |
| 認証 | デフォルトチームの ROLE_USER |
| ライセンス | GNU Affero GPL v3.0 |
| ラボ | 127.0.0.1:18154 のみ |
Stirling-PDF v3.2.0 leftovers シリーズの残存項目です。関連項目: stirling-h2-import-leftover (H2 CREATE OR REPLACE ALIAS)。本パックはストレージ IDOR です。
login-on の proprietary/fat でローカルストレージが有効な (テンプレートのデフォルト) 環境にログインした任意の人間 ROLE_USER。公式 compose は login-off かつ DISABLE_ADDITIONAL_FEATURES=true です。そのデプロイでは /api/v1/storage が 403 となり、このコントローラーは含まれません。HIT デプロイはテンプレートの login-on かつ fat です。
権限表 (網羅的)。基準は Signal-Server Dropwizard admin と同じです。
| 軸 | メソッド + パス | 付与されるもの | 根拠 |
|---|---|---|---|
| 偵察 | ROLE_USER GET /api/v1/user/users | admin、ピア、および STIRLING-PDF-BACKEND-API-USER の数値 userId | ラボ実証済み |
| 偵察 | POST /api/v1/processing-folders {directory:"storage/1"} の後 GET /api/v1/processing-folders/{id}/files | admin の保存済み PDF (5341de35-8729-49cf-92d0-c8284e05bfc5_victim-lab.pdf) の名前、サイズ、mtime | ラボ実証済み |
| 完全性 | POST /api/v1/processing-folders/{id}/sweep を /api/v1/security/add-watermark と共に実行し、その後被害者の Range GET /api/v1/storage/files/1/download | その場での書き換え。被害者の 206 / 3450 バイトに STIRLING-STORAGE-FOLDER-IDOR-WITNESS が含まれる | ラボ実証済み (replace=true) |
| 機密性 | 同じ sweep に加え、攻撃者が読み取れるチームの outputId / アウトバウンドステップ | 被害者 PDF バイト列のコピー | 推測。一覧表示/上書きには不要 |
このピンではクローズされたまま
| 軸 | 手法 + パス | クローズされている理由 |
|---|---|---|
| 偵察 | 非共有ファイルの GET /api/v1/storage/files/{id} | 403 Access denied。ファイルID 1 でラボ実証済み |
| 偵察 | 未認証の /api/v1/storage/** | ログイン無効時に 403(ensureStorageEnabled) |
| 整合性 | 所有者をまたぐフォルダUUIDのCRUD | findByIdAndOwner |
| 整合性 | LocalStorageProvider の .. / 絶対キー | 正規化後の Path.startsWith(basePath) |
| 整合性 | ultra-lite イメージ | 独自の処理フォルダコントローラが存在しない |
GET /api/v1/user/users が STIRLING-PDF-BACKEND-API-USER を列挙するのは追加のIOCである。私はこれを独立した残留物としては報告していない。範囲指定なしの被害者ダウンロードは、上書き後に500を返す。FileStorageController が依然として元のDBの sizeBytes を通知しているためである。Rangeは機能する。透かしテキストはFlateDecode内のIdentity-Hであり、オラクルはストリームをinflateする。
3.x ではローカルストレージと処理フォルダが追加された。ストレージのCRUDは所有者スコープである。FolderAccessGuard.serverStorageRoots はツリー全体に対して Path.of(basePath) を返し、basePath/{currentUserId} ではない。storage/<victimId> はその暗黙のルートに対して startsWith となる。
ラボでは peeruser を ROLE_USER として作成し、管理者として被害者のPDFをアップロードし、直接ストレージGETが403となることを実証し、処理フォルダを storage/1 に向け、UUID接頭辞付きの名前を列挙し、透かしをスイープし、その後被害者としてRangeダウンロードを行う。
誤った道筋:直接ストレージIDORが依然として未解決であるとみなすこと(403);ログイン無効の公式composeをHITデプロイとみなすこと(ストレージ403、コントローラ不在);outputId なしで攻撃者が読み取り可能なバイトコピーを主張すること。
python3 stirling-storage-folder-idor-Abraxas-Labs.py
または
cd lab
./run.sh
対象は http://127.0.0.1:18154 のみです。イメージは stirlingtools/stirling-pdf:3.2.0-fat です。Docker が必要です。ログイン有効です。ランチャーは lab/ に chdir して run.sh を exec します。
IOC direct-storage-get http=403
IOC processing-folders-save directory=storage/1 http=202
IOC listed-peer ... victim-lab.pdf
IOC victim-download attempt=1 http=206 bytes=3450 witness=1
SUCCESS stirling-storage-folder-idor direct-storage-403=yes listed-peer-pdf=yes download-has-witness=yes STIRLING-STORAGE-FOLDER-IDOR-WITNESS
マルチユーザーサーバー上のディスク directory について、暗黙のストレージルートを basePath/{currentUserId} にスコープしてください。findByIdAndOwner が他者のファイル ID を拒否するのと同様に、storage/<otherId> を拒否してください。インプレース書き換え後に、公開される sizeBytes を再計算してください。
パッチ適用済みビルドに対して ループバッククライアント を再実行してください: peeruser としての directory=storage/1 は 403 になる必要があり、listed-peer は空のままである必要があります。
それまでは、「/api/v1/storage/files/{id} にパッチを当てた」を「./storage 配下のディスクパスを受け取るすべての API をスコープした」と扱わないでください。
a7e593728dd9aa81e75318a949789d3c2e9ee754)ベンダーへの報告: GitHub Security Advisory タブまたは [email protected]。Stirling-Tools/Stirling-PDF に公開 issue は作成していません。
Abraxas Labs https://abraxaslabs.tech https://github.com/abraxas [email protected]