/tmp 디렉터리의 실행 파일에는 SUID 비트가 적용되지 않습니다.

/tmp 디렉터리의 실행 파일에는 SUID 비트가 적용되지 않습니다.

SUID 비트가 켜진(chmod +s) 실행 파일에서 getuid() 및 geteuid() 값을 인쇄하면 소유자 ID 대신 원래 호출자 ID를 가져오는 것 같습니다.실행 파일이 /tmp 디렉터리에 있는 경우.

이것은 정확히 동일한 코드를 홈 디렉토리로 컴파일할 때(그리고 chmod +s를 수행할 때) 예상대로 작동하는 것 같습니다.

많이 검색했지만 그러한 행동에 대한 참고 자료를 찾을 수 없습니다.

왜 이런 일이 일어나는지 아는 사람이 있나요?

소스는 간단합니다:

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>

int main(){
    printf("%d\n%d\n", getuid(), geteuid());
    return 0;
}

답변1

Setuid 실행 파일은 이라는 파일 시스템 마운트 옵션에서 비활성화할 수 있습니다 nosuid. 신뢰할 수 없는 사용자가 마운트할 수 있거나(자동 묵시적 user마운트 옵션) 그 내용을 신뢰할 수 없는 사용자가 임의로 수정할 수 있는 파일 시스템의 경우 이동식 미디어 또는 완전히 신뢰할 수 없는 컴퓨터의 네트워크를 통해. 이는 때때로 다른 파일 시스템에서도 수행됩니다./etc/fstabnosuid

많은 시스템이 사용임시 파일 시스템for /tmp: 내용이 메모리에 남아 있고 재부팅 후에도 지속되지 않는 파일 시스템입니다. (tmpfs 파일 시스템은 데이터 일관성을 신경 쓸 필요가 없기 때문에 디스크 캐싱에 의존하는 것보다 더 빠를 수 있습니다.) 일부 설정에서는 nosuidsetuid 임시 파일이 일반적으로 호출되지 않기 때문에 이 옵션을 사용하여 마운트하고 때때로 이것이 공격의 일부가 됩니다. 벡터(setuid 파일 자체는 /tmp보안 위험이 아니지만 이를 비활성화하면 일부 취약점으로 인한 피해를 제한할 수 있습니다).

먼저 디렉토리가 포함된 마운트 지점을 찾아 디렉토리의 마운트 옵션을 확인할 수 있습니다 df.

df /tmp/somefile

그런 다음 의 출력에서 ​​마운트 지점을 찾 mount거나 Linux에서 마운트 지점을 찾습니다 /proc/mounts.

mount | awk '$3 == "/tmp"'

관련 정보