rootユーザーと他のユーザーの違いは何ですか?

rootユーザーと他のユーザーの違いは何ですか?

いくつかのランダムアカウントとの基本的な違いは何ですかroot? 0UID以外のものですか?

それで、それは何をしますか?バイナリするユーザーをrootに昇格させる方法は?私はユーザーが最初にsudo私たちが見つけたコンテンツを通してグループの一部でなければならないことを理解しています/etc/sudoers

# User privilege specification
root    ALL=(ALL:ALL) ALL

# Members of the admin group may gain root privileges
%admin ALL=(ALL) ALL

# Allow members of group sudo to execute any command
%sudo   ALL=(ALL:ALL) ALL

su見つかった実行可能ファイルの権限を確認してください。-rwsr-xr-xまたは4755(つまり、すでにsetuid設定されています)

はいまたはいいえこの構成ファイルを読み取り、root権限を要求するユーザーが2つのグループのいずれかに属していることを確認するバイナリSudoまたは行政?もしそうなら、バイナリは別のシェルをrootとして作成しますか?設定値ビット) ユーザーが予想されるグループの一部であり、交換したい適切なユーザーのパスワードを知っているとします (例:、特に)?


長すぎます。 特権昇格の動作は次のsetuid点に依存していますか?バイナリですか、それとも現在のプロセスのUIDを変更する他のメカニズムはありますか?前者の場合、EUIDのみが変更され、UID! = EUIDが残ります。これは問題ですか?

関連 これはすべてAndroid環境でどのようにシミュレートされますか?私が知っている限り、プロセスはまだこの権限レベルで実行されていますが、ルートへのアクセスは完全に削除されました。

を削除するとsudo権限suの昇格を防ぐのに十分ですか、またはAndroidは追加の措置を講じますか?

答え1

ルートはユーザー0です。

キーはユーザーID 0です。カーネルには呼び出しプロセスのユーザーIDを確認する場所がたくさんあり、ユーザーIDが0の場合にのみ特定の操作を実行する権限が付与されます。

ユーザー名は重要ではありません。カーネルはユーザー名さえ知らない。

Androidの権限メカニズムはカーネルレベルでは同じですが、アプリケーションレベルではまったく異なります。 Androidには、Linuxカーネルベースの他のシステムと同様に、rootユーザー(UID 0)があります。 Androidにはユーザーアカウントがなく、ほとんどの設定でユーザー(デバイスを運営して所有している人など)がrootとしてタスクを実行することはできません。 「ルーティング」Androidは、デバイスの所有者/ユーザーがrootとしてタスクを実行できるようにする設定です。

setuidの仕組み

設定値実行可能ファイルは、実行可能ファイルを所有するユーザーとして実行されます。たとえば、susetuidでルートが所有しているため、ユーザーがそれを実行すると、実行中のプロセスがrootとしてsu実行されます。これは、suそれを呼び出すユーザーがrootアカウントへのアクセス権を持っていることを確認し、検証に成功した場合は指定されたコマンド(またはコマンドが指定されていない場合はシェル)を実行し、検証に失敗した場合は終了します。たとえば、suユーザーはルートパスワードを知っていることを証明するように求められます。

もっと詳しく言えば、プロセスはユーザーID 3:これ効果的なセキュリティチェックに使用されるUID。本物UIDは一部の権限確認に使用されますが、主に元のユーザーIDのバックアップとして使用され、保存されたユーザーIDとして使用され、プロセスは一時的に有効なUIDを実際のユーザーIDに切り替えてから古い有効なUIDに戻すことができます。 UID(たとえば、setuidプログラムが元のユーザーとしてファイルにアクセスする必要がある場合に便利です。)setuid実行可能ファイルを実行すると、有効なUIDが実行可能ファイルの所有者に設定され、実際のUIDが保持されます。

setuid実行可能ファイル(およびsetgidなどの同様のメカニズム)を実行することは、プロセスの権限を向上させる唯一の方法です。他のほとんどすべてはプロセスの権限を減らします。

伝統的なUnixを超えて

これまで、私は伝統的なUnixシステムを説明しました。これらはすべて最新のLinuxシステムに適用されますが、Linuxはいくつかの追加の複雑さをもたらします。

Linuxでは能力システム。カーネルには、ユーザーID 0で実行されているプロセスだけが許可されている多くのチェックがあると言ったことを覚えていますか?実際、各検査には独自の機能があります。正確ではありませんが、一部の検査では同じ機能を使用します。たとえば、raw ネットワークソケットにアクセスする機能や、システムを再起動する機能があります。各プロセスには、そのユーザーとグループに関連する一連の機能があります。プロセスがユーザー 0 として実行されるか、または検査に対応する機能がある場合、検査に合格します。特定の権限を必要とするプロセスは、rootではなくユーザーとして実行できますが、必要な機能があるため、プロセスにセキュリティの脆弱性があると影響が制限されます。実行可能ファイルは1つ以上の機能に設定できます。これは setuid に似ていますが、プロセスのユーザー ID ではなく、プロセスの機能セットに適用されます。たとえば、pingにはrawネットワークソケットのみが必要なため、CAP_NET_RAWsetuidルートの代わりにsetcapを使用できます。

Linuxにはいくつかセキュリティモジュール、最も有名なのはSELinux。セキュリティモジュールは、ルートとして実行されるプロセスにも適用できる追加のセキュリティチェックを導入します。たとえば、SELinuxを設定することは可能です(簡単ではありません!)。ユーザーID 0でプロセスを実行しますが、制限が多すぎるため、実際には何もできません。

Linuxはユーザーネームスペース。カーネル内では、ユーザーは実際には単純なユーザーIDではなく、ユーザーIDと名前空間のペアです。名前空間は階層を形成します。子ネームスペースは、親ネームスペース内の権限を具体化します。フルユーザーは、ルートネームスペースのユーザー0です。名前空間のユーザー0は、その名前空間内でのみ権限を持ちます。たとえば、ユーザーの名前空間のユーザー0はその名前空間のすべてのユーザーを偽装することができますが、外部ではその名前空間のすべてのプロセスが同じユーザーとして実行されます。

答え2

Linuxには4つのUIDがあります。ルイド(本物),EUユーザーID(効果的な),スエイド(保存済み)、FSUID(ファイルシステム)。

これはプロセスの属性である数値にすぎず、カーネルプロセステーブルの制御ブロックに格納されます。

UIDは通常、アクセスが制限されていない'0'ユーザーを表すという点で特別な特性を持っていますroot

susudo新しいサブプロセスを開始し、SetUIDビットを介してEUIDを新しいUIDに設定して、ユーザーの有効アクセス権を変更するプログラムですsu。その後、このsuプロセスは新しい子プロセスから新しいシェルを再生成し、4つのUIDを新しいUID値に設定します。

次の例はこれを示しています。ユーザーがrdaSSH端末を介してログインしているとします。ps fax次のプロセスが表示されます。

472 ?        Ss     0:00 /usr/sbin/sshd -D
9151 ?        Ss     0:00  \_ sshd: rda [priv]
9153 ?        S      0:00  |   \_ sshd: rda@pts/1
9154 pts/1    Ss+    0:00  |       \_ -bash

4つのプロセス、sshデーモン、sshセッション(およびターミナル?)用の2つのプロセス、最後のプロセスはログインシェル(-以前はaとマークされていますbash)です。

ps faw -eo euser,ruser,suser,fuser,f,commプロセスのUIDが表示されます。

EUSER    RUSER    SUSER    FUSER    F COMMAND
...
root     root     root     root     4 sshd
root     root     root     root     4  \_ sshd
rda      rda      rda      rda      5  |   \_ sshd
rda      rda      rda      rda      0  |       \_ bash

認証の成功後に呼び出されると、su次の結果が発生します。

EUSER    RUSER    SUSER    FUSER    F COMMAND
...
root     root     root     root     4 sshd
root     root     root     root     4  \_ sshd
rda      rda      rda      rda      5  |   \_ sshd
rda      rda      rda      rda      0  |       \_ bash
root     rda      root     root     4  |           \_ su
root     root     root     root     4  |               \_ bash

'0''bash'プロセスはSetUIDビットによって(ルート)に設定されたEUIDを使用して新しい 'su'サブプロセスを開始し、RUIDはまだrdaのUIDに設定されます。 「su」プロセスは新しいシェルを使用して新しいサブプロセスを再起動し、ユーザーにrootアクセス権を付与します(RUID'0'も次のように設定されます)。ユーザーは自分の作業ディレクトリに残り、新しいシェルは親シェルと同じ環境を使用します。たとえば、次のようになります。

server:/home/rda# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
server:/home/rda# pwd
/home/rda

を使用してシェルを閉じることexitができ、ユーザーは元のアクセス権を持つ親シェルに入ります。

「su」がハイフン引数で呼び出されると、状況が異なります'-'

rda@server:~$ su -
Password:
server:~# echo $PATH
/root/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
server:~# pwd
/root

新しいシェルはログインシェルなので、シェル環境が変更されました。参照'-su': いくつかの追加の構成スクリプトを実行します。

 9151 ?        Ss     0:00  \_ sshd: rda [priv]
 9153 ?        S      0:00  |   \_ sshd: rda@pts/1
 9154 pts/1    Ss     0:00  |       \_ -bash
 9613 pts/1    S      0:00  |           \_ su -
 9614 pts/1    S+     0:00  |               \_ -su

ログインシェルはoffとして使用する必要がありますlogout

理論的には、ユーザーが端末、SSHなどを介してシステムに直接ログインし、デバイスに物理的にアクセスできないようにすることで、sudoユーザーが高い権限を取得するのを防ぐことができると思います。su

修正する:Androidのルートプロセス

詳しく説明したようにここ、Androidデバイスをルーティングする方法は次のとおりです。ブートローダーそしてAndroidシステムのプロパティ ro.secure

目標は常に同じです。つまり、suバイナリをインストール/systemしますsetuid(0)

ロック解除されたブートローダを搭載したデバイス:

ddデバイスからプライマリROMを抽出、追加su、再圧縮(または変更されたROMのダウンロード)、フラッシュモードでデバイスを再起動し、変更されたROMをフラッシュします。

ro.secure=0のデバイス:

このシステム属性は、入力したコマンドがroot()または許可されていないユーザー()adb shellで実行されるかどうかを制御します。値は起動時にrootユーザーのみがアクセスできるため、安全なディレクトリのファイルに設定されます。ro.secure=0ro.secure=1ro.securedefault.proproot

ほとんどの場合ro.secureに設定されていますが、1一部のメーカーではに設定されています0。デバイスのターミナルエミュレータまたはadbシェルでコマンドを実行してgetprop ro.secureこれを確認できます。ルートに設定すると0簡単です。コンピュータに接続し、実行し、読み書きでadbマウントしてインストールします。/systemsu

ブートローダがロックされたデバイス:

これらのデバイスのリカバリ機能は、製造者が署名していないカスタムROMフラッシュを許可しません。この状況でrootアクセス権を取得する唯一の方法は、実行中のシステムプロセスの1つ(特権モードで実行されている)のセキュリティ脆弱性を悪用し、それを攻撃して「ランダムコード」の実行を許可することです。このコードは通常、永久にマウントおよびインストールさ/systemれますsu

答え3

通常、有効なuidは0だけです。実行可能ファイルの「setuid」ビットが実際に設定されました。効果的なプロセスのUID。有効な uid が 0 でなく、実際の uid が 0 でない場合、プログラムは「権限のない」ユーザーとして実行されています。以下が適用されます。

権限のないプロセスは、実効ユーザーIDを実ユーザーID、実効ユーザーID、または保存されたセットユーザーIDにのみ設定できます。権限のないユーザーは、実際のユーザーIDを実際のユーザーIDまたは有効なユーザーIDにのみ設定できます。

Androidに関する限り、いいえ、削除するだけでsudo十分suだと思います。プログラムがsetuidビットを設定できる場合、そのプログラムはおそらくuid = 0で実行されます。内部ファイルシステムはいつでもrootとして使用でき、その後これらのプログラムを導入してrootアクセスが可能です。

関連情報