{"id":1007,"date":"2013-07-27T09:32:06","date_gmt":"2013-07-27T07:32:06","guid":{"rendered":"https:\/\/www.asafety.fr\/?p=1007"},"modified":"2015-11-13T16:56:57","modified_gmt":"2015-11-13T14:56:57","slug":"bashshunix-shc-le-compilateur-et-protecteur-de-script-shell","status":"publish","type":"post","link":"https:\/\/www.asafety.fr\/en\/prog-and-dev\/bashshunix-shc-le-compilateur-et-protecteur-de-script-shell\/","title":{"rendered":"[Bash\/SH\/Unix] SHc : Le compilateur et protecteur de script shell"},"content":{"rendered":"<p><\/p>\n<p>Nombreux sont ceux qui esp\u00e8re trouver la solution ultime pour prot\u00e9ger les diff\u00e9rents scripts Bash\/Sh qu&#8217;ils produisent. Il n&#8217;est pas rare, loin de l\u00e0, de d\u00e9ployer des scripts shell critiques sur des environnements de production et des serveurs en-ligne.<\/p>\n<p>Pourquoi critique? Car le code source de ces scripts est accessible en clair, et qu&#8217;ils renferment souvent des informations qui s&#8217;av\u00e8rent \u00eatre d&#8217;un grand int\u00e9r\u00eat pour quelqu&#8217;un de malintentionn\u00e9 (mots de passe r\u00e9seau, de bases de donn\u00e9es, etc.).<\/p>\n<p>Ces scripts peuvent \u00eatre aussi divers que vari\u00e9s. A titre d\u2019exemple, de tels scripts sont souvent :<\/p>\n<ul>\n<li>Des scripts de sauvegardes\/backups d\u2019annuaires ou de base de donn\u00e9es, ex\u00e9cut\u00e9s p\u00e9riodiquement (t\u00e2ches cron)<\/li>\n<li>Des scripts de nettoyage de caches\/fichiers, d\u2019archivage ou encore de compression<\/li>\n<li>Des syst\u00e8mes de surveillances\/monitoring qui v\u00e9rifient l\u2019utilisation RAM\/CPU\/DISK d\u2019un serveur<\/li>\n<li>Des moyens d\u2019externaliser des backups sur des emplacements r\u00e9seaux distants<\/li>\n<\/ul>\n<p>Tous les administrateurs syst\u00e8mes ont d\u00e9j\u00e0 \u00e9t\u00e9 amen\u00e9s au moins une fois \u00e0 exploiter de tels scripts.<\/p>\n<p>Certaines bonnes pratiques permettent toutefois d\u2019accro\u00eetre la s\u00e9curit\u00e9 de ces fichier sensibles sous un environnement Linux :<\/p>\n<ul>\n<li>Forcer la demande de mot de passe\/passephrase \u00e0 un utilisateur d\u00e9di\u00e9 lors de l\u2019ex\u00e9cution du script. Certes cette m\u00e9thode n\u00e9cessite une intervention manuelle mais reste une des plus s\u00fbres.<\/li>\n<li>Pour les scripts en t\u00e2ches panifi\u00e9es, ceux-ci doivent \u00eatre autonomes et ne doivent pas n\u00e9cessiter d\u2019intervention manuelle. Ainsi, ces scripts sont g\u00e9n\u00e9ralement confin\u00e9s dans des r\u00e9pertoires du syst\u00e8me prot\u00e9g\u00e9s (\/root) afin d\u2019\u00eatre uniquement ex\u00e9cutables\/modifiables par un utilisateurs aux permissions suffisantes.<\/li>\n<li>Les mots de passes contenus dans ces fichiers sont tr\u00e8s souvent chang\u00e9s et complexifi\u00e9s lors d\u2019une mise en production.<\/li>\n<li><strong>Enfin, il est possible de chiffrer ces scripts afin d\u2019amoindrir les chances d\u2019en visualiser le contenu (et les mots de passes) en clairs.<\/strong><\/li>\n<\/ul>\n<p>Une solution existe depuis plusieurs ann\u00e9es, permettant de transformer un script \u00ab\u00a0*.sh\u00a0\u00bb en un binaire dont le code source du script initial est enti\u00e8rement chiffr\u00e9 et embarqu\u00e9 dans ce binaire. L\u2019id\u00e9e est d\u2019emp\u00eacher la visualisation du code source du script en clair et de d\u00e9courager certains curieux aux actions malveillantes.<\/p>\n<p>La solution se nomme \u00ab\u00a0<a title=\"shc\" href=\"http:\/\/www.datsi.fi.upm.es\/~frosal\/\" target=\"_blank\">shc<\/a>\u00a0\u00bb pour \u00ab\u00a0SHell Compiler\u00a0\u00bb. Ce petit outil OpenSource d\u00e9velopp\u00e9 par Francisco Javier Rosales Garcia dont la derni\u00e8re version en date est la 3.8.9 permet de chiffrer n\u2019importe quel script interpr\u00e9t\u00e9 sous un terminal Linux.<\/p>\n<p>Pour s&#8217;en \u00e9quiper, t\u00e9l\u00e9charger la derni\u00e8re version et compiler l&#8217;outil :<\/p>\n<p>[bash]&amp;lt;\/p&amp;gt;<br \/>\n&amp;lt;p&amp;gt;wget -q http:\/\/www.datsi.fi.upm.es\/~frosal\/sources\/shc-3.8.9.tgz&amp;lt;br \/&amp;gt;<br \/>\ntar zxvf shc-3.8.9.tgz&amp;lt;br \/&amp;gt;<br \/>\ncd shc-3.8.9&amp;lt;br \/&amp;gt;<br \/>\nln -s shc-3.8.9.c shc.c&amp;lt;br \/&amp;gt;<br \/>\nmake&amp;lt;\/p&amp;gt;<br \/>\n&amp;lt;p&amp;gt;[\/bash]<\/p>\n<p>L&#8217;aide de SHc renseigne sur son utilisation :<\/p>\n<p>[bash]&amp;lt;\/p&amp;gt;<br \/>\n&amp;lt;p&amp;gt;root@server:~\/shc\/shc-3.8.9# shc -h&amp;lt;br \/&amp;gt;<br \/>\nshc Version 3.8.9, Generic Script Compiler&amp;lt;br \/&amp;gt;<br \/>\nshc Copyright (c) 1994-2012 Francisco Rosales &amp;amp;lt;frosal@fi.upm.es&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\nshc Usage: shc [-e date] [-m addr] [-i iopt] [-x cmnd] [-l lopt] [-rvDTCAh] -f script&amp;lt;br \/&amp;gt;<br \/>\n-e %s Expiration date in dd\/mm\/yyyy format [none]&amp;lt;br \/&amp;gt;<br \/>\n -m %s Message to display upon expiration [&amp;amp;quot;Please contact your provider&amp;amp;quot;]&amp;lt;br \/&amp;gt;<br \/>\n -f %s File name of the script to compile&amp;lt;br \/&amp;gt;<br \/>\n -i %s Inline option for the shell interpreter i.e: -e&amp;lt;br \/&amp;gt;<br \/>\n -x %s eXec command, as a printf format i.e: exec(&#8216;%s&#8217;,@ARGV);&amp;lt;br \/&amp;gt;<br \/>\n -l %s Last shell option i.e: &#8211;&amp;lt;br \/&amp;gt;<br \/>\n -r Relax security. Make a redistributable binary&amp;lt;br \/&amp;gt;<br \/>\n -v Verbose compilation&amp;lt;br \/&amp;gt;<br \/>\n -D Switch ON debug exec calls [OFF]&amp;lt;br \/&amp;gt;<br \/>\n -T Allow binary to be traceable [no]&amp;lt;br \/&amp;gt;<br \/>\n -C Display license and exit&amp;lt;br \/&amp;gt;<br \/>\n -A Display abstract and exit&amp;lt;br \/&amp;gt;<br \/>\n -h Display help and exit&amp;lt;br \/&amp;gt;<br \/>\nEnvironment variables used:&amp;lt;br \/&amp;gt;<br \/>\n Name Default Usage&amp;lt;br \/&amp;gt;<br \/>\n CC cc C compiler command&amp;lt;br \/&amp;gt;<br \/>\n CFLAGS C compiler flags&amp;lt;br \/&amp;gt;<br \/>\nPlease consult the shc(1) man page.&amp;lt;\/p&amp;gt;<br \/>\n&amp;lt;p&amp;gt;[\/bash]<\/p>\n<p>Pour illustrer le fonctionnement de SHc, voici un simple script (totalement inutile) qui contient des informations sensibles. Ce script est vou\u00e9 \u00e0 un d\u00e9ploiement en production :<\/p>\n<p>[bash]&amp;lt;\/p&amp;gt;<br \/>\n&amp;lt;p&amp;gt;#!\/bin\/bash&amp;lt;br \/&amp;gt;<br \/>\n# This script is very critical !&amp;lt;br \/&amp;gt;<br \/>\necho &amp;amp;quot;I&#8217;m a super critical and private script !&amp;amp;quot;&amp;lt;br \/&amp;gt;<br \/>\nPASSWORDROOT=&amp;amp;quot;SuPeRrOoTpAsSwOrD&amp;amp;quot;&amp;lt;br \/&amp;gt;<br \/>\nmyService &#8211;user=root &#8211;password=$PASSWORDROOT &amp;amp;gt; \/dev\/null 2&amp;amp;gt;&amp;amp;amp;1&amp;lt;\/p&amp;gt;<br \/>\n&amp;lt;p&amp;gt;[\/bash]<\/p>\n<p>SHc permet de chiffrer le code source pr\u00e9c\u00e9dent du script afin de concevoir un binaire autonome qui r\u00e9alise les t\u00e2ches \u00e9quivalentes :<\/p>\n<p>[bash]&amp;lt;\/p&amp;gt;<br \/>\n&amp;lt;p&amp;gt;[root@server:~\/scripts\/shc]$ .\/shc -v -r -f myScript.sh&amp;lt;br \/&amp;gt;<br \/>\nshc shll=bash&amp;lt;br \/&amp;gt;<br \/>\nshc [-i]=-c&amp;lt;br \/&amp;gt;<br \/>\nshc [-x]=exec &#8216;%s&#8217; &amp;amp;quot;$@&amp;amp;quot;&amp;lt;br \/&amp;gt;<br \/>\nshc [-l]=&amp;lt;br \/&amp;gt;<br \/>\nshc opts=&amp;lt;br \/&amp;gt;<br \/>\nshc: cc myScript.sh.x.c -o myScript.sh.x&amp;lt;br \/&amp;gt;<br \/>\nshc: strip myScript.sh.x&amp;lt;br \/&amp;gt;<br \/>\nshc: chmod go-r myScript.sh.x&amp;lt;\/p&amp;gt;<br \/>\n&amp;lt;p&amp;gt;[root@server:~\/scripts\/shc]$ ll myScript.sh*&amp;lt;br \/&amp;gt;<br \/>\n-rwxr-xr-x 1 root root 191 2013-07-18 17:03 myScript.sh*&amp;lt;br \/&amp;gt;<br \/>\n-rwx&#8211;x&#8211;x 1 root root 10508 2013-07-18 17:06 myScript.sh.x*&amp;lt;br \/&amp;gt;<br \/>\n-rw-r&#8211;r&#8211; 1 root root 10421 2013-07-18 17:06 myScript.sh.x.c&amp;lt;\/p&amp;gt;<br \/>\n&amp;lt;p&amp;gt;[\/bash]<\/p>\n<p>A la suite de l&#8217;ex\u00e9cution de SHc, deux fichiers sont produits :<\/p>\n<ul>\n<li>Le binaire qui embarque la source du script Sh initial, chiffr\u00e9e et ex\u00e9cutable. L&#8217;extension de ce fichier est &#8220;*.sh.x&#8221;<\/li>\n<li>Le code source en C, g\u00e9n\u00e9r\u00e9 \u00e0 la vol\u00e9e par SHc, correspondant au binaire prot\u00e9g\u00e9. Ce code source porte l&#8217;extension &#8220;*.sh.x.c&#8221;.<\/li>\n<\/ul>\n<p>On notera que le binaire chiffr\u00e9 r\u00e9alise exactement les m\u00eames actions que le script initial :<\/p>\n<p>[bash]&amp;lt;\/p&amp;gt;<br \/>\n&amp;lt;p&amp;gt;[root@server:~\/scripts\/shc]$ .\/myScript.sh&amp;lt;br \/&amp;gt;<br \/>\nI&#8217;m a super critical and private script !&amp;lt;br \/&amp;gt;<br \/>\n[root@server:~\/scripts\/shc]$ .\/myScript.sh.x&amp;lt;br \/&amp;gt;<br \/>\nI&#8217;m a super critical and private script !&amp;lt;\/p&amp;gt;<br \/>\n&amp;lt;p&amp;gt;[\/bash]<\/p>\n<p>La version actuelle de SHc g\u00e9n\u00e8re un code C &#8220;*.sh.x.c&#8221; qui varie \u00e0 chaque ex\u00e9cution. La d\u00e9claration des variables et les vecteurs cryptographiques est al\u00e9atoire \u00e0 chaque protection. L&#8217;utilisation du &#8220;-r&#8221; permet d&#8217;\u00e9tendre la compatibilit\u00e9 du binaire chiffr\u00e9 vers d&#8217;autres plateformes.<\/p>\n<p>La version binaire chiffr\u00e9 peut \u00eatre plac\u00e9e sur un serveur de production afin d\u2019augmenter la s\u00e9curit\u00e9 de celui-ci. Bien \u00e9videmment, il est conseill\u00e9 de conserver le script original dont la source est accessible.<\/p>\n<p>Le fonctionnement g\u00e9n\u00e9ral de shc est le suivant :<\/p>\n<ul>\n<li>Analyse du script en entr\u00e9e<\/li>\n<li>Chiffrement de son code source \u00e0 l\u2019aide d\u2019une cl\u00e9 RC4 unique<\/li>\n<li>G\u00e9n\u00e9ration d\u2019un code source C dont la structure est al\u00e9atoire<\/li>\n<li>Ce code source C contient la version chiffr\u00e9e du code source du script Bash\/Sh initial, ainsi que les vecteurs cl\u00e9s de d\u00e9chiffrement.<\/li>\n<li>Ce code source C contient \u00e9galement l\u2019algorithme inverse de d\u00e9chiffrement<\/li>\n<li>Ce code source \u00ab\u00a0*.x.c\u00a0\u00bb est compil\u00e9 pour donner un binaire final.<\/li>\n<li>A l\u2019ex\u00e9cution de ce binaire, les variables chiffr\u00e9es qu\u2019il renferme sont d\u00e9chiffr\u00e9es \u00e0 la vol\u00e9e avec la cl\u00e9 qu\u2019il contient \u00e9galement. Puis la source d\u00e9chiffr\u00e9e est interpr\u00e9t\u00e9e directement via \u00ab\u00a0execvp()\u00a0\u00bb pour produire le r\u00e9sultat attendu.<\/li>\n<\/ul>\n<p>L\u2019outil shc permet \u00e9galement d\u2019int\u00e9grer une notion de validit\u00e9 temporelle du script. Au del\u00e0 d\u2019une certaine date (temps d\u2019utilisation), son ex\u00e9cution est bloqu\u00e9e pour laisser place \u00e0 un message arbitraire.<\/p>\n<p>Cet outil am\u00e9liore sensiblement la s\u00e9curit\u00e9 des scripts sensibles qui sont d\u00e9ploy\u00e9s sur des serveurs unix de production. Toutefois, il convient de garder \u00e0 l&#8217;esprit que le binaire produit par SHc est &#8220;stand-alone&#8221;. Ce qui signifie qu&#8217;il est totalement ind\u00e9pendant pour son ex\u00e9cution. Il contient par cons\u00e9quent la source du script Sh initial (chiffr\u00e9e), ainsi que tout le mat\u00e9riel cryptographique n\u00e9cessaire au d\u00e9chiffrement et \u00e0 sa propre ex\u00e9cution. Il est donc tout \u00e0 fait possible de r\u00e9g\u00e9n\u00e9rer le script sh initial en n&#8217;ayant que le binaire prot\u00e9g\u00e9.<\/p>\n<p>Pour illustrer ces propos, un article d\u00e9di\u00e9 sur le d\u00e9chiffrement manuel d&#8217;un script &#8220;*.sh.x&#8221; prot\u00e9g\u00e9 par SHc appara\u00eetra tr\u00e8s prochainement.<\/p>\n<p><strong>Sources &amp; ressources :<\/strong><\/p>\n<ul>\n<li><a title=\"SHc\" href=\"http:\/\/www.datsi.fi.upm.es\/~frosal\/\" target=\"_blank\">SHc \u2013 Francisco Javier Rosales Garcia<\/a><\/li>\n<li><a title=\"Admin-Linux\" href=\"http:\/\/www.admin-linux.fr\/?p=7656\" target=\"_blank\">SHc : Prot\u00e9ger les sources de scripts shell \u2013 Admin-Linux<\/a><\/li>\n<li><a title=\"Tux-Planet\" href=\"http:\/\/www.tux-planet.fr\/shc-shell-script-compiler\/\" target=\"_blank\">SHc \u2013 Shell script compiler<\/a><\/li>\n<li><a title=\"Limitations of shc\" href=\"http:\/\/www.linuxjournal.com\/article\/8256?page=0,0\" target=\"_blank\">Limitations of shc, a Shell Encryption Utility<\/a><\/li>\n<\/ul>\n<p><\/p>","protected":false},"excerpt":{"rendered":"<p>Nombreux sont ceux qui esp\u00e8re trouver la solution ultime pour prot\u00e9ger les diff\u00e9rents scripts Bash\/Sh qu&#8217;ils produisent. Il n&#8217;est pas [&hellip;]<\/p>\n","protected":false},"author":1337,"featured_media":1134,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[59,57,56,165,16],"tags":[358,219,359,363,360,362,365,357,34,364,366,361],"class_list":["post-1007","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administration-reseaux-et-systemes","category-cryptographie","category-cryptologie","category-os","category-prog-and-dev","tag-sh-x","tag-bash","tag-bash-encrypted","tag-generic-script-compiler","tag-rc4","tag-script-bash-protected","tag-sh","tag-shc","tag-shell","tag-shell-compiler","tag-unix","tag-unshc"],"_links":{"self":[{"href":"https:\/\/www.asafety.fr\/en\/wp-json\/wp\/v2\/posts\/1007","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.asafety.fr\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.asafety.fr\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.asafety.fr\/en\/wp-json\/wp\/v2\/users\/1337"}],"replies":[{"embeddable":true,"href":"https:\/\/www.asafety.fr\/en\/wp-json\/wp\/v2\/comments?post=1007"}],"version-history":[{"count":11,"href":"https:\/\/www.asafety.fr\/en\/wp-json\/wp\/v2\/posts\/1007\/revisions"}],"predecessor-version":[{"id":1756,"href":"https:\/\/www.asafety.fr\/en\/wp-json\/wp\/v2\/posts\/1007\/revisions\/1756"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.asafety.fr\/en\/wp-json\/wp\/v2\/media\/1134"}],"wp:attachment":[{"href":"https:\/\/www.asafety.fr\/en\/wp-json\/wp\/v2\/media?parent=1007"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.asafety.fr\/en\/wp-json\/wp\/v2\/categories?post=1007"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.asafety.fr\/en\/wp-json\/wp\/v2\/tags?post=1007"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}