このトピックでは、Parasoft SOAtest を使用して侵入テストを実行する方法について説明します。
アプリケーションのセキュリティ ホールを発見するには、侵入テストが重要です。Parasoft SOAtest を使用すると、既存の API 機能テストのシナリオを利用してセキュリティ テストを作成し、自動化された CI プロセスに侵入テストを追加できます。
SOAtest は、HTTP または HTTPS でアクセス可能な REST および SOAP の API の侵入テストをサポートします。
侵入テストは、侵入テストが必要な API を含む機能テスト シナリオから開始し、それらのシナリオを侵入テスト用に構成することでサポートされます。既存の機能テスト シナリオを利用して侵入テストに変えることも、侵入テスト専用のカスタムの簡略化されたテスト シナリオを作成することもできます。
機能テストをセキュリティ テストとして再利用すると、以下のようなメリットがあります。
侵入テスト シナリオを構成するための一般的なワークフローは次のとおりです。
テスト クライアント (SOAP Client、REST Client、EDI Client、Messaging Client など) に、侵入テストが必要な API 呼び出しを行う Penetration Testing Tools to the Traffic Object 出力を追加します。
Browser Playback Tool の場合、侵入テストが必要な HTTP トラフィックまたはブラウザー コンテンツの出力に Penetration Testing Tool を追加します。ツールが HTTP Traffic 出力に連結されている場合、ツールはそのトラフィック メッセージによって記述されたリクエストのみを攻撃します。このツールが Browser Contents に連結されている場合、Browser Playback ツールによって行われたすべてのリクエストを攻撃します。デフォルトでは、[Parasoft] > [設定] > [ブラウザー設定] で有効にしない限り、バイナリ ファイルは無視されます (「その他の設定 」を参照)。
侵入テストを行うには、API Security Testing ライセンス機能が有効なユーザー ライセンスが必要です。 Penetration Testing Tool も CTP で追加可能です。「Penetration Testing Tool」を参照してください。
その性質上、侵入テストは、テスト対象アプリケーション (AUT) のセキュリティの脆弱性を見つけるために、悪意のあるユーザーの活動をシミュレートします。このため、侵入テストは、AUT または SOAtest が実行されているシステムに以下のような影響を与える可能性があります。
ベスト プラクティスに従うことで、侵入テストの実行によって引き起こされる可能性のあるこれらの問題やその他の潜在的な問題を軽減できます。 |
侵入テスト シナリオを実行するには、「機能テストの実行」の説明に従ってシナリオを実行します。
侵入テストの実行には、たとえ単一の API であっても時間を要することがあるため、Penetration Testing Tool には、次のテストに移るまでの実行時間を管理するタイムアウトが組み込まれています。タイムアウトは、テストの実行に使用されるテスト構成で構成されたタイムアウトに準拠します。現在の API の侵入テストが完了する前にタイムアウトに達した場合、その API の侵入テストは中断され、エラーが報告されます。
さらに、正規表現として追加されたグローバルな包含と除外を設定して、Penetration Testing Tool によってスキャンされる URL を制御できます。包含は除外の前に処理されます。包含が定義されていない場合、除外を考慮する前にすべてが含まれていると見なされます。包含および除外は、Penetration Testing Tool が連結されているツールに関係なく適用されます。
タイムアウトおよび/または包含と除外を変更するには、[Parasoft] > [テスト コンフィギュレーション] に移動し、テスト コンフィギュレーションを選択して [実行] > [セキュリティ] に移動します。
侵入テスト シナリオを実行すると、スキャン対象に関する情報がコンソール ビューに表示されます。コンソールで高詳細度を有効にすると、どの URL がスキャンされ、どの URL がスキップされているかなどの詳細が提供され、包含パターンと除外パターンが期待どおりに実行されていることを確認できます。高い冗長レベルを有効にするには、[Parasoft] > [設定] > [コンソール] に移動し、[高] を選択します。
UI から実行している場合、エラーは [品質タスク] ビューにレポートされます。各エラーをダブルクリックするか、右クリックして [詳細の表示] を選択すると、エラーの詳細とその修正方法を確認できます。
より詳細な結果は、HTML レポートを生成することで得られます。HTML レポートは、CWE または OWASP 2021 トップ 10 ([Parasoft] > [設定] > [レポート] > [API セキュリティ] で設定されます。この設定を変更した後にテストを再実行する必要がないことに注意してください)、リスク、および信頼度ごとにエラーを分類します。
詳細については「結果の確認」を参照してください。
Penetration Testing Tool で使用される多くのルールは、ヒューリスティックを適用して AUT HTTP レスポンスを分析し、アラートを生成します。このため、レポートされたエラーの中には偽陽性のものがあるかもしれません。新しいエラーを個々に確認して、それが実行可能なアイテムなのか、偽陽性なのかを判断してください (評価のためにアラートの 信頼度 レベルを使用することもできます)。
次回以降の実行時に Penetration Testing Tool が偽陽性をレポートするのを防ぐために、[品質タスク] ビューまたは抑制ファイルでエラーを抑制することができます。詳細については 「タスクの抑制」 を参照してください。
すべてのテストでアクティブ スキャン ルールを抑制するには、デフォルトのアクティブ スキャン ポリシーを変更します。「Configuring Scan Policies」を参照してください。
SOAtest の侵入テストでは、アクティブ スキャンとパッシブ スキャンのルールを使って分析を行います。アクティブ スキャン ルールは、セキュリティの脆弱性を発見しようと、API に追加の (操作された) リクエストを行います。 対照的に、パッシブ スキャン ルールは、アプリケーションに新しいリクエストを行わず、代わりに、対応するツールによってキャプチャされたリクエスト/レスポンス データを分析して、セキュリティの脆弱性を発見します。SOAtest は、侵入テストのために OWASP ZAP を活用しています。
各プロファイルは、アクティブ スキャン ポリシーと一連のパッシブ スキャン ルールで構成されます。各プロファイルは、1 つのアクティブ スキャン ポリシーおよびパッシブ スキャン ルール セットで構成されます。デフォルトでは、構成されたテストが REST API、SOAP API、またはその他の Web リソース (HTML など) に対してリクエストを行うかどうかに基づいて、プロファイルが選択されます。
カスタムのアクティブ スキャン ポリシーを使用したい場合は、OWASP ZAP からスキャン ポリシーをエクスポートし、それを使用するように SOAtest を構成することで可能になります。エクスポートされたスキャンポリシーは、Penetration Testing Tool で使用されるアクティブ スキャン ルール セットを構成します。カスタムのアクティブ スキャン ポリシーを使用する場合、リクエストが REST API または SOAP API のどちらに行われるかに基づいて、適切なパッシブ スキャン ルール セットが自動的に使用されます。
カスタムの ZAP スキャン ポリシーを使用するように SOAtest を設定するには、以下の操作を行います。
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 ホームディレクトリがあるはずです。
これらのディレクトリに保存されている独立した ZAP インストールのユーザー設定は、起動時に SOAtest embedded ZAP と競合する可能性があります。このため、SOAtest embedded ZAP を起動する際には、-dir コマンドライン引数を使用し、カスタム ZAP のホーム ディレクトリを指定して起動する必要があります。コマンドプロンプトを使用して、SOAtest ZAPインストール ディレクトリに移動し、カスタム ZAP のホーム ディレクトリを使用して SOAtest embedded ZAP を起動します。次に例を示します。
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)
このフォルダーには、以下のアクティブ ポリシー ファイルが含まれています。
これらのポリシーのいずれかを変更した場合、変更したポリシーは次回の Penetration Testing Tool の起動時に使用されます
ID | ルール | CWE ID | OWASP | リスク | タイプ | プロファイル |
---|---|---|---|---|---|---|
0 | Directory Browsing | 548 | A01:2021 | medium | Active | Web/REST/SOAP |
2 | Private IP Disclosure | 200 | A01:2021 | low | Passive | Web/REST/SOAP |
3 | Session ID in URL Rewrite | 200 | A01:2021 | medium | Passive | Web/REST/SOAP |
6 | Path Traversal | 22 | A03:2021 | high | Active | Web/REST/SOAP |
7 | Remote File Inclusion | 98 | A03:2021 | high | Active | Web/REST |
41 | Source Code Disclosure - Git | 541 | A05:2021 | high | Active | Web/REST/SOAP |
42 | Source Code Disclosure - SVN | 541 | A05:2021 | medium | Active | Web/REST/SOAP |
43 | Source Code Disclosure - File Inclusion | 541 | A05:2021 | high | Active | Web/REST/SOAP |
10003 | Vulnerable JS Library | 829 | A06:2021 | medium | Passive | Web/REST/SOAP |
10009 | In Page Banner Information Leak | 200 | A05:2021 | low | Passive | Web/REST/SOAP |
10010 | Cookie No HttpOnly Flag | 1004 | A05:2021 | low | Passive | Web/REST/SOAP |
10011 | Cookie Without Secure Flag | 614 | A05:2021 | low | Passive | Web/REST/SOAP |
10015 | Incomplete or No Cache-control Header Set | 525 | 未指定 | low | Passive | Web/REST |
10017 | Cross-Domain JavaScript Source File Inclusion | 829 | A08:2021 | low | Passive | Web/REST/SOAP |
10019 | Content-Type Header Missing | 345 | A05:2021 | informational | Passive | Web/REST/SOAP |
10020 | Anti-clickjacking Header | 1021 | 未指定 | medium | Passive | Web/REST/SOAP |
10021 | X-Content-Type-Options Header Missing | 693 | A05:2021 | low | Passive | Web/REST |
10023 | Information Disclosure - Debug Error Messages | 200 | A01:2021 | low | Passive | Web/REST/SOAP |
10024 | Information Disclosure - Sensitive Information in URL | 200 | A01:2021 | informational | Passive | Web/REST/SOAP |
10025 | Information Disclosure - Sensitive Information in HTTP Referrer Header | 200 | A01:2021 | informational | Passive | Web/REST/SOAP |
10026 | HTTP Parameter Override | 20 | A04:2021 | medium | Passive | Web/REST/SOAP |
10027 | Information Disclosure - Suspicious Comments | 200 | A01:2021 | informational | Passive | Web/REST/SOAP |
10028 | Open Redirect | 601 | A03:2021 | high | Passive | Web/REST/SOAP |
10029 | Cookie Poisoning | 20 | A03:2021 | informational | Passive | Web/REST/SOAP |
10030 | User Controllable Charset | 20 | A03:2021 | informational | Passive | Web/REST/SOAP |
10031 | User Controllable HTML Element Attribute (Potential XSS) | 20 | A03:2021 | informational | Passive | Web/REST/SOAP |
10032 | Viewstate | 642 | 未指定 | high, medium, low, informational | Passive | Web/REST/SOAP |
10033 | Directory Browsing | 548 | A01:2021 | medium | Passive | Web/REST/SOAP |
10034 | Heartbleed OpenSSL Vulnerability (Indicative) | 119 | A09:2021 | high | Passive | Web/REST/SOAP |
10035 | Strict-Transport-Security Header | 319 | A05:2021 | low, informational | Passive | Web/REST/SOAP |
10036 | HTTP Server Response Header | 200 | A05:2021 | low, informational | Passive | Web/REST/SOAP |
10037 | Server Leaks Information via 'X-Powered-By' HTTP Response Header Field(s) | 200 | A01:2021 | low | Passive | Web/REST/SOAP |
10038 | Content Security Policy (CSP) Header Not Set | 693 | A05:2021 | medium, informational | Passive | Web/REST/SOAP |
10039 | X-Backend-Server Header Information Leak | 200 | A05:2021 | low | Passive | Web/REST/SOAP |
10040 | Secure Pages Include Mixed Content | 311 | A05:2021 | medium, low | Passive | Web/REST/SOAP |
10041 | HTTP to HTTPS Insecure Transition in Form Post | 319 | A02:2021 | medium | Passive | Web/REST/SOAP |
10042 | HTTPS to HTTP Insecure Transition in Form Post | 319 | A02:2021 | medium | Passive | Web/REST/SOAP |
10043 | User Controllable JavaScript Event (XSS) | 20 | A03:2021 | info | Passive | Web/REST/SOAP |
10044 | Big Redirect Detected (Potential Sensitive Information Leak) | 201 | A04:2021 | low | Passive | Web/REST/SOAP |
10045 | Source Code Disclosure - /WEB-INF folder | 541 | A05:2021 | high | Active | Web/REST/SOAP |
10047 | HTTPS Content Available via HTTP | 311 | A05:2021 | low | Active | Web/REST/SOAP |
10048 | Remote Code Execution - Shell Shock | 78 | A09:2021 | high | Active | Web/REST/SOAP |
10049 | Content Cacheability | 524 | 未指定 | informational | Passive | Web/REST |
10050 | Retrieved from Cache | 未指定 | 未指定 | informational | Passive | Web/REST/SOAP |
10051 | Relative Path Confusion | 20 | A05:2021 | medium | Active | Web |
10052 | X-ChromeLogger-Data (XCOLD) Header Information Leak | 200 | A04:2021 | medium | Passive | Web/REST/SOAP |
10054 | Cookie without SameSite Attribute | 1275 | A01:2021 | low | Passive | Web/REST/SOAP |
10055 | CSP | 693 | A05:2021 | medium, low, informational | Passive | Web/REST/SOAP |
10056 | X-Debug-Token Information Leak | 200 | A01:2021 | low | Passive | Web/REST/SOAP |
10057 | Username Hash Found | 284 | A01:2021 | informational | Passive | Web/REST/SOAP |
10061 | X-AspNet-Version Response Header | 933 | A05:2021 | low | Passive | Web/REST/SOAP |
10062 | PII Disclosure | 359 | A04:2021 | high | Passive | Web/REST/SOAP |
10063 | Permissions Policy Header Not Set | 16 | A01:2021 | low | Passive | Web/REST/SOAP |
10070 | Use of SAML | 未指定 | 未指定 | informational | Passive | Web/REST/SOAP |
10094 | Base64 Disclosure | 200 | A04:2021 | high, informational | Passive | Web/REST/SOAP |
10095 | Backup File Disclosure | 530 | A04:2021 | medium | Active | Web/REST/SOAP |
10096 | Timestamp Disclosure | 200 | A01:2021 | informational | Passive | Web/REST/SOAP |
10097 | Hash Disclosure | 200 | A04:2021 | high, low | Passive | Web/REST/SOAP |
10098 | Cross-Domain Misconfiguration | 264 | A01:2021 | medium | Passive | Web/REST/SOAP |
10099 | Source Code Disclosure | 540 | A05:2021 | medium | Passive | Web/REST/SOAP |
10103 | Image Location and Privacy Scanner | 200 | 未指定 | informational | Passive | Web/REST/SOAP |
10105 | Weak Authentication Method | 287 | A01:2021 | high, medium | Passive | Web/REST/SOAP |
10106 | HTTP Only Site | 311 | A05:2021 | medium | Active | Web/REST/SOAP |
10107 | Httpoxy - Proxy Header Misuse | 20 | A06:2021 | high | Active | Web/REST/SOAP |
10108 | Reverse Tabnabbing | 未指定 | A04:2021 | medium | Passive | Web/REST/SOAP |
10109 | Modern Web Application | 未指定 | 未指定 | informational | Passive | Web/REST/SOAP |
10110 | Dangerous JS Functions | 749 | A04:2021 | low | Passive | Web/REST/SOAP |
10202 | Absence of Anti-CSRF Tokens | 352 | A01:2021 | low, informational | Passive | Web/REST/SOAP |
20012 | Anti-CSRF Tokens Check | 352 | A05:2021 | high | Active | Web |
20015 | Heartbleed OpenSSL Vulnerability | 119 | A06:2021 | high | Active | Web/REST/SOAP |
20016 | Cross-Domain Misconfiguration | 264 | A01:2021 | high | Active | Web/REST/SOAP |
20017 | Source Code Disclosure - CVE-2012-1823 | 20 | A06:2021 | high | Active | Web/REST/SOAP |
20018 | Remote Code Execution - CVE-2012-1823 | 20 | A06:2021 | high | Active | Web/REST/SOAP |
20019 | External Redirect | 601 | A03:2021 | high | Active | Web/REST |
30001 | Buffer Overflow | 120 | A03:2021 | medium | Active | Web/REST/SOAP |
30002 | Format String Error | 134 | A03:2021 | medium | Active | Web/REST/SOAP |
30003 | Integer Overflow Error | 190 | A03:2021 | medium | Active | Web/REST |
40003 | CRLF Injection | 113 | A03:2021 | medium | Active | Web/REST |
40008 | Parameter Tampering | 472 | A04:2021 | medium | Active | Web/REST/SOAP |
40009 | Server Side Include | 97 | A03:2021 | high | Active | Web/REST |
40012 | Cross Site Scripting (Reflected) | 79 | A03:2021 | high | Active | Web/REST |
40013 | Session Fixation | 384 | A01:2021 | high | Active | Web/REST/SOAP |
40014 | Cross Site Scripting (Persistent) | 79 | A03:2021 | high | Active | Web/REST |
40015 | LDAP Injection | 90 | A03:2021 | high | Active | Web/REST/SOAP |
40016 | Cross Site Scripting (Persistent) - Prime | 79 | 未指定 | informational | Active | Web/REST |
40017 | Cross Site Scripting (Persistent) - Spider | 79 | 未指定 | informational | Active | Web/REST |
40018 | SQL Injection | 89 | A03:2021 | high | Active | Web/REST/SOAP |
40025 | Proxy Disclosure | 200 | A05:2021 | medium | Active | Web/REST/SOAP |
40028 | ELMAH Information Leak | 215 | A05:2021 | medium | Active | Web/REST/SOAP |
40029 | Trace.axd Information Leak | 215 | A05:2021 | medium | Active | Web/REST/SOAP |
40031 | Out of Band XSS | 79 | A03:2021 | high | Active | Web/REST |
40032 | .htaccess Information Leak | 215 | A05:2021 | medium | Active | Web/REST/SOAP |
40034 | .env Information Leak | 215 | A05:2021 | medium | Active | Web/REST/SOAP |
40035 | Hidden File Finder | 538 | A05:2021 | medium | Active | Web/REST/SOAP |
40038 | Bypassing 403 | 未指定 | A01:2021 | medium | Active | Web/REST/SOAP |
40039 | Web Cache Deception | 未指定 | A05:2021 | medium | Active | Web/REST/SOAP |
40040 | CORS Header | 942 | A01:2021 | high, medium, informational | Active | Web/REST |
40042 | Spring Actuator Information Leak | 215 | A01:2021 | medium | Active | Web/REST/SOAP |
40044 | Exponential Entity Expansion (Billion Laughs Attack) | 776 | A04:2021 | medium | Active | Web/REST/SOAP |
40045 | Spring4Shell | 78 | A03:2021, A06:2021 | high | Active | Web/REST/SOAP |
90001 | Insecure JSF ViewState | 642 | A04:2021 | medium | Passive | Web/REST/SOAP |
90002 | Java Serialization Object | 502 | A04:2021 | medium | Passive | Web/REST/SOAP |
90003 | Sub Resource Integrity Attribute Missing | 345 | A05:2021 | medium | Passive | Web/REST/SOAP |
90004 | Insufficient Site Isolation Against Spectre Vulnerability | 693 | A04:2021 | low | Passive | Web/REST/SOAP |
90011 | Charset Mismatch | 436 | 未指定 | informational | Passive | Web/REST/SOAP |
90017 | XSLT Injection | 91 | A03:2021 | medium | Active | Web/REST/SOAP |
90019 | Server Side Code Injection | 94 | A03:2021 | high | Active | Web/REST/SOAP |
90020 | Remote OS Command Injection | 78 | A03:2021 | high | Active | Web/REST/SOAP |
90021 | XPath Injection | 643 | A03:2021 | high | Active | Web/REST/SOAP |
90022 | Application Error Disclosure | 200 | A05:2021 | medium | Passive | Web/REST/SOAP |
90023 | XML External Entity Attack | 611 | A03:2021 | high | Active | Web/REST/SOAP |
90024 | Generic Padding Oracle | 209 | A02:2021 | high | Active | Web/REST/SOAP |
90025 | Expression Language Injection | 917 | A03:2021 | high | Active | Web |
90028 | Insecure HTTP Method | 200 | A05:2021 | medium | Active | Web/REST/SOAP |
90030 | WSDL File Detection | 未指定 | A05:2021 | informational | Passive | Web/REST/SOAP |
90033 | Loosely Scoped Cookie | 565 | A08:2021 | informational | Passive | Web/REST/SOAP |
90034 | Cloud Metadata Potentially Exposed | 未指定 | A05:2021 | high | Active | Web/REST/SOAP |
90035 | Server Side Template Injection | 94 | 未指定 | high | Active | Web/REST |
90036 | Server Side Template Injection (Blind) | 74 | 未指定 | high | Active | Web/REST |
110001 | Application Error Disclosure via WebSockets | 209 | 未指定 | medium | Passive | Web/REST/SOAP |
110002 | Base64 Disclosure in WebSocket message | 未指定 | 未指定 | informational | Passive | Web/REST/SOAP |
110003 | Information Disclosure - Debug Error Messages via WebSocket | 200 | 未指定 | low | Passive | Web/REST/SOAP |
110004 | Email address found in WebSocket message | 200 | 未指定 | informational | Passive | Web/REST/SOAP |
110005 | Personally Identifiable Information via WebSocket | 359 | 未指定 | high | Passive | Web/REST/SOAP |
110006 | Private IP Disclosure via WebSocket | 未指定 | 未指定 | low | Passive | Web/REST/SOAP |
110007 | Username Hash Found in WebSocket message | 284 | 未指定 | informational | Passive | Web/REST/SOAP |
110008 | Information Disclosure - Suspicious Comments in XML via WebSocket | 200 | 未指定 | informational | Passive | Web/REST/SOAP |
111001 | HTTP Verb Tampering (Parasoft proprietary rule) | 287 | A07:2021 | medium | Active | Web/REST |
SOAtest は、侵入テストを行うために、事前に設定された OWASP ZAP のインスタンスを内部で使用しています。また、拡張機能 Burp+Suite+Extensions+1.0 を利用することで、商用ツールである Burp Suite を侵入テストに利用することもできます。