스크립트를 읽을 수 있는 권한이 없어도 스크립트를 실행할 수 있나요? 루트 모드에서는 다른 사용자가 실행은 하되 읽지는 못하게 하는 스크립트를 만들었습니다. 읽기 및 쓰기를 비활성화 했지만 chmod
실행은 허용했지만 사용자 모드에서는 권한이 거부되었습니다.라는 메시지가 표시됩니다.
답변1
문제는 실행 중인 스크립트가 아니라 인터프리터( bash
, perl
등 python
)라는 것입니다. 통역사는 스크립트를 읽어야 합니다. ls
이는 프로그램이 인터프리터처럼 커널에 직접 로드된다는 점에서 "일반" 프로그램(예:)과 다릅니다 . 커널 자체가 프로그램 파일을 읽고 있으므로 읽기 액세스에 대해 걱정할 필요가 없습니다. 인터프리터는 일반 파일을 읽어야 하는 것처럼 스크립트 파일을 읽어야 합니다.
답변2
이는 바이너리 파일에만 작동합니다.
$ chown foo:foo bar
$ chmod 701 bar
권한이 없는 사용자로서:
$ ls -lha bar
-rwx-----x 1 foo foo 7.0K 2012-03-15 03:06 bar
$ cat bar
cat: bar: Permission denied
$ ./bar
baz
이제 문제가 발생합니다. 기존 방법으로는 파일을 읽을 수 없지만 실제로 파일을 읽는 것을 막을 수는 없습니다. 사실 이건 도전이다http://smashthestack.org/(레벨 13). hktrace
를 사용할 수 있는 잘 알려진 유틸리티가 있습니다 ptrace
.
답변3
이전 진술은 절반만 사실입니다. 사용자가 읽을 수는 없지만 계속 실행할 수 있도록 스크립트를 설정할 수 있습니다. 프로세스는 약간 길지만 /etc/sudoer에 예외를 설정하여 사용자가 비밀번호를 입력하라는 메시지를 표시하지 않고 일시적으로 스크립트를 스스로 실행할 수 있도록 하면 완료할 수 있습니다. 이 방법은 다음과 같습니다. - 다른 배포판에 대한 setuid 패치를 우회합니다. - 사용자에게 모든 것에 대한 sudo 권한을 부여하지 않고 특정 스크립트에 대해 상승된 권한을 일시적으로 부여할 수 있습니다.
이 문서의 지침을 따르십시오. 파일 권한은 실행만 가능
답변4
나는 당신이 이것을 할 수 있다고 생각합니다 setuid
.
하지만 그렇게 할 수는 없습니다. 대부분의 배포판에서는 setuid
엄청난 보안 허점이 있기 때문에 (분명히) 비활성화했기 때문입니다. 제 경우에는 비활성화되어 있어서 이 답변이 효과가 있는지 실제로는 모르겠습니다. 그래도 효과가 있을 것 같아서 게시하겠습니다.~해야 한다.
어쨌든, 내가 원하는 것을 하고 싶었고 setuid
스크립트 지원 배포판이 있었다면 다음과 같이 할 것입니다.
$ chmod 700 myscript
$ cat > myscript-nonroot
#!/bin/sh
bash myscript
^D
$ sudo chown root:root myscript-nonroot
$ sudo chmod 4755 myscript-nonroot # make SURE this isn't world-writable!
즉, 루트 읽기 전용 스크립트를 호출하고 이를 루트 소유로 변경하고 setuid 권한을 부여하는 것이 유일한 목적인 다른 스크립트를 작성합니다. (그리고 그에 따른 다른 사람들의 쓸 수 없는 상태.)
myscript-nonroot 함수는 누구나 읽을 수 있으므로 읽고 실행할 수 있으며 실제로 스크립트( )를 실행하는 두 줄을 얻으면 bash myscript
루트(또는 원하는 다른 권한)로 수행하는 것입니다. 누구인지는 중요하지 않습니다. , 정확한 사용자)는 동일한 사용자가 래퍼 파일을 소유하고 있는 한 실행 중입니다. )