
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
Класс: остаточная уязвимость H2 RUNSCRIPT из GHSA-mrr8. Достижимость: удалённо, ROLE_ADMIN.
POST /api/v1/database/import-database защищён @PreAuthorize("hasRole('ADMIN')"). validateSqlContent должен блокировать CREATE ALIAS. Чёрный список — CREATE\s+(FORCE\s+)?ALIAS. H2 parseCreate допускает OR REPLACE перед ALIAS, поэтому CREATE OR REPLACE ALIAS … FOR "java.lang.…" соответствует белому списку \bCREATE\b и не попадает под чёрный список. Валидатор очищает копию. verifyBackup и production RUNSCRIPT FROM ? обрабатывают исходный файл.
GHSA-mrr8-934j-4g8m / CVE-2026-85714 закрыли исходные строки FILE_READ / CREATE ALIAS / CSVWRITE. Эта остаточная уязвимость — пробел OR REPLACE в том же валидаторе.
Импорт с ROLE_ADMIN создаёт Java-алиас, который должен блокировать чёрный список. Последующая выгрузка резервной копии содержит SQL атакующего. RCE через FILE_READ / FileUtils на хосте из исходного advisory выведен логически, но не подтверждён в лаборатории в этом пакете.
| 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 leftovers. Смежная: stirling-storage-folder-idor (неявный корень хранилища processing-folder). Этот пакет — остаточная уязвимость импорта H2.
ROLE_ADMIN при включённом логине в proprietary/fat с встроенной H2 по умолчанию. Первый администратор по умолчанию — admin / stirling, когда initialLogin пуст. Неаутентифицированный доступ не требуется. Lite-образ и источники данных PostgreSQL этот контроллер не содержат.
Таблица привилегий (исчерпывающая). Тот же уровень, что и Signal-Server Dropwizard admin: метод + путь, что даёт этот вызов, разведка против целостности против доступности, подтверждено в лаборатории против выведено логически, смежная поверхность, которая остаётся закрытой.
| Ось | Метод + путь | Права | Происхождение |
|---|---|---|---|
| Целостность | 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 плюс CSVWRITE файла .pth из user-site Python, затем конвертация office | Выполнение команд от имени сервисной учётной записи | Выведено из GHSA-mrr8. Здесь не проверялось в лаборатории |
| Доступность | не заявлено | Импорт может заменить таблицы приложения | Выведено. Не является оракулом лаборатории |
Остаётся закрытым на этой фиксации
| Ось | Метод + путь | Почему закрыто |
|---|---|---|
| Целостность | неаутентифицированный POST /api/v1/database/import-database | 401 Authentication required. Безопасность метода ADMIN сохраняется, когда HTTP настроен как permitAll |
| Целостность | импорт 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. Вход включён. Лаунчер выполняет chdir в lab/ и запускает run.sh.
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. Запускайте validateSqlContent на тех же байтах, которые будет выполнять RUNSCRIPT. Запретите EXECUTE IMMEDIATE, если внутренний SQL также не сканируется.
Pattern.compile("(?i)\\bCREATE\\s+(OR\\s+REPLACE\\s+)?(FORCE\\s+)?ALIAS\\b")