내보낸 변수에 대해 getenv를 호출할 때 루트가 아닌 사용자가 nil을 반환하는 이유는 무엇입니까?

내보낸 변수에 대해 getenv를 호출할 때 루트가 아닌 사용자가 nil을 반환하는 이유는 무엇입니까?

C 코드는 다음과 같습니다.

#include <stdio.h>
#include <stdlib.h>

int main () {
   printf("PATH : %s\n", getenv("PATH"));
   printf("HOME : %s\n", getenv("HOME"));
   printf("ROOT : %s\n", getenv("ROOT"));
   printf("TMPDIR : %s\n", getenv("TMPDIR"));
   return(0);
}

완료 후:

gcc env.c -o printenv
setcap 'cap_dac_override+eip' printenv
sudo -S su -s $(which bash) steve
export TMDIR=hello
./printenv

나는 다음과 같은 결과를 얻습니다.

PATH : /sbin:/bin:/usr/sbin:/usr/bin
HOME : /home/steve
ROOT : (null)
TMPDIR : (null)

"printenv"로 설정된 CAP를 제거하면 출력은 다음과 같습니다.

PATH : /sbin:/bin:/usr/sbin:/usr/bin
HOME : /home/steve
ROOT : (null)
TMPDIR : hello

어떻게 그래?

몇 가지 검색 끝에 다음을 발견했습니다.http://폴라홈.com/service/man/?qf=secure_getenv&tf=2&of=RedHat&sf=

이는 함수를 설정할 때 getenv가 secure_getenv가 되어 모든 getenv() lib 호출이 nil을 반환하기 때문일 수 있다고 언급하지만 이 경우 환경 변수를 어떻게 PATH인쇄 합니까?HOME

답변1

글쎄요, 몇번의 조사 끝에 그 이유를 알아냈습니다. "TMPDIR"은 ld의 특수 변수 중 하나입니다. 따라서 보안상의 이유로 CAP가 설정되고 실행 사용자가 루트가 아닌 경우에는 무시됩니다. 자세한 내용은 ld 매뉴얼 페이지를 참조하십시오. 그래서:https://man7.org/linux/man-pages/man8/ld.so.8.html.

ENVIRONMENT         top
       Various environment variables influence the operation of the
       dynamic linker.

   Secure-execution mode
       For security reasons, if the dynamic linker determines that a
       binary should be run in secure-execution mode, the effects of
       some environment variables are voided or modified, and
       furthermore those environment variables are stripped from the
       environment, so that the program does not even see the
       definitions.  Some of these environment variables affect the
       operation of the dynamic linker itself, and are described below.
       Other environment variables treated in this way include:
       GCONV_PATH, GETCONF_DIR, HOSTALIASES, LOCALDOMAIN, LOCPATH,
       MALLOC_TRACE, NIS_PATH, NLSPATH, RESOLV_HOST_CONF, RES_OPTIONS,
       TMPDIR, and TZDIR.

       A binary is executed in secure-execution mode if the AT_SECURE
       entry in the auxiliary vector (see getauxval(3)) has a nonzero
       value.  This entry may have a nonzero value for various reasons,
       including:

       *  The process's real and effective user IDs differ, or the real
          and effective group IDs differ.  This typically occurs as a
          result of executing a set-user-ID or set-group-ID program.

       *  A process with a non-root user ID executed a binary that
          conferred capabilities to the process.

       *  A nonzero value may have been set by a Linux Security Module.

관련 정보