bloc_note
Bloc Note rapide
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <libgen.h> // Liste codée en dur des scripts autorisés const char *hardcoded_script_names[] = { "authorized_script1.sh", "authorized_script2.sh", NULL // Marqueur de fin de liste }; // Chemin en dur vers le fichier contenant les scripts autorisés #define AUTHORIZED_SCRIPTS_FILE "/etc/authorized_scripts.txt" // Fonction pour vérifier si un script est dans une liste int is_script_in_list(const char *script_name, const char **script_list) { for (int i = 0; script_list[i] != NULL; i++) { if (strcmp(script_name, script_list[i]) == 0) { return 1; // Trouvé dans la liste } } return 0; // Non trouvé } // Fonction pour lire les scripts autorisés depuis un fichier int is_script_in_file(const char *script_name, const char *file_path) { FILE *file = fopen(file_path, "r"); if (!file) { perror("Error: Unable to open the authorized scripts file."); return 0; // Considérer comme non autorisé si le fichier est inaccessible } char line[256]; while (fgets(line, sizeof(line), file)) { // Supprimer le saut de ligne line[strcspn(line, "\n")] = '\0'; if (strcmp(script_name, line) == 0) { fclose(file); return 1; // Trouvé dans le fichier } } fclose(file); return 0; // Non trouvé dans le fichier } void check_parent_script_name() { pid_t ppid = getppid(); // Obtenir le PPID (Parent Process ID) char path[256]; char cmdline[1024] = {0}; FILE *file; // Construire le chemin vers /proc/[PPID]/cmdline snprintf(path, sizeof(path), "/proc/%d/cmdline", ppid); // Ouvrir le fichier cmdline pour lire la commande du parent file = fopen(path, "r"); if (!file) { perror("Error: Unable to open parent process info."); exit(1); } // Lire le contenu de cmdline if (fgets(cmdline, sizeof(cmdline), file) != NULL) { fclose(file); // Extraire le chemin du script (premier argument après le shell) char *script_path = strchr(cmdline, '\0') + 1; if (*script_path != '\0') { // Extraire le nom du script (basename) char *script_name = basename(script_path); // Vérifier le nom dans la liste codée en dur ou le fichier if (!is_script_in_list(script_name, hardcoded_script_names) && !is_script_in_file(script_name, AUTHORIZED_SCRIPTS_FILE)) { fprintf(stderr, "Error: Unauthorized script '%s' tried to launch this program.\n", script_name); exit(1); } } else { fprintf(stderr, "Error: This program must be launched by a shell script.\n"); exit(1); } } else { fclose(file); perror("Error: Unable to read parent process command line."); exit(1); } } int main() { // Vérifier le script parent check_parent_script_name(); printf("Program successfully launched by an authorized script.\n"); // Logique principale du programme ici return 0; }
bloc_note.txt · Dernière modification : 2024/12/18 08:05 de admin