web-dev-qa-db-ja.com

継承されていないオブジェクトを複数回削除して、コード実行に悪用することはできますか?

バグに優先度を割り当てる際、C++でオブジェクトを2回以上削除すると、オブジェクトへのポインターが破損する可能性がある場合にコードが実行されるかどうかについて内部で話し合いました。仮想デストラクタを持つオブジェクトの場合、答えはここで明白になるようです。

ただし、削除されたオブジェクトが標準型(つまり、long)、配列、または仮想テーブルを持たないクラスのインスタンスのいずれかである場合、これがコード実行に悪用される可能性があるかどうかは明らかではありません。

この状況により、既存の一般的な実装でコードが実行される可能性はありますか?

1
George Y.

Longやarrayなどの基本的なタイプの場合、リモート実行を実現する方法は考えられません。クラスには、仮想テーブル以外にも多くのオプションがあります。たとえば、メンバークラスに仮想テーブルがある場合があります。デストラクタ関数へのポインタが含まれているため、共有ポインタも使用できます。デストラクタがポインタを使用して関数を呼び出すなど、他のよりエキゾチックなケースも発生する可能性があり、おそらくそれ以上のものがあります。そのようなバグを真剣に受け止めることをお勧めします。

2
Peter Harmann