セキュリティ

セキュリティプログラミング

投稿日:

セキュリティプログラミングとは、ソフトウェア開発において、脆弱性を作り込まないように安全な実装を行うことを意味します。目的は、外部からの攻撃や内部不正による情報漏えい、改ざん、サービス停止を防ぐことです。

■ セキュアコーディングの基準

セキュアコーディングのための主なポイントは以下の通りです。

 ・入力値の検証(バリデーション)
 ・バッファオーバーフロー対策
 ・エラーメッセージに機密情報を含めない
 ・安全な乱数生成(rand()ではなく暗号論的乱数)

これらを規定した代表的な基準には以下があります。

基準 特徴主な適用分野
CERT Secure Coding Standard 言語別の詳細な安全実装ルールC/C++、Javaなどの組込みや業務アプリ
MISRA C / MISRA C++安全性重視の組込みシステム向けルール自動車・産業機器
OWASP Secure Coding PracticesWebアプリ開発での安全な実装指針Webアプリケーション

これらを中心に、プロジェクトの特徴を踏まえ、コーディング規約として整理します。
基準の沿ったプログラミングが実施されているかを確認するには、有識者によるコーディングレビューだけでは不十分であり、解析ツールを活用する必要があります。

■ 静的解析(SAST: Static Application Security Testing)

プログラムを実行せずにソースコードやバイナリを解析し、脆弱性やバグを検出する手法です。
コードの全体を網羅的に解析できます。プログラミング段階など開発の早い段階で脆弱性を発見可能です。

代表的ツールとしては、以下があります。

・SonarQube(多言語対応、品質分析)
・Coverity(深いコード解析、産業系で利用)
・Fortify SCA
・CodeQL(GitHubが提供)

■ 動的解析(DAST: Dynamic Application Security Testing)

アプリケーションを実行し、動作中に脆弱性を検出する手法。実際の攻撃シナリオを模してテストします。実際の挙動を確認できます。実行に時間とテスト環境が必要となるため、結合テストやシステムテストにおいて実施します。

代表的ツールとしては、以下があります。

・OWASP ZAP(Webアプリの自動診断)
・Burp Suite(Webセキュリティ診断)
・AppScan
・Arachni

■ まとめ

セキュリティプログラミングは、脆弱性の発生を未然に防ぎ、安全なソフトウェアを作るための基本です。以下のように、セキュアコーディング規約の遵守、静的解析・動的解析の活用、そして運用時まで見据えた設計が不可欠です。

・設計段階での安全性考慮(入力検証、エラー処理、暗号化)
・実装時のコーディング規約遵守(OWASP、CERTなど)
・テスト工程での自動化(SAST、DAST、ペネトレーションテスト)
・リリース後の継続的改善(脆弱性対応、アップデート)

セキュリティは「後付け」ではなく、開発ライフサイクル全体に組み込む文化が必要です。

-セキュリティ

執筆者:


comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

関連記事

初受験のための「CISSP」入門

丁度1年ほど前ですが、セキュリティのグローバルスタンダードを学ぶために、CISSP(Certified Information Systems Security Professional)を取得しまし …

はじめての「情報セキュリティ」入門

情報セキュリティとは、見えない敵のために防御を張り巡らせることです。情報の価値は、外へと公開されている情報より、会社などの組織で流れている情報の方が価値がずっと高くなります。それらの情報は、組織の内部 …

シングルサインオン(SSO)入門(SAML編)

シングルサインオン(SSO)は、ユーザーが一度の認証(ログイン)で、複数のシステムやサービスにアクセスできる仕組みを指します。ユーザを認証するログイン処理を一か所に統括し、アプリケーションやサービスと …

運用・保守とセキュリティ対応

「導入時のセキュリティ」だけではなく「継続的なセキュリティ」が重要です。攻撃者はシステムが古くなるのを待っており、運用担当は攻撃者と同じくらい粘り強く対応し続ける必要があります。運用・保守フェーズは、 …

防御のための「セキュリティ攻撃」入門

ソフトウェアに脆弱性があっても、通常の機能を使う上では全く問題はありません。しかし、ソフトウェア設計者、プログラマーの関心や意識のない機能外の箇所で、悪意のある処理を実行できるアクセスが可能となってし …

Chinese (Simplified)Chinese (Traditional)EnglishFilipinoFrenchGermanHindiJapaneseKoreanMalayThaiVietnamese