"루트" 사용자로 실행되는 상위 프로세스가 있습니다. fork()
, execl()
및 이후에는 setuid()/setgid()
하위 프로세스가 다른 운영 체제 사용자(예: user1)로 시작됩니다.
환경을 인쇄하면 user1로 로그인한 것과는 달리 루트 환경과 동일하다는 것을 알 수 있습니다(마치 루트로 로그인한 것처럼). 왜?
하위 프로세스에서 user1의 환경을 읽는 방법이 있습니까?
답변1
모든 프로세스에는상위 환경에서 복사된 자체 환경. 부모가 쉘이라면 개념이 있습니다내보낼 수 있는 변수이 점을 고려해야 하지만 직접 거래하는 경우에는 적용되지 않습니다 exec()
. 이 LOGNAME
변수는 일반적으로 로그인 쉘에 의해 설정되며 재설정되지 않은 나머지 값만 표시됩니다. 그래서 당신은예아이의 환경을 살펴보세요. 일부 시스템에서는 상위(또는 기타 프로세스) 환경에 쉽게 액세스할 수 없지만 Linux에서는 액세스할 수 있습니다(권한 제한에 따라 다름).통과하다/proc
)
su
을 시도하여 보고 있는 효과를 재현할 수 있습니다 su -
. 후자는 쉘 로그인 환경을 초기화하여 (거의 확실하게) 재설정되고 LOGNAME
전자는 무엇보다도 변경되지 않은 상태로 유지됩니다.
env
명령을 사용하는 것은 명령줄에서 새 프로세스를 시작할 때 깨끗한 환경을 얻는 한 가지 방법이며, execle()
유사한 작업을 수행하는 방법을 알아보려면 시스템의 설명서를 확인해야 합니다.
답변2
다음 명령을 사용하여 간단하게 사용자 환경을 확인할 수 있습니다.
su -l user_name -c "run_programm && env"
또는 env
해당 pid를 사용하여 하위 프로세스를 확인할 수 있습니다.
하위 프로세스 pid가 24112
다음 env
을 사용하여 확인된다고 가정합니다.
cat /proc/24112/environ
답변3
몇가지 정보:
- 환경 변수를 사용
execle
하거나 하위 항목에 제공할 수 있습니다.execve
이를 사용하여 더 이상 하위 프로세스에 적합하지 않은 상위 프로세스의 환경 변수를 억제하고 하위 프로세스에 추가 변수를 제공할 수 있습니다. - 예를 들어 를 사용하여 하위 항목에 대한 "로그인 셸"을 시작할 수 있습니다
bash -l
. 이렇게 하면 하위 항목과 같은 환경이 채워집니다. 많은 쉘(bash 포함)의 경우 바이너리 이름 앞에 하이픈을 추가하는 것(예-bash
: passargv[0]
)은 동일한 효과를 갖습니다. 이러한 차이점의 주요 영향은 로그인 셸이 실행되거나/etc/profile
다른 프로필 셸 스크립트를 실행하여 많은 수의 환경 변수를 설정한다는 것입니다. - 인증 및 세션 초기화를 위해 PAM을 사용하는 서비스의 경우 이
pam_env
모듈은 환경을 적절하게 초기화하는 역할을 담당합니다. 이를 사용하거나 해당 동작을 에뮬레이트하기 위해 해당 구성을 볼 수 있습니다.
답변4
각 프로세스에는 일련의 환경 변수가 있습니다(셸 export SOMEVAR=value
등에서 설정할 수 있음). 이는 하위 프로세스에 의해 변경되지 않고 상속됩니다. 이를 재설정하려면 를 사용하여 extern char **environ;
전달된 환경(참고자료 참조 environ(7)
)을 가져온 다음 복사된 변수 값이 포함된 새 환경 배열을 사용 execle(3)
하거나 전달합니다. execve(3)
데이비드 휠러(David Wheeler)는 자신의 책에서 무엇을 해야 하는지, 어떻게 해야 하는지에 대한 몇 가지 지침을 제공합니다."보안 Unix/Linux 프로그래밍 가이드"