0.135.1
Security
- **DNS-rebinding / TOCTOU — закрыт на основном LLM-пути **:
OpenAICompatProviderиAnthropicProviderтеперь инжектятoption.WithHTTPClient(safeHTTPClientForSpec(spec))в SDK-клиент. Transport выполняет dial-time IP re-check, блокируя обращения к private/loopback/cloud-metadata диапазонам независимо от config-time валидацииapi_base. Это единственный runtime SSRF guard на chat-пути (MakeProviderне валидирует api_base). - FetchContextWindow — safe-клиент: сигнатура изменена — принимает
spec *ProviderSpecвместоclient *http.Client, внутри строит safe-клиент черезsafeHTTPClientForSpec(spec). HandlerFetchContextдополнительно валидирует api_base черезResolveAndValidateAPIBase(HTTP 400 при SSRF-отклонении). - runDiagnostics — safe-клиент: использует
safeHTTPClientForSpec(spec)(local specs → loopback-whitelisted). SafeHTTPClient per-hop redirect validation сохранена без override.
Changed
NewAnthropicProvider: добавлен параметрspec *ProviderSpec(для выбора safe-клиента). Factory обновлён.AdvancedHandler: удалено полеclient *http.Clientи параметрNewAdvancedHandler(s, nil)(стало неиспользуемым после перевода FetchContextWindow на spec-based safe-клиент).FetchContext: порядок проверок —IsContextWindowUnsupported(HTTP 200 + error=“unsupported”) →ResolveAndValidateAPIBase(HTTP 400 + ssrf_rejected) →FetchContextWindow(HTTP 502 при fetch_failed).
Added
- Публичный helper
providers.IsContextWindowUnsupported(providerName)— проверка без построения spec; используется в handler для short-circuit до SSRF-валидации. - Тесты (
internal/providers/ssrf_chat_test.go, 5 шт.): e2e DNS-rebinding —Chat/ChatStreamблокируются на dial для приватных IP (169.254.169.254, 10.0.0.1, 192.168.1.1), TOCTOU invariant (после прохожденияValidateURLдля публичного IP dial на приватный всё равно блокируется), structural guard (http.DefaultClientpoison — провайдер не использует default клиент).diagnostics_test.go(5 шт.):diagnosticSpec(3 ветви),runDiagnosticsдля local-spec loopback (ok) и nil-spec loopback (SSRF block). - Docstring-контракт в
NewOpenAICompatProvider/NewAnthropicProvider: явно зафиксировано, что chat-path не валидирует api_base на config-time, dial-time IP re-check — единственный runtime guard.