LD_PRELOAD n'est pas trop difficile, et vous n'avez pas besoin d'être root.Interposez votre propre routine C qui est appelée à la place du vrai open()
dans la bibliothèque C. Votre routine vérifie si le fichier à ouvrir est "/tmp/adb.log" et appelle le vrai open avec un nom de fichier différent. Voici votre 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);
}
Compilez-le avec gcc -Wall -O2 -fpic -shared -ldl -o shim_open.so shim_open.c
et testez-le en mettant quelque chose dans /tmp/myadb.log
et exécutantLD_PRELOAD=/.../shim_open.so cat /tmp/adb.log
. Ensuite, essayez le LD_PRELOAD sur adb.
Voici un exemple très simple d'utilisation de util-linux
est unshare
pour placer un processus dans un espace de noms de montage privé et lui donner une vue différente du même système de fichiers que son parent possède actuellement :
{ 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
Vous pouvez donner à un processus une vue privée de son système de fichiers avec le unshare
utilitaire sur les systèmes Linux à jour, bien que la fonction d'espace de noms de montage elle-même ait été assez mature pour toute la série de noyaux 3.x. Vous pouvez entrer des espaces de noms préexistants de toutes sortes avec nsenter
utilitaire du même package, et vous pouvez en savoir plus avec man
.