guest@6admin.io:~$

Compilons un script shell avec shc

Un script shell est du texte lisible par tout le monde: cat script.sh montre le code, les mots de passe éventuels, la logique métier. shc (shell script compiler) transforme le script en binaire: le script est compilé en C, le C est compilé en binaire ELF et le texte source n’est plus lisible.

Le principe

shc -f script.sh

shc génère deux fichiers:

  • script.sh.x : le binaire ELF exécutable
  • script.sh.x.c : le source C généré (à supprimer après compilation)

Le binaire script.sh.x s’exécute comme le script original, mais le code shell n’est pas lisible dans le binaire.

Ce que shc NE fait PAS

shc n’est pas du chiffrement. C’est de l’obfuscation. Le binaire contient le script shell en clair (XOR avec une clé) et la clé est dans le binaire. strings script.sh.x ne révèle rien parce que le XOR masque le texte, mais un debugger (gdb) révèle tout: le script est décodé en mémoire avant d’être exécuté et à ce moment-là, il est lisible dans /proc/pid/mem ou dans un core dump.

shc protège contre cat script.sh, pas contre gdb script.sh.x. Si le mot de passe est dans le script, shc ne le protège pas. Si la logique métier est dans le script, shc la masque visuellement, pas cryptographiquement.

Les options

shc -f script.sh -o script_bin     # nom de sortie personnalisé
shc -f script.sh -r                # relaxation (permis sur machines différentes)
shc -f script.sh -T                # traçable (anti-strace off)
shc -f script.sh -e 31/12/2008 -m "Expiré"  # expiration

L’option -e fait expirer le binaire à une date donnée: le binaire refuse de s’exécuter après la date. C’est une forme de DRM (contournable en changeant l’horloge système, mais fonctionnelle pour un usage de base).

Le cas d’usage légitime

Le cas d’usage légitime de shc n’est pas la sécurité: c’est le déploiement. Un script shell qui doit être exécuté par un opérateur qui ne doit pas voir le code (par contrat, pas par sécurité technique) peut être shc-compilé. L’opérateur exécute le binaire et le code n’est pas lisible dans cat.

Le mot de passe dans le script? Ne le mettez pas dans le script. Utilisez sudo, utilisez des variables d’environnement, utilisez un gestionnaire de mots de passe. shc ne protège pas les secrets, il masque le code.