Inicie o aplicativo como root durante o boot no Ubuntu 14.04

1

Estou trabalhando no Ubuntu 14.04 Eu tenho um aplicativo C ++ que eu compilei. Eu recebo o executável que nome é "programa". Bem, a coisa é que este programa usa opencv e sockets então se eu tentar executá-lo no terminal assim:

./program

Eu recebi este erro:

 listener: socket: Operation not permitted
 setsockopt: Bad file descriptor

Esse erro aparece porque estou usando o soquete e preciso executar meu aplicativo como root, então digitei:

sudo ./program

Esta solicitação minha senha e o programa funciona propriedade.

O problema é que eu quero executar este "programa" automaticamente quando eu inicio o meu Ubuntu, mas ele não funciona. Eu tenho outra aplicação, o nome é "camera", que só usa opencv, sem socket, então eu não preciso executar como root. Então eu coloquei este aplicativo no aplicativo de inicialização do Ubuntu e o aplicativo "camera" começou no começo sem problema.

Então, como posso iniciar automaticamente uma aplicação que usa sockets no Ubuntu?

Eu tentei fazer isso:

sudo chown root:root ./program
sudo chmod a+s ./program

Mas meu programa usa vídeo, então quando tento assistir ao vídeo o programa para. Isso se deve ao fato de meu programa não estar livre de falhas de segurança, de modo que eles estão vulneráveis a explorações de estouro de buffer, etc.

Basicamente, só preciso saber como posso lançar meu programa como inicialização sem problemas.

    
por user3766585 21.10.2014 / 16:35

1 resposta

1

Com base no nome do arquivo RecvRawEth.c que você postou no seu comentário acima, acredito que você esteja tentando usar soquetes brutos ( SOCK_RAW ). Este sempre requer que o programa seja executado como root porque os sockets raw têm o potencial de permitir que você ignore outros mecanismos de segurança, como a restrição em portos privilegiados .

Você realmente deve repensar este aplicativo. Muito poucos programas legitimamente requerem soquetes brutos. Há quase sempre uma maneira melhor.

Você está lançando pelo menos dois problemas adicionais no mix, que realmente é não é no Stack Exchange digite sites, mas vou abordá-los de qualquer maneira:

  1. setuid root

    Você está tentando contornar a restrição de soquetes brutos marcando-o para ser executado como root , independentemente de quem realmente o tenha iniciado. Você está potencialmente abrindo um ou mais buracos de segurança ao fazer isso. Confie em mim: décadas de história do Unix nos dizem que complicados programas setuid root provavelmente terão problemas exploráveis. Pode levar muitos anos para encontrar e extirpar todos eles.

    Se você absolutamente precisa usar sockets raw e, assim, precisar de algum elemento do programa para ser executado como root, é melhor escrevê-lo como um scope limitado daemon . Ou seja, torne o programa o menor possível, fazendo apenas o mínimo absoluto que você deve fazer como root , mais o que for necessário para exportar as informações resultantes para um programa que esteja sendo executado com privilégios normais.

  2. Iniciar na inicialização

    Se você criar um daemon, configurá-lo para ser executado na inicialização do sistema é trivial. Qualquer tutorial decente mostrando-lhe como criar um daemon irá para isso. No Ubuntu, acredito que isso signifique lidar com systemd .

    Quanto à parte da GUI, basta adicioná-la à inicialização da sessão .

por 21.10.2014 / 17:16