Limitando as bibliotecas do sistema que um programa pode usar

3

Eu tenho um programa que roda no Linux. O programa trava se uma determinada biblioteca existir no sistema, mas é executada normalmente se a biblioteca não estiver presente. (Parece apenas procurar pela biblioteca na primeira execução, mas não se importa se não consegue encontrá-la. Se a biblioteca estiver presente durante as execuções subseqüentes, o programa parece ignorá-la.)

Eu gostaria de limitar as bibliotecas que o programa pode usar em tempo de execução. Como posso conseguir isso?

Restrições e possibilidades :

  • não consigo modificar o programa.
  • Não consigo atualizar ou alterar as bibliotecas existentes no sistema.
  • Eu posso envolver o programa em um script de shell ou chamá-lo do meu próprio programa.

Editar: É um derivado modificado do Firefox que não está publicamente disponível. De fato, como Faheem Mitha suspeita, parece estar criando algo no perfil do usuário. Não tenho certeza do que é neste momento.

    
por Steve Kalemkiewicz 08.05.2016 / 16:01

2 respostas

2

Você pode executar o programa em chroot , o que forçará o carregador a usar apenas as bibliotecas que você copiou para o ambiente restrito.

Leitura adicional:

por 08.05.2016 / 16:46
2

Dado que o programa se lembra de usar a biblioteca entre execuções, ele deve armazenar essas informações em um arquivo de configuração em algum lugar. Como sugerido por Faheem Mitha , sua melhor aposta é encontrar esse arquivo de configuração e criá-lo antes de executar o programa.

A execução do programa com strace deve informar quais arquivos são carregados:

strace -o myprogram.strace -e open,access myprogram

Se você precisar alterar a maneira como o programa funciona, essa situação exigirá LD_PRELOAD . Você precisará encontrar qual chamada de biblioteca (não chamada de sistema!) O programa faz para determinar se deve carregar o arquivo. O comando ltrace pode ajudar. Por exemplo, se o programa chamar dlopen , substitua a função dlopen para retornar um erro se o programa tentar abrir essa biblioteca específica. Aviso: código não testado.

#define _GNU_SOURCE
#include <dlfcn.h>
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
int dlopen(const char *filename, int flags) {
    int (*original_dlopen)(const char *, int) = dlsym(RTLD_NEXT, "dlopen");
    if (!strcmp(filename, PATH_TO_HIDE)) {
        return NULL;
    }
    return original_fopen(path, mode);
}

Compile com

gcc -DPATH_TO_HIDE='"libfoo.so"' -O -Wall -fPIC -shared -o hide_libfoo.so hide_library.c -dl

Execute o programa da seguinte forma:

LD_PRELOAD=./hide_libfoo.so ./myprogram
    
por 09.05.2016 / 01:05