슈퍼유저가 아니더라도 Nice()에 음수 값을 지정하고 오류 없이 실행하려면 어떻게 해야 합니까?
system("su");
nice(-1);
원하지 않는 비밀번호를 요구하나요?
답변1
전화를 걸면 su
루트가 아닌 이상 비밀번호를 묻는 메시지가 표시됩니다.
음수 값을 재처리하려면 프로세스에 다음이 필요합니다.
- 루트가 되다
- 또는CAP_SYS_NICE 기능이 있습니다(참조:Gnu/linux에서 파일 권한 등을 설정하는 다른 방법은 무엇입니까?그리고http://man7.org/linux/man-pages/man7/capability.7.html)
답변2
당신은 할 수 없습니다. 이것이 시스템의 요점입니다. 일반 사용자는 작업 우선순위를 높일 수 없습니다.
답변3
프로세스는 자신의 권한을 높일 수 없습니다.
프로세스가 권한을 높일 수 있는 방법은 전혀 없습니다. 가능하다면 그것들이 있었을 것입니다.
프로세스에 실제 또는 저장된 uid가 발생하면 해당 uid를 유효 세트에 복사할 수 있습니다. 허용된 기능이 있으면 해당 기능을 유효 세트에 복사할 수 있지만 먼저 해당 권한이 있어야 합니다. 당신은 그것들을 허공에서 마술처럼 꺼낼 수 없습니다(마음대로 열쇠를 생성할 수 있는 자물쇠가 무슨 소용이 있겠습니까).
그렇다면 Unix(Gnu/Linux 포함)에서 권한을 확대하는 방법은 무엇입니까?
(전문가만 주의하세요)
두 가지 방법이 있습니다(전통적인 방법이지만 둘 다 유사하며 원래 방법이 언젠가 사라질 수 있음). 두 경우 모두 exec를 호출하면 이런 일이 발생합니다. (알겠습니다. exec를 실행한 후 동일한 프로세스에 있고 권한이 변경되었지만 새 코드가 실행되고 있기 때문에 위에서 거짓말을 했습니다.)
- 실행 파일의 setuid 및/또는 setuid 비트를 설정합니다. 파일을
exec
편집하면 사용자 ID 및/또는 그룹 ID가 파일의 사용자 ID 및/또는 그룹 ID(아마도 루트)로 변경됩니다(대부분의 경우 작동하지 않음). 유닉스 스크립팅 언어)). - 실행 파일의 기능 비트 설정: 파일이
exec
편집되면 프로세스는 파일에 설정된 기능을 가져옵니다. 이제 이것이 권장되는 방법입니다.- seduid 루트 프로그램을 함수로 변환하는 경우 필요에 따라 허용되는 함수를 설정하고 유효한 비트를 설정할 수 있습니다(이렇게 하면 허용되는 모든 함수가 유효한 것으로 복사됩니다).
- 새 프로그램을 작성할 때 기능을 인식하므로 유효한 비트를 설정하지 않는 것이 좋으며 프로그램은 필요에 따라 유효한 기능을 복사하고 지울 수 있습니다(이렇게 하면 버그(익스플로잇 포함)의 영향이 줄어듭니다).
예:
//renice.cc
#include <unistd.h>
#include <sys/capability.h>
class Renice {
cap_t original_cap_state;
cap_t can_nice_cap_state;
cap_value_t cap_list[1];
public:
Renice() {
original_cap_state = cap_get_proc();
if ( original_cap_state == NULL)
/* handle error */;
can_nice_cap_state = cap_get_proc();
if ( can_nice_cap_state == NULL)
/* handle error */;
cap_list[0] = CAP_SYS_NICE;
if (cap_set_flag(can_nice_cap_state, CAP_EFFECTIVE, 1, cap_list, CAP_SET) == -1)
/* handle error */;
}
~Renice() {
if (cap_free(original_cap_state) == -1 )
/* handle error */;
}
void new_value(int v) {
if (cap_set_proc(can_nice_cap_state) == -1)
/* handle error */;
nice (v);
/* handle error */
if (cap_set_proc(original_cap_state) == -1)
/* handle error */;
}
};
int main () {
Renice renice;
renice.new_value(-1);
nice (-2); //won't work, capability no longer set
sleep (30);
}
- 엮다:
g++ -lcap renice.cc
- 설정 기능:
sudo setcap CAP_SYS_NICE+p a.out
- 달리다:
./a.out