![LD_PRELOAD가 작동하지 않고 LD_DEBUG가 아무것도 표시하지 않습니다.](https://linux55.com/image/224837/LD_PRELOAD%EA%B0%80%20%EC%9E%91%EB%8F%99%ED%95%98%EC%A7%80%20%EC%95%8A%EA%B3%A0%20LD_DEBUG%EA%B0%80%20%EC%95%84%EB%AC%B4%EA%B2%83%EB%8F%84%20%ED%91%9C%EC%8B%9C%ED%95%98%EC%A7%80%20%EC%95%8A%EC%8A%B5%EB%8B%88%EB%8B%A4..png)
나는 함수 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)
:
[...]
안전 실행 모드에서, 슬래시가 포함된 사전 로드 경로 이름은 무시됩니다. 또한,공유 개체는 표준 검색 디렉터리에서만 미리 로드됩니다.그리고사용자 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
이러한 권한 있는 바이너리를 실행하는 사용자가 라이브러리를 사용하는 것을 막을 수는 없습니다.
[...]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