午後試験、特に記述式問題において、プログラミングコードの読解は避けて通れない壁です。「自分はインフラ担当だからコードは苦手だ」と感じている方も多いかもしれません。しかし、試験で求められるのは、高度なアルゴリズムを実装する力ではありません。求められているのは、「セキュリティ上の欠陥(脆弱性)」を見つけ出し、それを塞ぐ力です。
コードの中に潜む脆弱性は、実は「典型的なパターン」に集約されます。C++におけるメモリ管理の不備や、Javaにおける入力値検証の甘さなど、出るべきところは決まっているのです。このパターンさえ頭に入っていれば、数百行のソースコードも、チェックすべきポイントが輝いて見えるようになります。
本記事では、試験で頻出するC++とJavaの脆弱性コードを具体的に提示し、なぜそれが危険なのか、そしてどう修正すべきかを徹底的に解説します。プログラマー視点ではなく、セキュリティエンジニアの視点でコードを読む技術を身につけましょう。
C/C++:メモリ管理に潜む魔物「バッファオーバーフロー」
C言語やC++は、ハードウェアに近いメモリ操作が可能な反面、メモリ管理の責任が開発者に委ねられています。ここで最も頻繁に発生し、かつ試験でも問われやすいのが「バッファオーバーフロー」です。これは、コップに水を注ぎすぎて溢れさせるようなもので、溢れた水(データ)が隣の重要な書類(メモリ領域)を濡らしてダメにしてしまう現象に似ています。
脆弱なコード例(スタックバッファオーバーフロー)
以下のC++コードを見てください。ユーザーからの入力をバッファにコピーするだけの単純な処理です。
#include <cstring>
#include <iostream>
void copyInput(char* userInput) {
char buffer[10]; // 10バイトの領域を確保
// 【危険!】入力サイズのチェックを行わずにコピーしている
strcpy(buffer, userInput);
std::cout << "Copied: " << buffer << std::endl;
}
int main(int argc, char* argv[]) {
if (argc > 1) {
copyInput(argv[1]);
}
return 0;
}
なぜ危険なのか:メモリ構造の破壊
このコードの致命的な問題は、strcpy関数がコピー先のバッファサイズ(ここでは10バイト)を気にせず、コピー元のデータがNULL文字(