"실행 전용"파일 권한에 대한 유효한 사용 사례는 무엇입니까?


20

나는 chmod와 8 진 모드를 읽고 있었다 . 나는 그것이 1실행되는 것을 보았다 . 실행 전용 권한에 대한 유효한 사용 사례는 무엇입니까? 파일을 실행하려면 일반적으로 읽기 및 실행 권한이 필요합니다.

$ echo 'echo foo' > say_foo
$ chmod 100 ./say_foo
$ ./say_foo
bash: ./say_foo: Permission denied
$ chmod 500 ./say_foo
$ ./say_foo
foo

답변:


41

셸 스크립트 에는 읽기 권한이 필요하지만 이진 파일 에는 필요하지 않습니다.

$ cat hello.cpp
#include<iostream>

int main() {
    std::cout << "Hello, world!" << std::endl;
    return 0;
}
$ g++ -o hello hello.cpp
$ chmod 100 hello
$ ./hello
Hello, world!
$ file hello
hello: executable, regular file, no read permission

파일의 내용을 표시하고 실행하는 것은 서로 다른 두 가지입니다. 쉘 스크립트를 사용하면 단순화를 용서할 경우 이러한 스크립트는 새 쉘 (또는 현재 쉘)로 "읽기"하여 "실행"되기 때문에 관련이 있습니다. 그렇기 때문에 읽을 수 있어야합니다. 바이너리는 그 메커니즘을 사용하지 않습니다.

디렉토리의 경우 실행 권한이 약간 다릅니다. 즉, 해당 디렉토리 내의 파일 대해 작업을 수행 할 수 있습니다 (예 : 파일을 읽거나 실행). 따라서 /tools사람들이 사용할 수 있기를 원하지만 도구에 대해 알고 있는 도구 세트가 있다고 가정 해 봅시다 . chmod 711 /tools. 그런 다음 실행 파일을 /tools명시 적으로 실행할 수 /tools/mytool있지만 ls /tools/거부됩니다. 마찬가지로 /private-docs파일 이름을 알고있는 경우에만 읽을 수있는 문서를 저장할 수 있습니다.


1
또한 익명 ftp를 실행하지 않으면 더 이상 시스템 바이너리에서 실행 전용을 설정할 필요가 없습니다.
Joshua

1
또한 디렉토리에서 실행 가능 비트를 설정하면이를 수행 cd할 수 있습니다.
gardenhead


1
BTW, stdio.h여기에 C 헤더를 포함시킬 필요가 없습니다 . 나는 그것을 제거하는 것이 좋습니다.
Spikatrix

1
@Kevin : 아마도 ls탭 완성 작업이 없기 때문에 유지 관리 작업이 번거롭고 실제 보안 이점이 거의 없습니다. 공격자가 관심을 가질 수있는 대부분의 파일은 알려진 표준 위치에 있거나 다른 파일의 데이터에서 간접적으로 위치를 찾을 수 있습니다 (그렇지 않으면 해당 파일을 합법적으로 사용하는 프로그램이 파일을 찾을 수있는 위치를 어떻게 알 수 있습니까?).
Ilmari Karonen

4

젠투에서는 setuid (호출자 대신 소유자의 권한으로 실행하도록 설정된) 실행 프로그램이 읽기 액세스가 거부됩니다 (모드 4711). 이것은 권한 상승을 돕기 위해 버그 악용으로부터 보호 계층을 추가하는 것입니다.

권한이없는 공격자가 setuid 파일을 읽을 수 있고 libc 스타일로의 공격 을 허용하는 버그를 알고있는 경우 파일의 내용을 사용하여 특정 유용한 기능이나 라이브러리가있을 수있는 위치를 예측할 수 있습니다 프로그램이 호출 될 때 메모리에 배치됩니다.

최신 시스템에는 종종 ASLR 과 같은보다 효과적인 추가 보호 기능이 포함되어 있지만 32 비트 플랫폼에 존재하는 제한으로 인해보다 쉽게 ​​악용 될 수 있습니다.


보호는 소스 기반 배포판에만 적용됩니다. 바이너리 기반 배포판을 사용하면 공격자는 자신의 프로그램 사본을보고 흥미로운 부분이 어디인지 파악할 수 있습니다.
Mark

실행 전용 바이너리에는 암호가 내장되어있을 수도 있습니다. 사용자는 프로그램을 실행할 수 있으며 암호를 서버로 보낼 수는 있지만 암호를 얻을 수는 없습니다 (시스템에서 코어 덤프를 할 수 없어야 함).
Barmar

1

"execute only"값은 파일을 많이 사용하지 않는 것처럼 보이지만 디렉토리의 내용을 읽지 못하게하는 데 사용할 수 있습니다.

$ mkdir foo
$ touch foo/bar
$ ls foo/
bar
$ chmod 100 foo
$ ls foo/
ls: cannot open directory foo/: Permission denied

1
이것이 유용한 이유는 파일 이름을 알고 있으면 여전히 foo / bar를 읽을 수 있기 때문에 언급 할 가치가 있습니다. 나는 이것을 웹 서버에서 사용했다.
Random832

0

스크립트를 실행하려면 읽기 및 실행 권한이 있어야합니다. 스크립트의 내용을 읽으면 스크립트를 실행할 수 있으므로 다음을 수행 할 수 있어야합니다 read and execute. 그렇지 않으면 스크립트없이 스크립트를 실행할 수 없습니다.

실행 전용 권한에 대한 유효한 사용 사례는 무엇입니까?

보안. 일부는 파일을 보호하고 다른 사용자가 파일을 실행하거나 사용하지 못하게 할 수 있습니다.


2
chmod 000이외의 다른 사람 에게 권한을 부여합니다 root. 때로는 보호를 위해 그다지 광범위하게 갈 필요가 없습니다. 사용자의 의도에 달려 있습니다. 이를 위해 파일을 읽기 가능하고 쓰기 가능한 권한으로 "다시 chmod"한다고 가정 해 보겠습니다 root. 에 액세스 할 수 없으면 root어렵습니다.
Jordan Savell

2
/tools사람들이 사용할 수 있기를 원하지만 도구를 알고 있는 도구 세트가 있다고 가정 해 봅시다 . chmod 711 /tools. 그런 다음 실행 일 에는 /tools 명시 적으로 실행할 수 있지만 ls /tools/거부됩니다.
DopeGhoti

1
좋은 대답입니다! 나도 거기에서 뭔가를 가르쳤다. 바이너리 파일에 읽기 권한이 필요하지 않은 이유는 무엇입니까?
Jordan Savell

2
파일의 내용을 표시하고 실행하는 것은 서로 다른 두 가지입니다. 쉘 스크립트는 새 쉘로 "읽기"하여 "실행"됩니다 (간단히 용서하는 경우). 따라서 스크립트를 읽을 수 있어야합니다. 바이너리는 그 메커니즘을 사용하지 않습니다.
DopeGhoti

1
아 상식. 나는 그것이 다른 것이라고 생각했습니다-감사합니다!
Jordan Savell
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.