0.136.3
Fixed
- Глобальный SSRF whitelist в БД + UI (known limitation из #164): pre-call SSRF-валидация (
ResolveAndValidateAPIBase/validateLoopbackOrSSRF) вadvanced.go,connectivity.go,model_list.goранее использовала глобальныйssrfGuard.Load()без whitelist — UI-кнопки «проверить подключение» / список моделей провайдера на приватном IP показывали✗ api_base rejected by security policy, а в логах сыпались startup-WARN’ы. Теперь админ может редактировать CIDR-whitelist через UI: Settings → Система → «Безопасность / SSRF», textarea (по CIDR на строку). Настройка хранится вsettingsпод ключомssrf_whitelist(миграция не нужна — создаётся при первом сохранении), применяется при старте процесса (restart-required). Один guard покрывает все точки SSRF-проверки: pre-call валидацию (4 места) И dial-time на chat-пути (черезproviders.SetSSRFGuard). Дефолт для новых инсталляций:10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16, 127.0.0.0/8, ::1/128(все приватные + loopback). Audit-log смены настройки:slog.Info("ssrf_whitelist updated")сactor,previous,raw_request,new_normalized(truncate 1KB). - Эндпоинты:
GET /api/v1/system/security(любой авторизованный) иPUT /api/v1/system/security(RequireGlobalAdmin). PUT парсит textarea (split по\n/,/пробелам), валидирует каждый CIDR черезnetip.ParsePrefix, нормализует черезMasked()(так192.168.1.0/16→192.168.0.0/16), при невалидном → HTTP 400invalid_cidrс указанием бракованного токена. Пустой whitelist допустим (означает «блокировать все приватные»). - Frontend: типы
SecurityConfig/SecurityUpdateResponseвtypes.ts, методыapi.system.security.get/updateвendpoints.ts, компонентSecurityCard.svelte(textarea + «Сохранить» + «Сбросить к дефолту» + toast «требуется перезапуск» + индикатор невалидных записей), подключён вsettings/system/+page.svelte.
Security
- Audit-log на security-critical write (ocr review): смена
ssrf_whitelistлогируется черезslog.Infoсactor(UserID из auth-mw),previousraw-значением,raw_request(что оператор реально ввёл — для forensics), иnew_normalized(что сохранилось). Значения truncate’ятся до 1KB против раздувания логов. - Невалидные токены в startup ignored с WARN (ocr review):
LoadSSRFWhitelistпри старте логируетslog.Warn("ssrf_whitelist: ignoring invalid CIDR(s) at startup", ...)вместоfmt.Printf— survives log aggregation. GET/system/securityпоказываетinvalid-список оператору.