Existe-t-il des méthodes pour vérifier ce que vous exécutez réellement à partir d'un script bash?
Supposons que votre script bash appelle plusieurs commandes (par exemple: tar
, mail
, scp
, mysqldump
) et vous êtes prêt à vous assurer que tar
le réel, réel tar
, qui est déterminable par l' root
utilisateur étant le fichier et le répertoire parent propriétaire et le seul avec des autorisations d'écriture et pas certains /tmp/surprise/tar
avec www-data
ou apache2
étant le propriétaire.
Bien sûr, je connais PATH
et l'environnement, je suis curieux de savoir si cela peut également être vérifié à partir d'un script bash en cours d'exécution et, si oui, comment exactement?
Exemple: (pseudo-code)
tarfile=$(which tar)
isroot=$(ls -l "$tarfile") | grep "root root"
#and so on...
bash
shell-script
shell
security
Miloš Đakonović
la source
la source
which
ne pas dire correctement ce quitar
va faire, comme l'a répondu xhienne, ills
pourrait être piraté pour renvoyer de fausses informations sur le ou les fichiers, le cas échéant.grep
Peut également être piraté pour renvoyer de fausses informations; cela pourrait être évité en utilisant la correspondance du shell à la place, mais le shell pourrait être piraté. Et le shell pourrait être piraté pour donner des résultats erronéstype
en premier lieu - ou remplacé entièrement car la remplaçabilité du shell était une innovation importante d'Unix par rapport aux systèmes d'exploitation vieux de 50 ans. Voir l'adresse Turing de 1984 de Ken Thompson. C'est des tortues tout le long.TE
) - qui a une base de données avec des signatures (c'est-à-dire plus étendue qu'une somme de contrôle MD5. Lorsque TE est actif ET qu'un fichier est dans la base de données, vous pouvez choisir si le programme s'exécute - ou avertit uniquement qu'il ne correspond pas à la base de données. En outre, il existe deux autres paramètres:TEP
(PATH d'exécution approuvé) etTLP
(CHEMIN LIBrary approuvé). Seuls les programmes dans TEP peuvent être exécutés et les bibliothèques ne peuvent être chargées qu'avec le répertoire est inclus dans TLP. Dans Linux I, il y a quelque chose appelé "AppArmor" qui peut vous aider.Réponses:
Au lieu de valider les binaires que vous allez exécuter, vous pouvez exécuter les bons binaires dès le départ. Par exemple, si vous voulez vous assurer de ne pas exécuter
/tmp/surprise/tar
, exécutez simplement/usr/bin/tar
votre script. Alternativement, définissez votre$PATH
valeur saine avant d'exécuter quoi que ce soit.Si vous ne faites pas confiance aux fichiers
/usr/bin/
et aux autres répertoires système, il n'y a aucun moyen de reprendre confiance. Dans votre exemple, vous vérifiez auprès du propriétairels
, mais comment savez-vous que vous pouvez faire confiancels
? Le même argument s'applique à d'autres solutions telles quemd5sum
etstrace
.Lorsqu'une confiance élevée dans l'intégrité du système est requise, des solutions spécialisées comme IMA sont utilisées. Mais ce n'est pas quelque chose que vous pourriez utiliser à partir d'un script: l'ensemble du système doit être configuré de manière spéciale, avec le concept de fichiers immuables en place.
la source
/bin
place de/usr/bin
.$PATH
ensuite ces deux chemins si la prise en charge de plusieurs distributions est nécessaire.Si un intrus a accédé à votre système et est en mesure de modifier votre
$PATH
(ce qui ne devrait/tmp
en aucun cas inclure ), il est trop tard pour commencer à vous soucier de la propriété des exécutables.Au lieu de cela, vous devriez lire comment gérer une intrusion .
Mieux vaut se concentrer sur l'évitement des intrusions.
Si vous avez un système où ce genre de choses est important, il peut être judicieux d'isoler les parties qui doivent être publiques des parties qui doivent être privées, ainsi que d'effectuer un audit des modes de communication entre ceux-ci.
la source
C'est possible dans une certaine mesure en vérifiant le
md5sum
fichier. Ainsi, sur les systèmes qui utilisent laapt
gestion des packages - dans mon cas particulier, Ubuntu 16.04 - il y a le fichier/var/lib/dpkg/info/tar.md5sums
, qui stocke les sommes md5 de tous les fichiers provenant de l'tar
installation. Vous pouvez donc écrire une simple instruction if qui vérifie si la sortie demd5sum /bin/tar
correspond à ce qui se trouve dans ce fichier.Cela suppose bien sûr que le fichier lui-même n'a pas été falsifié. Bien sûr, cela ne peut se produire que si l'attaquant a obtenu un accès root / sudo, auquel cas tous les paris sont désactivés.
la source
/usr/bin/md5sum
?/bin/tar
ou/usr/bin/tar
, il est très probable qu'il puisse également simplement remplacermd5sum
ou/var/lib/dpkg/info/tar.md5sums
. Ou$SHELL
.tar
pointant vers différents binaires, cela fonctionnera. Lorsqu'un système est compromis au niveau racine, vous avez alors une option - le neutraliser depuis l'orbiteOui, il existe une méthode: le builtin
type
. Contrairement à lawhich
commande qui ne recherche que dans votre PATH,type
vous dira si le nom de la commande est en fait un mot clé réservé, un builtin, un alias, une fonction ou un fichier disque.De plus
type -a
vous donnera tous les candidats à votre commandement (du premier au dernier choix):Enfin, si vous n'êtes concerné que par les binaires sur votre disque, vous pouvez utiliser
type -Pa
pour obtenir tous les binaires de votre PATH (même ordre que ci-dessus):Cela dit,
type
seul ne vous dira pas exactement quelle commande sera appelée à la fin. Par exemple, si votretar
est un alias qui appelle un binaire (par exemplealias tar="/tmp/tar"
), iltype
vous dira que c'est unalias
.la source
type -a
inclut tous les formulaires (par exemple, alias et programme externe)type
vous dira dans la mesure où bash le sait, mais si nous sommes sous le contrôle d'un attaquant malveillant, il n'y a aucune raison de croire que ce que bash pense qu'il sait reflète la vérité. Pour tout ce que vous savez, il existe unLD_PRELOAD
module interceptant chaque appel de bibliothèque C que vous effectuez.which
.enable
auparavant. J'ai utilisé les conseils de ces réponses pour exécutertype enable
pour découvrir qu'il s'agit d'un shell intégré, puishelp enable
pour voir ce qu'il fait.Vous pouvez vérifier quelles commandes sont exactement exécutées par un script à l'aide de
strace
. Par exemple:Avec le script suivant:
strace
vous indiquera le chemin exact des commandes exécutées lorsqu'il est utilisé avec le-e execve
paramètre:Paramètres (de strace man):
-f
: Trace les processus enfants tels qu'ils sont créés par les processus actuellement tracés à la suite des appels système fork (2), vfork (2) et clone (2). Notez que-p PID -f
va attacher tous les threads du processus PID s'il est multi-thread, pas seulement le thread avec thread_id = PID.-e trace=file
: Trace tous les appels système qui prennent un nom de fichier comme argument. Vous pouvez considérer cela comme une abréviation pour-e trace=open,stat,chmod,unlink,...
laquelle il est utile de voir à quels fichiers le processus fait référence. De plus, l'utilisation de l'abréviation garantira que vous n'oublierez pas accidentellement d'inclure un appel comme lstat dans la liste.la source
strace
n'a pas lui-même été renversé.Le système d'exploitation Linux est basé sur des fichiers et de nombreuses commandes exécutées sur linux résoudront probablement certains changements dans les fichiers situés sur votre machine. À cause de cela, c'est peut - être la meilleure solution à votre problème. Vous pouvez tester vos commandes pour tout changement sur le système de fichiers avant qu'il ne soit exécuté.
Il y a la commande 'strace' qui décompile votre commande en plusieurs parties ...
Si vous voulez vraiment aller plus loin, vous devez vérifier les décompilateurs pour les scripts qui vont être exécutés. En d'autres termes, vous devez vérifier l'interprétation par l'assembleur de cette commande. Pour bash là-bas
objdump -d
. Les scripts bin Linux sont principalement créés avecC
un langage de programmation, utilisez donc un bonC
décompilateur.la source