このトピックでは、Parasoft SOAtest を使用して侵入テストを実行する方法について説明します。

概要

アプリケーションのセキュリティ ホールを発見するには、侵入テストが重要です。Parasoft SOAtest を使用すると、既存の API 機能テストのシナリオを効率的に利用してセキュリティ テストを作成し、自動化された CI プロセスに侵入テストを追加できます。

侵入テスト シナリオの作成

SOAtest は、HTTP または HTTPS でアクセス可能な REST および SOAP の API の侵入テストをサポートします。

侵入テストは、侵入テストが必要な API を含む機能テスト シナリオから開始し、それらのシナリオを侵入テスト用に構成することでサポートされます。既存の機能テスト シナリオを利用して侵入テストに変えることも、侵入テスト専用のカスタムの簡略化されたテスト シナリオを作成することもできます。

機能テストをセキュリティ テストとして再利用すると、以下のようなメリットがあります。

  1. 機能テストはすでに作成されているため、すでに行われた作業を再利用することができ、時間と労力を節約できます。
  2. 特定の API を実行するには、データベースの準備や他の API の呼び出しなど、いくつかセットアップが必要になる場合があります。すでに機能している機能テストから始めれば、このセットアップはすでに完了しています。

侵入テスト シナリオを構成するための一般的なワークフローは次のとおりです。  

  1. 侵入テストに使用するテスト シナリオを特定し、それをコピーします。機能テスト用のオリジナルのテスト シナリオは、通常どおり実行することができます。
  2. 侵入テストが必要な API 呼び出しを行うテスト クライアント (SOAP ClientREST ClientEDI ClientMessaging Client など) のトラフィック オブジェクト出力に、Penetration Testing Tool を追加します。
  3. アプリケーションが変更されたら、機能テスト シナリオだけを更新します。対応する侵入テスト シナリオを実行する準備ができたら、最新の機能テストのセットからコピーして、そのコピーを侵入テスト用に設定するという上記のプロセスを繰り返します。 

侵入テストを行うには、API Security Testing ライセンス機能が有効なユーザー ライセンスが必要です。

セキュリティ テスト シナリオを作成するためのベスト プラクティス

侵入テストに内在するリスク

その性質上、侵入テストは、テスト対象アプリケーション (AUT) のセキュリティの脆弱性を見つけるために、悪意のあるユーザーの活動をシミュレートします。このため、侵入テストは、AUT または SOAtest が実行されているシステムに以下のような影響を与える可能性があります。

  • AUT がダウンする可能性があります。
  • AUT のデータが変更されたり、破損したりする可能性があります。
  • AUT または SOAtest が実行されているマシンにウイルス対策アプリケーションがインストールされている場合、SOAtest の侵入テストのテストアクティビティを疑わしいまたは悪意のあるものとして解釈し、警告を生成したり、その他のアクションを取ったりする可能性があります。

ベスト プラクティスに従うことで、侵入テストの実行によって引き起こされる可能性のあるこれらの問題やその他の潜在的な問題を軽減できます。

  • 機能テスト シナリオは、セキュリティ テストのシナリオとは別に管理し、別々のテストジョブで実行してください。この主な理由は、既存の機能テストに侵入テストを追加すると、機能テストが不安定になる可能性があるからです。どの機能テスト シナリオを自動化されたセキュリティ テストにするかを選択して、別のセキュリティ テストとして管理する機能テストのコピーを作成する必要があります。
  • 侵入テストには費用がかかるので、どのテストを選ぶかを選択する必要があります。テストの数を最小限に抑えながら、対象となる API の攻撃対象領域を最大化する必要があります以下の点を考慮する必要があります。
    • 侵入テスト ツールは、リクエスト/レスポンスのトラフィックを分析し、リクエスト内のどのパラメーターがテストできるかを理解します。API へのすべての入力が確実に分析されるように、各 API のすべてのパラメーターを実行する機能テストを選択する必要があります。
    • 各シナリオでは、どの API 呼び出しをテストするかを決定する必要があります。同じ API が複数のシナリオから参照される可能性があり、別のシナリオでテストされる API に対して、侵入テストを重複して実施したくない場合があります。Penetration Testing Tool は、侵入テストの対象となる API の適切なテストにのみ追加するべきです。
    • シナリオの数は、セキュリティ テストが少なくとも 1 日に 1 回実行できる程度の短さになるように管理する必要があります。
  • 機能テスト シナリオには、初期化またはクリーンアップのためのセットアップまたはティアダウンセクションが含まれている場合があります。これらは通常、侵入テストを行う必要はありません。これらは通常、浸透テストを行う必要はありません。
  • 機能テストにパラメータライズがある場合は、それを削除してください。Penetration Testing Tool は、何をテストすべきかを知るために、同じパラメーターの複数の値のセットを確認する必要はありません。異なる値のセットを送信すると、テストが重複するため、テストの実行が長くなる可能性があります
  • 侵入テスト シナリオに変換された機能テスト シナリオから、すべてのアサーションを削除する必要があります。API の機能テストには、通常、サービスからのレスポンスを検証するアサーションがあります。セキュリティ テストとして使用すると、これらのアサーションは失敗する可能性がありますが、結果を確認するときにノイズが発生します。なぜなら、このコンテキストでは、検出されたセキュリティの脆弱性のみを気にするためです。
  • 一部の API 呼び出しは、データベースにデータを追加します。このような API に対して Penetration Testing Tool を使用すると、Penetration Testing Tool が API に向ける攻撃の数が原因で、データベースが情報で肥大化する可能性があります。場合によっては、アプリケーションのパフォーマンスが低下して、自動化されたセキュリティ テストの実行が適切な時間内に終了しないなど、予期せぬ副作用が発生することがあります。  このような挙動が見られた場合は、開発チームが問題を解決するまで、その API に対するセキュリティ テストを自動実行から除外してください。
  • 機能テストとセキュリティ テストを同じテスト環境で実行するか、別の環境で実行するかを検討する必要があります。機能テストとセキュリティ テストの実行の間に環境をリセットするか、別の環境を使用すると、テストの安定性が向上しますが、通常は必要ありません。多くの場合、同じ環境を再利用できますが、再利用する場合は、最初に機能テストを実行し、最後にセキュリティ テストを実行するべきです。なぜなら、セキュリテ ィテストが機能テストの環境を不安定にする可能性があるからです。さまざまな環境を使用する場合は、元の機能テスト シナリオが変数で構成されていることを確認して、さまざまな環境のさまざまなエンドポイントでテストを簡単にポイントできるようにする必要があります。SOAtestは、環境変数を使用してこれをサポートします。( 異なる環境でのテスト構成 を参照してください。)

侵入テスト シナリオの実行

侵入テスト シナリオを実行するには、「機能テストの実行」の説明に従ってシナリオを実行します。

  • Penetration Testing Tool が接続された REST Client または SOAP Client を実行すると、対応するリクエストとレスポンスのデータがキャプチャされ、Penetration Testing Tool が侵入テストを実行する際の開始点として使用されます。

侵入テストの実行には、たとえ単一の API であっても時間を要することがあるため、侵入テストツールには、次のテストに移るまでの実行時間を管理するタイムアウトが組み込まれています。このタイムアウトは、[その他の設定] で設定された [接続設定] のデフォルトのタイムアウトに準拠しています。現在の API の侵入テストが完了する前にタイムアウトに達した場合、その API の侵入テストは中断され、エラーが報告されます。タイムアウトは、[その他の設定] でデフォルトのタイムアウトを更新することで延長できます。その他の設定」を参照してください。 

結果の確認

UI から実行している場合、エラーは [品質タスク] ビューにレポートされます。各エラーをダブルクリックするか、右クリックして [詳細の表示] を選択すると、エラーの詳細とその修正方法を確認できます。

より詳細な結果は、HTML レポートを生成することで得られます。HTMLレポートでは、CWE、リスク、信頼度ごとにエラーが整理されています。

詳細については「結果の確認」を参照してください。

偽陽性の抑制

Penetration Testing Tool で使用される多くのルールは、ヒューリスティックを適用して AUT HTTP レスポンスを分析し、アラートを生成します。このため、レポートされたエラーの中には偽陽性のものがあるかもしれません。新しいエラーを個々に確認して、それが実行可能なアイテムなのか、偽陽性なのかを判断してください (評価のためにアラートの 信頼度 レベルを使用することもできます)。

次回以降の実行時に Penetration Testing Tool が偽陽性をレポートするのを防ぐために、[品質タスク] ビューまたは抑制ファイルでエラーを抑制することができます。詳細については 「タスクの抑制」 を参照してください。

すべてのテストでアクティブ スキャン ルールを抑制するには、デフォルトのアクティブ スキャン ポリシーを変更します。「スキャン ポリシーの構成」を参照してください。

スキャン ポリシーの構成

SOAtest の侵入テストでは、アクティブ スキャンとパッシブ スキャンのルールを使って分析を行います。アクティブ スキャン ルールは、セキュリティの脆弱性を発見しようと、API に追加の (操作された) リクエストを行います。  対照的に、パッシブ スキャン ルールは、アプリケーションに新しいリクエストを行わず、代わりに、対応する REST Client または SOAP Client によってキャプチャされたリクエスト/レスポンス データを分析して、セキュリティの脆弱性を発見します。SOAtest は、侵入テストのために OWASP ZAP を活用しています。 

SOAtest には、REST API 用とSOAP API 用の 2 つのビルトイン侵入テスト プロファイルがあります。各プロファイルは、1 つのアクティブ スキャン ポリシーおよびパッシブ スキャン ルール セットで構成されます。デフォルトでは、設定されたテストが REST API と SOAP API のどちらにリクエストを行うかに基づいて、プロファイルが選択されます。

カスタムのアクティブ スキャン ポリシーを使用したい場合は、OWASP ZAP からスキャン ポリシーをエクスポートし、それを使用するように SOAtest を構成することで可能になります。エクスポートされたスキャンポリシーは、Penetration Testing Tool で使用されるアクティブ スキャン ルール セットを構成します。カスタムのアクティブ スキャン ポリシーを使用する場合、リクエストが REST API または SOAP API のどちらに行われるかに基づいて、適切なパッシブ スキャン ルール セットが自動的に使用されます。

カスタムの ZAP スキャン ポリシーを使用するように SOAtest を設定するには、以下の操作を行います。

  1. [Parasoft] > [テスト コンフィギュレーション] を選択してテスト コンフィギュレーション マネージャーを開きます。
  2. [新規] をクリックして新しいテスト コンフィギュレーションを作成するか、既存のテスト コンフィギュレーションを選択します。
  3. [実行] > [セキュリティ] タブをクリックします。
  4. [カスタム スキャン ポリシーの使用] を選択します。
  5. [参照] ボタンを使用して、ZAP .policy ファイルを選択します。

カスタム アクティブ スキャン ポリシーの作成

SOAtest ZAP のインストール ディレクトリにある SOAtest embedded ZAP を使って、カスタム アクティブ スキャン ポリシーを作成・変更することができます。

plugins\com.parasoft.ptest.libs.web_<version>\root\zap

(ここで、version は com.parasoft.ptest.libs.web プラグインの実際のバージョンです。たとえば、10.5.2.202109012000)

SOAtest とは独立して ZAP がインストールされている場合は、次のいずれかの場所に ZAP ホームディレクトリがあるはずです。

  • Windows: C:\Users\<username>\OWASP ZAP
  • Linux: ~/.ZAP
  • Mac: ~/Library/Application Support/ZAP

これらのディレクトリに保存されている独立した ZAP インストールのユーザー設定は、起動時に SOAtest embedded ZAP と競合する可能性があります。このため、SOAtest embedded ZAP を起動する際には、-dir コマンドライン引数を使用し、カスタム ZAP のホーム ディレクトリを指定して起動する必要があります。コマンドプロンプトを使用して、SOAtest ZAPインストール ディレクトリに移動し、カスタム ZAP のホーム ディレクトリを使用して SOAtest embedded ZAP を起動します。次に例を示します。

  • Windows: zap -dir C:\Users\your_name\ZAP_SOATEST
  • Linux: ./zap.sh -dir ~/.ZAP_SOATEST
  • Mac: ./zap.sh -dir ~/Library/Application Support/ZAP_SOATEST

SOAtest とは独立した ZAP がインストールされていない場合は、SOAtest ZAP のインストール ディレクトリにある zap.bat (Windows) または zap.sh (Linux、Mac) スクリプトを使用して SOAtest embedded ZAP を実行できます。

SOAtest embedded ZAP を起動すると、すでに使用されているプロキシ ポートを使用しようとする場合があります。その場合、ZAP は別のポートを選択するように求めます。

新しいアクティブ スキャン ポリシーを作成したり、既存のポリシーを編集するには、ZAP のトップメニューから [Analyze] > [Scan Policy Manager] を選択します。[Scan Policy Manager ] ダイアログで、既存のポリシーを選択するか、新しいポリシーを作成します。[Scan Policy] ダイアログで、カスタム ポリシーに適用するアクティブ スキャン ルールを選択します。

作成したカスタム .policy ファイルは、ZAP ホームディレクトリの policies フォルダーに保存されます。

注意

SOAtest embedded ZAP に含まれていないアクティブ スキャン ルールを追加したい場合は、これらのルールを含む ZAP アドオンを SOAtest ZAP インストール ディレクトリの plugin ディレクトリに追加し、このセクションで説明するようにカスタム ポリシーでこれらのルールを選択することができます。ただし、SOAtest ZAP インストール ディレクトリに ZAP アドオンを追加・変更した場合、SOAtest embedded ZAP の正常な実行を保証できなくなるため、続行する前に注意して必要なバックアップを作成してください。

デフォルトのアクティブ スキャン ポリシーの検査と変更

SOAtest で使用されているデフォルトのアクティブ スキャン ポリシーを検査・変更することができます。SOAtest インストールの以下のフォルダーにあります。

plugins\com.parasoft.ptest.libs.web_version\root\zap\policies

(ここで、version は com.parasoft.ptest.libs.web プラグインの実際のバージョンです。たとえば 10.5.2.202109012000)

このフォルダーには、以下のアクティブ ポリシー ファイルが含まれています。

  • Parasoft REST.policy - REST Client に接続された Penetration Testing Tool で使用されます。
  • Parasoft SOAP.policy – SOAP Client に接続された Penetration Testing Tool で使用されます。

これらのポリシーのいずれかを変更した場合、変更したポリシーは次回の Penetration Testing Tool の起動時に使用されます

サポートされている侵入テスト ルール

IDルールCWE IDリスクタイププロファイル
0Directory Browsing 548mediumActiveREST/SOAP
2Private IP Disclosure 200lowPassiveREST/SOAP
3Session ID in URL Rewrite 200mediumPassiveREST/SOAP
6Path Traversal 22highActiveREST/SOAP
7Remote File Inclusion 98highActiveREST
41Source Code Disclosure - Git 541highActiveREST/SOAP
42Source Code Disclosure - SVN 541mediumActiveREST/SOAP
43Source Code Disclosure - File Inclusion 541highActiveREST/SOAP
10003Vulnerable JS Library 829mediumPassiveREST/SOAP
10009In Page Banner Information Leak 200lowPassiveREST/SOAP
10010Cookie No HttpOnly Flag 1004lowPassiveREST/SOAP
10011Cookie Without Secure Flag 614lowPassiveREST/SOAP
10015Incomplete or No Cache-control Header Set 525lowPassiveREST
10017Cross-Domain JavaScript Source File Inclusion 829lowPassiveREST/SOAP
10019Content-Type Header Missing 345informationalPassiveREST/SOAP
10020X-Frame-Options Header 1021mediumPassiveREST/SOAP
10021X-Content-Type-Options Header Missing 693lowPassiveREST
10023Information Disclosure - Debug Error Messages 200lowPassiveREST/SOAP
10024Information Disclosure - Sensitive Information in URL 200informationalPassiveREST/SOAP
10025Information Disclosure - Sensitive Information in HTTP Referrer Header 200informationalPassiveREST/SOAP
10026HTTP Parameter Override 20mediumPassiveREST/SOAP
10027Information Disclosure - Suspicious Comments 200informationalPassiveREST/SOAP
10028Open Redirect 601highPassiveREST/SOAP
10029Cookie Poisoning 20informationalPassiveREST/SOAP
10030User Controllable Charset 20informationalPassiveREST/SOAP
10031User Controllable HTML Element Attribute (Potential XSS) 20informationalPassiveREST/SOAP
10032Viewstate 642high, medium, low, informationalPassiveREST/SOAP
10033Directory Browsing 548mediumPassiveREST/SOAP
10034Heartbleed OpenSSL Vulnerability (Indicative) 119highPassiveREST/SOAP
10035Strict-Transport-Security Header 319low, informationalPassiveREST/SOAP
10036HTTP Server Response Header 200low, informationalPassiveREST/SOAP
10037Server Leaks Information via 'X-Powered-By' HTTP Response Header Field(s) 200lowPassiveREST/SOAP
10038Content Security Policy (CSP) Header Not Set 693medium, informationalPassiveREST/SOAP
10039X-Backend-Server Header Information Leak 200lowPassiveREST/SOAP
10040Secure Pages Include Mixed Content 311medium, lowPassiveREST/SOAP
10041HTTP to HTTPS Insecure Transition in Form Post 319mediumPassiveREST/SOAP
10042HTTPS to HTTP Insecure Transition in Form Post 319mediumPassiveREST/SOAP
10043User Controllable JavaScript Event (XSS) 20infoPassiveREST/SOAP
10044Big Redirect Detected (Potential Sensitive Information Leak) 201lowPassiveREST/SOAP
10045Source Code Disclosure - /WEB-INF folder 541highActiveREST/SOAP
10047HTTPS Content Available via HTTP 311lowActiveREST/SOAP
10048Remote Code Execution - Shell Shock 78highActiveREST/SOAP
10049Content Cacheability 524informationalPassiveREST
10050Retrieved from Cache 未指定informationalPassiveREST/SOAP
10052X-ChromeLogger-Data (XCOLD) Header Information Leak 200mediumPassiveREST/SOAP
10054Cookie without SameSite Attribute 1275lowPassiveREST/SOAP
10055CSP 693medium, low, informationalPassiveREST/SOAP
10056X-Debug-Token Information Leak 200lowPassiveREST/SOAP
10057Username Hash Found 284informationalPassiveREST/SOAP
10061X-AspNet-Version Response Header 933lowPassiveREST/SOAP
10062PII Disclosure 359highPassiveREST/SOAP
10063Permissions Policy Header Not Set 16lowPassiveREST/SOAP
10070Use of SAML 未指定informationalPassiveREST/SOAP
10094Base64 Disclosure 200high, informationalPassiveREST/SOAP
10095Backup File Disclosure 530mediumActiveREST/SOAP
10096Timestamp Disclosure 200informationalPassiveREST/SOAP
10097Hash Disclosure 200high, lowPassiveREST/SOAP
10098Cross-Domain Misconfiguration 264mediumPassiveREST/SOAP
10099Source Code Disclosure 540mediumPassiveREST/SOAP
10103Image Location and Privacy Scanner 200informationalPassiveREST/SOAP
10105Weak Authentication Method 287high, mediumPassiveREST/SOAP
10106HTTP Only Site 311mediumActiveREST/SOAP
10107Httpoxy - Proxy Header Misuse 20highActiveREST/SOAP
10108Reverse Tabnabbing 未指定mediumPassiveREST/SOAP
10109Modern Web Application 未指定informationalPassiveREST/SOAP
10110Dangerous JS Functions 749lowPassiveREST/SOAP
10202Absence of Anti-CSRF Tokens 352low, informationalPassiveREST/SOAP
20015Heartbleed OpenSSL Vulnerability 119highActiveREST/SOAP
20016Cross-Domain Misconfiguration 264highActiveREST/SOAP
20017Source Code Disclosure - CVE-2012-1823 20highActiveREST/SOAP
20018Remote Code Execution - CVE-2012-1823 20highActiveREST/SOAP
20019External Redirect 601highActiveREST
30001Buffer Overflow 120mediumActiveREST/SOAP
30002Format String Error 134mediumActiveREST/SOAP
30003Integer Overflow Error 190mediumActiveREST
40003CRLF Injection 113mediumActiveREST
40008Parameter Tampering 472mediumActiveREST/SOAP
40009Server Side Include 97highActiveREST
40012Cross Site Scripting (Reflected) 79highActiveREST
40013Session Fixation 384highActiveREST/SOAP
40014Cross Site Scripting (Persistent) 79highActiveREST
40015LDAP Injection 90highActiveREST/SOAP
40016Cross Site Scripting (Persistent) - Prime 79informationalActiveREST
40017Cross Site Scripting (Persistent) - Spider 79informationalActiveREST
40018SQL Injection 89highActiveREST/SOAP
40025Proxy Disclosure 200mediumActiveREST/SOAP
40028ELMAH Information Leak 215mediumActiveREST/SOAP
40029Trace.axd Information Leak 215mediumActiveREST/SOAP
40032.htaccess Information Leak 215mediumActiveREST/SOAP
40034.env Information Leak 215mediumActiveREST/SOAP
40035Hidden File Finder 538mediumActiveREST/SOAP
40038Bypassing 403 未指定mediumActiveREST/SOAP
40039Web Cache Deception 未指定mediumActiveREST/SOAP
40040CORS Header 942high, medium, informationalActiveREST
90001Insecure JSF ViewState 642mediumPassiveREST/SOAP
90002Java Serialization Object 502mediumPassiveREST/SOAP
90003Sub Resource Integrity Attribute Missing 345mediumPassiveREST/SOAP
90004Insufficient Site Isolation Against Spectre Vulnerability 693lowPassiveREST/SOAP
90011Charset Mismatch 436informationalPassiveREST/SOAP
90017XSLT Injection 91mediumActiveREST/SOAP
90019Server Side Code Injection 94highActiveREST/SOAP
90020Remote OS Command Injection 78highActiveREST/SOAP
90021XPath Injection 643highActiveREST/SOAP
90022Application Error Disclosure 200mediumPassiveREST/SOAP
90023XML External Entity Attack 611highActiveREST/SOAP
90024Generic Padding Oracle 209highActiveREST/SOAP
90028Insecure HTTP Method 200mediumActiveREST/SOAP
90030WSDL File Detection 未指定informationalPassiveREST/SOAP
90033Loosely Scoped Cookie 565informationalPassiveREST/SOAP
90034Cloud Metadata Potentially Exposed 未指定highActiveREST/SOAP
110001Application Error Disclosure via WebSockets 209mediumPassiveREST/SOAP
110002Base64 Disclosure in WebSocket message 未指定informationalPassiveREST/SOAP
110003Information Disclosure - Debug Error Messages via WebSocket 200lowPassiveREST/SOAP
110004Email address found in WebSocket message 200informationalPassiveREST/SOAP
110005Personally Identifiable Information via WebSocket 359highPassiveREST/SOAP
110006Private IP Disclosure via WebSocket 未指定lowPassiveREST/SOAP
110007Username Hash Found in WebSocket message 284informationalPassiveREST/SOAP
110008Information Disclosure - Suspicious Comments in XML via WebSocket 200informationalPassiveREST/SOAP
111001HTTP Verb Tampering (Parasoft proprietary rule)287mediumActiveREST

Burp Suite との統合

SOAtest は、侵入テストを行うために、事前に設定された OWASP ZAP のインスタンスを内部で使用しています。また、拡張機能 Burp+Suite+Extensions+1.0 を利用することで、商用ツールである Burp Suite を侵入テストに利用することもできます。



  • No labels