サイバー攻撃・脆弱性攻撃への耐性を高めるようソフトウェアを設計・開発する手法
悪意のある攻撃者は、ソフトウェアが抱える不備や不具合、すなわち脆弱性を突いてデータを盗聴・改ざんしたり、マルウェアに感染させたりといった攻撃を仕掛けてくる。セキュアコーディングとは、こうした攻撃を受けることを想定して、脆弱性を抱えないようにソフトウェアを開発する手法を指す。
例えば、Webアプリケーションでは入力フォームに書き込む値からデータベースを不正に操作し、データの改ざん・窃取を試みるSQLインジェクションと呼ばれる攻撃が知られている。セキュアコーディングで推奨された手法に基づき、脆弱性を解消し不正な操作を防ぐようにコーディングを行うことで、脆弱性を突いた攻撃のリスクは軽減される。Webアプリケーションに限らず、モバイルアプリやIoT機器など、あらゆるソフトウェア製品において、脆弱性を事前に回避する取り組みが必要だ。
設計段階からセキュリティを考慮する考え方は「セキュリティ・バイ・デザイン」と呼ばれる。一般的に、サイバー攻撃の被害が発生してから対処するより、事前に被害が生じないように設計する方が、トータルコストが抑制できるとされる。また、ソフトウェアのリリース後に未知の脆弱性が発覚するケースも多いため、設計時から堅牢なコーディングを目指す必要がある。
開発工程の各局面におけるセキュアコーディングの考慮点
セキュアコーディングを行う上では、上流工程からセキュリティを考慮することが求められる。開発工程の各局面で検討するべき事項について以下に解説する。
要件定義
開発するソフトウェアの特性に応じて、セキュアコーディングが対象とすべき脆弱性への対処法を検討する。アーキテクチャーやセキュリティ要件により、考慮するべき脅威は異なる。具体的には、SQLインジェクション、クロスサイトスクリプティングといった攻撃を想定する。
設計
セキュアコーディングにおいて守るべきコーディング規約を策定し、開発者全員に周知させる。「Top 10 Secure Coding Practices」のように、よく知られた設計原則を参考にするとよいだろう。また、プログラミング言語やフレームワークによって固有の脆弱性が知られているため、それらを避けるコーディングを徹底することも意識したい。
開発
開発を進めるに伴い、コーディング規約が遵守されているかを検証するためにも、ソースコード単位でのレビューが推奨される。具体的には、フォーム入力やデータ表示時の検証といった処理で脆弱性対策が講じられているかどうかを確認する。
テスト
要件定義時に対象とした脆弱性について、セキュリティテストを実施する。場合によっては、外部のベンダーに依頼して脆弱性診断やペネトレーションテストを実施し、その診断の結果を踏まえて検証してもよいだろう。
セキュアコーディングだけに頼らない多層的な防御
セキュアコーディングを支援するべく、開発標準やセキュリティに関する情報を公開している団体として、OWASP(Open Web Application Security Project)やJPCERT/CCが知られている。
また、目視によるセキュリティレビューには限界があるため、ツールを活用するのも有効だ。セキュアコーディングの規約を遵守しているかどうかを確認するためのコード検査ツールが公開されている。
セキュアコーディングは安全性の高いソフトウェアを開発するのに欠かせない取り組みであるが、加えて、多層的な防御を施すことで、より一層安全性は高まる。例えば、Webアプリケーションの場合、ファイアウォールやWAF(Web Application Firewall)によってアプリケーションの通信を保護することで、サイバー攻撃や悪意のある通信に対するリスクを軽減できる。
また、開発環境にマルウェアが潜伏し、開発したソフトウェアにマルウェアが組み込まれてしまうサプライチェーン攻撃のような手法もあるため、開発端末にセキュリティソフトを導入するなど、エンドポイントのセキュリティ対策も講じるようにしておきたい。