Linux ではファイル所有者としてスクリプトを実行することは可能ですか?

Linux ではファイル所有者としてスクリプトを実行することは可能ですか?

申し訳ありませんが、ここが正しい場所かどうかはわかりません。急いでいて、時間に追われています。Linux マシンに次の属性を持つファイルがあります。(カーネル 2.6.26)

-rwxrwxrwx 1 root root 25 2015-06-01 08:08 /usr/bin/runme

マシンのルート権限がなく、ルート パスワードもわかりません。このスクリプトを所有者として実行することは可能ですか。別のファイルにいくつかの C コードを記述してコンパイルしましたが、動作しませんでした。使用したコードは次のとおりです。

#include <unistd.h>
#include <errno.h>

int main(void) {        
     setuid(0);
     system("/bin/bash /usr/bin/runme"); 
}

その後、execve を使用すると結果は変わらないという人もいました。execve を使用した場合のコードは次のとおりです。

#include <unistd.h>
#include <errno.h>

int main(void) {        
        extern char * const environ[];
    char * const command[] = {"runme", NULL, NULL, NULL, NULL,NULL, NULL};
    execve("/usr/bin/runme", command, environ);
}

答え1

可能ですが、スクリプトにはグローバルな読み取り/書き込み権限があるため、非常に注意が必要です。誰でもそれを変えることができ、したがって何でもルートとして。

これは恐ろしいセキュリティホールです。普通バイナリをユーザーとして実行するには、setuidでバイナリにフラグを追加する必要がありますchmod g+s。これは、root として実行する必要があります。そうしないと、大きなセキュリティ ホールも開くことになります。

スクリプトを使用する場合は、スクリプト言語によって異なります。実装方法が原因で、スクリプトの一部 (実際には多く) が動作しないことがあります。この場合も、セキュリティ上のリスクがあります。

ここでのルート (sic) を確認することをお勧めします。sudoこれは「スーパー ユーザーが行う」もので、権限のないユーザーが権限のある (またはルート) アカウントとしてコマンドを実行できるようにします。その後、設定が完了すると、次の操作を実行できます。

sudo /path/to/script

ただし、スクリプト ワールドを書き込み可能のままにしておくことはお勧めしません。これは依然としてセキュリティ上のリスクです。

ルート権限がなく、ルート パスワードも管理者アクセス権もない場合は、それはあなたのシステムではないため、これを実行するのをやめることをお勧めします。これはおそらくコンピューターの不正使用であり、お住まいの地域によっては犯罪になる可能性があります。

答え2

ある時点でそのユーザーが権限を付与していない限り、(脆弱性を利用しない限り) 別のユーザーとしてスクリプト (または実行可能ファイル) を実行する方法はありません。

「実際の」実行ファイルの場合、これはファイル所有者が設定できる setuid ビットを使用して実行できます。スクリプトの場合、最近の環境では通常 setuid ビットが無視されるため、何らかのラッパー (カスタム ラッパーまたは sudo) が必要になります。https://unix.stackexchange.com/questions/364/allow-setuid-on-shell-scripts詳細についてはこちらをご覧ください。

あなたのケースは、setuid ビットがいかに危険であるかを示す好例です。誰でも書き込み可能で実行可能なファイルに setuid ビットを設定すると、ファイルの所有者として任意のコマンドを実行できるようになります。ファイルの所有者は実際には root であるため、そのようなファイルの内容を、たとえば bash の内容に置き換えると、root シェルが付与されます。

関連情報