- 「ゼロデイ(zero-day)」とは、「セキュリティ上の問題点が発見された日」のことです。
- 「ゼロデイ脆弱性」は、悪用されたときのリスクは大きいですが、比較的 早期に修正されます。
- 定期的にシステムのアップデートを実行しておくことが対策になります。
基本的には「問題が発見された時だけ(ゼロデイ)」の脆弱性と言えます。
1. プログラムの不備が「脆弱性」になる
どうして、そんな脆弱性があるの?
コンピュータのシステムは複雑で、プログラムの「不備(バグ)」が見落とされてしまうことがあります。
この見落とされた「不備」は、最初に発見した攻撃者に「脆弱性」として悪用されてしまうことがあります。
不備を悪用してわざと誤動作を引き起こすと、セキュリティ上の制限を逸脱したような処理をさせることもできるからです。
しかし、このような「見落とし」は、見つけてしまえば修正は容易です。
システム開発会社が不具合に気づくと、すぐに修正のアップデートがなされます。
従って、この「ゼロデイ脆弱性」が悪用される期間は、比較的 短い期間ということになります。
もちろん、利用者がアップデートをしなければ、脆弱性は残ったままです。
アップデートがセキュリティのために必要なのは、これが理由です。
2. 脆弱性になりやすい例(バッファオーバーフロー)
脆弱性を生みやすいコードとして、もっともシンプルな例は C言語の scanf関数です1。
scanf(“%s”, szName);
scanf関数は、入力された文字列を内部のデータ領域に記録する、基本的な処理を担っています。
このとき問題になるのが「文字数」です。
scanf関数では入力された文字数をチェックしないため、あらかじめ用意したデータ領域の範囲外まで書き込んでしまうことがあるのです。
範囲外にデータを書き込んでしまう不具合を「バッファオーバーフロー」と言います。
このときにわざと長いデータを入力させて、範囲外の大事なデータを勝手に書き換える攻撃があります。
それによってコードが改変され、予期せぬ動作の原因になるのです。
このように入力されたデータの整合性をチェックする必要がある処理は、ほかにもあります。
3. 効率優先のために生じるチェック漏れ
どうして、scanf関数は入力された文字数をチェックしないの?
現代からみると、はすべての入力の整合性をチェックするべきかもしれません。
しかし、そうすると計算処理に余分に時間がかかってしまいます。
とくにscanf関数が作られたころには、その処理時間は無視できないものでした。
そこで、チェックするかどうかはプログラマーに委ねられました。
しかし、ここに人為的なミスの入り込む余地があるわけです。
とはいえ、現在は、より安全な設計の関数を利用することが主流です。
しかし、依然としてシステムの深い部分では残っていることがあり、しばしば問題として表面化するのです。
4. 一般人はゼロデイ脆弱性の標的には(比較的)なりにくい
このような「ゼロデイ脆弱性」で標的とされるのは、大企業や政治家、ジャーナリスト、反体制派、その他のリスクの高い個人と言われています。
変な話ですが、「ゼロデイ攻撃」は、いつでも誰にでもできるわけではありません。
脆弱性には攻撃できる期間と対象が限れています。
いわば、「チャンスは一度切り」。
犯罪者には、このような弱点を隠し持っておいて、「とっておきの相手」、つまり、情報や資金の集中する大企業を狙って悪用する傾向があります。
犯罪組織にとって、一般人に無差別にゼロデイ攻撃を仕掛けるメリットはあまりないです。
どちらかというと大企業が攻撃の対象であることが多いです。
もちろん、企業で働いていれば無関係ではありません。
こちらもどうぞ。