
Stirling-PDF v3.2.0 - 重大 - リモート - H2 RUNSCRIPT の残存 - CREATE OR REPLACE ALIAS import-database
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · stirling-h2-import-leftover
Stirling-PDF 3.2.0 - Stirling Tools
分類: GHSA-mrr8 の H2 RUNSCRIPT 残存問題。到達範囲: リモート ROLE_ADMIN。
POST /api/v1/database/import-database は @PreAuthorize("hasRole('ADMIN')") である。validateSqlContent は CREATE ALIAS を阻止するはずである。拒否リストは CREATE\s+(FORCE\s+)?ALIAS である。H2 の parseCreate は ALIAS の前に OR REPLACE を許可するため、CREATE OR REPLACE ALIAS … FOR "java.lang.…" は許可リスト \bCREATE\b に一致し、拒否リストをすり抜ける。バリデータはコピーをサニタイズする。verifyBackup と本番の RUNSCRIPT FROM ? は元のファイルを対象とする。
GHSA-mrr8-934j-4g8m / CVE-2026-85714 は元の FILE_READ / CREATE ALIAS / CSVWRITE 文字列を塞いだ。この残存問題は、同じバリデータにおける OR REPLACE の抜け穴である。
ROLE_ADMIN によるインポートは、拒否リストが阻止するはずの Java エイリアスを作成する。その後のバックアップダウンロードには攻撃者の SQL が含まれる。 元のアドバイザリにあるホストの FILE_READ / FileUtils RCE は推測であり、このパックではラボで実証されていない。
| ID | CVE 未割当 |
| CWE | CWE-94 / CWE-184 |
| CVSS | 9.1 CVSS:3.1/AV:N/AC:L/PR:H/UI:N/S:C/C:H/I:H/A:H |
| 製品 | Stirling-PDF |
| 影響を受けるバージョン | v3.2.0 (a7e593728dd9aa81e75318a949789d3c2e9ee754)、イメージ stirlingtools/stirling-pdf:3.2.0-fat |
| 認証 | ROLE_ADMIN、デフォルトの組み込み H2。初回管理者のデフォルトは変更するまで admin / stirling |
| ライセンス | GNU Affero GPL v3.0 |
| ラボ | 127.0.0.1:18152 のみ |
Stirling-PDF v3.2.0 残存問題シリーズの残存問題。関連項目: stirling-storage-folder-idor(processing-folder が示唆するストレージルート)。本パックは H2 インポートの残存問題である。
デフォルトの組み込み H2 を使用する login-on の proprietary/fat における ROLE_ADMIN。initialLogin が空の場合、初回管理者のデフォルトは admin / stirling である。未認証である必要はない。Lite イメージおよび PostgreSQL データソースにはこのコントローラは含まれない。
権限表(網羅的)。Signal-Server Dropwizard admin と同じ基準: メソッド + パス、その呼び出しが付与するもの、偵察 vs 完全性 vs 可用性、ラボ実証済み vs 推測、閉じたままの隣接する攻撃面。
| 軸 | メソッド + パス | 付与 | 来歴 |
|---|---|---|---|
| 整合性 | ROLE_ADMIN POST /api/v1/database/import-database に CREATE OR REPLACE ALIAS lab_nano FOR "java.lang.System.nanoTime" と INSERT INTO lab_w VALUES('STIRLING-H2-IMPORT-WITNESS') を付加 | 200 importIntoDatabaseSuccessed。Java エイリアスが作成された。攻撃者の SQL が RUNSCRIPT 配下でコミットされた | ラボ実証済み |
| 偵察 | ROLE_ADMIN GET /api/v1/database/createDatabaseBackup の後 GET /api/v1/database/download/backup_202610172328.sql | 50432 バイトのバックアップに STIRLING-H2-IMPORT-WITNESS が含まれる | ラボ実証済み |
| 偵察 / ホストファイル | 同じインポートで FILE_READ('/etc/os-release') を EXECUTE IMMEDIATE 内にラップ | 500 Backup verification failed。ホストのバイト列はバックアップに含まれない | ラボでの追加 FAIL |
| 整合性 / RCE | エイリアス org.h2.store.fs.FileUtils と Python ユーザーサイトの .pth の CSVWRITE、その後 office 変換 | サービスアカウントとしてのコマンド実行 | GHSA-mrr8 からの推測。ここではラボ検証していない |
| 可用性 | 主張なし | インポートがアプリケーションのテーブルを置き換え得る | 推測。ラボのオラクルではない |
このピンではクローズのまま
| 軸 | メソッド + パス | クローズである理由 |
|---|---|---|
| 整合性 | 未認証 POST /api/v1/database/import-database | 401 Authentication required。HTTP が permitAll でもメソッドセキュリティ ADMIN は有効なまま |
| 整合性 | ROLE_ADMIN による素の CREATE ALIAS のインポート | 500 SQL script contains disallowed operations and was rejected |
| 整合性 | lite / DISABLE_ADDITIONAL_FEATURES イメージ | DatabaseController が存在しない |
| 整合性 | カスタム PostgreSQL データソース | @Conditional(H2SQLCondition.class) |
リバースシェルを主張するものではなく、ホストの FILE_READ をラボ実証済みとして主張するものでもない。残っているのは、CREATE OR REPLACE ALIAS … FOR "java.lang.…" を RUNSCRIPT 経由で通してしまうデナイリストの見落としである。
v3.2.0 には依然として GHSA-mrr8 のバリデータが同梱されている。私はそのタグに留まり DENIED_PATTERNS を読んだ。エイリアス行は CREATE\s+(FORCE\s+)?ALIAS である。H2 のパーサーは CREATE OR REPLACE ALIAS を受け付ける。テストは明白な CREATE ALIAS / FILE_READ( 文字列をカバーしている。しかし OR REPLACE はカバーしていない。
ラボではデフォルト管理者としてログインし、change-password-on-login を完了させ、拒否される CREATE ALIAS をインポートし(500)、次に CREATE OR REPLACE ALIAS と INSERT の証人をインポートする(200)。バックアップのダウンロードにその証人が含まれる。
誤った道筋:未認証インポートをスコープ内とみなす(401)、EXECUTE IMMEDIATE + FILE_READ を残存箇所とみなす(verifyBackup 500)、元の難読化されていない CREATE ALIAS が依然として有効とみなす(拒否される)。
python3 stirling-h2-import-leftover-Abraxas-Labs.py
または
cd lab
./run.sh
対象は http://127.0.0.1:18152 のみ。イメージは stirlingtools/stirling-pdf:3.2.0-fat。Docker が必要。ログイン有効。ランチャーは lab/ に chdir して run.sh を exec する。
IOC unauth-import http=401
IOC negative-import http=500 ... disallowed operations ...
IOC leftover-import bypass=create-or-replace-alias http=200 ... importIntoDatabaseSuccessed
IOC download file=backup_202610172328.sql http=200 bytes=50432 witness=1
SUCCESS stirling-h2-import-leftover negative-denied=yes bypass=create-or-replace-alias backup-has-witness=yes file=backup_202610172328.sql unauth-import=401 STIRLING-H2-IMPORT-WITNESS
OR REPLACE が CREATE と ALIAS の間に置けないように、拒否リストを拡張します。RUNSCRIPT が実行するのと同じバイト列に対して validateSqlContent を実行します。内側の SQL もスキャンされない限り、EXECUTE IMMEDIATE を拒否します。
Pattern.compile("(?i)\\bCREATE\\s+(OR\\s+REPLACE\\s+)?(FORCE\\s+)?ALIAS\\b")
パッチ適用済みビルドに対してループバッククライアントを再実行してください。残存インポートは、素の CREATE ALIAS がすでにそうであるように 400/500 を返す必要があります。
それまでは、「CREATE ALIAS を禁止した」を「H2 Java エイリアスを禁止した」と扱わないでください。
a7e593728dd9aa81e75318a949789d3c2e9ee754)ベンダーへの報告窓口: GitHub Security Advisory タブまたは [email protected]。Stirling-Tools/Stirling-PDF に公開 issue は作成しません。
Abraxas Labs https://abraxaslabs.tech https://github.com/abraxas [email protected]