제가 슈퍼유저가 아닌데 어떻게 Nice()에 음수 값을 부여하고 오류 없이 실행할 수 있나요?

제가 슈퍼유저가 아닌데 어떻게 Nice()에 음수 값을 부여하고 오류 없이 실행할 수 있나요?

슈퍼유저가 아니더라도 Nice()에 음수 값을 지정하고 오류 없이 실행하려면 어떻게 해야 합니까?

system("su"); 
nice(-1);

원하지 않는 비밀번호를 요구하나요?

답변1

전화를 걸면 su루트가 아닌 이상 비밀번호를 묻는 메시지가 표시됩니다.

음수 값을 재처리하려면 프로세스에 다음이 필요합니다.

답변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

관련 정보