Linux의 동적 링커가 경로를 검색하는 순서는 무엇입니까?

Linux의 동적 링커가 경로를 검색하는 순서는 무엇입니까?

이것은 내가 사용할 때 알아차린 특이성을 다루고 있기 때문에 중복된 것이 아닙니다 /etc/ld.so.conf.

동적 링커가 라이브러리를 검색하는 경로를 얻으려면 명령을 실행합니다 ldconfig -v | grep -v "^"$'\t' | sed "s/:$//g". 언제 /etc/ld.so.conf경로가 나열되지 않습니다. 이전 명령의 출력은 다음과 같습니다.

/lib
/usr/lib

나는 그것이 /lib먼저 검색한 다음 검색한다고 생각했습니다 /usr/lib. 와 같은 새 경로를 추가한 다음 remake 를 추가하면 의 /usr/local/lib출력 /etc/ld.so.conf/etc/ld.so.cache다음과 ldconfig -v | grep -v "^"$'\t' | sed "s/:$//g"같습니다.

/usr/local/lib
/lib
/usr/lib

나열된 디렉토리가 위에서 아래로 검색되는 순서가 맞다면 /lib및 이전에 추가 디렉토리가 검색되기 때문에 이것이 이상하다고 생각합니다 /usr/lib. 신뢰할 수 있는 디렉토리 이전에 추가 디렉토리를 검색하는 것은 그 자체로는 이상하지 않지만 가 /lib이전에 검색되면 & 에서 & 이후에 & 가 검색되기 /usr/lib때문에 이상합니다 ./bin/sbin/usr/bin/usr/sbinPATH

에 나열된 경로를 아래에서 위로 검색하더라도 추가 디렉터리는 신뢰할 수 있는 디렉터리 다음에 검색되고 ldconfig -v | grep -Ev "^"$'\t' | sed "s/:$//g"는 이후에 검색되기 때문에 여전히 순서가 왜곡됩니다 ./lib/usr/lib

ld.so그렇다면 라이브러리 경로를 검색하는 순서는 어떻게 될까요 ? /lib이전에 검색되는 이유는 무엇입니까 /usr/lib? 그렇지 않다면 왜 추가 디렉토리를 검색합니까 /lib?

답변1

순서는 동적 링커의 매뉴얼에 문서화되어 있습니다.ld.so. 그것은:

  1. LD_LIBRARY_PATH; 의 디렉토리
  2. /etc/ld.so.conf; 의 디렉토리
  3. /lib;
  4. /usr/lib.

(약간 단순화하고 있습니다. 자세한 내용은 설명서를 참조하세요.)

사용자 정의 라이브러리를 사용하여 기본 위치에 있는 라이브러리를 재정의하는 유일한 방법이라고 생각하면 순서가 합리적입니다. LD_LIBRARY_PATH사용자 설정이므로 다른 설정보다 먼저 와야 합니다. /etc/ld.so.conf로컬 설정이므로 운영 체제 기본값보다 먼저 제공됩니다. 따라서 사용자로서 다른 버전의 라이브러리로 프로그램을 실행하려는 경우 LD_LIBRARY_PATH다른 라이브러리 버전의 위치가 포함된 프로그램을 실행할 수 있습니다. 그리고 관리자로서 다른 버전의 라이브러리를 에 넣고 /usr/local/lib목록을 나열 /usr/local/lib할 수 있습니다 /etc/ld.so.conf.

신뢰는 여기에 들어 가지 않습니다. 이 검색 경로에 나열된 모든 디렉터리는 신뢰할 수 있어야 합니다. 왜냐하면 모든 라이브러리가 해당 디렉터리에서 로드될 수 있기 때문입니다. 이론적으로는 시스템에서 "더 많은 신뢰가 필요한" 모든 프로그램에서 사용하는 라이브러리 이름을 나열하고 이러한 모든 라이브러리가 "가장 신뢰할 수 있는" 디렉토리에 있는지 확인할 수 있습니다. 그런 다음 "신뢰도가 낮은" 디렉토리는 그렇지 않습니다. "더 낮은 신뢰를 요구하는" 프로그램을 제외하고 검색 경로에서 더 신뢰할 수 있는 디렉토리 뒤에 오는 경우 사용됩니다. 그러나 그것은 매우 취약할 것입니다. 그것은 또한 꽤 무의미할 것입니다: 공격자가 의 값 LD_LIBRARY_PATH이나 요소를 주입할 수 있다면 그들은 확실히 , of 등 /etc/ld.so.conf의 값을 주입하는 것과 같은 임의의 코드를 실행하는 더 직접적인 경로를 갖게 될 것입니다 . 라이브러리 로드 경로에 대한 신뢰는 실행이 신뢰 경계를 넘을 때, 즉 추가 권한이 있는 프로그램을 실행할 때(예: setuid/setgid 프로그램 또는 를 통해 ) 문제가 됩니다. 이 경우에 일어나는 일은 그것이 공백이라는 것입니다.PATHLD_PRELOADsudoLD_LIBRARY_PATH

/libvs 의 경우에는 /usr/lib그다지 중요하지 않습니다. 동일한 엔터티(운영 체제)에 의해 제공되며 둘 다에 존재하는 라이브러리가 있어서는 안 됩니다. (매우 작은) 성능상의 이점을 제공하기 때문에 먼저 나열하는 것이 좋습니다 /lib. 가장 자주 사용되는 라이브러리, 특히 작은 기본 프로그램에서 사용되는 라이브러리(로드 시간이 크고 긴 프로그램보다 총 실행 시간의 비율이 더 높음) -실행 중인 프로그램)은 에 있습니다 /lib.

관련 정보