Linux에서 실행되는 프로그램이 있습니다. 특정 라이브러리가 시스템에 있으면 프로그램이 충돌하지만 라이브러리가 없으면 프로그램이 제대로 실행됩니다. (처음 실행 시에만 라이브러리를 찾는 것 같으나, 찾지 못해도 상관없습니다. 이후 실행 시 라이브러리가 존재하면 프로그램은 이를 무시하는 것으로 보입니다.)
내 프로그램이 런타임에 사용할 수 있는 라이브러리를 제한하고 싶습니다. 이 목표를 어떻게 달성할 수 있나요?
한계와 가능성:
- 프로그램을 수정할 수 없습니다.
- 내 시스템의 기존 라이브러리를 업그레이드하거나 변경할 수 없습니다.
- 프로그램을 쉘 스크립트로 래핑하거나 내 프로그램에서 호출할 수 있습니다.
편집하다:이는 Firefox의 수정된 파생물이며 공개적으로 사용할 수 없습니다. 실제로 Faheem Mitha가 의심한 것처럼 사용자 프로필에 무언가를 생성하는 것 같습니다. 지금은 어떤지 잘 모르겠습니다.
답변1
에서 프로그램을 실행할 수 있습니다 chroot
. 그러면 로더가 제한된 환경에 복사한 라이브러리만 사용하게 됩니다.
추가 자료:
- 루트 디렉터리 변경(아치)
- UNIX chroot() 작업에 대한 모범 사례
- chroot(데비안)
- 기본 Chroot(우분투)
- 3.13 Chroot Jail 구성 및 사용(오라클 리눅스)
답변2
프로그램은 실행 사이에 라이브러리가 사용되는지 여부를 기억하므로 이 정보를 구성 파일 어딘가에 저장해야 합니다. ~처럼Fahim Misa가 제안한가장 좋은 방법은 프로그램을 실행하기 전에 구성 파일을 찾아서 생성하는 것입니다.
프로그램 실행strace
어떤 파일이 로드되었는지 알려줄 것입니다:
strace -o myprogram.strace -e open,access myprogram
프로그램 작동 방식을 정말로 변경해야 하는 경우 이 상황에서는 다음이 필요합니다.LD_PRELOAD
. 파일을 로드할지 여부를 결정하려면 프로그램에서 수행하는 라이브러리 호출(시스템 호출이 아님)을 찾아야 합니다. 이 ltrace
명령이 도움이 될 수 있습니다. 예를 들어, 프로그램이 를 호출하는 경우 프로그램이 해당 특정 라이브러리 dlopen
를 dlopen
열려고 할 때 오류를 반환하도록 함수를 재정의합니다. 경고: 테스트되지 않은 코드입니다.
#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);
}
컴파일용
gcc -DPATH_TO_HIDE='"libfoo.so"' -O -Wall -fPIC -shared -o hide_libfoo.so hide_library.c -dl
실행 프로그램은 다음과 같습니다.
LD_PRELOAD=./hide_libfoo.so ./myprogram