解決済みのQ&A
これ、わかりません、どなたか説明おねがいします。
babu3gさん
これ、わかりません、どなたか説明おねがいします。
以下のプログラムはxinetdから呼び出され、パスワードを知っているユーザのみがメッセージ投稿・表示を行えることを意図して作られています。ただ、このプログラムにはいくつか脆弱性が存在します。発見した脆弱性と攻撃方法、またその修正方法について解説してください。
-----
1 #include <stdio.h>
2 #include <string.h>
3 #include <stdlib.h>
4 #include <unistd.h>
5 #include <crypt.h>
6 #define SALT "$1$54lt$"
7 #define HASH SALT"4OOZtZMXwyHi.bwq2QS6U0"
8 char *get_line()
9 {
10 char buf[256];
11 gets(buf);
12 return strdup(buf);
13 }
14 int main()
15 {
16 char *name=NULL, *passwd=NULL, *msg=NULL, buf[256];
17 int trial_num, pass = 0;
18 setbuf(stdout, NULL);
19 for(trial_num = 0; trial_num < 10;trial_num++){
20 printf("USER: ");
21 name = get_line();
22 printf("PASS: ");
23 passwd = get_line();
24 if(strcmp(HASH, crypt(passwd, SALT)) == 0){
25 pass = 1;
26 break;
27 }
28 snprintf(buf, sizeof(buf), "NG(%s)\n", name);
29 printf(buf);
30 }
31 if(pass){
32 printf("MSG: "); msg = get_line();
33 snprintf(buf, sizeof(buf), "echo [%s]%s >> /tmp/memo.log", name, msg);
34 system(buf);
35 system("cat /tmp/memo.log");
36 }
37 return 0;
38 }
-----
-
- 質問日時:
- 2013/5/20 21:12:30
-
- 解決日時:
- 2013/5/21 15:45:16
-
- 回答数:
- 2
-
- 閲覧数:
- 157
-
- ソーシャルブックマークへ投稿:
- Yahoo!ブックマークへ投稿
- はてなブックマークへ投稿
- (ソーシャルブックマークとは)
ベストアンサーに選ばれた回答
まずあげられることはgets( )を使っていることでしょう。バッファーオーバーフローの危険があります。代わりに少なくともバッファの大きさを指定できるfgets( )を用いることが推奨されます。さらにgetline( )という関数を用いれば入力バッファを関数内で柔軟に割り当てさせることもできます。
しかし最大の脆弱性はパスワードを入力するときに丸見えになってしまうことでしょう。端末制御のコードを書けば入力時のエコーを無効にできますが、^Cを押されたときのことなどを考慮するときちんと動くコードを書くことはなかなか大変ですが、getpass( )というライブラリ関数を用いることで容易に実現できます。
- 回答日時:2013/5/20 23:13:58
このQ&Aはまだナイス!されていません。
役に立ったと思った回答に、ナイス!してみよう!
ベストアンサー以外の回答
(1件中1〜1件)
enifstiさん
gets() は既に指摘されている通りですが、加えて、ユーザの入力をチェックせずに system() に渡している点が問題。
正規のユーザでも、"MSG: ;/bin/sh" と入力すると xinetd の権限で shell が実行可能になります。
- 回答日時:2013/5/20 23:54:06
あなたにおすすめの解決済みの質問
- c言語について文字配列を用いて" "(全額空白)か"■"(四角)をどちらか1文字ランダムに表示したいです。 #i...
- c言語を独学し始めた高校一年男子です。 「猫でもわかる c言語プログラミング」という本で勉強していま...
- c言語で重複しない乱数の生成プログラムを作成しているのですが、上手くいきません。1000個の重複しない...
質問した人からのコメント
最初に回答あいてくれたかたにBAします!