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;
}