2016-03-04 2 views
2

J'ai travaillé sur un projet qui utilise des PID, /proc et l'analyse en ligne de commande pour valider les processus sur un système. Mon code a dû être vérifié par les gars de la sécurité qui ont réussi à le casser avec une seule ligne ... embarrassant!Pourquoi est-il permis de modifier argv [0]?

#!/usr/bin/env perl 

$0="I am running wild"; # I had no clue you can do this! 

system("cat /proc/$$/cmdline"); 
print("\n"); 
system("ps -ef | grep $$"); 

# do bad stuff here... 

Mes questions:

  1. Je vois certains usages cas pour ce qui précède, comme les mots de passe cacher données sur la ligne de commande (aussi mauvaise pratique) mais je vois beaucoup plus de problèmes/problèmes quand on peut cacher les processus et parodie cmdline. Y at-il une raison pour laquelle cela est autorisé? N'est-ce pas une vulnérabilité du système?

  2. Comment puis-je empêcher ou détecter cela? J'ai regardé dans les options de montage /proc. Je sais aussi que l'on peut utiliser lsof pour identifier les processus usurpés basés sur un comportement inattendu, mais cela ne marchera pas dans mon cas. Pour l'instant j'utilise une méthode simple pour détecter si le cmdline contient au moins un caractère nul (\0) qui suppose qu'au moins un argument est présent. Dans le code ci-dessus, les espaces doivent être remplacés par des zéros pour contourner cette vérification qui est quelque chose que je ne pouvais pas trouver comment implémenter en perl - écrit jusqu'à la première \0.

Merci

+0

Prévenir ou détecter quoi? Lorsque les processus ont été renommés? À quelle fin? – Sobrique

Répondre

5

Pour répondre à 1:

Il est à cause de la façon dont commencer un nouveau processus fonctionne réellement.

Vous fork() frayer une instance en double de votre processus en cours, et vous exec() pour commencer la nouvelle chose - il remplace votre processus en cours avec le processus « nouveau », et par conséquent - il a à réécrire $0.

Ceci est en fait très utile lorsque vous exécutez du code parallèle - je le fais assez souvent quand le code est fork(), car il est facile de repérer quelle 'chose' est bloquée/en cours d'exécution.

.: par exemple

use Parallel::ForkManager; 
my $manager = Parallel::ForkManager -> new (10); 

foreach my $server (@list_of_servers) { 
    $manager -> start and next; 
    $0 = "$0 child: ($server)"; 
    #do stuff; 
    $manager -> finish; 
} 

Vous pouvez voir instantanément dans votre liste ps ce qui se passe. Vous verrez ce genre de comportement avec de nombreux services multitraitement comme httpd.

Mais ce n'est pas une vulnérabilité, sauf si vous supposez que c'est quelque chose que ce n'est pas (comme vous le faites). Pas plus que de pouvoir 'mv' un binaire de toute façon. Quoi qu'il en soit, pour répondre à 2 ... empêcher ou détecter quoi? Je veux dire, vous ne pouvez pas dire ce que fait un processus depuis la ligne de commande, mais vous ne pouvez pas dire ce qu'il fait de toute façon (il y a plein de façons de faire quelque chose de bizarre derrière la scène).

La réponse est: faites confiance à votre modèle de sécurité. N'exécutez pas de code non fiable dans un contexte privilégié, et c'est en grande partie hors de propos ce qu'ils appellent. Bien sûr, vous pouvez écrire des messages grossiers dans la liste des processus, mais il est assez évident de savoir qui le fait.

+0

Salut Sobrique.Je vois ce que vous dites et j'avoue que j'utilise le 'cmdline' probablement pour quelque chose que je ne devrais pas (voir [celui-ci] (http://stackoverflow.com/questions/34380618/password-management-for-non- processus interactif)). Je vois aussi l'utilité de cela dans le traitement parallèle. Ma deuxième question est plus sur si je peux détecter que la cmdline a été modifiée à quelque chose d'autre que la première/valeur originale – urban

+0

Mais c'est tout processus. Le "parent" de chaque processus sur votre système est finalement 'init'. Tout le reste a fait une fourchette et exec à partir de là - et dans le processus, a changé son nom. Les fichiers ne connaissent pas leur propre nom, les noms correspondent à la façon dont la structure du répertoire trouve un inode particulier. Ainsi, les processus ne connaissent pas non plus leur propre nom, mis à part mettre 0 $ à quelque chose de approprié. – Sobrique

+0

Je vois ... c'est logique ... et j'avais peur que ce soit le cas - j'accepte votre réponse puisque vous couvrez les deux questions. Les informations techniques que vous fournissez sont également très appréciées - applaudissements pour cela :) – urban