Outils pour utilisateurs

Outils du site


bloc_note

Ceci est une ancienne révision du document !


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

// 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(const char *authorized_scripts_file) {
    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(int argc, char *argv[]) {
    // Vérifier si un fichier de scripts autorisés est passé en argument
    if (argc < 2) {
        fprintf(stderr, "Usage: %s <authorized_scripts_file>\n", argv[0]);
        exit(1);
    }

    // Chemin du fichier des scripts autorisés
    const char *authorized_scripts_file = argv[1];

    // Vérifier le script parent
    check_parent_script_name(authorized_scripts_file);

    printf("Program successfully launched by an authorized script.\n");

    // Logique principale du programme ici
    return 0;
}

bloc_note.1734505296.txt.gz · Dernière modification : 2024/12/18 08:01 de admin