私はスーパーユーザーではありませんが、どのようにNice()に負の値を与え、エラーなしで実行できますか?

私はスーパーユーザーではありませんが、どのようにNice()に負の値を与え、エラーなしで実行できますか?

スーパーユーザーでなくても、Nice()に負の値を指定してエラーなしで実行するにはどうすればよいですか?

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

不要なパスワードが必要ですか?

答え1

電話をかけると、suルート以外のパスワードの入力を求められます。

負の値を再処理するには、プロセスに次のものが必要です。

答え2

あなたはできません。これがシステムのポイントです。一般ユーザーはジョブの優先順位を上げることはできません。

答え3

プロセスは自分の権限を高めることはできません。

プロセスが権限を高める方法はまったくありません。可能であれば、それらがあったでしょう。

プロセスで実際または保存されたuidが発生した場合は、そのuidを有効なセットにコピーできます。許可された機能がある場合は、その機能を有効セットにコピーできますが、まずその権限が必要です。あなたはそれらを虚空から魔法のように引き出すことはできません(勝手に鍵を生成することができる鍵がどんな役に立ちますか?)。

それでは、Unix(Gnu / Linuxを含む)で権限を拡大する方法は?

(専門家だけに注意してください)

2つの方法があります(従来の方法ですが、どちらも似ており、元の方法がいつか消える可能性があります)。どちらの場合も、execを呼び出すとこれが発生します。 (わかりました。execを実行した後、同じプロセスにあり、権限が変更されましたが、新しいコードが実行されているので上記でうそをつきました。)

  • 実行可能ファイルのsetuidおよび/またはsetuidビットを設定します。ファイルexecを編集すると、ユーザーIDおよび/またはグループIDがファイルのユーザーIDおよび/またはグループID(おそらくroot)に変更されます(ほとんどの場合は機能しません)。 Unixスクリプト言語))。
  • 実行可能ファイルの機能ビット設定:ファイルがexec編集されると、プロセスはファイルに設定されている機能を取得します。これでこれが推奨される方法です。
    • seduid rootプログラムを関数に変換する場合は、必要に応じて許可される関数を設定して有効なビットを設定できます(これにより、許可されているすべての関数が有効なものにコピーされます)。
    • 新しいプログラムを作成するときに機能を認識するので、有効なビットを設定しないことをお勧めし、プログラムは必要に応じて有効な機能をコピーして消去することができます(これはバグ(エクスプロイトを含む)の影響を減らします)。

例:

//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

関連情報