LD_PRELOAD가 작동하지 않고 LD_DEBUG가 아무것도 표시하지 않습니다.

LD_PRELOAD가 작동하지 않고 LD_DEBUG가 아무것도 표시하지 않습니다.

나는 함수 LD_PRELOAD를 재정의하는 데 사용했습니다 read. 가장 작은 테스트 앱의 경우에는 잘 작동하지만 더 큰 앱으로 테스트하면 더 이상 작동하지 않습니다. 또한 LD_DEBUG=all아무것도 표시하지 않습니다.

LD_DEBUG=all LD_PRELOAD=./lib.so ./big_app

이것은 단지 실행 ./big_app되고 LD_PRELOAD아무런 효과가 없습니다. 이것을 디버깅할 수 있는 방법이 있나요?

답변1

이 답변은 GNU/Linux 환경에만 유효합니다.

의견에 따르면 OP의 바이너리는 특권 기능, 즉 기능을 추가합니다. 이는 ld.so(8)다음으로 전환됩니다.안전 실행 모드어느기본적으로LD_PRELOAD및 를 포함한 대부분의 동적 링커 관련 환경 변수를 비활성화합니다 LD_DEBUG.

안전 실행 모드

보안상의 이유로 동적 링커가 바이너리가 다음 위치에서 실행되어야 한다고 결정하는 경우:안전한 실행 모드, 일부 환경 변수의 영향이 무효화되거나 수정됩니다.[...]

[...]에 다음이 포함된 경우 바이너리는 안전 실행 모드에서 실행됩니다.

  • 프로세스의 실제 및 유효 사용자 ID가 다르거나 실제 및 유효 그룹 ID가 다릅니다. [...]

  • 루트가 아닌 사용자 ID를 가진 프로세스가 기능 바이너리를 실행했습니다.이 과정에.

[...]

그러나뿌리다음 전제 조건을 충족하도록 구성할 수 있는 시스템에 액세스합니다.안전 실행 모드루트가 아닌 사용자로 실행할 때 이 두 매개변수에 대해서는 여전히 설명대로입니다.ld.so(8):

LD_PRELOAD

[...]

안전 실행 모드에서, 슬래시가 포함된 사전 로드 경로 이름은 무시됩니다. 또한,공유 개체는 표준 검색 디렉터리에서만 미리 로드됩니다.그리고사용자 ID 모드 비트를 설정할 수 있는 경우에만(일반적인 경우는 아님)

표준 검색 디렉토리란 무엇입니까? 그들은 출력을 제공합니다 ld.so --help. 예를 들어 Debian amd64/x86_64의 경우:

$ ld.so --help
[...]

Shared library search path:
  (libraries located via /etc/ld.so.cache)
  /lib/x86_64-linux-gnu (system search path)
  /usr/lib/x86_64-linux-gnu (system search path)
  /lib (system search path)
  /usr/lib (system search path)

[...]

마지막으로 공유 객체 파일은 다음 위치 중 하나에 있어야 합니다. 테스트에서:

  • u+s모드를 설정하는 한 루트가 소유할 필요는 없습니다 .
  • u+s기호 링크가 올바른 위치에 있는 한 이는 어디에서나 실제 파일에 대한 기호 링크가 될 수 있습니다 .
  • 에는 경로가 없어야 하며 위치가 LD_PRELOAD아닌 (a) 파일 이름만 있어야 합니다./
  • 바이너리의 기능이 파일을 읽을 수 있는 임의 액세스를 허용하지 않는 경우 공유 객체는 단일 사용자 또는 그룹만 허용되도록 모드를 설정할 수 있습니다( chmod o-rwx일반적으로 올바른 소유권을 적용하고 설정한 다음 u+s복원해야 합니다). setuid-root 또는 CAP_DAC_OVERRIDE/ 의 경우 CAP_DAC_READ_SEARCH이러한 권한 있는 바이너리를 실행하는 사용자가 라이브러리를 사용하는 것을 막을 수는 없습니다.

LD_DEBUG

[...]glibc 2.3.4부터,LD_DEBUG/etc/suid-debug파일이 존재 하지 않는 한 안전 실행 모드에서는 무시됩니다.(파일 내용은 상관없습니다.)

사용자나 그룹으로만 제한하는 방법을 찾지 못했습니다.

예(루트 액세스 사용 sudo):

$ sudo touch /etc/suid-debug
$ sudo cp -aiL ./lib.so /usr/lib/lib.so
$ sudo chmod u+s /usr/lib/lib.so

이제 일반 사용자로 실행을 허용하고 두 가지 변수를 고려하십시오.

LD_DEBUG=all LD_PRELOAD=lib.so ./big_app

답변2

실행 파일이 정적으로 빌드되었는지 확인해야 합니다. 그렇다면 LD 환경 변수는 아무런 영향을 미치지 않습니다.

ldd공유 객체 종속성을 보여주는 유틸리티인 를 사용하여 이를 확인할 수 있습니다 .

실행 파일이 정적이면 다음과 같이 인쇄되어야 합니다.

ldd ./big_app
not a dynamic executable

관련 정보