0111 또는 0333과 같은 권한의 목적


17

실행 기능이 자동으로 읽기 기능을 암시하지 않는 경우 111 또는 333 (예 : 사용자 는 실행할 있지만 파일을 읽을 수 없음) 과 같은 Linux 권한의 목적은 무엇입니까 ?


1
그러한 설정에 대한 예가 있습니까? 그 쪽이 맞는 거 같아요. 읽을 수없는 것을 실행할 수 없습니다. 이러한 조합은 0000과 0777 사이의 권한 공간에서 이론적 인 것입니다. 숫자의 8 진 기준을 표시하려면 앞에 0을 추가해야합니다.
ikrabbe

6
스크립트 (예 : 셸 스크립트) 가 아니라면 실제로 명령을 실행하기 위해 읽기 권한이 필요 하지 않습니다 . "정상"실행 파일-예. su, bash 또는 vi-실행 가능 비트 만 설정하면 사용자가 실행할 수 있습니다. 읽을 수없는 파일은 복사 할 수 없습니다 . 따라서 사용자가 보안 중요 명령 (예 : su)을 복사하지 못하게함으로써 자신의 사본을 만들거나 해체 할 수 없습니다. * BSD에는 실행 권한이 있지만 읽기 권한이없는 여러 명령이 있습니다.
Baard Kopperud

답변:


25

나는 그것을 가지고 놀았으며 분명히 exec 권한은 읽기 권한을 의미하지 않습니다. 바이너리는 읽을 수없이 실행 가능할 수 있습니다.

$ echo 'int main(){ puts("hello world"); }' > hw.c
$ make hw
$ ./hw
hello world
$ chmod 111 hw
$ ./hw 
hello world
$ cat hw
/bin/cat: hw: Permission denied

읽기 및 실행 권한 비트가 모두 없으면 스크립트를 실행할 수 없습니다.

$ cat > hw.sh
#!/bin/bash
echo hello world from bash
^D
$ chmod +x ./hw.sh
$ ./hw.sh 
hello world from bash
$ chmod 111 ./hw.sh
$ ./hw.sh
/bin/bash: ./hw.sh: Permission denied

4
두 번째 예는 #! ELF- 헤더를 놓치면서 시작하기 때문에 파일을 읽을 수 있어야 실행 파일을 실행할 수 있습니다. 파일의 내용이 다른 위치로 복사되는 것을 방지하려는 일반적인 상황입니다. 라이센스 관리자가 일반적인 예입니다.
hspaans

1
실행 가능한 바이너리 만 읽을 수 있습니다. unix.stackexchange.com/a/34294
小 太郎

6
@hspaans : shebang은 커널에 의해 처리되며, 커널은 권한과 같은 기이 한 작은 것을 신경 쓰지 않습니다. 그것은이다 읽기 액세스를 필요로 (또는 통역). 커널은 (예를 들어) 실행 /bin/bash hw.sh되고 bash는 hw.sh읽기 위해 열려고 시도합니다 .
Kevin

2
커널 권한에 관심을 갖기를 바랍니다 . 다른 것은 없습니다. @Kevin의 게시물에서 무서운 문장은 커널이 파일을 사용하는지 여부에 관계없이 파일을 실행할 수있는 실행 권한 만 필요하다는 것입니다.
Emil Jeřábek은 Monica

2
@ EmilJeřábek 커널은 응용 프로그램 프로세스가 수행 할 수있는 작업을 결정할 때 권한에 관심을 갖습니다. 그러나 권한을 구현하는 구성 요소이므로 내부적으로 무시할 수도 있습니다. 따라서 해석 된 파일을 실행하는 방법을 결정할 때 shebang 행을 읽거나 실행 전용 2 진 파일의 내용을 메모리로 읽을 수 있습니다.
Barmar

16

예를 들어 특정 디렉토리에 (비밀) 실행 파일을 유지 한 다음 사용자가 디렉토리 내용을 보지 않고도 해당 파일을 호출 할 수있게하는 경우와 같이 디렉토리에 적합합니다. 111에 비해 333은 디렉토리의 내용을 보지 않고도 해당 디렉토리에 파일을 쓰거나 삭제할 수 있습니다.


5
내 Uni에서, 이러한 권한은 학생들이 다른 사람이 일하는 것을 보지 않고 과제를 디렉토리에 놓는 데 사용되었습니다. 강사는 오래된 스쿨이었다.
DarkHeart

@DarkHeart 재미있는. 파일 이름에 임의의 구성 요소를 추가해야하기를 바랍니다. 그렇지 않으면 동급생에게서 복사하고 인센티브가 아닌 경우 나는 무엇인지 모릅니다.
PSkocik

5

분명히 모든 조합이 그다지 유용하지는 않지만 구체적으로 언급 한 것을 취하십시오 ... 문제의 파일이 스크립트 (예 : 셸 스크립트)가 아닌 한 실제로 read파일을 실행할 권한이 필요하지 않습니다 ( 권한 만) execute( .sh), 펄 스크립트 ( .pl) 등). execute권한 만으로 일반 바이너리를 실행할 수 있습니다 . * BSD-systmes에서 여러 실행 파일은 특히 "보안 중요"명령에 대해 execute허용없이 권한을 부여합니다 (예 read:) su.

그렇다면 왜 사용자에게 read권한을 부여하지 execute않는가? 사용자가 읽을 수없는 파일을 숨기십시오. 해당 사용자 도 복사 할 수 없습니다 ! read권한을 제거 하면 사용자가 자신의 "개인"실행 파일 사본을 만들 수 없습니다. 나중에 사본을 남용 할 수 있습니다 (예 : get SUID=root on).

write-permission이 없으면 파일이 악의적으로 삭제 되지 않습니다 .

소유자 에게 read-또는- write권한을 부여하지 않는 것은 조금 드문 일이지만 때로는 owner파일을 삭제하는 것 조차 막는 것이 좋습니다 . 물론 owner- 말할 것도없고 root- 수도 항상 우회하기 등의 조치를하지 않을 경우 다른 방법으로, 단순히하여 chmod파일에 대한 권한.


" owner파일을 삭제하는 것 조차 방지하는 것이 좋습니다 ." — 파일을 삭제하기 위해 파일에 대한 어떠한 종류의 권한 (읽기, 쓰기 또는 실행)이 필요하지 않다는 점을 제외하고.
셀라 다

예를 들어, 실행 파일이 데이터베이스에 연결하여 작업을 수행 할 때 사용하는 데이터베이스 비밀번호를 포함하지만 반드시 비밀번호를 공개하고 싶지 않은 경우, 준비 전용 실행 파일을 사용할 수 있습니다.
셀라 다

@Celada, 그것은 오래된 질문이지만, 메모리 영역 오프셋을 /proc/${PID}/maps찾은 다음 메모리의 관련 섹션을 읽음으로써 메모리 덤프에 취약한 접근 방식은 아닙니다./proc/${PID}/mem 아닐까요? 또는 실행 파일의 권한을 제한하면 실행 중에 메모리의 관련 섹션에 대한 읽기 권한도 제한됩니까? (후자는 IMO가 아닌 것 같습니다.)
Spencer D
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.