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.