メインコンテンツ

関数ポインターに絶対アドレスが割り当てられています

関数アドレスとして使用される定数式にコード インジェクションに対する脆弱性がある

説明

この欠陥は、関数ポインターに絶対アドレスが代入された場合に発生します。

Bug Finder では、リテラル定数の任意の組み合わせを伴う式は絶対アドレスであるとみなされます。1 つの例外は、式の値がゼロである場合です。

リスク

固定アドレスの使用は移植可能ではありません。アドレスが他のプラットフォームでは無効となる可能性があるためです。

攻撃者は絶対アドレスにコードを挿入でき、それが原因で恣意的な、おそらくは悪意のあるコードがプログラムにより実行されることになります。

修正方法

関数ポインターには絶対アドレスを使用しないようにします。

すべて展開する

extern int func0(int i, char c);
typedef int (*FuncPtr) (int, char);

FuncPtr funcptrabsoluteaddr() {
    return (FuncPtr)0x08040000; 
}

この例では、関数がアドレス 0x08040000 を指す関数ポインターを返します。攻撃者がこの絶対アドレスを知っていると、攻撃者によってプログラムが侵害される可能性があります。

修正 — 関数アドレス

1 つの修正方法として、既存の関数のアドレスを代わりに使用します。

extern int func0(int i, char c);
typedef int (*FuncPtr) (int, char);

FuncPtr funcptrabsoluteaddr() {
    return &func0;
}

結果情報

グループ: セキュリティ
言語: C | C++
既定値: オフ
コマンド ライン構文: FUNC_PTR_ABSOLUTE_ADDR
影響度: Low

バージョン履歴

R2015b で導入