setuid 프로그램을 실행할 때 필터 환경 변수를 제거하는 Linux 구성 요소는 무엇입니까?

setuid 프로그램을 실행할 때 필터 환경 변수를 제거하는 Linux 구성 요소는 무엇입니까?

setuid 비트가 설정된 프로그램을 실행할 때 쉘에 설정된 특정 환경 변수(bash 등)를 수신하지 못하는 것으로 관찰되었습니다. 이 방법으로 제거된 여러 환경 변수는 LD_PRELOAD, LD_LIBRARY_PATH, LD_ORIGIN_PATH, LD_DEBUG_OUTPUT, LD_PROFILE, LD_USE_LOAD_BIAS, GCONV_PATH.

에서 언급했듯이여기그리고이 문제, 이는 예상되는 동작입니다. 그 이유는 공격 벡터를 줄이기 위해서입니다. 매뉴얼 페이지 ld.so (8)에도 이에 대한 내용이 나와 있습니다.

문제는 Linux 운영 체제의 어떤 구성 요소가 이와 같은 환경 변수를 제거하느냐는 것입니다.

  • 껍질인가요?
  • 명령을 실행할 때 쉘이 내부적으로 호출하는 함수인가요 fork()?execve()
  • ld.so?

참고: 어떤 답변이라도 도움이 될 것입니다. 그러나 어떤 매뉴얼 페이지를 읽어야 하는지 등 이 문제에 대한 정보가 포함된 리소스를 알려주시면 더 도움이 될 것입니다.

답변1

이러한 변수의 대부분은 동적 링커 또는 C 라이브러리의 기타 구성 요소에서 사용되며, setuid 바이너리를 시작할 때 해당 변수를 제거하는 역할을 합니다. 이 내용은 다음과 같이 기록됩니다.'환경' 섹션man ld.so(GNU C 라이브러리의 경우):

보안상의 이유로 동적 링커가 바이너리를 안전한 실행 모드에서 실행해야 한다고 결정하면 특정 환경 변수의 역할이 무효화되거나 수정되며 이러한 환경 변수는 환경에서 제거되어 프로그램이 실행되지도 않습니다. 무엇이든 작동합니다. 정의를 참조하세요. 이러한 환경 변수 중 일부는 아래 설명된 대로 동적 링커 자체의 작동에 영향을 줍니다. 이러한 방식으로 처리되는 다른 환경 변수로는 , , GCONV_PATH, GETCONF_DIR, HOSTALIASES, LOCALDOMAIN, LOCPATH, MALLOC_TRACE, NIS_PATH, NLSPATHRESOLV_HOST_CONFRES_OPTIONS있습니다 TMPDIR.TZDIR

영향 ld.so변수는 별도로 기록됩니다.

이 변수는 안전 실행 모드에서는 무시됩니다.

이러한 각 변수에 대한 문서에 나타납니다.

전체 목록도 제공됩니다.GNU C 라이브러리의 소스 코드에서, 코드 자체를 삭제하는 것도 가능합니다.동적으로 연결된 바이너리의 경우그리고정적으로 링크된 바이너리의 동적 링크용.

다른 C 라이브러리의 동적 링커는 관심 있는 변수에 대해 비슷한 방식으로 작동합니다.musl 파일은 다음을 나타냅니다.

이 변수는 setuid, setgid 또는 기타 호이스트된 함수를 호출하는 프로그램에서 완전히 무시됩니다.

많은 변수( LD_PRELOAD, LD_LIBRARY_PATH, MUSL_LOCPATH)의 경우, TZ이 경우 변수의 일부 기능을 사용할 수 없습니다.

관련 정보