Bonjour à tous,
Je viens d'installer mon petit serveur web et mail et je dois faire quelque chose de similaire à ça. Il faudrait que je puisse rajouter un compte mail depuis une page php sécurisée bien entendu (php -> programme C/C++).
Pour se faire, j'ai besoin d'accéder à MySQL (par l'API C, pas de problème) et faire des commandes comme maildirmake depuis un utilisateur (vmail) normal à qui appartient les dossiers de mails. Apache tournant sur l'utilisateur apache, je pense faire du setuid pour donner les droits temporairement de vmail. Toutes les commandes "natives" au C/C++ se font bien sous l'utilisateur vmail mais dès que je fais un appel avec system() sur une commande comme touch/mkdir/maildirmake c'est l'utilisateur apache qui est utilisé, pourquoi ?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| #include <iostream>
#include <iomanip>
#include <fstream>
using namespace std;
int main(void)
{
static uid_t ruid, rgid;
ruid = getuid();
rgid = getgid();
setuid(geteuid());
setgid(getegid());
ofstream file("test.txt");
file << "Hello test \n";
file.close();
system("touch test2.txt");
setuid(ruid);
setgid(rgid);
return EXIT_SUCCESS;
} |
Je précise que j'ai bien fait :
g++ suid-print.c -o suid-print && chown vmail:vmail suid-print && chmod +s suid-print
Quand j'exécute le programme, le fichier test.txt appartient bien à vmail alors que le fichier test2.txt appartient à celui qui a lancer le programme. Comment ça se fait ? On dirait que system n'affecte pas les programme au setuid donné.
Avez-vous une solution ?
Partager