O único erro que vejo com o seu código é que você está executando o comando do usuário desnecessariamente através de sh -c
quando você deve executá-lo diretamente. Executá-lo através de sh -c
não compra nada, mas destrói a citação que o usuário originalmente colocou no comando. Por exemplo, tente isto:
sudo /usr/local/sbin/_oob_shim ls -l "a b"
deve listar um arquivo chamado a b
dentro do contexto do namespace, mas em vez disso, ele lista dois arquivos chamados a
e b
.
sudo /usr/local/sbin/_oob_shim ls -l "*"
deve listar um arquivo chamado *
(asterisco literal), falha pelo mesmo motivo.
Então, deve ser assim:
#!/bin/sh
/bin/ip netns exec oob \
/usr/bin/sudo -u "#$SUDO_UID" -g "#$SUDO_GID" -- "$@"
Torna o script mais simples para inicializar!
Outro ponto que posso fazer é que, embora nesse caso o bug fosse apenas um bug de funcionalidade, não um bug de segurança, sempre é suspeito ao auditar código sensível à segurança e descobrir que ele executa coisas através de shells, porque isso é quase sempre problema.
Finalmente, os grupos suplementares do usuário não serão propagados para o namespace (eles obtêm apenas seus uid e main gid), mas isso não parece ser um grande problema e consertar isso não é trivial.
Fora isso, parece bom para mim.