【ダングリングポインタ】
ダングリングポインタ とは?
公開:
💡 引っ越した友達の家に手紙を送り続ける、迷子の宛先
📌 このページのポイント
- メモリを解放した後もポインタがその場所を指し続けている状態
- ダングリングポインタ経由のアクセスは未定義動作を引き起こす
- Use-After-Free脆弱性として攻撃に悪用されるケースが多い
- RustやSwiftなどの言語は仕組みレベルでダングリングポインタを防止している
ダングリングポインタって怖そうな名前だけど、どういうものなの?
たとえば、友達が引っ越したのに古い住所のまま手紙を送り続けるようなものだよ。メモリ上のデータが解放されたのに、ポインタだけがその場所を指し続けている状態のことだね。
それってアクセスしたらどうなるの?
何が起きるか分からないんだ。たまたま同じ場所に別のデータが入っていたら、見知らぬ人の手紙を読んでしまうようなもの。プログラムがクラッシュしたり、データが壊れたり、最悪の場合は攻撃者に悪用されるよ。
攻撃に悪用されるってどういうこと?
「Use-After-Free」と呼ばれる脆弱性だよ。解放された領域に攻撃者が悪意のあるデータを配置して、ダングリングポインタ経由でそれを実行させるんだ。ブラウザの脆弱性の多くがこのパターンで、Chrome・Firefox・Safariどれも過去に何度もやられているよ。
C言語ではどうやって防ぐの?
基本的なテクニックとしては、メモリを解放した直後にポインタをNULLに設定する方法があるよ。NULLアクセスならクラッシュするから、少なくとも「気づかず壊れたデータを使い続ける」事態は防げるんだ。
それって手動でやるの?忘れちゃいそう...
Rustってすごいんだね!他の言語はどうしているの?
JavaやPythonはそもそもプログラマが直接メモリを解放できないから、ダングリングポインタは基本的に発生しないよ。ただしC/C++で書かれたネイティブライブラリを呼び出す部分では起きうるんだ。Googleの調査ではChromeのセキュリティバグの約70%がメモリ安全性の問題で、その多くがUse-After-Freeだったんだよ。
まとめ:ざっくりこれだけ覚えればOK!
「ダングリングポインタ」って出てきたら「解放済みメモリを指しっぱなしの危険なポインタ」と思えればだいたいOK!
📖 おまけ:英語の意味
「Dangling Pointer」 = 宙ぶらりんのポインタ
💬 「dangling(ぶら下がっている・宙ぶらりんの)」が語源で、行き先を失ってブラブラしている状態を表しているよ