ここから本文です

解決済みの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 }
-----

違反報告

ベストアンサーに選ばれた回答

glassyfeetさん

まずあげられることはgets( )を使っていることでしょう。バッファーオーバーフローの危険があります。代わりに少なくともバッファの大きさを指定できるfgets( )を用いることが推奨されます。さらにgetline( )という関数を用いれば入力バッファを関数内で柔軟に割り当てさせることもできます。

しかし最大の脆弱性はパスワードを入力するときに丸見えになってしまうことでしょう。端末制御のコードを書けば入力時のエコーを無効にできますが、^Cを押されたときのことなどを考慮するときちんと動くコードを書くことはなかなか大変ですが、getpass( )というライブラリ関数を用いることで容易に実現できます。

  • 回答日時:2013/5/20 23:13:58

質問した人からのコメント

  • 感謝ありがとうございました!!
    最初に回答あいてくれたかたにBAします!
  • コメント日時:2013/5/21 15:45:16

グレード

この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個の重複しない...
PR
Yahoo!知恵袋のQ&Aアプリが登場! さくさく検索、かんたんに質問や回答ができる! Yahoo!知恵袋アプリ

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。

お客様自身の責任と判断で、ご利用ください。


知恵コレに追加する

閉じる

知恵コレクションをするID/ニックネームを選択し、「追加する」ボタンを押してください。
※知恵コレクションに追加された質問や知恵ノートは選択されたID/ニックネームのMy知恵袋で確認できます。

ほかのID/ニックネームで利用登録する