Modification des arguments de la ligne de commande pour qu’ils ne soient pas visibles dans la sortie ps

J’ai un exécutable qui accepte certains arguments de ligne de commande. Tout utilisateur de la machine peut trouver les arguments en faisant un ps (Unix) ou procexp (Windows). Certains de ces arguments sont des mots de passe. Je sais que nous ne devrions pas passer des mots de passe comme ça.

Existe-t-il un moyen de modifier le code de l’exécutable pour que les autres utilisateurs de ps / procexp ne puissent pas voir les arguments de ligne de commande utilisés pour lancer l’exécutable?

Je suis sûr qu’il n’existe pas de moyen indépendant pour ce faire, mais même s’il existe une API spécifique à chaque plate-forme, ce sera un bon sharepoint départ. J’ai hâte d’entendre vos commentaires, suggestions ou pensées.

Cordialement,

Cendre

    Cet exemple d’ init me donne une faille de segmentation

    Celui-ci, cependant, fonctionne:

     int main(int argc, char *argv[]) { char * argv0 = argv[0]; int i; size_t len; for (i = 0; i  

    Vous essayez de rendre une solution peu sûre légèrement plus sûre. Pourquoi ne pas simplement le rendre plus sûr?

    Un rapide hack consisterait à écrire le mot de passe dans un fichier défini sur des permissions restreintes et à le supprimer immédiatement après sa lecture par l’exécutable appelé. Si le fichier est écrit sur le disque, vous avez toujours le risque que les bits existent toujours sur le disque dur. Mais vous pouvez éliminer ce problème en utilisant un disque virtuel.

    Ou vous pouvez donner à l’exécutable une clé privée et chiffrer le mot de passe à l’aide de la clé publique correspondante. C’est un peu plus de travail, mais beaucoup plus sécurisé. Alors, bien sûr, vous avez le problème de la gestion des clés.

    Toute méthode qui consiste à effacer l’ argv affichée dans la sortie ps aura une condition de concurrence, elle ne peut donc pas être sécurisée. Autrement dit, il y a un intervalle de temps après le début du processus, mais avant qu’il ne puisse effacer ses arguments publiquement visibles.

    Si vous avez besoin de cette fonctionnalité (passer des mots de passe sur la ligne de commande, ce qui est une très mauvaise idée), vous devez utiliser un kernel renforcé qui vous permet de désactiver complètement la lecture des arguments de ligne de commande ou même de désactiver complètement la fonctionnalité ps . Un moyen peu coûteux de le faire (mais cela pourrait casser des choses) est de démonter /proc .

    Vous pouvez écrire le mot de passe dans un fichier protégé en lecture, puis y accéder depuis le nouvel exécutable, plutôt que de le passer en argument. ps n’est pas votre seul ennemi, comme le montre le commentaire de meagar.

    Je pense que la réponse de base est probablement de ne pas transmettre les données sur la ligne de commande et d’utiliser plutôt un RPC. stdin est le RPC d’un homme pauvre, tout comme l’écriture dans un fichier que vous supprimez, et il existe des méthodes plus sophistiquées.

    Sous Windows, par exemple, si vous étiez vraiment préoccupé par la sécurité, je vous suggère d’utiliser un canal nommé, auquel vous pouvez appliquer des permissions de sécurité et chiffrer les données, si vous le souhaitez. Vous pourriez probablement également utiliser la mémoire partagée, pour une approche un peu plus portable.

    Toute solution RPC nécessite évidemment de modifier les deux côtés de la communication, bien évidemment. Essayer de masquer les données en modifiant le système d’exploitation pour empêcher les opérations normales, ou en s’appuyant sur un comportement d’exécution non documenté, semble être une mauvaise idée du sharepoint vue de la sécurité.

    J’espère que cela pourra aider.

    Certaines versions d’ init écraseront leur ligne de commande afin qu’elles apparaissent comme init dans une liste ps .

     int main(int argc, char * argv[]) { // process the arguments or make a copy of them // and then char * argv0 = argv[0]; while (*argv++) { size_t len = strlen(*argv); memset(*argv, 0, len); } strcpy(argv0, "init"); 

    J’ai été surpris de voir ce genre de chose être utilisé et qu’un * nix pourrait être conçu de telle manière qu’il puisse fonctionner. Je n’ai pas testé pour voir si cela fonctionnait, mais j’ai lu qu’il devait s’agir de la mémoire d’actural dans laquelle se trouvaient les arguments, et que copier uniquement le tableau de pointeurs sur ces arguments ne fonctionnerait pas.

    C’est toujours une façon cassée de faire passer des informations sensibles via une ligne de commande (ou des variables d’environnement, car celles-ci sont accessibles dans /proc//environ comme argv est dans /proc//cmdline sous Linux).

    Si la ligne de commande du mot de passe est utilisée, vous pouvez demander au programme de s’exécuter lui-même et de transmettre les informations à la seconde instance et de tuer le premier, réduisant ainsi le temps pendant lequel les informations de la ligne de commande sont présentes.

    La seule bonne réponse est de ne pas les laisser passer les informations sur la ligne de commande.

    Je lis généralement toutes les données sensibles de stdin. Par exemple, dans isql (shell Sybase SQL) sous Linux, je fais quelque chose comme:

     isql -U username <