[CRIU] [PATCH 1/3] p.haul: do not use getsockname() as a hash_name, v4

Ruslan Kuprieiev kupruser at gmail.com
Wed Oct 29 03:12:26 PDT 2014


On 29.10.2014 10:17, Pavel Emelyanov wrote:
> On 10/28/2014 01:18 AM, Ruslan Kuprieiev wrote:
>> Currently xem_rpc is not proxy-resistant.
>> It means that if there is a proxy somewhere in
>> between client and server, p.haul will fail,
>> because getsockname() on client != getpeername()
>> on server.
>>
>> v2, Pavel suggested to solve it like this:
>>
>> 1. On main rpc socket after init_rpc() the server
>>     reports back the name by which it sees the client
>>     socket.
>>
>> 2. After calling connect() on data socket the client
>>     should mix the name from step 1 to the data socket
>>     name to distinguish his data socket from those
>>     created by other clients.
>>
>> v3, use rpc to transfer socket name
>> v4, use init option in _make_sk
>>
>> Signed-off-by: Ruslan Kuprieiev <kupruser at gmail.com>
>> ---
>>   xem_rpc.py | 18 +++++++++++++-----
>>   1 file changed, 13 insertions(+), 5 deletions(-)
>>
>> diff --git a/xem_rpc.py b/xem_rpc.py
>> index 9718eef..71ca051 100644
>> --- a/xem_rpc.py
>> +++ b/xem_rpc.py
>> @@ -3,6 +3,7 @@ import select
>>   import threading
>>   import traceback
>>   import util
>> +import struct
>>   
>>   rpc_port = 12345
>>   rpc_sk_buf = 256
>> @@ -41,22 +42,26 @@ class _rpc_proxy_caller:
>>   class rpc_proxy:
>>   	def __init__(self, conn, *args):
>>   		self._srv = conn
>> -		self._rpc_sk = self._make_sk()
>> +		self._rpc_sk = self._make_sk(init=True)
>>   		util.set_cloexec(self._rpc_sk)
>>   		_rpc_proxy_caller(self._rpc_sk, RPC_CMD, "init_rpc")(args)
>>   
>>   	def __getattr__(self, attr):
>>   		return _rpc_proxy_caller(self._rpc_sk, RPC_CALL, attr)
>>   
>> -	def _make_sk(self):
>> +	def _make_sk(self, init=False):
> Plz, make it w/o argument to _make_sk(). Let the caller of it
> call the RPC_CMD "get_name" or smth himself.

Ok.

>>   		sk = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
>>   		sk.connect((self._srv, rpc_port))
>> -		return sk
>> +		if init:
>> +			return sk
>> +		else:
>> +			host = _rpc_proxy_caller(sk, RPC_CMD, "get_name")()
>> +			return (sk, host)
>>   
>>   	def open_socket(self, uname):
>> -		sk = self._make_sk()
>> +		sk, host = self._make_sk()
>>   		c = _rpc_proxy_caller(self._rpc_sk, RPC_CMD, "pick_channel")
>> -		c(sk.getsockname(), uname)
>> +		c(host, uname)
>>   		return sk
>>   
>>   
>> @@ -76,6 +81,9 @@ class _rpc_server_sk:
>>   	def hash_name(self):
>>   		return self._sk.getpeername()
>>   
>> +	def get_name(self, mgr):
>> +		return self.hash_name()
>> +
>>   	def work(self, mgr):
>>   		raw_data = self._sk.recv(rpc_sk_buf)
>>   		if not raw_data:
>>



More information about the CRIU mailing list