バッファオーバフロー攻撃の仕組みとは???

どもー、最近セキュリティ関連にハマってるたなかです
今回は夏休み中、暇なのでセキュリティの関連のお話したいと思います!

まずは、IPAから脆弱性の種類別割合を見てみましょう


なんだか、よくわからない!
では、今回は最も割合を占めている
『バッファエラー』について紹介したいと思います!


 

ここから先、少し難しい内容が入ってきますので
分からない場合は、無視するか調べてみてください(特に、スタックとかキューとか)

バッファエラー(Buffer Error)
パソコンのメモリアドレスにアクセスできるような言語(C言語とか)
不正にコードをメモリに上書きし、意図しない動作させる攻撃のこと(詳細はここから)
最近では、Facebookのサービス停止など様々なところで問題が発生しています
具体例として、バッファオーバフロー攻撃が挙げられます

では、バッファオーバフロー攻撃とは何だろうか?
どうやって攻撃しているのか?

実際に単純なソースコードを書いてみました

#include <stdio.h>
#include <string.h>

int main(int argc, char *argv[])
{

char buf[10];//変数で文字列10個の領域を確保
printf("buf = %p\n", buf); //メモリのアドレスの表示
printf("plz enter letters:");
scanf("%s", buf);//文字列の入力
puts(buf);

return 0;

}

 

これは、普通に書いたC言語の文字列の入力ですが
これでも、バッファオーバフロー攻撃が可能です
どこが問題かというと、変数buf[10]ところ
10文字以上打つとどうなるでしょうか?

動作が停止しました!!!!

なぜか?

「変数の文字列が戻り値と被って終了できない!」という事態が発生しました!
このようにプログラムを意図的に破壊することが可能になりました!

これを用いれば、メモリにシェルコードを紛れこませて管理者権限を取得することが可能です!

では、このようなプログラムの脆弱性を消すためにはどうすればいいか

文字列の長さを確認する

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
    char buff[10];
    printf("plz enter letters:");
    gets(buff);
    int buffn = strlen(buff);//文字列の長さ
    if(buffn > 10) //文字列の長さが10文字以上の時
    {
        puts("error"); 
        exit(1); //異常終了
    }
    puts(buff);

    return 0;
}

10文字を超える場合は、exit関数で終了させるという方法です。

ほかにも、strcpy関数やgets関数を使わないなど
様々な対策方法があるので、ぜひ調べてみてください!


 

いかがでしたでしょうか?
今回は、バッファエラー(バッファオーバフロー攻撃)のお話でした!
まだまだ、ほかにありますので
評判が良ければ、随時更新していこうかな?と思っている次第です!

以上です!
長文で失礼しました!

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です