GNU/Linux >> Tutoriales Linux >  >> Linux

¿Es posible falsificar una ruta específica para un proceso?

LD_PRELOAD no es demasiado difícil, y no necesita ser root. Interponga su propia rutina C que se llama en lugar del verdadero open() en la biblioteca C. Su rutina verifica si el archivo a abrir es "/tmp/adb.log" y llama a la apertura real con un nombre de archivo diferente. Aquí está su shim_open.c:

/*
 * capture calls to a routine and replace with your code
 * gcc -Wall -O2 -fpic -shared -ldl -o shim_open.so shim_open.c
 * LD_PRELOAD=/.../shim_open.so cat /tmp/adb.log
 */
#define _FCNTL_H 1 /* hack for open() prototype */
#define _GNU_SOURCE /* needed to get RTLD_NEXT defined in dlfcn.h */
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <dlfcn.h>
#define OLDNAME "/tmp/adb.log"
#define NEWNAME "/tmp/myadb.log"

int open(const char *pathname, int flags, mode_t mode){
    static int (*real_open)(const char *pathname, int flags, mode_t mode) = NULL;

    if (!real_open) {
        real_open = dlsym(RTLD_NEXT, "open");
        char *error = dlerror();
        if (error != NULL) {
            fprintf(stderr, "%s\n", error);
            exit(1);
        }
    }
    if (strcmp(pathname,OLDNAME)==0) pathname = NEWNAME;
    fprintf(stderr, "opening: %s\n", pathname);
    return real_open(pathname, flags, mode);
}

Compílalo con gcc -Wall -O2 -fpic -shared -ldl -o shim_open.so shim_open.c y pruébalo poniendo algo en /tmp/myadb.log y ejecutando LD_PRELOAD=/.../shim_open.so cat /tmp/adb.log . Entonces prueba LD_PRELOAD en adb.


Aquí hay un ejemplo muy simple de usar util-linux de unshare para poner un proceso en un espacio de nombres de montaje privado y darle una vista diferente del mismo sistema de archivos que tiene actualmente su padre:

{   cd /tmp                      #usually a safe place for this stuff
    echo hey   >file             #some
    echo there >file2            #evidence
    sudo unshare -m sh -c '      #unshare requires root by default
         mount -B file2 file     #bind mount there over hey
         cat file                #show it
         kill -TSTP "$$"         #suspend root shell and switch back to parent
         umount file             #unbind there
         cat file'               #show it
    cat file                     #root shell just suspended
    fg                           #bring it back
    cat file2                    #round it off
}
there                            #root shell
hey                              #root shell suspended
hey                              #root shell restored
there                            #rounded

Puede darle a un proceso una vista privada de su sistema de archivos con el unshare utilidad en los sistemas Linux actualizados, aunque la instalación del espacio de nombres de montaje en sí misma ha sido bastante madura para toda la serie del kernel 3.x. Puede ingresar espacios de nombres preexistentes de todo tipo con nsenter utilidad del mismo paquete, y puede obtener más información con man .


Linux
  1. Linux:¿determinación del archivo específico responsable de la E/S alta?

  2. ¿La mejor herramienta de monitoreo de archivos de registro para Ubuntu Server?

  3. Cómo configurar Sudo sin contraseña para un usuario específico

  4. Cómo cambiar la ruta del archivo de registro auditd /var/log/audit/audit.log

  5. ¿Es posible usar / en un nombre de archivo?

8 comandos esenciales de navegación de archivos de Linux para nuevos usuarios

Sintaxis del archivo de configuración logrotate:¿son posibles múltiples entradas comodín?

¿Rotación de registro de stdout?

¿Es posible que un proceso daemon (es decir, en segundo plano) busque pulsaciones de teclas desde un teclado USB?

Encuentra qué proceso está modificando un archivo

Cómo encontrar el archivo .pid para un proceso dado