ikepyonのだめ人間日記

セキュリティに関することを書いていく予定。

ここらでアプリケーションの脆弱性について考え直してみる

アプリケーションの脆弱性ってのは、ぶっちゃけて言えばアプリケーションのバグor仕様のミス(まあこれもバグの一つか?)のうち、狭義のセキュリティ上の問題になるものだと思うんだな。
ちなみにあらゆるバグは、完全性や機密性、可用性のどれか(複数ってのもあり)を侵害するものなので、広義のセキュリティ上の問題だったりすると思うんだが、それはそれとしてw

まず、一般的に言われているバグがどういう風に起こるか?というと、開発者が想定していない状態になるor結果が得られることであるといえると思う(それが異常終了するとか、予期していた結果が得られないとか)。また、開発者が想定していない使われ方をすると、やはり想定していない結果が得られたり、状態になってしまうことがある。
で、脆弱性があるアプリケーションとはバグor仕様ミスのあるアプリケーションであるともいえるので、脆弱性とはアプリケーションが開発者が想定していない状態になるor使われ方をすると、セキュリティ上の脅威が発生することといえると思う(論理の飛躍がありすぎ?)。

では、開発者が想定していない状態にするor使い方をするとはどういうことか?
まず、どんなアプリケーションも入力データと起動タイミングなどに依存してその挙動を開発者が思ったとおりに変えるといえる。
例えば、入力データ1と入力データ2の和を表示するようなアプリケーションの場合、入力データ1と2がそれぞれ、「1」、「2」のときは「3」を表示し、「4」、「5」の場合は「9」を表示するといった具合だ。

この例のアプリケーションで、入力データ1と2にそれぞれ、「abc」と「10」を入れた場合、どうなるか?
あるアプリケーションは、「abc10」と表示するかもしれないし、別のアプリケーションは「10」と表示するかもしれない。場合によってはエラーが発生して、エラーメッセージを表示するだろう。
このアプリケーションの目的が数値計算であるので、開発者が想定していた入力データは「abc」のような文字が入ってくることを想定していなかった場合、いずれにせよ想定していない結果が得られる(どういう事態が起こるかはプログラムの構造に依存するし、それが問題とならない場合もあるだろう)。その結果、セキュリティ上の問題が発生することもある。
一方、開発者が入力データに何が入ってくるかandどういう状態で使用されるかわからないと仮定してアプリケーションを作っていたなら、その想定に間違いがなければ、どんな値が入力データとして渡されてもandどういう状態で使用していても、それは全て開発者の想定の範囲内の挙動であり、それはバグとはいえない。

開発者が想定していない状態になるor使い方をするには、開発時に開発者が結果を想定していなかったデータを受け取ったり、想定していない状態でアプリケーションを使用すればよい。実際、これらが脆弱性につながっている。

まあ、あらゆる状態を想定するというのはそれなりの経験がないと難しいので、セキュリティ対策が難しいといわれるんだと思うけど・・・
実際のところ、こういう時どうなる?というのを常に考えながら作っていけば、ある程度安全なアプリって作れると思うんだよねぇ。

セキュリティ対策の基本は起こりうるあらゆる状態でも想定の範囲内に押し込めることだと思うんだよねぇ。もし、システム的にそれができないのなら、人的な条件付け(使う人、時、場所を限定するとか)を行うしかないかもね。でも、インターネットに公開するアプリケーションではそういった人的な条件付けというのは基本的に無理なので、システム的に条件をつけるしかないんだけどね。