2011-05-18 9 views
7

¿Cómo puedo ocultar el argumento de la línea de comando para el programa C que se ejecuta en Linux para que no sean visibles para otros usuarios mediante "w", "ps auxwww" o comandos similares?Ocultar argumentos de la línea de comando para el programa C en Linux

+0

Me han dicho que mysql oculta la contraseña cuando un usuario la escribe en la línea de comandos, por lo que 'w' o' ps' no la mostrará. Tal vez podrías tratar de ver cómo lo logra (es decir, cuando se llama como 'mysql -u foobar -ppassword',' w' o comandos similares muestran 'mysql -u foobar -pxxxxxx'. Aparte de eso no puedo ayudarte (pero estoy de acuerdo con @paxdiablo, si no desea que sean visibles, no use esa información como argumento de línea de comando). –

+0

https://serverfault.com/questions/592744/how-to-hide-a -password-passed-as-command-line-argument – Marcel

Respuesta

7

De hecho, es bastante difícil (dejaré de corta de decir imposible, ya que no puede ser una manera que no soy consciente de) al hacer esto, especialmente si un usuario tiene acceso al sistema de archivos /proc para su proceso .

Tal vez la mejor manera de evitar que la gente vea a sus argumentos de línea de comandos es la de no utilización argumentos de línea de comandos :-)

Se podía esconder sus argumentos en un archivo protegido adecuadamente llamada (por ejemplo) a continuación myargs.txt ejecutar su programa con:

myprog @myargs.txt 

Por supuesto, usted tiene que modificar myprog para manejar los "argumentos en un archivo" escenario.

Como alternativa, puede establecer los argumentos en variables de entorno y hacer que su programa use getenv.

Sin embargo, no conozco ningún método que pueda protegerlo de un proceso habilitado adecuado (como uno ejecutado por root).

+1

No creo que sea tan difícil.Si mal no recuerdo, la mayoría de los parches de mejora de seguridad para Linux agregan una opción para cambiar los permisos en las entradas '/ proc/NNNNN' a' 0700', e incluso podría haber una opción de montaje para él en el kernel predeterminado hoy en día . (La única razón por la que estoy escribiendo esto como un comentario en lugar de una respuesta es que no lo he comprobado). –

+1

Incluso si oculta sus archivos en un archivo, todavía tiene un programa ejecutándose durante una fracción de segundo con los args visibles antes de que estén escondidos. si un usuario ejecuta el comando w en el momento justo, aún no están protegidos. –

+0

¿Alguien puede confirmar que/proc/NNNNN es el único lugar que contiene argumentos de línea de comando? ¿Y hay alguna manera de cambiar los permisos solo para/proc/NNNNN solo para algún proceso en particular (es decir, el proceso de inicio con estos permisos modificados?) Cualquier enlace con más información sería apreciado. – celicni

0

Por lo que sé, esa información se almacena en el espacio del kernel. A menos que escriba un módulo kernel, no podrá ocultar esta información porque cualquier programa puede consultar el sistema de archivos proc para ver los argumentos de línea de comandos (esto es lo que hace ps).

Como alternativa, puede leer en la línea de comandos args en stdin y completar una matriz para pasar al manejador de argumentos de línea de comandos. O, mejor aún, agregue soporte para su programa para leer un archivo de configuración que contenga la misma información de argumento de línea de comando y establezca los permisos para que solo el propietario pueda leer el archivo.

Espero que esto ayude.

8

modificar el contenido de argv en su programa:

#include <stdio.h> 
#include <time.h> 

void delay (long int msecs) 
{ 
     clock_t delay = msecs * CLOCKS_PER_SEC/1000; 
     clock_t start = clock(); 
     while (clock() - start < delay); 
} 

void main (int argc, char **argv) 
{ 
    if (argc == 2) 
    { 
     printf ("%s\n", argv[1]); 
     delay (6000); 

     argv[1][0] = 'x'; 
     argv[1][1] = '.'; 
     argv[1][2] = 'x'; 

     printf ("%s\n", argv[1]); 
     delay (5000); 
     printf ("done\n"); 
    } 
    else printf ("argc != 1: %d\n", argc); 
} 

Invocación:

./argumentClear foo 
foo 
x.x 
done 

resultado, viewn por ps:

asux:~ > ps auxwww | grep argu 
stefan 13439 75.5 0.0 1620 352 pts/5 R+ 17:15 0:01 ./argumentClear foo 
stefan 13443 0.0 0.0 3332 796 pts/3 S+ 17:15 0:00 grep argu 
asux:~ > ps auxwww | grep argu 
stefan 13439 69.6 0.0 1620 352 pts/5 R+ 17:15 0:02 ./argumentClear x.x 
stefan 13446 0.0 0.0 3332 796 pts/3 S+ 17:15 0:00 grep argu 

Observación: Mi retraso de la función doesn' t funciona como se esperaba En lugar de 11 segundos, el programa se ejecuta en aproximadamente 2-3. No soy el gran C-programador. :) La función de retardo necesita mejoras aquí.

+1

Según Chris H, ¿no se ejecutaría 'ps auxwww' en el momento correcto (antes de que el programa modifique el argumento argv todavía revela los argumentos de la línea de comando? – celicni

+0

Bueno, por supuesto. Antes de que el programa oculte los parámetros, no están ocultos Como no conozco ningún programa, que pueda viajar a tiempo, ocultarlos en el pasado, tal vez pueda prohibir el uso de ps y otros programas, pero no sé cómo encontrar una lista de todos los programas conocidos. el usuario debe detenerse para escribir/instalar programas propios. O debe modificarse el kernel. Debería patear al usuario y detener sus procesos, iniciar el programa que modifica sus argumentos, antes de que el usuario vuelva a entrar. Si lo intenta, para ocultar las contraseñas, quizás el archivo sudoers con NOPASSWD ... –

+0

... y ssh con claves pre compartidas y hosts de confianza es una mejor solución. –

Cuestiones relacionadas