セキュアコーディングとは?
セキュアコーディングとは、厳密には、システムや各種アプリケーションを開発する際に、サイバー攻撃の対象となりうる脆弱性を回避するコーディングのことを指します。
しかし、実際のシステムやアプリケーション開発においては、コーディングのプロセスを通じてのみセキュリティ問題に対処するという考え方では、脆弱性のない安全なシステムやアプリケーションを開発することはできません。
そのため、最近ではセキュアコーディングをより広い意味で捉えるようになってきています。システムやアプリケーションの開発プロジェクトにおいて、サイバー攻撃に強いシステムを構築するために、「要件定義や設計などのコーディング前工程を含め、開発プロセス全体を通じて脆弱性を排除する活動」といえます。
システムやアプリケーションの開発という観点からは、要件定義、設計、実装のプロセスにおいて、たとえば、システムやアプリケーションのどの部分の様々な脆弱性リスクをどのように軽減するかといった、広い視点での要件定義や設計が重要です。
したがって、コーディングそのものが実装の問題であっても、要件定義や設計といった前工程で決められたこと(設計されたこと)を正しく実装することが必要です。担当者個人の恣意的な意思で、コーディングだけをセキュアに見せようと努力しても、それだけではシステムやアプリケーション全体のセキュリティを確保することはできません。
セキュアコーディングはなぜ必要か
インターネットが一般的になって20年以上が経過し、今日、ネットワーク環境で動作するシステム、ソフトウェア、アプリケーションの数はますます増えています。これらは常にサイバー攻撃のリスクにさらされています。
サイバー攻撃の多くは、プログラムの欠陥やバグによる脆弱性を狙ったものであるため、これらの脅威を念頭に置いて開発することを心がける必要があります。
このような背景から、セキュアコーディングは近年特に重要視されています。
セキュアコーディング規約・分類体系
システムやアプリケーションの開発において、不具合のない高品質なプログラムをいかに開発するかが長年の課題でした。その解決策は、不具合の発生しやすいコードパターンを共有し、それを回避することでした。1990年代、インターネットの普及とともに、最初のウェブブラウザやアマゾンのような販売サイトなどが次々と登場し、2000年代初頭には利用者が急増しました。現在ではパソコンだけでなく、スマートフォンやタブレット端末も広く普及しています。その結果、通常の不具合問題だけでなく、プログラムの不備など、脆弱性の重要性は社会問題になるほど高まっています。
このような背景から、脆弱性リスクを高めるコードや不具合が発生しやすいコードは現在体系化され、いくつかの主要なコーディング規約やリスク分類体系が作られ、日々更新され続けています。
現在のシステムやアプリケーションの開発では、ゼロから考えるのではなく、既存の規約や分類体系を活用して効率的な対策を講じる必要があります。
ここでは、代表的なセキュアコーディング規約・分類体系を紹介します。これらは互いに共通する部分も多いですが、視点が異なる部分もあり、互いに補完し合っています。少し古いですが、下記のIPAの資料「ESCRのルールと内容的に関係するMISRA、CERT、CWEのルール」におおまかな相互関係が示されています。実際に開発に適用する場合、これらの一つ以上を軸に開発組織でコーディングルールを決めます。また、開発組織が独自にルールを追加して運用することもあります。
つまり、セキュアコーディングを実現するためには、既知の脆弱性を網羅的に理解し、従わなければならない規約をしっかりと把握する必要があります。
MISRA C/C++
MISRA C/C++は、自動車メーカーや部品メーカーなど自動車関連企業の業界団体であるMISRAが体系化した、セキュリティ関連の組込み制御システム、ソフトウェア、アプリケーション開発のためのガイドラインで、C言語とC++プログラミング言語に関連します。もともとは自動車業界向けのガイドラインとしてスタートしましたが、現在では自動車業界だけでなく広く使われています。
CERT C
CERT Cは正式にはCERT C Coding Standardと呼ばれます。もともとは米国のカーネギーメロン大学のソフトウェア研究所で体系化されたもので、ISOにも含まれ、日本ではJPCERTが日本語情報を提供しています。従うべきコーディングの好例を集めて体系化したもので、C言語によるセキュアコーディングを実践するためのルールとして汎用性が高いものといえます。CERT C は、数値や式の扱い方、文字列の扱い方、メモリ管理のあり方などのガイドラインを提供し、 コーディング例なども解説しています。CERT Cを利用することで、よりセキュアなコーディングが可能になります。
HIPAA
HIPAA(Health Insurance Portability and Accountability Act)は米国の法律の名称です。日本語では「医療保険の携行性と責任に関する法律」と訳されます。この法律はHIPAA Private RuleとHIPAA Security Ruleに分かれており、後者がセキュアコーディングの観点から重要となります。
医療・保険情報を取り扱う際に、どのようなセキュリティ対策を講じなければならないかを規定したもので、米国で医療関連システムを開発する際には遵守する必要があります。日本ではシステム要件として参照されることがあり、厚生労働省も情報提供しています。
CWE
CWE(Common Weakness Enumeration)は「共通脆弱性タイプ」と訳されます。システム開発などにおけるセキュリティの脆弱性をタイプ分けして、体系化された一覧として提供されています。2008年にCWEバージョン1.0が公開され、現在も継続的に更新されています。
もともと米国では、Mitre Corporation が、CVE(Common Vulnerabilities and Exposures = 共通脆弱性識別子)と呼ばれる、固有の名前、番号などの識別子をつけたセキュリティ脆弱性とインシデントのリストを作成しました。しかし、これはあらゆる脆弱性について一覧になっているため、より使いやすくするために体系化したものがCWEです。CVEで取り上げられている脆弱性について、深刻度や重要度などによってカテゴライズしているのが特徴です。
OWASP
OWASP(Open Worldwide Application Security Project)はソフトウェアやその他のセキュリティのレベルを上げることを目的とした非営利団体です。ここでは、実際に発生した脆弱性の事例がランキングされ、毎年定期的に公表されています。世界中のセキュリティ専門家がこの公開情報を確認し、脆弱性の動向を把握しています。
セキュアコーディングにより低減されるリスクの例
セキュアコーディングを実践することで、さまざまなバグや脆弱性のリスクを排除または低減することができます。代表的な例をいくつか紹介します。
下記の例では、「1.初期設定もれによる不具合防止」と「2.型変換間違いによる不具合防止」が実際の細かいコーディングで起こりがちな例です。一方、「3.アクセス制御の不備」は、ウェブサイトにどのような要件があり、どのように設計・実装すべきかについて大局的な判断を下し、その判断を忠実に実装する必要がある例です。
OWASPの情報によると、近年の傾向として、ミクロなコードの問題だけでなく、「設計」を重視するようになってきています。下記の「OWASP Top 10 – 2021 へようこそ」では、「Insecure Design」という項目が初めて登場しています。
1.初期設定もれによる不具合防止
たとえば、ある変数を使用するプログラムにおいて、初期値が設定されていない場合、プログラムが予期せぬ動作をする可能性があります。計算結果が間違ってしまうだけでなく、予期せぬ条件分岐が発生し、本来のアクセス権限を持たないユーザが重要なデータにアクセスできてしまうという重大なインシデントにつながる危険性があります。セキュアコーディングを実践することで、このような不具合の発生を未然に防ぐ確率が高まります。
2.型変換間違いによる不具合防止
C言語や他の言語では、型の変換ルールが曖昧な部分があり、変換が期待通りにされず不具合が発生することがあります。このような不具合は、セキュリティ上の問題を引き起こす可能性がありますが、たとえば、MISRA C/C++やCERT Cでは、このような不具合を引き起こさないようなコーディングについても取り上げられており、安全なコーディングルールを使用することで、不具合を防ぐことができます。
3.アクセス制御の不備
たとえば、ウェブサイトに誰でもアクセス・閲覧できるページと、特定の権限を持つユーザーしかアクセス・閲覧できないページがある場合、アクセス制御がしっかりされていないと、特定のユーザーしか閲覧できないはずのページが閲覧されてしまうリスクがあります。このようなミスは、セキュアコーディングを適切に実践することで防ぐことができます。
開発プロセスにおけるセキュアコーディング適用ポイント
開発プロセスにおいて、セキュアなコーディングを適用するためのポイントを解説します。
シフトレフトの重要性
前述のように、セキュアコーディングを実施するためには、開発プロジェクト全体を通じてセキュリティ対策に取り組むことが重要です。
そのため、要件定義、設計、実装、テストという開発プロセスにおいて、前工程でできることはできるだけ前工程で行い、手戻りによるロスを最小限に抑える考え方がシフトレフトです。
昨今では、このシフトレフトの考え方が重要性を増しています。
要件定義、設計、実装、DevOps(運用)
これまでの開発は、要件定義、設計、実装、テスト、リリースというウォーターフォール型が一般的でした。そのため、テスト段階で不具合が発見されると、実装から設計、場合によっては要件定義までプロセスをやり直さなければならないこともあります。その結果、時間とコストの面で大きな損失が生じてしまいます。
近年、活用が進んでいるアジャイル開発やDevOpsにおいても、すべてが完成してからテストするのではなく、実装段階でテストできる部分はテストし、設計段階で解決できる問題は実装まで持ち越さず解決し、さらには要件定義の段階で解決できる問題は解決しておくことも重要です。
ツールに出来ることは、(人ではなく)ツールにまかせよう
前述のコーディング規約や分類体系は非常に多岐に及びます。実際に、最低限のことを実践するためには、開発者のトレーニングが欠かせません。しかし、すべての項目で完全にルールを守ることは難しい場合があります。そこで解析ツールの出番となります。
解析ツールを使えば、網羅的かつ高速にコードのチェックが可能です。開発者がチェック結果を見れば、コーディング作業に対するフィードバックを提供できます。ツールによっては、教育的な説明情報を提供するものもあり、OJTにも利用できます。
セキュアコーディングには、リスク情報の共有と設計段階の方向付けが重要
どのようなタイプのシステム、ソフトウェア、またはアプリケーションの開発においても、参加するプロジェクトメンバー全員がリスク情報を共有し、セキュアな開発を行う方向性について共通の理解を持つことが不可欠です。
実際の開発プロジェクトでは、どのような製品を作るかによって、セキュリティの方向性が異なってきます。たとえば、Webアプリケーション開発と制御システム開発では、脆弱性のパターンが大きく異なります。当然、セキュアコーディングの方向性も異なってきます。そのため、チームのベクトルを合わせることが欠かせません。
さらに、セキュアコーディングをより効率的に推進するためには、効率化ツールの活用も欠かせません。丸紅情報システムズでは、セキュアコーディングを効率的に実施するツールとして、「Klocwork」と「Embold」を推奨しています。
これらのツールを積極的に活用することで、セキュアコーディングをより効率的かつ効果的に実践することができます。
安全で信頼性の高いコーディングを支援「Klocwork」
Klocworkは、C, C++, C#, Java, JavaScript, PythonおよびKotlin用の静的解析ツールです。
各言語のソースコードをスキャンするように読み込み、ソースコードの不具合や脆弱性を発見・指摘します。不適切なコーディングのスタイルやバグを見つけることに特化したツールです。コーディング作業で頻繁に使用することで、バグを残したまま次のコーディングに進むことなく、不具合をいち早く修正することができます。
MISRA C/C++やCERT Cなどのコーディングルールだけでなく、さまざまなコーディングスタンダードをサポートしています。
視覚的で直感的なUIで開発プロジェクトそのものをリードする「Embold」
Emboldは、開発プロジェクトそのものを俯瞰する多次元的アナライザーです。
ソースコードのバグを指摘するだけでなく、ソースコードの成り立ちやソースコード間の関係を分析し、ソースコード間の依存関係に関する不具合を発見・指摘します。
また、バージョンごとにソースコード自体がどのように改善されてきたかの変遷をモニターすることも可能です。また、大きすぎるソースコードを分割するなど、リファクタリングを支援する機能もあります。
これらのさまざまな機能により、Emboldはシステム開発プロジェクトをトータルサポートする統合ソリューションとなっています。
Klocwork Embold お役立ち資料
Klocwork、Emboldのカタログをダウンロードいただけます。