Je veux créer un programme qui sera difficile à arrêter (même pour l'administrateur) une fois qu'il sera démarré (avec les privilèges root). Une fois démarré, le processus devrait continuer à démarrer au démarrage jusqu'à ce qu'il vous soit demandé de l'arrêter. Le processus d'arrêt devrait prendre un certain temps (c'est-à-dire qu'il devrait être coûteux).
Je sais que cela peut ressembler à un logiciel malveillant, mais je le veux pour une vraie raison. Je veux exécuter des bloqueurs de site sur mon ordinateur portable (dont je suis l'administrateur). Et je veux qu'il soit difficile pour moi de les arrêter.
La solution à laquelle j'ai pensé est la suivante-
Le processus doit s'exécuter avec un nom différent chaque fois qu'il est exécuté, de sorte que je ne peux pas prédire le nom du processus et le tuer.
Le processus se sauvera dans /etc/rc5.d à l'arrêt
Le processus chiffrera son nom à l'aide d'un chiffre dans un emplacement connu. Le processus d'arrêt devra utiliser bruteforce pour récupérer le nom du programme et le tuer.
Je voudrais trouver une bonne solution pour cette tâche.
Réponses:
Une approche pourrait être d'utiliser des espaces de noms PID:
Démarrez votre système avec un
init=/some/cmd
paramètre en tant que noyau, où/some/cmd
bifurque un processus dans un nouvel espace de noms (CLONE_NEWPID
) et y s'exécute/sbin/init
(il aura PID 1 dans ce nouvel espace de noms et pid 2 dans l'espace de noms racine), puis dans le parent, exécutez votre " programme".Vous voudrez probablement un moyen de contrôler votre programme d'une manière ou d'une autre (socket TCP ou ABSTRACT Unix par exemple).
Vous voudrez probablement verrouiller votre programme en mémoire et fermer la plupart des références au système de fichiers afin qu'il ne repose sur rien.
Ce processus ne sera pas vu du reste du système. Le reste du système fonctionnera en effet comme dans un conteneur.
Si ce processus meurt, le noyau panique, ce qui vous donne une garantie supplémentaire.
Cependant, un effet secondaire gênant est que nous ne verrons pas les threads du noyau dans la sortie de
ps
.Comme preuve de concept (en utilisant cette astuce pour démarrer une copie de votre système dans une machine virtuelle qemu):
Créez un
/tmp/init
comme:(vous avez besoin
unshare
d'une version récente d'util-linux (2.14)). Ci-dessus, nous utilisonssocat
comme le "programme" qui répond simplement sur les connexions TCP sur le port 1234 avec la sortie deps -efH
.Ensuite, démarrez votre machine virtuelle en tant que:
Ensuite, nous voyons:
la source
Je ne sais pas si c'est la solution finale ou si c'est la meilleure façon de le faire. Mes opinions:
Modifier
init
car c'est le premier processus s'il meurt tous les autres meurent aussi. Votre machine ne sera donc utilisable qu'avec elle.Créez un module du noyau et chargez les modules critiques en fonction de lui (s'il est tué, cela provoquera une réaction en chaîne comme dans l'
init
exemple).Modifiez le noyau pour ignorer les demandes de suppression pour un certain processus.
Gardez à l'esprit que les deux derniers s'exécuteront en mode noyau (ce qui est très limité en termes de bibliothèques et ainsi de suite). La modification
init
s'exécutera dans l'espace utilisateur vous permettant d'utiliser de nombreuses fonctionnalités de celui-ci.la source