2015 年度 修⼠士論⽂文
テストテンプレートを⽤用いた
セキュリティ設計パターンの実装⽀支援 に関する研究
2016 年 2 ⽉月 1 ⽇日(⽉月)提出
指導:深澤 良彰 教授
早稲⽥田⼤大学⼤大学院 基幹理⼯工学研究科 情報理⼯工・情報通信専攻
学籍番号:5114F095-4
芳澤正敏
i
目次
第1章 はじめに ... 1
第2章 背景 ... 3
2.1 セキュリティ ... 3
2.2 ソフトウェアパターン ... 4
2.2.1 セキュリティ設計パターン ... 5
2.2.2 セキュリティ実装パターン ... 6
2.3 動機付けの例 ... 7
第3章 関連研究 ... 9
第4章 本研究の提案 ... 12
4.1 本⼿手法の全体像 ... 12
4.2 モデルベーステスト ... 14
4.3 テスト駆動開発 ... 14
4.4 アスペクト指向 ... 14
4.5 テストテンプレート ... 15
4.5.1 Password Design and Use ... 15
4.5.2 Prevent SQL Injection ... 22
4.6 ケーススタディ ... 26
第5章 評価 ... 38
第6章 制限 ... 45
第7章 おわりに ... 46
謝辞 ... 47
参考文献 ... 48
ii
外部発表 ... 50
1
第 1 章 はじめに
ソフトウェアのシステム開発において、セキュリティ対策を施すことは重要 であり、現代のネットワーク社会ではある種義務といっても過⾔言ではない。セ キュアなソフトウェアを開発するためには、セキュリティに関する専⾨門知識が 必要になる。セキュリティの問題というのは、悪意のある第三者によって引き 起こされるため、対応可能な問題については設計段階から⼗十分に考慮しておく 必要がある [1]。
セキュリティの関⼼心事はソフトウェア開発の要求から設計、実装、テスト、
運⽤用の全てのフェーズで扱えるようにしなくてはならない [2]。しかしなが ら、ソフトウェア開発者が必ずしもセキュリティの専⾨門家ではなく、開発の早 い段階でのシステムにおけるセキュリティ項⽬目について⼗十分に考慮されていな い。そこでセキュリティの専⾨門家の知識を活⽤用・再利⽤用する⽅方法としてセキュ リティパターン [3]がある。セキュリティパターンとは、セキュリティに関す る特定の状況下で幾らか抽象化された問題およびその解決法である。
しかし、現状では設計レベルのパターンは記述が抽象的なため、設計⽅方針は 理解できても、それを具体的にどう実装に落としていけばよいかが分かりにく い [1]。そのため、実装がセキュアな要求仕様を満たしているか確認すること が必要になるが、そのためのセキュリティ機能のテストには、特殊なテストケ ースなどの通常の機能テストと異なる準備とテストの実施が必要になる [4]。
そこで本稿では、テストテンプレートを⽤用いたテストによるセキュリティ設 計パターンの実装⽀支援を提案する。本⼿手法では、設計レベルのセキュリティパ ターンに定義された情報からテストテンプレートを新たに定義した。このテス トテンプレートに設計情報を与えてテストを⽣生成する。テストを⾏行うことでセ キュリティ設計パターンの適⽤用検証を⾏行い、そのテストの結果より実装の⽀支援 をする。
本研究の研究課題(RQ)として以下の4つを⽰示す。
2
RQ1 既存⼿手法に⽐比べて本⼿手法は効率的にセキュリティ設計パターンの実装の誤 りを発⾒見できるか。
RQ2 既存⼿手法に⽐比べて本⼿手法は効果的なセキュリティ設計パターンの実装の誤 りを発⾒見できるテストを作成できるか。
RQ3既存⼿手法に⽐比べて本⼿手法は回帰テスト可能なセキュリティ設計パターンの 実装の誤りを発⾒見できるテストを作成できるか。
RQ4既存⼿手法に⽐比べて本⼿手法はセキュリティパターンの実装の誤りの修正を⽀支 援することができるか
本研究の貢献を以下に⽰示す。
l セキュリティ設計パターンから再利⽤用可能なテストテンプレートの作成。
l 効率的なセキュリティ設計パターンの実装の誤りの発⾒見。
l 効果的なセキュリティ設計パターンの実装の誤りの発⾒見のテストの作成。
l 回帰テスト可能なテストの作成。
l セキュリティ設計パターンの実装⽀支援。
以下に本稿の構成を述べる。第2章では、本研究の背景を述べる。第3章で は、関連研究について述べる。第4章では、本研究の提案を述べる。第5章で は、提案⼿手法の評価について述べる。第6章では、本⼿手法の制限について述べ る。第7章では、本稿のまとめと展望について述べる。
3
第 2 章 背景
2.1 セキュリティ
情報セキュリティの定義は、ISO/IEC2700 [5]では、「情報の機密性、完全性及 び可⽤用性を維持すること。さらに、真正性、責任追従性、否認防⽌止及び、信頼 性のような特性を含めてもよい。」としている。セキュリティの問題とは、こ のような特性が成り⽴立たなくさせる攻撃が発⽣生するために起こる。例えば、機 密性を守りたい個⼈人情報があった場合、その情報を漏えいさせる攻撃により、
機密性が保たれなくなるというセキュリティ上の問題が発⽣生する[2]。
また、吉岡らは[1]でセキュリティに関する概念として以下の9つを挙げてい る。
l Asset(アセット):
組織や⼈人が、価値のあると認めることができる情報、またはリソース
l Stakeholder(ステークホルダー):
アセットに特定の価値を満たすための宣⾔言⽂文
l Security objective(セキュリティ⽬目標):
脅威に対する安全が脅かされている可能性があること
l Threat(脅威):
アセットに対する安全が脅かされている可能性があること
l Attack(攻撃):
アセットの安全性を破壊する⾏行為
l Attacker(攻撃者):
攻撃を実⾏行する実体
4 l Vulnerability(脆弱性):
アセットに関するセキュリティを破ることができる⽋欠陥や弱点
l Countermeasure(対策):
脆弱性や攻撃に対してアセットを保護するための⾏行為
l Risk(リスク):
攻撃が成功する確率の⾼高さ
セキュリティは、守るべき価値のあるアセットに対する故意の攻撃と、その 攻撃に対する概念である。
ソフトウェア開発において、セキュリティの関⼼心事は、要求、設計、実装、
テスト、運⽤用のすべての段階で扱えなくてはならない。しかし、ソフトウェア 開発者が必ずしもセキュリティの専⾨門家であるというわけではない。そこで、
専⾨門家の知識を活⽤用、再利⽤用する⽅方法としてソフトウェアパターンがある。そ して、このソフトウェアパターンのうち、セキュリティに関する知識をまとめ たものがセキュリティパターンである。ユーザビリティは、⽇日本語では「使い やすさ」と訳されている。しかし、ソフトウェアにおいては、そのシステムの 性質やそれを使うユーザ、利⽤用状況などによって「使いやすさ」は変化するた め、この「使いやすさ」を定義することは難しい。
2.2 ソフトウェアパターン
ソフトウェアパターンとは、どこかで⾒見たことのあるような繰り返されるソ フトウェア設計やコードを集めたもののことである [6]。また、ただ単に集め ただけではなく、様々なソフトウェア開発事例のうち、熟練者による類似の成 功事例を集めて共通部分を抽象化し、名前を与えたものである。代表的なもの としてはGoFデザインパターンが挙げられる。パターンを⽤用いることによるメ リットとしてまず、過去の成功体験者やビジョン策定者の思考過程と成果を再 利⽤用して、同じような状況で似た問題の解決に成功する確率を⾼高めることがで きる [5]。また、難しい問題に⾜足してその解決策を⾃自ら考えるのではなく、あ らかじめノウハウとして蓄積されているパターンを適⽤用することで、開発者の コストを⼤大幅に低減させることができる。次に、意思疎通を促進できることが
5
挙げられる。様々なパターンの名前をソフトウェア開発における語彙として使 うことで、状況や解決策をいちいち説明しなくてもよくなるため、複数の開発 者と仕事をする際に意志疎通をスムーズに⾏行うことができる。結果、ソフトウ ェアパターンを⽤用いることで、低コストで⾼高品質なソフトウェア開発を⾏行うこ とができる。
2.2.1 セキュリティ設計パターン
機密性など、情報(資産)に対するセキュリティ特性を守るためには、暗号機 能や認証フレームワークなどセキュリティ機能を利⽤用し、セキュリティを設計 する必要がある。セキュリティ機能は、できる限り安全性が確認されている既 存のにものを利⽤用し、独⾃自に実装しないことが望ましい。そのためにセキュリ ティ機能をどのように使えばよいのかの設計⽅方針を⽰示したセキュリティ設計パ ターンの利⽤用がある。M.Schumacherらは[3]で、セキュリティの設計に役⽴立つ7 種類、38パターンが紹介されている。具体的には、セキュリティの基盤やアプ リケーションによって、IDの証明、アクセス制御モデル、アクセス制御アーキ テクチャ、OSのアクセス制御、真証性確認・監査、ファイヤーウォール、イ ンターネットアプリケーションの7種類にセキュリティパターンを分類してい る。
セキュリティ設計パターンの代表例として、組織や役割ごとに情報のアクセ ス制御について説明しているロールベースアクセス制御パターン(Role-Based
Access Control Pattern)が挙げられる。このパターンでは、図2.1のようにロール
ベースアクセス制御を⾏行う際のユーザと情報との静的な構造をクラス図によっ て⽰示している。しかし、実装における脆弱性への対策のパターンは対象外であ るという問題がある。
図2.1 ロールベースアクセス制御の構造([2]から引⽤用)
6 2.2.2 セキュリティ実装パターン
ソフトウェアをセキュアに実装するためには、セキュリティ設計を正しく実 装するとともに、実装(コード)に付随して発⽣生する脆弱性を排除する必要があ る。また、実装がセキュリティ要求仕様を満たすことを、テストによって確認 する必要がある。実装時のセキュリティパターン(セキュリティ実装パターン) はこれらの⽀支援を⾏行う。
プログラマの視点で、セキュアなプログラムを書くための設計や実装をガイ ドラインとしてまとめたものを、⼀一般に“セキュアプログラミング”と呼ぶ。セ キュアプログラミングの例として、[8]では、取り除くべきプログラム上の問題 点に関して、18個の実装のルールを定めている。また、[9]では、6種類につい て推奨される実例と、23個の悪い実例を整理している。
ソフトウェアを破壊する⽅方法に焦点を当てたパターンにアタックパターン
[10]がある。[11]では、19個のアタックパターンを紹介しており、Webブラウ
ザなどの特定のアプリケーションの例を説明している。アタックパターンで は、直接コーディングを⽀支援していないが、実装を改善するために有効であ る。
アタックパターンをWeb上で共有する枠組みとしてCommon Attack Pattern Enumeration and Classification (CAPEC)[12]がある。CAPECでは、既知の攻撃 を、その分類、過酷さ、対応⽅方針、関連する攻撃などとともに登録して情報を 共有することができる。また、多数の攻撃の分類や関連を⾃自動化するために、
XML形式で共有している。そのデータベースは、現在380パターン以上が登 録されている。図2.2はSpoofingについて書かれたものである。
図2.2 CAPEC Spoofing
7
問題点として、実装レベルのパターンは数が多く、必要なパターンを⾒見つけ 出すのが困難であるということが挙げられる。設計レベルのパターンはそれほ ど数があるわけではないが、記述が抽象的なため、設計⽅方針は理解できても、
それを具体的にどう実装に落としていけばよいかが分かりにくい。なぜなら ば、現状、設計⽅方針、詳細設計、実装のそれぞれのパターン間での関連が定義 されていないため、設計時に選ばれたパターンがどう実装と関連するのかが明 確ではない。また、実装がセキュアな要求仕様を満たしているか確認するため のセキュリティ機能のテストには、特殊なテストケースなどの通常の機能テス トと異なる準備とテストの実施が必要になる。
2.3 動機付けの例
図2.3にEMSsec[13]という学⽣生情報管理システムのWebアプリケーションに
対してセキュリティ設計パターンを適⽤用した設計の⼀一部を⽰示す。
図2.3 EMSsecの設計の⼀一部
8
EMSsecはセキュリティとプライバシーに関連したソフトウェア開発⼿手法の
ための共通問題として開発されたものである。このアプリケーションには、正 規のユーザのみアクセス可能にしたい、不正な⼊入⼒力があった場合には検出した いというセキュリティ要求がある。図2.3の設計段階におけるクラス図ではこ の要求に対して、Password Design and UseパターンとPrevent SQL Injectionパタ ーン、Prevent XSSパターンの3つが正しく適⽤用されている。しかし、この設計 を実装した場合、実装段階においてセキュリティ設計パターンが適切に適⽤用で きているのか確認できない。なぜならば、セキュリティ設計パターンと実装間 の関係が定義されていないため、どのように実装すれば良いのかわからないか らである。また、実装した場合にそれが適切な実装であるのか確認することも できない。そのため、脆弱性を含んだシステムを構築する可能性がある。
9
第 3 章 関連研究
UMLモデルのシミュレーション環境を⽤用いたモデルテストにより、セキュリ ティパターンの⼀一貫した適⽤用⽀支援を⾏行い、適⽤用検証を⾏行う研究がある[14]。既 存のセキュリティパターンに新たな定義を加えた拡張セキュリティ要求パター ン(Extended Security Requirement Pattern)(以下Ex SRP)と拡張セキュリティ設計 パターン(Extended Security Design Pattern)(以下Ex SDP)を提案している。
図3.1 Ex SRPとEx SDPの構造概要
Ex SRPには新たに「対策」としてセキュリティ要求とセキュリティテストテ
ンプレートが与えられている。セキュリティ要求はモデル記述のための形式⾔言 語であるオブジェクト制約⾔言語(Object Constraint Language)(以下OCL)記述で表 現され、曖昧であったパターンの厳密な定義を可能にしている。セキュリティ テストテンプレートは要求段階でのモデルがEx SRPで与えられ、セキュリテ ィ要求を満たしているか確認する。セキュリティ要求の例を図3.2、セキュリ
10
ティテストテンプレートの⼀一部の例を図3.3に⽰示す。Ex SDPはEx SRPの「対 策」と関連付けられているので⼀一貫した適⽤用⽀支援を⾏行うことができる。
図3.2 Ex SRPのセキュリティ要求の例(OCL)
図3.3 Ex SRPのセキュリティテストテンプレートの⼀一部の例
しかし、この研究では要求と設計間でのセキュリティパターンの適⽤用⽀支援・
検証に留まっている。本⼿手法では、設計と実装間でのセキュリティパターンの 適⽤用⽀支援、検証を⾏行うことができる。
また、セキュリティパターンが利⽤用者に与える効果の程度を測るために学⽣生 32名を対象とした実験を⾏行った研究がある[15]。この研究では、設計段階にお
11
けるセキュリティの対策をセキュリティパターンを⽤用いた場合と⽤用いない場合 で事前に埋め込んだ脅威への対処を⽐比較し、加えてアンケートによってセキュ リティパターンの効果について調べた。アンケートの結果では被験者の多くか セキュリティパターンを⽤用いた場合の⽅方を好み、またセキュリティパターンに よって⾃自分⾃自⾝身では気づかなかった解決策を⾒見つけることができたと答えた。
しかし、この研究では設計段階のみでの⽀支援の実験に留まっている。本研究 では実装段階での実装⽀支援を⾏行い、被験者から本⼿手法の優位性を調べた。
12
第 4 章 本研究の提案
4.1 本⼿手法の全体像
本⼿手法の全体像を図4.1に⽰示す。
図4.1 本⼿手法の全体像
本⼿手法では、設計時に使われたセキュリティ設計パターンからテストテンプ レートを作成し、テンプレートに設計の情報を与えることでテストの⽣生成を⾏行
13
う。実装に対して⽣生成されたテストを⾏行い、修正を繰り返すことによりセキュ リティ設計パターンの実装⽀支援を⾏行う。また、TESEM[16]というUMLのモデ リングとセキュリティ設計パターンの適⽤用検証を⾏行うことのできるWebアプリ ケーションを拡張し、テストケースの⾃自動⽣生成を実現した。
以下に本⼿手法の具体的な流れについて説明する。
ステップ0 : テストテンプレートの作成
事前にセキュリティ設計パターンからテストテンプレートを作成する。テス トテンプレートは「アスペクトテストテンプレート」と「テストケーステンプ レート」の2つからなる。
ステップ1 : 設計の実装
セキュリティ設計パターンが使⽤用されている設計を実装する。しかし、この 時点では、セキュリティ設計パターンが適切に実装されているかわからない。
ステップ2 : テストテンプレートからテストの⽣生成
テストテンプレートに設計の情報を与えることでテストを⽣生成する。
ステップ3 : 実装のテスト
テスト駆動開発を基として、パターンが使⽤用されている実装に対してパター ンの適⽤用確認のためにテストをする。
ステップ4 : 実装のリファクタリング
ステップ3でエラーを基に実装のリファクタリングをする。
ステップ5 : 実装の再テスト
リファクタリングされた実装に対して再度テストを⾏行い、パターンの適⽤用を 確認する。テストに成功すればそのパターンが実装段階において適切に適⽤用さ れていることが確認できる。失敗した場合、成功するまでステップ4を繰り返 し、システムを洗練する。
まず以下にテスト実⾏行の際に⽤用いる考え⽅方であるモデルベーステスト、テス ト駆動開発とアスペクト指向について説明する。
14
4.2 モデルベーステスト
モデルベーステスト(MBT: Model-based Testing)は⼀一部かすべてのテストケー スをモデルから⽣生成する技術である[17]。モデルとはシステムを実現すべき処 理を表現したものである。MBTは複雑でコストのかかるテストを緩和する こ とができる。⾃自動MBTツール[18]やセキュリティにおけるMBT[19]についてな どがある。
本研究ではセキュリティ設計パターンから作成したテストテンプレートを定 義した。そのため、テストテンプレートは抽象的かつ再利⽤用できる。このテス トテンプレートを⽤用いたMBT ツールを使⽤用し、テストを⽣生成する。
4.3 テスト駆動開発
テスト駆動開発(TDD:Test Driven Development)とは、プログラム開発⼿手法の
⼀一種で、プログラムに必要な各機能について、最初にテストを書き(テストファ ースト)、そのテストが動作する必要最低限な実装をとりあえず⾏行った後、コー ドを洗礼させる、という短い⼯工程を繰り返すスタイルである[20]。
本研究では、Selenium[21]というWebアプリケーションのテストツールを使
⽤用して、テストを実施する。実装する際に、まずテストが動作する最低限のコ ードの実装を⾏行い実装上の脆弱性を検出させ、その後コードの洗練を⾏行い、テ ストを満たすことでセキュリティ設計パターンの適⽤用の確認を⾏行う。
4.4 アスペクト指向
アスペクト指向とは、各プログラム(モジュール)から共通に利⽤用される機能 のことであり、この機能はさまざまなモジュールにおいて横断的に利⽤用され る。そして、モジュールの機能とは独⽴立している[22]。
本研究では、AspectJというアスペクト指向のJava実装を⽤用いてテストテン プレートを作成する。AspectJではモジュールをクラスとしてではなく、アスペ クトとして定義し、アスペクトの要素としてポイントカットとアドバイスを持 つ。ポイントカットは、「いつアドバイスを実⾏行するのかの指定」を⾏行い、ア
15
ドバイスは、「ポイントカットで指定されたタイミングで実⾏行する処理」を⾏行 う。また、アドバイスが実⾏行可能なポイントをジョインポイントと呼び、ポイ ントカットにより多数のジョインポイントからアドバイスを実⾏行するジョイン ポイントを選別する。
本研究では、AspectJによって実装時の内部処理の観測を⾏行い、テストによる 検証に⽤用いる。
4.5 テストテンプレート
テストテンプレート作成の⼿手順は以下通りである。
1. セキュリティ設計パターンのOCL記述よりディシジョンテーブルの作成。
2. ディシジョンテーブルとセキュリティ設計パターンで定義された構造より 実装時の内部処理を観測するためのアスペクトのテンプレート作成。
3. ディシジョンテーブルとセキュリティ設計パターンで定義された振る舞い よりテストケースのテンプレート作成
テンプレートには「アスペクトのテンプレート」と「テストケースのテンプ レート」があり、これらのテンプレートに設計の情報を与えることによってテ ストを⽣生成することができる。以下に代表的なセキュリティ設計パターンであ る「Password Design and Use」と「Prevent SQL Injection」を⽤用いてテストテンプ レート作成の流れを説明する。
4.5.1
Password Design and UsePassword Design and Useのテストテンプレート作成について説明する。
Password Design and UseはOCL記述により図4.2のように定義されている。
16
図4.2 Password Design and UseのOCL記述
これは「ユーザがログイン画⾯面から⼊入⼒力したIDとPassがUser DataのIDと Passに⼀一致するものが存在すれば正規ユーザと判断されアセットへのアクセス が可能であり、それ以外であるならばシステムの⾮非正規ユーザと判断されアセ ットにアクセスが不可能である」ということを定義している。このセキュリテ ィ設計パターンの構造を図4.3に、正規ユーザかどうか判断する振る舞いを図 4.4に、アセットへのアクセスの振る舞いを図4.5に⽰示す。
17
図4.3 Password Design and Useの構造
18
図4.4 Password Design and Use の振る舞い(ユーザの判断)
図4.5 Password Design and Use の振る舞い(アセットへのアクセス)
19
テストテンプレートはOCL記述と構造、振る舞いの図より作成し、テス トによってテストケースの振る舞い通りに実⾏行されるかを確認する。テストケ ースはOCL記述より表4.1のように作成した。
表4.1 Password Design and Use のSITPのディシジョンテーブル
1 2 3 4
条件 入力されたID が User Data と一致する Yes Yes No No 入力された Pass が User Data と一致する Yes No Yes No
振る舞 い
正規ユーザと判断される ×
アセットへのアクセス可能 ×
非正規ユーザと判断される × × ×
アセットへのアクセス不可能 × × ×
表4.1のディシジョンテーブルはテストによって確認するべき対象の決定と テストに必要なテストケースの作成に利⽤用する。
次に、ディシジョンテーブルと設計の構造よりアスペクトのテンプレートを 作成する。ディシジョンテーブルよりテストによって確認するべき対象が「正 規ユーザか⾮非正規ユーザか判断」と「アセットへのアクセスが可能か不可能か 判断」であることがわかる。
「正規ユーザか⾮非正規ユーザか判断」の部分は図4.3の構造の図より
password_design_and_useクラスのcheck_identificationメソッドであることがわ かる。この部分のAspectJのポイントカットをLoginCheckと定義し図4.6に⽰示 す。
図4.6 ポイントカットLoginCheck
このポイントカットに対するアドバイスからcheck_identificationメソッドの 戻り値を取得する。LoginCheckのアドバイスを図4.7に⽰示す。
20
図4.7 アドバイスLoginCheck
setTemporaryメソッドはAspectJ内で図4.8のように定義している。
図4.8 setTemporaryメソッド
setTemporaryメソッドではアドバイスによって得られたデータを⼀一時保存し
ておくためのものである。⼀一時保存されたデータはテストの時に使⽤用される。
「アセットへのアクセスが可能か不可能か判断」の部分も同様に
Subject_Controlクラスのsubject_functionメソッドであることがわかる。この部 分のAspectJのポイントカットをAssetAccessと定義し図4.9に⽰示す。
21
図4.9 ポイントカットAssetAccess
このポイントカットに対するアドバイスからsubject_functionメソッドの戻り 値を取得する。AssetAccessのアドバイスを図4.10に⽰示す。
図4.10 アドバイスAssetAccess
次に、テストケースのテンプレートを作成する。表3.1のディシジョンテー ブルと設計の振る舞いより作成する。
図4.4よりユーザの判断の振る舞いが「Login_UI」に対して、アクションと して「id、passを⼊入⼒力」することでregular_userのboolean型が戻り値として与 えられることがわかる。テストケースのテンプレートではこの振る舞いを実⾏行 し、アスペクトによって保存された値を検証するように作成する。同様に図 4.5のアセットへのアクセスの振る舞いに対してもテストケースのテストテン プレートを作成する。このテストケースにディシジョンテーブルの条件を与え ることでテストケースのテンプレートとなる。作成されたテストテンプレート を図4.11に⽰示す。
22
図4.11 Password Design and Use テストケース(⼀一部)
4.5.2
Prevent SQL InjectionPrevent SQL Injectionのテストテンプレートの作成⼿手順について説明する。
Prevent SQL InjectionはOCL記述により図4.12のように定義されている。
23
図4.12 Prevent SQL InjectionのOCL記述
これは「Prevent SQL Injection のエスケイプ処理が正しく⾏行われている場 合、その⼊入⼒力は正しい⼊入⼒力であり、そうでなければ疑わしい⼊入⼒力である」と読 み取ることができる。このセキュリティ設計パターンの構造を図4.13、振る舞 いを図4.14に⽰示す。
図4.13 Prevent SQL Injectionの構造
24
図4.14 Prevent SQL Injectionの振る舞い
OCL記述より表4.2のようにディシジョンテーブルが作成できる。
表4.2 Prevent SQL Injectionのディシジョンテーブル 1 2 条件 エスケイプ処理が正しく行われている Yes No
振る舞 い
正しい入力と判断される ×
疑わしい入力と判断される ×
25
表4.2よりPrevent SQL Injectionでテストするべき対象が「エスケイプ処理が正 しく行われているか行われていないかの判断」であることがわかる。
「エスケイプ処理が正しく行われているか行われていないかの判断」は図4.9の構造 よりprevent_SQL_Injectionクラスのescape_input_dataであることがわかる。こ の部分のAspectJのポイントカットをEscapeCheckと定義し図4.15に⽰示す。
図4.15 ポイントカットEscapeCheck
このポイントカットに対するアドバイスからescape_input_dataメソッドの戻 り値を取得する。EscapeCheckのアドバイスを図4.16に⽰示す。
図4.16 アドバイスEscapeCheck
図4.14よりエスケイプ処理の振る舞いが「UI」に対して、アクションとして 何かの「⼊入⼒力」をすることでescape_input_dataのboolean型が戻り値として与 えられることがわかる。テストケースのテンプレートではこの振る舞いを実⾏行 し、アスペクトによって保存された値を検証するように作成する。このテスト ケースにディシジョンテーブルの条件を与えることでテストケースのテンプレ ートとなる。作成されたテストテンプレートを図4.17に⽰示す。
26
図4.17 Prevent SQL Injectionのテストケース
このように、セキュリティ設計パターンの OCL 記述と構造と振る舞いより 形式的にテストテンプレートの作成ができる。作成されたテストテンプレート からテストを⽣生成し、セキュリティ設計パターンの適⽤用検証を⾏行う。
4.6 ケーススタディ
ケースステディとしてEMSsec[13]という学⽣生情報管理システムに対し本⼿手法 を適⽤用する。EMSsecは産学の参加者が共同で、セキュリティとプライバシー に関連した開発⼿手法の実験評価のために開発した共通問題である。
最初にセキュリティ設計パターンが適⽤用された設計を作成する。UMLモデ リングツールであるastahで作成した設計を図4.18に⽰示す。この設計をxml形 式に出⼒力し、TESEMで読み込ませる。読み込ませた結果を図4.19に⽰示す。次 にセキュリティ設計パターンが適⽤用されているメソッドを選択し、セキュリテ ィ設計パターンとバインドしていく。今回、EMSsecで適⽤用されているセキ
27
図4.18 EMSsecの設計
図 4.19 TESEM での EMSsec のクラス図
28
ュリティパターンは「Password Design and Use」、「Prevent SQL
Injection」、「Prevent XSS」の 3 つのパターンを適⽤用した。これらのセキュ リティパターンを適⽤用したメソッドは StudentController クラスの edit、
create、list メソッド、FinishedStudentController の edit、create、list メソッ ド、InformationController クラスの edit、create、list メソッド、
LoginController クラスの loginCheck メソッドである。
ステップ 1 : 設計の実装を⾏行う。
次にセキュリティ設計パターンの適⽤用された設計の実装を⾏行う。Prevent SQL Injection を適⽤用した実装のコードを図 4,20、4.21 に⽰示す。今回、このパ ターンでは「ʼ’ (シングルクォーテーション)」「” (ダブルクォーテーション)」
「/ (バックスラッシュ)」の 3 つの⽂文字をそれぞれ「ʼ’ʼ’」「””」「//」へ変換す ることによってエスケイプ処理が正しく⾏行われたこととする。しかし、図 4.20 ではダブルクォーテーションへの処理が正しく⾏行われていないため SQL Injection の脅威が存在する。また、図 4.21 ではメールアドレスを挿⼊入する処 理においてエスケイプ処理が⾏行われていないため SQL Injection の脅威が存在 する。そのため、セキュリティパターンが正しく適⽤用されておらず、脆弱性が あるといえる。
29
図 4.20 Prevent SQL Injection の実装の⼀一部(その 1)
30
図 4.20 Prevent SQL Injection の実装の⼀一部(その 2)
ステップ 2 : テストテンプレートからテストを⽣生成する。
TESEM よりセキュリティ設計パターンの適⽤用をテストするための AspectJ のコードと JUnit のコードを⽣生成する。テスト⽣生成のためには Selenium によ るテストするメソッドを含む振る舞いのテストケース、正しい⼊入⼒力セット、脅 威になりうる⼊入⼒力セットを TESEM に⼊入⼒力する。⽣生成された AspectJ のコード を図 4.21、JUnit のコードを図 4.22 に⽰示す。
31
図 4.21 AspectJ のコード
32
図 4.22 JUnit のコードの⼀一部
33 ステップ 3 : 実装のテストをする。
ステップ 2 で⽣生成したテストを実⾏行しセキュリティ設計パターンが適切に実 装できているか確認する。実⾏行した結果を図 4.23 に⽰示す。この結果からセキュ リティ設計パターンが正しく実装されていないことがわかる。また、エラーの 結果のテストケースを図 4.24、図 4.25 に⽰示す。エラーの結果のテストケース と成功したテストケースを⽐比較することでセキュリティ設計パターンの実装の バグの箇所が特定できる。testEmssec02、testEmssec03,、testEmssec04 を⽐比較 することでダブルクォーテーションを⼊入⼒力した場合のみエラーの結果になって いることがわかる。この結果からダブルクォーテーションの⼊入⼒力時に正しく処 理が⾏行われていないことがわかる。また、testEmssec05、testEmssec06、
testEmssec07 を⽐比較し email のフィールドに SQL Injection を引き起こす⽂文字 列が⼊入⼒力されることで正しく処理されないことがわかる。以上の結果より、ダ ブルクォーテーションの⽂文字列を処理している箇所と email フィールドに⼊入⼒力 された⽂文字を処理している箇所に問題があることが確認できる。
図 4.23 テスト結果
34
図 4.24 エラーの結果のテストケース(その 1)
図 4.25 エラーの結果のテストケース(その 2)
ステップ 4 : 実装のリファクタリング
スッテプ 3 の結果よりダブルクォーテーションの⽂文字列を処理している箇所 と email フィールドに⼊入⼒力された⽂文字を処理している箇所を正しい処理となる ように修正する。図 4.26、図 4.27 に修正したコードを⽰示す。
35
図 4.26 修正後の Prevent SQL Injection の実装の⼀一部(その 1)
36
図 4.27 修正後の Prevent SQL Injection の実装の⼀一部(その 2)
37 ステップ 5 : 実装を再度テストする。
ステップ 4 で修正後のシステムに対して再度テストを実⾏行する。テストの結 果を図 4.28 に⽰示す。この結果よりセキュリティ設計パターンが適切に実装され ていることがわかる。
図 4.28 修正後のテスト結果
以上の流れより本⼿手法によってセキュリティ設計パターンの実装の誤りを検 出し、そのテストの結果より正しい実装の⽀支援を⾏行うことができる。セキュリ ティ設計パターンを適切に実装することでそのパターンで解決できる脆弱性に 関して強固なシステムを構築できる。
38
第 5 章 評価
本章では、EコマースシステムとEMSsecのログインの実装部分に対して本
⼿手法と既存の技術によるセキュリティ設計パターンの誤り検出と修正を⾏行い評 価を⾏行う。評価⽅方法として対象システムに3つのセキュリティ設計パターンの 実装の誤りを埋め込み、本⼿手法と既存の⼿手法での誤り検出と修正を被験者に実 施してもらい、そのテストに掛かった時間を測り、発⾒見・修正できた⽋欠陥箇所 を数える。実験後にどちらの⼿手法を被験者は好むのかをアンケートに答えても らう。
評価ではPassword Design and Useパターン、Prevent SQL Injectionパターン、
の2つのパターンの実装の検証を⾏行う。このシステムに対して以下の実験を⾏行 う。
⼿手順1 : 実験前アンケートを⾏行う
⼿手順2 : JUnit、Selenium、本⼿手法の説明を⾏行う
⼿手順3 : 既存⼿手法(本⼿手法)による誤り検出、修正を⾏行う
⼿手順4 : 本⼿手法(既存⼿手法)による誤り検出、修正を⾏行う
⼿手順5 : 実験後アンケートを⾏行う
それぞれの⼿手順について詳しく説明する。
⼿手順 1 : 実験前アンケートを⾏行う
実験を⾏行う前に被験者の能⼒力を測るためにアンケートを⾏行う。アンケートの 項⽬目を以下にしめす。
l プログラミング能⼒力はどれくらいですか
l セキュリティに関する知識はどれくらいですか
l ソフトウェアテストに関する知識はどれくらいですか l Webシステムの開発能⼒力はどれぐらいですか
これらの項⽬目に対して、「⾮非常に⾼高い」「⾼高い」「あまり⾼高くない」「低い」
の選択肢より選択してもらう。
⼿手順2 : JUnit、Selenium、本⼿手法の説明を⾏行う
39
本実験で使⽤用するJUnit、Seleniumと本⼿手法の利⽤用⽅方法について説明を⾏行 う。それぞれの⼿手法について被験者と共に具体的なテストを⾏行い、既存⼿手法と 本⼿手法の利⽤用⽅方法と実⾏行結果から得られる情報について講義を⾏行う。
⼿手順3、4 : 既存⼿手法(本⼿手法)による誤り検出、修正を⾏行う
⼿手順3、4では被験者にEコマースシステムまたはEMSsecに対して既存⼿手 法と本⼿手法を⽤用いたセキュリティ設計パターンの実装の誤り検出とその誤りの 修正を⾏行う。⼿手順3、4では既存⼿手法を先に⾏行い本⼿手法をその後に⾏行うグルー プと本⼿手法を先に⾏行い既存⼿手法を後に⾏行う2つグループに分けて⾏行う。
⼿手順5 : 実験後アンケートを⾏行う
⼿手順3、4でそれぞれ⼿手法を⾏行った後にアンケートを取りどちらの⼿手法を好 むのか確認する。アンケートの項⽬目を以下に⽰示す。
l ソフトウェアの誤り発⾒見を⾏行う場合にどちらの⼿手法を好みますか l どちらの⼿手法のほうが効率的に誤り発⾒見できると感じましたか l ソフトウェアの誤り修正においてどちらの⼿手法を好みますか
また、⼿手順2にて⾏行ったJUnit、Selenium、本⼿手法の説明で理解ができたかを確 認するため以下の項⽬目にも答えてもらう。
l JUnit, Seleniumの使い⽅方はどれぐらい理解できましたか l 本⼿手法の使い⽅方はどれぐらい理解できましたか
これらの実験を4名に⾏行った。実験前アンケートの結果を表6.1に実験後ア ンケートの結果を表6.2に⽰示す。
表6.1 実験前アンケートの結果
被験者
プログラミング 能⼒力はどれくら いですか
セキュリティに 関する知識はど れくらいですか
ソフトウェアテ ストに関する知 識はどれくらい ですか
Web システムの 開発能⼒力はどれ ぐらいですか
1 ⾼高い あまり⾼高くない ⾼高い あまり⾼高くない 2 あまり⾼高くない 低い あまり⾼高くない あまり⾼高くない 3 あまり高くない あまり高くない あまり高くない 低い
4 あまり高くない 高い あまり高くない あまり高くない
40
表6.2 実験後アンケートの結果(その1)
被験者
ソフトウェアの誤り発⾒見を⾏行 う場合にどちらの⼿手法を好み ますか
ど ち ら の ⼿手 法 の ほ う が 効 率 的 に 誤 り 発 ⾒見 で き ると感じましたか
ソフトウェアの誤り 修正においてどちら の⼿手法を好みますか
1 提案⼿手法を好む 提案⼿手法 提案⼿手法 2 提案手法を好む 提案手法 提案手法 3 提案手法を好む 提案手法
どちらかというと提 案手法
4 提案手法を好む 提案手法
どちらかというと提 案手法
表6.3実験後アンケートの結果(その2)
被験者
JUnit, Seleniumの使い⽅方はどれぐらい
理解できましたか
本⼿手法の使い⽅方はどれぐらい理解 できましたか
1 あまり理解できなかった 理解できた 2 理解できた 理解できた
3 理解できた 理解できた
4 あまり理解できなかった 理解できた
次に被験者による誤り発⾒見・修正の結果を表6.4、表6.5に⽰示す。
41
表6.4 被験者による誤り発⾒見結果
被験者 回数 ⼿手法 発⾒見時間
テストによる ⽋欠陥発⾒見数
1 つあたりの 平均発⾒見時間 1
1 回⽬目 JUnit,Selenium 10 分 2 5 分
2 回⽬目 提案⼿手法 8 分 3 2.6 分
2
1 回⽬目 提案⼿手法 8分 3 2.6 分
2 回⽬目 JUnit,Selenium 20 分 1 20 分
3
1 回⽬目 JUnit,Selenium 80 分 1 80 分
2 回⽬目 提案⼿手法 50 分 3 16.6 分
4
1 回⽬目 提案⼿手法 11 分 2 5.5 分
2 回⽬目 JUnit,Selenium 14 分 1 14 分
表6.5被験者による誤り修正結果
被験者 回数 ⼿手法 修正時間 修正数
1 つあたりの 平均修正時間 1
1 回⽬目 JUnit,Selenium 8 分 3 2.6 分
2 回⽬目 提案⼿手法 4 分 3 1.3 分
2
1 回⽬目 提案⼿手法 26 分 3 8.6 分
2 回⽬目 JUnit,Selenium 5 分 3 1.6 分 3
1 回⽬目 JUnit,Selenium 38 分 1 38 分
2 回⽬目 提案⼿手法 22 分 3 7.3 分
4
1 回⽬目 提案⼿手法 9 分 2 4.5 分
2 回⽬目 JUnit,Selenium 3 分 2 1.5 分
以上の結果よりRQに答える。
被験者1、3では既存⼿手法を⽤用いた1回⽬目よりも提案⼿手法を⽤用いた2回⽬目の
⽅方が発⾒見時間が短くなっている。また、被験者2、4においても2回⽬目に⾏行っ た既存⼿手法による発⾒見よりも提案⼿手法を⽤用いた発⾒見の法が発⾒見時間が短くなっ ている。これらのことからRQ1の既存⼿手法に⽐比べて本⼿手法は効率的にセキュリ ティ設計パターンの実装の誤りを発⾒見できるかという問いに対してプログラミ
42
ング能⼒力やWeb開発能⼒力に関係なく既存⼿手法に⽐比べて本⼿手法は効率的に実装の 誤りを発⾒見できると結論付けることができる。
テストによる⽋欠陥発⾒見数に関しては、被験者1、2、3では既存⼿手法を⽤用いた 場合1つまたは2つの発⾒見であるが本⼿手法を⽤用いた場合に3つすべてのバグを 発⾒見できている。被験者4においても既存⼿手法では1つのみの発⾒見であるが、
本⼿手法では2つの⽋欠陥を発⾒見している。これらのことからRQ2の既存⼿手法に⽐比 べて本⼿手法は効果的なセキュリティ設計パターンの実装の誤りを発⾒見できるテ ストを作成できるかという問いに対してプログラミング能⼒力やWeb開発能⼒力に 関係なく既存⼿手法に⽐比べて本⼿手法は効果的な実装の誤りを発⾒見できるテストの 作成ができると結論付けることができる。
被験者によって作成されたテストを図5.1、図5.2に⽰示す。
図5.1 被験者1によって1回⽬目(既存⼿手法)に作成されたテストの⼀一部
43
図5.2被験者1によって2回⽬目(本⼿手法)に作成されたテストの⼀一部
図5.1のテストは被験者によってテストを⾏行う毎にテストを書き換え、実施 したテストである。そのため、再度同様にテストを⾏行う場合にこのテストを利
⽤用することができない。また、すべてのテストが正しく⾏行われた結果もこのテ ストからは確認することができない。図5.2のテストはテストケースが再度実 施できる状態で作成されている。また、すべてのテストが正しく⾏行うことがで きたかどうかについても確認することができる。被験者2、4においても既存
⼿手法において再度テストができる状態でテストを作成できていなかった。本⼿手 法を⽤用いた場合では被験者全員において再度テストを実施できるテストを作成 できていた。これらのことからRQ3の既存⼿手法に⽐比べて本⼿手法は回帰テスト可 能なセキュリティ設計パターンの実装の誤りを発⾒見できるテストを作成できる かという問いに対してプログラミング能⼒力やWeb開発能⼒力に関係なく既存⼿手法 に⽐比べて本⼿手法は回帰テスト可能なセキュリティ設計パターンの実装の誤りを 発⾒見できるテストを作成できると結論付けることができる。
被験者1、2、4において既存⼿手法、本⼿手法ともに誤り修正数に違いはなかっ た。被験者3では1回⽬目の既存⼿手法による修正では1つ修正のみであったが2 回⽬目の本⼿手法では3つの⽋欠陥を修正することができた。修正時間に関しては既
44
存⼿手法によるテストを先に⾏行った被験者1、3では2回⽬目の本⼿手法では1回⽬目 の約半分の時間で修正できている。本⼿手法によるテストを先に⾏行った被験者 2、4では2回⽬目の既存⼿手法では3分の1以下の時間で修正できている。これら のことからRQ4の既存⼿手法に⽐比べて本⼿手法はセキュリティパターンの実装の誤 りの修正を⽀支援することができるかという問いに対してWeb開発能⼒力の低い利
⽤用者に対しては既存⼿手法に⽐比べて本⼿手法は効果的にセキュリティ設計パターン の実装の誤りを修正できると結論付けることができる。しかし、修正に掛かる 時間において既存⼿手法よりも多くの時間が掛かると⾔言える。これはTESEMに よって⾃自動⽣生成されたテストから修正内容を推測する作業に時間が掛かったた めだと考えられる。
45
第 6 章 制限
本章では本⼿手法の制限を述べる。今回、TESEM によって確認したパターン は「Password Design and Use」、「Prevent SQL Injection」、「Prevent XSS」、「Role-Based Access Control」の 4 つのパターンに限られている。これ らのパターンはセキュリティパターンの中でも代表的なものを選択した。本⼿手 法において適⽤用可能なパターンは設計が具体的に与えれら、対称アプリケーシ ョン上で実装が可能なものである。また、セキュリティ設計パターンの実装⽅方 法に関して、パターンの定義、構造、振る舞いを正確に実装したことが前提条 件となる。
46
第 7 章 おわりに
本稿ではAspectJを⽤用いたテストによるセキュリティ設計パターンの実装⽀支 援を提案した。セキュリティ設計パターンは抽象的なパターンであるために実 装にどう落としていけばわかりにくいが、本稿ではテストを先に与えテスト駆 動開発を⾏行うことでパターンの正しい実装を⽀支援する。具体的には、TESEM というWebアプリケーションを⽤用いてテストテンプレートに設計情報を与える ことでテストを⽣生成し、そのテストを満たすように実装を⾏行っていくことでセ キュリティ設計パターンの実装⽀支援を可能とした。また、実験によって本⼿手法 がパターンの誤り発⾒見やそのためのテスト作成において既存⼿手法よりも効果的 であることを確認した。誤り修正においてもWeb開発能⼒力の低い利⽤用者に対し ては効果的であることがわかった。
今後の課題としては、今回の実験ではJUnit、Seleniumの経験の浅い被験者 による実験を⾏行ったため本⼿手法を⽀支持する意⾒見が多かったが、評価実験におい
てJUnit、Seleniumの熟練者に本⼿手法と既存⼿手法を⽤用いたテストを⾏行った場合
にどちらの⼿手法を好むのかを検証したい。加えて、より複雑な⽋欠陥において本
⼿手法は有効的か評価を⾏行いたい。今回は4つの代表的なパターンにおいてのみ の実装⽀支援を⾏行ったが他のパターンにおいても同様な結果が得られるのか検証 する必要がある。
47
謝辞
本研究を進めるにあたり、数々のご指導を頂いた深澤良彰教授、鷲崎弘宜准 教授、また、数々のお世話をしてくださった秘書の⼭山崎さんに深く感謝いたし ます。
また、共に研究に励み、様々な⾯面でご協⼒力いただいた深澤研究室、鷲崎研究 室の皆様に深く感謝いたします。
48
参考文献
[1] 吉岡信和, “セキュリティの知識を共有するセキュリティパターン,” 第 巻
9, 第 52, pp. 1134-1139, 2011.
[2] N.Yoshioka、H.Washizaki、K.Maruyama, “A Survey on Security Patterns,” Progress in Informatics、No.5, pp. 35-47, 2008.
[3] M.Schumacher, Eduardo Fernandez-Buglioni, Duane Hybertson, Frank Buschmann and Peter Sommerlad, “Security Patterns: Integrating Security and Systems Engineering John Wiley & Sons,” 2006.
[4] 吉岡 信和隆夫, 宗藤 誠治, ⼤大久保 隆夫, “セキュリティソフトウェア⼯工 学の研究動向,” コンピュータソフトウェア Vol.28,No.3, 2011.
[5] “ISO/IEC27001,” http://www.bsigroup.com/ja-JP/ISO27001/ .
[6] 天野勝, 平澤章, 平鍋健児, ⽮矢沢久雄, ⼭山本啓⼆二, “正しく学ぶ ソフトウ ェア設計,” ⽇日経BP出版センター, 2005.
[7] 鷲崎弘宜, “ソフトウェアパターン ─時を超えるソフトウェアの道─ ソ
フトウェアパターン概観,” 第 巻Vol.52, 第 No.9, 2011.
[8] M.Bishop, “Computer Security: Art and Science, Chapter 29: Program Security,” Addison Wesley, pp. 869-921, 2003.
[9] McGraw, Greg Hoglund and Gary, Secure Coding: Principles and Practices, Chapter 4: Implementation, Oʼ’Reilly, 2003, pp. 99-123.
[10] McGraw,G., Hoglund,G.; Exploiting Software: How to Break Code, Addison-Wesley, 2004.
[11] Mike Whittaker, James A. Andrews, How to Break Web Software, Addison-Wesley, 2006.
[12] “CAPEC,” https://capec.mitre.org.
[13] ⼤大久保隆夫、海⾕谷治彦、鷲崎弘宣、⼩小形真平、柿崎淑郎、櫨⼭山淳雄、吉岡
信和, “セキュリティ,プライバシー向け共通問題 EMSsec の提案,” 研究 報告ソフトウェア⼯工学(SE), 2015-SE-189, pp. 1 - 6, 2015.
[14] Takanori Kobashi, Nobukazu Yoshioka, Haruhiko Kaiya, Hironori
49
Washizaki, Takano Okubo and Yoshiaki Fukazawa, “ Validating Security Design Pattern Applications Using Model Testing,” ARES, 2013.
[15] R. S. J. Koen Yskout, “Do Security Patterns Really Help Designers?,”
International Conference on Software Engineering, 2015.
[16] TESEM http://patterns.fuka.info.waseda.ac.jp
[17] Dalal,S.R, Jain,A., Karunanithi,N, Leaton,J.M, Lott,C.M, Patton,G.C.
and Horowitz,B.M, “ Model-based Testing in practice, Proc. The International Conference on Software Engineering,” The International Conference on Software Engineering, 1999.
[18] J. B. Tretmans, “ TorX: Automated Model-Based Testing, ” The Conference on Model-Driven Software Engineering, 2003.
[19] Felderer,M, Agreiter,B, BreuR. and Armenteros,A, “Security Testing by Telling TestStories,” The conference on Modellierung, 2010.
[20] ケント・ベック, テスト駆動開発⼊入⾨門, ヒアソン・エテュケーション, 2003.
[21] “Selenium,” http://docs.seleniumhq.org/.
[22] ⻑⾧長瀬嘉秀,天野まさひろ,鷲崎弘宜,⽴立堀道昭, AspectJ によるアスペクト指 向プログラミング⼊入⾨門, 2004.
50
外部発表
l Masatoshi Yoshizawa, Takanori Kobashi, Hiroyoshi Washizaki, Yoshiaki Fukazawa, Takao Okubo, Haruhiko Kaiya and Nobukazu Yoshioka,
“Verification of Implementing Security Design Patterns Using a Test Template,” Proceedings of 9th International Conference on Availability, Reliability and Security (ARES2014), pp.178-183,Fribourg, Switzerland, September 8-12, 2014.
l Takanori Kobashi, Masatoshi Yoshizawa, Hironori Washizaki, Yoshiaki Fukazawa, Nobukazu Yoshioka, Haruhiko Kaiya, Takano Okubo,
“TESEM: A Tool for Verifying Security Design Pattern Applications by Model Testing,” Proceedings of the 8th IEEE International Conference on Software Testing, Verification, and Validation (ICST 2015), Tool Track, Graz, Austria, 13-17 April 2015.