web-dev-qa-db-ja.com

エクスプロイト後にSUIDが使用されない

私は次のことを知っています

SUIDビットが有効になっているプログラムを実行すると、そのプログラムの所有者の権限が継承されます。

私は現在user1ですが、user2のパスを読みたいです

  1. ls -l fileでSUIDビットを確認します

    user1@ssh/path$ ls -l file
    -r-sr-x--- 1 user2 user1 5164 Nov  9 15:08 file
    
  2. 私はエクスプロイトを行います=> ./file arg=exploit。シェルが表示されます

  3. それが機能するかどうかを確認するために、私はwhoamiをします。

    $ whoami
    user1
    

私はまだ同じユーザーですか? 、そして私はこれがどのようになるのかわかりません。

さらに情報が必要な場合はお知らせください。

4
Ludisposed

Setuidの理解は正しいです。 suidビットを持つプログラムを実行すると、プロセスはそのプログラムの所有者の権限を継承します。不足している知識は、起動後にシェルが行うことです。起動時にshドロップ特権の一般的な実装の多くは、有効なUIDを実際のUIDにリセットします。これにはbash、dash、mksh、およびBusyBox shが含まれるため、Linuxでは他に何も表示されません。

プログラムがシェルを実行すると(たとえば、標準Cライブラリからsystem関数を呼び出すか、同等の機能を別の言語で呼び出すことにより)、シェルは昇格された特権で起動しますが、ユーザーコードを実行する前に通常の特権にドロップします。これにより、攻撃者が昇格された特権での実行を意図していないシェルコマンドのみを実行できるsetuidプログラムでの悪用が緩和されます(たとえば、シェルコマンドが、アプリケーションプログラマが知らないライブラリコードに埋め込まれていたため)。

これは、攻撃者が任意のコードを実行するエクスプロイトを緩和するものではありません。シェルを取得するには、systemを呼び出すよりも少し手間がかかります。いくつかの異なる通訳を呼び出すように手配します。 execve("/usr/bin/Perl", "/usr/bin/Perl")を実行します(親プログラムを終了したくない場合は、まずフォークします)。