情報セキュリティ(49) サイバー攻撃への対策⑥ セキュアプログラミング
セキュアプログラミングとは、プログラムの開発時のコーディングの際に、セキュリティを意識した構築を行うことです。
まず、開発言語の問題があります。古いプログラム資産の中には、C++言語が使用されているものがあります。C++は、仕様がアセンブラに近く、メモリ空間の管理もプログラムの中で行います。従い、実行モジュールのシステム専用領域に、ユーザがデータを書き込んでしまう、などということができてしまいます。これを利用した攻撃が、バッファオーバーフロー攻撃です。
この攻撃を防ぐためには、メモリ領域を確保する際に、malloc()関数のみを使うなどガイドラインもありますが、そもそもC++系の言語はWebアプリケーションには使用しないことがベターです。
JavaもWebアプリケーションではよく利用される言語です。Javaはメモリの確保・解放を自動的に行い、ユーザは触れないので、セキュリティ上はC++より有利です。同じメモリを複数のプログラム(スレッド)がアクセスでき、データ更新上の不具合が発生する可能性があります。これをレースコンディションと言いますが、スレッドの同期を行う対策があります。
また、コーディング時のセキュアプログラミング対策としては、タグを文字変換(エスケープ処理といいます)する方法があります。例えば、htmlで使用する「<」を、「<」と表現するなどです。こうすると、Web画面で表示する際に、<script></script>など命令を実行するhtmlタグが実行されることを防ぐことができます。
更には、SQLインジェクション対策として、バインド機能が利用できます。Webサービスでパラメータを渡す際に、データを更新するステートメントをそのまま渡すのではなく、プレースホルダという受け渡し皿に入れて引き渡すのです。こうすることで、引き渡したパラメータが実行され、意図しないデータの書き込みを防ぐことができます。
これらの方針は、セキュアプログラミング方針として、開発ベンダが作成・運用するべきです。ベンダ選定や、監査の際に、ベンダにセキュアプログラミング方針の状況を確認するのがよいと思います。