読み方 : カナリアち
カナリア値【canary value】スタックカナリア/stack canary
概要
カナリア値とは、バッファオーバーフロー攻撃を検出するためにメモリ上のスタック領域に記録される特定の値。プログラムの実行中にこの値が改竄されていないかを監視することで、不正な攻撃を検知することができる。

名称の由来は、かつて炭鉱夫が有毒ガスの検知のためにカナリアを坑道へ持ち込んでいた慣習にある。カナリアはガスに敏感で、危険な環境になるといち早く異変を示した。カナリア値もこれと同様に、攻撃の兆候をいち早く検知する「見張り役」として機能することから、この名が付いている。
バッファオーバーフローとは、プログラムが確保したメモリ領域を超えてデータを書き込む攻撃手法である。プログラムの実行時に用意される「スタック」(stack)と呼ばれるメモリ領域には関数の戻りアドレスが格納されており、攻撃者はバッファに大量のデータを流し込むことでこの戻りアドレスを上書きし、任意のコードを実行させることを狙う。
カナリア値はバッファと戻りアドレスの間に配置される。関数が呼び出されるたびにカナリア値が設置され、関数が終了して戻りアドレスへジャンプする直前にその値が変わっていないかを確認する。バッファオーバーフローによって戻りアドレスを上書きしようとすれば、その途中にあるカナリア値も必ず改ざんされるため、攻撃を検知してプログラムを強制終了させることができる。
カナリア値の効果を高めるため、値はランダムに生成され、プログラム実行のたびに変化するのが一般的な実装となっている。攻撃者がカナリア値を事前に知っていれば回避できてしまうため、予測困難な乱数が用いられる。gccなどの主要なコンパイラにはカナリア値を自動的に挿入するオプションが備わっており、ソフトウェアのメモリ安全性を高めるための基本的な防御手法の一つとなっている。