IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Mathématiques Discussion :

Auto contrôle de CRC dans un shell script


Sujet :

Mathématiques

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut Auto contrôle de CRC dans un shell script
    Bonjour,

    Sous unix, il existe une commande qui s'appelle cksum. Elle calcule et affiche le checksum d'un fichier. L'algorithme utilisé est un CRC, lequel, je ne sais pas encore mais je ne pense pas que cela soit un problème.

    L'idée serait d'intégrer une fonction de controle basique (et c'est volontairement que je reste dans un registre basique) dans un script afin que si le checksum n'est pas correct, c'est que le script a été modifié et qu'il ne doit donc pas être exécuté.

    Pour cela, il est toujours possible de mettre à côté du script le checksum calculé et si le checksum du script ne correspond pas au contenu du fichier associé, c'est pas bon. Le problème, c'est que cette fonction ajoute un fichier au script et que cela complexifie la gestion de version.

    Une autre idée à laquelle je pense, c'est le CRC des trames ethernet. Crc(Trame + CRC) = 0 (ou autre valeur connue, peut importe).

    L'idée serait d'intégrer dans le fichier une chaine de caractères (forcément des commentaires afin de ne pas perturber le script) de manière à ce que le calcul du CRC par la programme cksum donne 0 (ou autre valeur connue).

    Ainsi, le script lors de son exécution vérifie son CRC, s'il vaut 0, il peut continuer, s'il est différent de 0, il sort parce qu'il a été modifié.

    Pensez vous qu'il soit possible d'intégrer ce genre de contôle "minimaliste" afin d'empêcher des modifications non désirées. Dans mon cas de figure, les droits Unix ne peuvent pas s'appliquer car tout le monde est "root", c'est comme cela.

    Il est clair que si je devais modifier le script, je commencerais par mettre en commentaire le contrôle du CRC et le tour est joué mais j'ai affaire avec des personnes qui bidouillent les scripts, pas des hackers, donc ce contrôle suffirait. S'ils suppriment l'appel au contrôle CRC, c'est une autre volonté, ils entrent volontairement dans le registre "hacker".

    Merci d'avance pour vos idées et remarques
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  2. #2
    Membre Expert
    Avatar de prgasp77
    Homme Profil pro
    Ingénieur en systèmes embarqués
    Inscrit en
    Juin 2004
    Messages
    1 306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur en systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 306
    Par défaut
    Bonjour,

    puisque personne ne répond, je me lance à l’assaut. Effectivement, un auto-contrôle est faisable (je me suis codé un petit proof of concept en sh) facilement ; en revanche comme tu le fais remarquer, il est aussi facilement contournable.

    Une idée qui me passe par la tête, et qui peut être efficace si menée à bien, serait de modifier le shell par défaut (celui précisé dans la première ligne du fichier). Celui-ci serait un interpréteur de ton cru qui effectuerait le contrôle puis transmettrait le contenu du script à sh.

    La somme de contrôle pourrait être stockée dans une base de données (sqlite ou texte) quelque part dans le système de fichier (pourquoi pas /quelquechose/md5(adresse_complète_du_script).

    Cdlt,

  3. #3
    Membre Expert
    Avatar de prgasp77
    Homme Profil pro
    Ingénieur en systèmes embarqués
    Inscrit en
    Juin 2004
    Messages
    1 306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur en systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 306
    Par défaut
    Voici un proof of concept (j'adore cette expression).

    /home/yscialom/tmp/mysh
    Code sh : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    #!/bin/sh
     
    # Returns the full name (begining with a '/') of the given filename
    fullname()
    {
    	echo "$( readlink -f "$( dirname "$1" )" )/$( basename "$1" )"
    }
     
    # Computes md5sum of the script to execute
    sum=`md5sum -t "$1" | awk '{print $1}'`
     
    # Gets the name of the file containing the correct md5sum of the script to execute
    chk=`echo "$( fullname "$1")" | md5sum -t | awk '{print $1}'`
     
    # Checks & Launches
    if [ "$sum" = "`cat ".$chk"`" ]
    then
    	/bin/sh "$1"
    else
    	echo "Script modified."
    fi


    Et voici un script à vérifier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #!/home/yscialom/tmp/mysh
    echo "Hello, World"
    J'ai au préalable créé le fichier /home/yscialom/tmp/.f1f66dfc39b5d39bbc592258f0ecf9b9 contenant cd97cf8c8f3da551928705d59af42819.

    Le système est à perfectionner, mais je pense que c'est ce que tu recherches .

  4. #4
    Expert confirmé Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Par défaut
    On peut mettre dans le script 2 parties:
    - une partie en clair,
    - une partie encodée avec le instructions que tu veux protéger (pour faire au plus simple, ce serait un encodage hexadécimal)

    La partie en clair comporterait les instructions pour:
    - extraire la partie encodée,
    - la copier dans un fichier,
    - décoder ce fichier pour créer un script temporaire en clair,
    - lancer l'exécution du script temporaire.

    En fin d'éxécution, le script temporaire s'autodétruirait.

    Evidement, rien n'empêche de signer le script temporaire ou de le rendre moins lisible ("Shell script obfuscation").

  5. #5
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Par défaut
    Citation Envoyé par ram-0000 Voir le message
    L'idée serait d'intégrer dans le fichier une chaine de caractères (forcément des commentaires afin de ne pas perturber le script) de manière à ce que le calcul du CRC par la programme cksum donne 0 (ou autre valeur connue).
    J'aime bien ce concept de "signature" d'une partie du code. Personnellement, je définirais deux balises et je calculerais le MD5 du code entre les balises.

    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    #!/bin/bash
    EXPECTEDMD5="6cefe7246817b63abb127737d5bc7995"
     
    # Test de l'intégrité du code entre les 2 balises
    CURRENTMD5=`awk '/ENDMD5$/{flag=0}flag;/BEGINMD5$/{flag=1}' $0 | md5sum | awk '{ print $1 }'`
    if [ $CURRENTMD5 != $EXPECTEDMD5 ];
    then
      echo "Bad MD5, bla bla bla"
      exit 1 
    fi
     
    # BEGINMD5
    ...
    ... (reste du script ici)
    ...
    # ENDMD5

    (NB: je ne suis pas bien sur que la syntaxe soit correcte, mais vous voyez l'idée.)
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  6. #6
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Par défaut
    Mince. Le temps que je tape mon message, prgasp77 a donné une variante de mon idée.
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  7. #7
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 376
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 376
    Par défaut
    Bonjour,

    Si la phase de vérification ne se trouve pas directement dans le script mais qu'il y a uniquement le CRC et les 2 commentaires balises qui entourent la partie qui ne doit pas être modifiée, rien n'empêche de passer aussi par un cryptage asymétrique du CRC pour garantir un meilleur niveau de sécurité.
    Mais cela suppose bien sur que le seul qui à la clé privée est celui qui valide les modifications.

    Cordialement.

  8. #8
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 376
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 376
    Par défaut
    Idem, le temps que je soumette mon idée, Graffito a soumit une variante

  9. #9
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Citation Envoyé par prgasp77 Voir le message
    La somme de contrôle pourrait être stockée dans une base de données (sqlite ou texte) quelque part dans le système de fichier (pourquoi pas /quelquechose/md5(adresse_complète_du_script).
    Merci pour l'idée mais non. En effet, je voudrais un script autonome, donc pas de checksum extérieur (fichier ou base de données ou autre).

    Citation Envoyé par pseudocode Voir le message
    J'aime bien ce concept de "signature" d'une partie du code. Personnellement, je définirais deux balises et je calculerais le MD5 du code entre les balises.
    Je retiens l'idée

    Ceci dit, j'en reviens à mon idée de base que j'ai peut être mal exprimé.

    Le CRC est le reste d'une division entière. Globalement, dividende / diviseur = quotient + reste avec dans mon cas :
    • dividende = le fichier à protéger
    • diviseur = polynôme générateur du CRC (X32 + X26 + X23 + X22 + X16 + X12 + X11 + X10 + X8 + X7 + X5 + X4 + X2 + X + 1 dans le cas du CRC 32 Ethernet par exemple)
    • quotient = on s'en moque
    • reste = CRC


    Si une fois que l'on a calculé le CRC du script à protéger et que l'on réintègre ce CRC dans le script (sous forme de commentaires), le calcul du nouveau CRC' du fichier contenant le CRC devrait donner 0.

    C'est aussi pour cela que je reste sur le CRC car c'est un reste de division et il est donc possible et facile de trouver un nombre tel que ce reste soit 0. Avec un MD5, qui est une fonction cryptographique forte (bien qu'elle ait du plomb dans l'aile depuis quelques années), il n'est pas possible (ou très très difficile) de trouver un nombre pour obtenir un MD5 voulu.
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  10. #10
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 376
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 376
    Par défaut
    Bonjour,

    En mon sens le CRC' sera égale à zéro dans le cas de fichier binaire ou bien il faudra une routine qui transforme une chaine ascii en binaire.

    Cordialement.

  11. #11
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Citation Envoyé par disedorgue Voir le message
    En mon sens le CRC' sera égale à zéro dans le cas de fichier binaire ou bien il faudra une routine qui transforme une chaine ascii en binaire.
    Pour les détails d'implémentation, on verra plus tard. D'abord je m'occupe de la faisabilité (ou non) du "machin"
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  12. #12
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Par défaut
    Citation Envoyé par ram-0000 Voir le message
    Pour les détails d'implémentation, on verra plus tard. D'abord je m'occupe de la faisabilité (ou non) du "machin"
    Comme le dit disedorgue, pour que ton idée fonctionne il faudrait ajouter le CRC (remainder) sous forme 'binaire' au fichier original. Ce qui risque de le rendre inutilisable, surtout si c'est un fichier ASCII.

    Le plus simple c'est encore de faire du "reverse CRC": c'est à dire trouver une suite de caractères ASCII qui, une fois ajoutée au fichier original, permet d'atteindre une valeur arbitraire de CRC.

    (Cf. blog de Daniel Vik "Finding Reverse CRC Patch with Readable Characters")
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 25/01/2011, 16h37
  2. Intégrer un shell script dans le shell ?
    Par damien27000 dans le forum Linux
    Réponses: 3
    Dernier message: 23/07/2007, 23h04
  3. shell script: placer une variable dans le clavier
    Par kaukos dans le forum Linux
    Réponses: 6
    Dernier message: 30/06/2007, 07h42
  4. [AIX] plusieurs sous-scripts dans un shell
    Par fguigui dans le forum AIX
    Réponses: 4
    Dernier message: 10/04/2007, 11h14
  5. Shell Script dans crontab
    Par Deepc dans le forum Linux
    Réponses: 3
    Dernier message: 30/03/2006, 11h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo