Eu quero criar um programa que será difícil de parar (mesmo para o administrador) depois que ele for iniciado (com privilégios de root). Uma vez iniciado, o processo deve continuar sendo iniciado na inicialização até que seja solicitado a parar. O processo de parada deve levar algum tempo (ou seja, deve ser caro).
Sei que isso pode parecer um software malicioso, mas quero-o por um motivo genuíno. Quero executar bloqueadores de sites no meu laptop (no qual sou o administrador). E quero tornar difícil para mim pará-los.
A solução que pensei é a seguinte:
O processo deve ser executado com um nome diferente cada vez que é executado, para que eu não possa prever o nome do processo e matá-lo.
O processo se salvará em /etc/rc5.d no desligamento
O processo criptografará seu nome usando um código em algum local conhecido. O processo de parada precisará usar o bruteforce para recuperar o nome do programa e matá-lo.
Gostaria de encontrar uma boa solução para esta tarefa.
Respostas:
Uma abordagem poderia ser usar namespaces do PID:
Inicialize seu sistema com um
init=/some/cmd
parâmetro as kernel, onde/some/cmd
bifurca um processo em um novo espaço para nome (CLONE_NEWPID
) e é executado/sbin/init
nele (ele terá o PID 1 nesse novo espaço para nome e o pid 2 no espaço para nome raiz) e, em seguida, no pai, execute seu " programa".Você provavelmente desejará uma maneira de controlar seu programa de uma maneira ou de outra (soquete TCP ou ABSTRACT Unix, por exemplo).
Você provavelmente desejará bloquear seu programa na memória e fechar a maioria das referências ao sistema de arquivos para que ele não dependa de nada.
Esse processo não será visto no resto do sistema. O restante do sistema será executado como em um contêiner.
Se esse processo morrer, o kernel entrará em pânico, o que lhe dará uma garantia extra.
Um efeito colateral inconveniente é que não veremos os threads do kernel na saída de
ps
.Como prova de conceito (usando este truque para inicializar uma cópia do seu sistema em uma máquina virtual qemu):
Crie um
/tmp/init
like:(você precisa
unshare
de uma versão recente do util-linux (2.14)). Acima, estamos usandosocat
como o "programa" que apenas responde nas conexões TCP na porta 1234 com a saída deps -efH
.Em seguida, inicialize sua VM como:
Então, vemos:
fonte
Não tenho certeza se é a solução final ou se é a melhor maneira de fazê-lo. Minhas opiniões:
Modifique,
init
pois é o primeiro processo se morrer todos os outros também morrerão. Portanto, sua máquina só poderá ser utilizada com ela.Crie um módulo do kernel e carregue os módulos críticos, dependendo dele (se for morto, causará uma reação em cadeia como o
init
exemplo).Modifique o kernel para ignorar solicitações de interrupção para um determinado processo.
Lembre-se de que os dois últimos serão executados no modo kernel (que é muito limitado em termos de bibliotecas e um). A modificação
init
será executada no espaço do usuário, permitindo que você use muitos recursos.fonte