ikepyonのだめ人間日記

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

コーダーにセキュリティ知識は必要か?

いろいろつぶやいていたら、某氏にBlogに書けといわれそうなのでw
設計や仕様レベルの脆弱性CSRFとか、Amazonウィッシュリストのように悪用できる仕様とか)では、リスク分析やセキュリティ対策を考えなけれならない。これは、コーディングでどうにかすると言うわけにはいかないからだ(もっともCSRFはコーディングで何とかできんわけでもないけど、設計レベルで対処すべきだろう)。
一方、コーディングレベルの脆弱性XSSとかSQLインジェクションといったインジェクション系やディレクトリトラバーサルなど)は、セキュリティとは関係なく、どのような場合でも、想定したとおりの動作をするように作るだけで、かなり防ぐことができると思う。
どのような場合でもと言うのは、例えば、同じプログラムを同時に実行した場合、非常に大きなデータが渡された場合、想定外の内容のデータが渡された場合といったことだ。
想定している使い方やデータだけでなく、想定していないデータや使い勝たされた場合、どうなるか?と言うことを考えながら作ればセキュリティ云々言わずにすむ。
さて、こう考えると、コーダーは設計書どおりに作ること+以下のようなことを心がけて作ればいいのではないか?

  • プログラムには想定外のデータが渡されることもある

英数字の項目に記号とかメタ文字が入るとか、サイズが異常に大きいとかがあった場合、エラーにしたり、適切なエスケープを行って処理を行ったりする必要があるだろう。

  • 想定外の実行がされることもある

同時に実行されるとか、複数のプログラムがある場合、実行される順番が違うとかがあった場合、排他制御するとか、起動順番を確認してエラーにするとかする必要があるだろう。

  • エラー情報は少なめにユーザに返す

クライアントサーバのシステムの場合、エラーの詳細を出して、開発者に連絡しろというのをやっていたことがあったけど、セキュリティのことを考えると、エラーの詳細はログに出力して画面には情報を出さないと言うことが必要だろう。

これ以外にももっとあるかもしれない。でも最低限これぐらいのことを考えながら作れば、難しいセキュリティのことを考えずに、発見されている多くの脆弱性は防げると思う。

上流の技術者にはセキュリティ知識が必要だけど、コーダーレベルになれば、当たり前のことを当たり前にやるだけで、セキュリティ知識がなくてもある程度安全なアプリを作れると思うけどなぁ。