IETF-SSH archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: protocol support for privilege seperation



that is a known problem.  but for the same reason, if the
non-privilege separated process gets compromised, it can do
a man-in-the-middle with ifself.  or just read the key file
and use if from a different hosts.   this increases security,
it is not perfection.

On Wed, Jun 26, 2002 at 10:29:31PM -0700, Wei Dai wrote:
> It's a good idea for an SSH server to drop down to normal user privileges 
> after authentication is complete, and only make requests to a privileged 
> monitor for things like key re-exchanges. Unfortunately, without changes 
> to the SSH protocol as currently defined, there seems to be no way to do 
> this without allowing the non-privileged process to perform 
> man-in-the-middle attacks if it was compromised.
> 
> The attack is as follows. Assume an attacker is able to corrupt a 
> non-privileged SSH process and cause it to execute arbitrary code. He 
> impersonates the server at the TCP/IP layer and waits for someone to log 
> in. When a connection comes in, he starts a key re-exchange as the 
> couterparty to the SSH process that he controls, using the SSH_MSG_KEXINIT 
> packet he received from the remote party and forwarding responses back and 
> forth until the key exchange is complete. At this point, even if the 
> Diffie-Hellman key generation and agreement were done in the privileged 
> monitor, the monitor must either pass the shared secret back to the 
> non-privileged process, or act as an encryption/MAC oracle for it. Either 
> way, the attacker can now send arbitrary messages to the remote party that 
> it will think came from the server.
> 
> The problems seems to be that the privileged monitor has no way to tell 
> whether a SSH_MSG_KEXINIT packet is for the initial key exchange, or for a 
> re-exchange. I propose making use of the reserved field of 
> SSH_MSG_KEXINIT, something like:
> 
> byte      SSH_MSG_KEXINIT
> ...
> boolean   first_kex_packet_follows
> boolean   is_initial_exchange
> byte[3]   0 (reserved)
> 
> The privileged monitor would refuse to sign any exchange hash where
> is_initial_exchange is true if it's not an initial exchange. I think that
> would allow implementors to take full advantage of privilege seperation
> and avoid this attack. If current implementations are programmed to ignore
> the reserved field (rather than treat a non-zero value as an error), this
> should cause no compatibility problems. Specificly, an old client that
> does not make use of is_initial_exchange would be vulnerable to this
> attack, but it would still work.
> 
> Comments?



Home | Main Index | Thread Index | Old Index