Start Debugging

Semantic Kernel 1.80.0 impede que plugins OpenAPI sigam redirecionamentos

O Semantic Kernel .NET 1.80.0 traz uma mudança incompatível: o HttpClient padrão do plugin OpenAPI não segue mais redirecionamentos e fecha um bypass de SSRF. Veja o que muda e por que o seu próprio HttpClient reabre a brecha.

O Semantic Kernel .NET 1.80.0 saiu em 2026-08-18, e a linha do changelog que importa é a mais seca de todas: ”.NET: [Breaking] Update OpenAPI HTTP client defaults”. Ela fecha uma brecha que o Semantic Kernel vinha documentando como limitação conhecida nos próprios comentários XML desde maio.

A validação era real, o redirecionamento era a saída de emergência

Desde que o PR #14029 entrou em maio de 2026, RestApiOperationServerUrlValidationOptions é aplicado por padrão a todo plugin OpenAPI. Deixe ServerUrlValidationOptions como null e você ainda recebe uma instância construída por padrão que exige https para tudo que esteja fora da lista de permitidos e rejeita hosts que resolvem para loopback, link-local (incluindo o endereço de metadados de nuvem 169.254.169.254), RFC1918, fc00::/7, NAT de nível de operadora, multicast e faixas reservadas.

O problema era a ordem. A validação roda sobre a URL antes de a requisição sair. O HttpClient padrão seguia redirecionamentos, então um host público que você tivesse liberado podia responder com um 302 apontando para http://169.254.169.254/latest/meta-data/ e o handler ia atrás, já tendo passado pelo filtro. O Semantic Kernel dizia isso nos comentários do próprio tipo e mandava você configurar AllowAutoRedirect = false por conta própria.

O que a 1.80.0 mudou de fato

A factory do plugin não resolve mais o cliente padrão por HttpClientProvider.GetHttpClient(). Agora ela chama um novo GetNonRedirectingHttpClient(), apoiado em um singleton de handler não descartável separado, com redirecionamentos desligados:

public static HttpClient GetNonRedirectingHttpClient()
    => new(NonDisposableHttpClientHandler.NonRedirectingInstance, disposeHandler: false);

Todos os pontos de entrada passam por ele: ImportPluginFromOpenApiAsync, CreatePluginFromOpenApiAsync, OpenApiKernelPluginFactory.CreateFromOpenApiAsync, além das extensões de API Manifest e Copilot Agent Plugin. Um redirecionamento agora aparece como uma HttpOperationException carregando o status 3xx, em vez de ser seguido em silêncio.

O seu HttpClient continua sendo problema seu

Esta é a parte a conferir antes de atualizar Microsoft.SemanticKernel.Plugins.OpenApi para 1.80.0. O novo padrão só vale quando o Semantic Kernel constrói o cliente. Se você passar um, ele é usado do jeito que veio:

var handler = new HttpClientHandler { AllowAutoRedirect = false };
using var http = new HttpClient(handler);

await kernel.ImportPluginFromOpenApiAsync(
    pluginName: "partner",
    uri: new Uri("https://partner.example.com/openapi.json"),
    executionParameters: new OpenApiFunctionExecutionParameters
    {
        HttpClient = http,
    });

O caso sutil é a injeção de dependências. As extensões do kernel caem em kernel.Services.GetService<HttpClient>() antes de chegar ao padrão, então um registro simples de AddHttpClient() vence e traz AllowAutoRedirect = true de volta junto. Se você monta os plugins dentro de um host, como em rodar um plugin do Semantic Kernel a partir de um BackgroundService, configure o handler primário explicitamente.

A parte incompatível é real: uma API interna que responde 301 quando a barra final não bate antes funcionava e agora lança exceção. Corrija o servers[].url do documento em vez de entregar ao plugin um cliente que segue redirecionamentos.

Comments

Sign in with GitHub to comment. Reactions and replies thread back to the comments repo.

< Voltar