Salut ;)
Je cherche une solution/un script permettant d'appeler une fonction à partir d'un processus avec un ID utilisateur non autorisé à accéder au sysfs correspondant.
Version imprimable
Salut ;)
Je cherche une solution/un script permettant d'appeler une fonction à partir d'un processus avec un ID utilisateur non autorisé à accéder au sysfs correspondant.
Bonjour
Assez obscur comme demande. Déjà "appeler une fonction à partir d'un processus" c'est totalement abscons. Un processus représente un programme en cours d'exécution. Pour qu'un processus appelle "quelque chose" il faut que ce soit le programme qui appelle ce quelque chose. Et un programme ne peut pas appeler de fonction mais seulement un autre programme.
Ensuite "avec un id d'utilisateur" c'est pareil. Un processus possède un uid natif qui correspond, dans 99,9% des cas, au uid de l'utilisateur qui a appelé le programme (programme instanciant le processus). Exemple quand j'appelle ls alors un processus correspondant au programme "ls" est instancié, et le uid de ce processus correspond à mon uid. Ainsi, c'est ce processus qui sera contrôlé lors de ses accès au système (le uid de ce processus a-t-il le droit de lire le dossier ? a-t-il le droit de lire "/etc/passwd" pour pouvoir faire la correspondance entre "uid fichiers présents" et "utilisateur correspondant" afin d'afficher les fichiers avec le bon propriétaire, etc etc etc).
Un processus peut toutefois changer son uid via la fonction setuid() mais à condition qu'il soit autorisé à effectuer ce changement. Or seul root en a le droit. Donc pour qu'un processus puisse changer son "uid", il faut alors qu'il ait au préalable le uid de root. Donc il faut que le programme qui instanciera le processus soit lancé par root ou bien qu'il appartienne à root et qu'il ait le droit "s" positionné au niveau de "user" (exemple rwsr-xr-x root groupe_quelconque programme). Petite remarque amusante: ce droit "s" se nomme "setuid" tout comme la fonction (probablement parce que la fonction en question est appelée par le noyau quand il voit ce "s" positionné au niveau du fichier exécutable).
Et enfin "non autorisé à accéder" ben là c'est mort. Si l'utilisateur n'est pas autorisé à accéder à un dossier, alors tout processus qu'il invoquera (hors changement uid) ne sera pas non plus autorisé à y accéder (trop facile sinon de pouvoir hacker le système s'il suffisait de lancer un processus X pour accéder là où on n'a pas le droit).
En fait, c'est même plus simple car ce n'est jamais l'utilisateur lui-même qui accède à quelque chose mais toujours les processus qu'il invoque. Exemple: si je tape cp /etc/shadow . alors le programme "/bin/cp" va être mis en exécution dans un processus qui aura mon uid et c'est ce processus (et non moi) qui tentera de copier le fichier. C'est vrai qu'au résultat c'est la même chose (si ce processus avec mon uid n'arrive pas à accéder au fichier alors c'est comme si moi je n'y arrivais pas puisque ce processus agit en mon nom) mais c'est vraiment pour que tu comprennes que c'est le programme que tu exécutes qui est vérifié dans ses accès et non toi.
Donc bref, essaye de revoir ton besoin et surtout ta façon de l'exprimer...
Je pense que cette partie apporte plus de confusion qu'autre chose:
Vu de l'OS, un processus avec ton uid est toi.Citation:
En fait, c'est même plus simple car ce n'est jamais l'utilisateur lui-même qui accède à quelque chose mais toujours les processus qu'il invoque. Exemple: si je tape cp /etc/shadow. alors le programme "/bin/cp" va être mis en exécution dans un processus qui aura mon uid et c'est ce processus (et non moi) qui tentera de copier le fichier. C'est vrai qu'au résultat c'est la même chose (si ce processus avec mon uid n'arrive pas à accéder au fichier alors c'est comme si moi je n'y arrivais pas puisque ce processus agit en mon nom) mais c'est vraiment pour que tu comprennes que c'est le programme que tu exécutes qui est vérifié dans ses accès et non toi.
Et donc, si tu n'as pas le droit de faire quelque chose, la seule façon est de demander à quelqu'un d'autre de le faire pour toi.
Sous les OS unixoïdes, la méthode traditionnelle pour "demander à quelqu'un d'autre", c'est l'exécutable marqué avec le bit setuid. Par exemple, si un utilisateur veut changer son mot de passe, il appelle l'exécutable approprié, mais celui-ci s'exécute en fait en tant que root, car lui seul a les droits d'écriture sur les fichiers /etc/passwd et /etc/shadow (d'où l'importance de blinder ses entrées, car une faille de sécurité dans ce programme permettrait de faire faire à root ce que tu veux).
Sve@r et Médinoc : merci beaucoup pour votre aide.
Ces clarifications m'ont beaucoup aidé ;)