フォーマット文字列を指定せずに scanf を実行すると、どのような脆弱性が発生しますか?
例:
scanf(variable);
ここでの脆弱性は通常、本質的に非常に技術的なものですが、問題は、scanf
読み取った値が書き込まれるアドレスを関数がパラメーターとして受け取ることです。関数に十分な引数を渡して、それらがどこに行くべきかを指定していない場合、または間違ったタイプの引数を与えた場合、悪意のある攻撃者は、scanf
読み込まれた値が制御するメモリ内の場所に書き込まれるようにフォーマット文字列を作成できます。機密情報。たとえば、関数を実装する最も一般的な方法は、関数が戻った後に次に実行する命令のアドレスをスタックのどこかに格納することです。攻撃者が何らかの方法でこのアドレスにデータを書き込むことができれば、関数が戻る場所を変更できます。さらに、攻撃者がバイナリデータをメモリに入れることができれば、scanf
(おそらくstdin
データの束にフィードすることによって)、理論的にはリターン アドレスを変更してそのバイナリ データにジャンプし、プログラムをハイジャックして、攻撃者が選択したコードを実行させることができます。これは、ハード ドライブをフォーマットするコードなどの悪意のあるものである可能性があり、さらに悪いことに、個人情報を盗んだり、コンピューターにバックドアを追加したりする可能性もあります。
データを書き込むべきではない場所にデータを書き込むことによって機能する一般的な攻撃を実行する方法の詳細については、記事「Smashing the Stack for Fun and Profit」が参考になります。このタイプの問題には特に対処していませんが、ここで説明する種類の攻撃は同様に実行できます。
お役に立てれば!