“LD_LIBRARY_PATH”는 보안 위험입니까? 우리 ld.so는 environment variable로 지정된 디렉토리에서

우리 ld.so는 environment variable로 지정된 디렉토리에서 라이브러리를 검색한다는 것을 알고 $LD_LIBRARY_PATH있지만 일반 사용자는 다음을 실행할 수 있습니다.

export LD_LIBRARY_PATH=dir1:dir2...

감염된 라이브러리를 원래 라이브러리보다 우선 순위가 높은 경로에 저장 ld.so하여에서 신뢰할 수있는 라이브러리 대신 해당 라이브러리 를 찾을 수 있습니다 ld.so.cache.

이것이 위험합니까?
일반 사용자를 위해이 환경 변수에 쓰지 못하게하려면 어떻게해야합니까?



답변

현재 환경 (예 : 현재 Bash 세션)과 export해당 자식 환경 (시작하는 스크립트, 서브 쉘 등) 명령을 사용하여 항상 환경 변수 만 설정할 수 있기 때문에 이것은 보안 위험이 아닙니다 . 상위 환경으로 작성 또는 수정 된 환경 변수를 에스컬레이션 할 수 없습니다. 여기에는 일반 사용자가 시스템 전체를 변경할 수 없다는 것도 포함됩니다.

따라서 실행할 때 영향을받는 유일한 환경 export LD_LIBRARY_PATH=...은 현재 셸과 그 뒤에있는 셸의 하위 셸입니다. 처음에 감염된 라이브러리를 포함하도록 (즉, 우선 순위가 가장 높은) 검색 경로를 변경한다고 가정 해 봅시다. 그런 다음 모르게 감염된 라이브러리 중 하나를로드하는 실행 파일을 실행합니다. 지금 무슨 일이 일어나는거야?

관리자가 아닌 일반 권한으로 사용자 계정으로 실행되는 악성 코드 (감염된 라이브러리의)가 있습니다. 이것은 나쁘게 들릴지 모르지만 실제로 … 그래서 무엇? 일반 사용자 권한으로 실행되므로 전체 시스템에 영향을 줄 수 없습니다. 그건 그렇고, 동일한 악성 코드로 실행 파일을 직접 실행하는 것은 라이브러리 조회 경로를 수정하고 일반 실행 파일이로드되기를 기다리는 것보다 훨씬 쉽습니다.

결론 : 일반 사용자는 자신의 라이브러리 조회 경로 만 수정할 수 있습니다. 즉, 일반 비 시스템 전체 권한이있는 일반 사용자 계정으로 해당 라이브러리 만로드 할 수 있습니다. 즉, 감염된 라이브러리를 강제로로드하거나 감염된 실행 파일을 직접 실행하는지 여부는 차이가 없습니다. 해당 환경 변수를 사용자가 재정의 할 수 없으면 아무 것도 얻지 못할 것입니다.

추신 : 이 또한이 실행됩니다 의 setuid 또는 setgid를 그들을 실행하는 하나의 사용자 / 그룹으로 실행되지 않습니다 수단 플래그가 설정,하지만 하나의 소유 를. 예를 들어 sudo실행 파일은 root가 소유하고 setuid 플래그가 설정되어 있습니다. 즉, 실행시 항상 root로 실행됩니다. 보안상의 이유로 setuid / setgid 플래그 $LD_LIBRARY_PATH중 하나가 설정된 실행 파일은 이 변수를 무시 하여 일반 사용자가 루트 권한으로 실행중인 실행 파일을 만들어 임의의 라이브러리를로드 할 수 없도록합니다. (이 사실을 지적한 @Rinzwind에 감사합니다!)