GAIO CLUB

2024年03月18日

【第20回】脆弱性を含む記述例2

静的解析/コンパイラ技術
いまさら聞けない静的解析/コンパイラ技術
引き続き、CWE Top 25 の脆弱性からコーディング例を考えます。

CWE-190(整数オーバーフローまたはラップアラウンド)

CWEの例ではメモリの確保に関するものがあります。今回もお手本にして作りました。
CWE-190(整数オーバーフローまたはラップアラウンド)
mallocで確保するエリアサイズがunsigned short型の最大値を超えてしまい、sizeには下位2バイトの0だけが入るため、0バイトのメモリ確保が行われます。

mallocは正常リターンしますが、メモリを確保したつもりでポインタの指すエリアを使用すると、「ヒープエリア」の回でご紹介したmallocの管理情報を壊すかもしれません。

結果、あるとき突然エリアが壊れてしまう原因追及の大変難しい問題を作り込んでしまいます。
malloc管理情報

CWE-416(解放後の使用)

CWEの情報では、freeした後のポインタ使用があげられています。
こちらは、CWEサイトの例をそのまま引用しました。
CWEサイトの例
freeしたエリアは別のmallocで使用されます。もしfreeしたエリアのポインタを引き続き使用した場合、異なる用途のポインタが同じエリアを指すことになってしまい、想定外のエリア破壊が起きるでしょう。
CWE-190の例のように、管理情報を壊すこともあり得ます。
管理情報を壊す例
このような状況を起こさせないために、free後にポインタ値を変更するよう規定するCERT Cのルールもあります(MEM01-C)。

筆者紹介

浅野 昌尚(あさの まさなお)

ガイオ・テクノロジー株式会社

開発1部 QTXグループ

1980年代から30年以上にわたり汎用構造のCコンパイラ開発に従事し、その間に8ビットマイコンからRISC・VLIW・画像処理プロセッサまで、さまざまなCPU向けのクロスCコンパイラを開発。

人気のコラム

最新のコラム