はじめに
百聞は一見に如かず。
脆弱性の中でわりと聞くバッファオーバーフローについて実際に引き起こしてみて、知った事、思った事をまとめてみた。
バッファオーバーフローについて
割り当てられているバッファサイズを超えた値に上書きされた状態をバッファオーバーフロー状態というらしい。上書きされるメモリ(バッファ)の領域の場所により「何とかベースのバッファオーバーフロー」という名称で呼ばれるらしい。
JVNでも新着リストをざっと見るとバッファオーバーフロー関連の脆弱性情報を見かける印象。
バッファオーバーフローを試しに引き起こしてみた
試す前に環境準備。
バッファオーバーフローを引き起こす為にはバッファサイズを指定できるC言語を使用したいのでVS CodeでC言語の環境を準備する。
準備の手順は調べると色々なサイトがあるけれど、今回はこちらを参照した。
バッファオーバーフローのコード例
参考にしたコードが載っているサイトはこちら。(他のカテゴリの脆弱性についても色々載っているので今回以降も参考にしたいサイトだと思った。)
#define BUFSIZE 256
int main(int argc, char **argv) {
char buf[BUFSIZE];
strcpy(buf, argv[1]);
}
読んでみると、1行目はバッファサイズを256と指定している。
3行目でbuf
のバッファサイズを256に設定している。
4行目のstrcpy
でバッファサイズ256のbuf
にargv[1]
の文字列をコピーしている。
strcpy
自体についてはこちらのサイトを参照した。
https://marycore.jp/prog/c-lang/string-strcpy-strncpy/
記事中にある通り、文字列の終わりを示すナル文字('\0')に1バイト必要なところもポイントっぽそう。
実際にVS Codeに書いたコードはこちら(ほぼ例のままではある)。
#include <string.h>
#define BUFSIZE 256
int main(int argc, char **argv) {
char buf[BUFSIZE];
strcpy(buf, argv[1]);
}
デバッグしてみると以下のメッセージ(抜粋)が表示される。
Thread 1 hit Breakpoint 1, main (argc=1, argv=0x21c827614b0) at C:\C_file_2409\test_cwe_121.c:7
7 strcpy(buf, argv[1]);
Thread 1 received signal SIGSEGV, Segmentation fault.
0x00007ffaac4af04a in strcpy () from C:\Windows\System32\msvcrt.dll
メッセージを読んでみると7行目のstrcpy
で停まっていることが分かる。
SIGSEGV
はセグメント不正のメッセージで、使用可能なメモリー範囲外のメモリーアドレスを参照したことを示しているらしいので、確かにバッファオーバーフローが引き起こされている事が分かる。
参照しているのはargv[1]
のメモリーで、今回、配列argv
の長さは1なのでargv[1]
には値が存在しない。(printfで見てみるとnull)
argv[1]
のメモリーを参照しようとしたのでSIGSEGV
が出ていることが分かる。
他にも書いたコード
buf
のバッファサイズを超えた値を書き込もうとしてSIGSEGV
が出るパターン。
#include <string.h>
#define BUFSIZE 5
int main(char *abcd) {
char buf[BUFSIZE];
strcpy(buf, abcd);
}
そのデバッグのメッセージ(抜粋)。
Thread 1 hit Breakpoint 1, main (abcd=0x1 <error: Cannot access memory at address 0x1>) at C:\C_file_2409\test_cwe_121_2.c:6
6 strcpy(buf, abcd);
Thread 1 received signal SIGSEGV, Segmentation fault.
0x00007ff90b44f02b in strcpy () from C:\Windows\System32\msvcrt.dll
まとめ
C言語にはあまり馴染みがなかったのでウッ…となったけれどコードの中身を見てみると、うっかり書きかねないなと思った。
それとC言語と違ってメモリ管理の事を考えなくて良い言語もある点、C言語ベースの言語も潜在的にバッファオーバーフローが発生する可能性がある点も、今回調べる中で知れたので良かった。
参考リンク
(むしろこれ読んだ方がいい)