diff --git a/.github/workflows/review-release.yml b/.github/workflows/review-release.yml
new file mode 100644
index 0000000..6f3bf31
--- /dev/null
+++ b/.github/workflows/review-release.yml
@@ -0,0 +1,22 @@
+name: Review Release
+concurrency:
+ group: app-release
+ cancel-in-progress: true
+permissions:
+ contents: read
+ id-token: write
+ statuses: write
+on:
+ workflow_dispatch:
+ inputs:
+ task_token:
+ description: 'StepFunction task token'
+ required: true
+
+jobs:
+ review:
+ uses: 'phantomcyber/dev-cicd-tools/.github/workflows/review-release.yml@main'
+ with:
+ task_token: ${{ inputs.task_token }}
+ secrets:
+ resume_release_role_arn: ${{ secrets.RESUME_RELEASE_ROLE_ARN }}
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index d591a81..0d38655 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -1,11 +1,11 @@
repos:
- repo: https://github.com/phantomcyber/dev-cicd-tools
- rev: v1.11
+ rev: v1.13
hooks:
- id: org-hook
- id: package-app-dependencies
- repo: https://github.com/Yelp/detect-secrets
- rev: v1.2.0
+ rev: v1.3.0
hooks:
- id: detect-secrets
args: ['--no-verify', '--exclude-files', '^recordedfuture.json$']
diff --git a/README.md b/README.md
index 5fd59ae..2260b5e 100644
--- a/README.md
+++ b/README.md
@@ -2,11 +2,11 @@
# Recorded Future
Publisher: Recorded Future, Inc
-Connector Version: 3\.1\.0
+Connector Version: 4\.0\.0
Product Vendor: Recorded Future, Inc
Product Name: Recorded Future App for Phantom
Product Version Supported (regex): "\.\*"
-Minimum Product Version: 5\.1\.0
+Minimum Product Version: 5\.3\.0
This app implements investigative actions to perform lookups for quick reputation information, contextual threat intelligence and external threat alerts
@@ -36,37 +36,20 @@ defenses through automation and orchestration. The Recorded Future App provides
that enable the creation of Playbooks to do automated enrichment, correlation, threat hunting, and
alert handling.
-## Recorded Future Demo Playbooks
+# Ingest alerts into events
-Together with the Recorded Future App for Phantom 3.0, a new demo playbook was created and uploaded
-to the community site. The new playbook incorporates the new assessment functionality.
+With alerting rules set up in your Recorded Future enterprise, triggered alerts can now be ingested
+in Splunk SOAR as events.The ingestion configuration is set per asset under the tabs "Asset
+Settings" and "Ingest Settings".
-Four demo playbooks were released with the Recorded Future App for Phantom 2.0 to show how the
-actions in the app can be used. The playbooks are designed to operate on a Recorded Future App asset
-named "recorded-future" and Phantom SMTP asset named "smtp". If the assets are named differently,
-the playbooks will be adjusted. The email address used for the alert emails is specified in the
-linked SMTP asset.
+"Asset Settings" defines a list of rule IDs, what severity to apply to the new events and set the
+limits for the number of events created by the ingestion.
-**Correlation Playbook**
-This playbook shows how to obtain IP reputation and, if its risk score is 90 or more, add the IP
-address to a bad IP address list maintained by Phantom plus forward the information to Splunk and in
-an email.
+
-**Enrichment Playbook**
-This playbook shows how to obtain intelligence of an IP address and, if its risk score is 90 or
-more, to forward this in an email as well as adding the IP to a bad IP address list maintained by
-Phantom.
+The scheduling of the ingestion is set under "Ingest Settings"
-**Threat Hunting Playbook**
-The purpose of this playbook is to find out the IP reputation and when its risk score is 90 or
-above, to find related entities - IP addresses, domains, files, vulnerabilities, and/or URLs - and
-to search for them in Splunk. The results are summarised in an email and the IP address is added to
-the bad IP address list maintained by Phantom.
-
-**Handling of Leaked Credentials**
-The purpose of this playbook is to demonstrate how Recorded Future Alerts can be used to monitor
-various threats such as leaked credentials. The playbook is designed to be scheduled, polling for
-new alerts each time it is run. If an alert is found the information is forwarded via an email.
+
### Configuration Variables
@@ -74,14 +57,22 @@ The below configuration variables are required for this Connector to operate. T
VARIABLE | REQUIRED | TYPE | DESCRIPTION
-------- | -------- | ---- | -----------
-**recordedfuture\_base\_url** | required | string | Recorded Future API Basename
-**recordedfuture\_api\_token** | required | password | Recorded Future API Token
-**recordedfuture\_verify\_ssl** | optional | boolean | Verify SSL Certificates
+**recordedfuture\_base\_url** | required | string | Recorded Future API basename
+**recordedfuture\_api\_token** | required | password | Recorded Future API token
+**recordedfuture\_verify\_ssl** | optional | boolean | Verify SSL certificates
+**ph1** | optional | ph |
+**ph2** | optional | ph |
+**on\_poll\_alert\_ruleids** | optional | string | Comma\-separated list of alert rule IDs
+**on\_poll\_alert\_severity** | optional | string | Severity to apply to the alert event
+**max\_count** | optional | numeric | Max events to ingest for scheduled polling
+**first\_max\_count** | optional | numeric | Max events to ingest for scheduled polling first time
### Supported Actions
[test connectivity](#action-test-connectivity) - Validate the asset configuration for connectivity
-[alert data lookup](#action-alert-data-lookup) - Get details on alerts configured and generated by Recorded Future by alert rule ID and/or time range
-[alert rule lookup](#action-alert-rule-lookup) - Search for alert rule IDs by name
+[alert update](#action-alert-update) - Update status and/or notes for the alert specified with alert\_id
+[alert search](#action-alert-search) - Get details on alerts configured and generated by Recorded Future by alert rule ID and time range
+[alert lookup](#action-alert-lookup) - Get details on an alert
+[alert rule search](#action-alert-rule-search) - Search for alert rule IDs by name
[url intelligence](#action-url-intelligence) - Get threat intelligence for a URL
[url reputation](#action-url-reputation) - Get a quick indicator of the risk associated with a URL
[vulnerability intelligence](#action-vulnerability-intelligence) - Get threat intelligence for a vulnerability
@@ -94,6 +85,7 @@ VARIABLE | REQUIRED | TYPE | DESCRIPTION
[ip reputation](#action-ip-reputation) - Get a quick indicator of the risk associated with an IP address
[threat assessment](#action-threat-assessment) - Get an indicator of the risk for a collection of entities based on context
[list contexts](#action-list-contexts) - Get a list of possible contexts to use in threat assessment
+[on poll](#action-on-poll) - Ingest alerts from Recorded Future
## action: 'test connectivity'
Validate the asset configuration for connectivity
@@ -107,8 +99,42 @@ No parameters are required for this action
#### Action Output
No Output
-## action: 'alert data lookup'
-Get details on alerts configured and generated by Recorded Future by alert rule ID and/or time range
+## action: 'alert update'
+Update status and/or notes for the alert specified with alert\_id
+
+Type: **investigate**
+Read only: **True**
+
+#### Action Parameters
+PARAMETER | REQUIRED | DESCRIPTION | TYPE | CONTAINS
+--------- | -------- | ----------- | ---- | --------
+**alert\_id** | required | Alert ID specifying which alert to update | string | `recordedfuture alert id`
+**alert\_status** | required | New alert status | string |
+**alert\_note** | required | Text to be added to the alert | string |
+
+#### Action Output
+DATA PATH | TYPE | CONTAINS
+--------- | ---- | --------
+action\_result\.status | string |
+action\_result\.parameter\.alert\_id | string | `recordedfuture alert id`
+action\_result\.parameter\.alert\_status | string |
+action\_result\.parameter\.alert\_note | string |
+action\_result\.data\.\*\.id | string |
+action\_result\.data\.\*\.note\.date | string |
+action\_result\.data\.\*\.note\.text | string |
+action\_result\.data\.\*\.note\.author | string |
+action\_result\.data\.\*\.title | string |
+action\_result\.data\.\*\.status | string |
+action\_result\.data\.\*\.statusDate | string |
+action\_result\.data\.\*\.statusChangeBy | string |
+action\_result\.summary\.update | string |
+action\_result\.summary\.reason | string |
+action\_result\.message | string |
+summary\.total\_objects | numeric | `recordedfuture total objects`
+summary\.total\_objects\_successful | numeric | `recordedfuture total objects successful`
+
+## action: 'alert search'
+Get details on alerts configured and generated by Recorded Future by alert rule ID and time range
Type: **investigate**
Read only: **True**
@@ -117,58 +143,245 @@ Read only: **True**
PARAMETER | REQUIRED | DESCRIPTION | TYPE | CONTAINS
--------- | -------- | ----------- | ---- | --------
**rule\_id** | required | Alert Rule ID to look up alert data for | string | `recordedfuture alert rule id`
-**timeframe** | required | Time range for when rules were triggered | string | `recordedfuture alert timerange`
+**timeframe** | required | Time range for when rules were triggered | string |
#### Action Output
DATA PATH | TYPE | CONTAINS
--------- | ---- | --------
-action\_result\.status | string | `recordedfuture result status`
+action\_result\.status | string |
action\_result\.parameter\.rule\_id | string | `recordedfuture alert rule id`
-action\_result\.parameter\.timeframe | string | `recordedfuture alert timerange`
-action\_result\.data\.\*\.alerts\.\*\.alert\.alertTitle | string | `recordedfuture alert title`
-action\_result\.data\.\*\.alerts\.\*\.alert\.alertUrl | string | `recordedfuture alert url`
-action\_result\.data\.\*\.alerts\.\*\.alert\.content\.counts\.documents | numeric | `recordedfuture alert content count documents`
-action\_result\.data\.\*\.alerts\.\*\.alert\.content\.counts\.entities | numeric | `recordedfuture alert content count entities`
-action\_result\.data\.\*\.alerts\.\*\.alert\.content\.counts\.references | numeric | `recordedfuture alert content count references`
-action\_result\.data\.\*\.alerts\.\*\.alert\.content\.entities\.\*\.documents\.\*\.references\.\*\.entities\.\*\.id | string | `recordedfuture alert content entities references id`
-action\_result\.data\.\*\.alerts\.\*\.alert\.content\.entities\.\*\.documents\.\*\.references\.\*\.entities\.\*\.name | string | `email` `recordedfuture alert content entities references name`
-action\_result\.data\.\*\.alerts\.\*\.alert\.content\.entities\.\*\.documents\.\*\.references\.\*\.entities\.\*\.type | string | `recordedfuture alert content entities references type`
-action\_result\.data\.\*\.alerts\.\*\.alert\.content\.entities\.\*\.documents\.\*\.references\.\*\.fragment | string | `recordedfuture alert content entities references fragment`
-action\_result\.data\.\*\.alerts\.\*\.alert\.content\.entities\.\*\.documents\.\*\.references\.\*\.language | string | `recordedfuture alert content entities references language`
-action\_result\.data\.\*\.alerts\.\*\.alert\.content\.entities\.\*\.documents\.\*\.source\.id | string | `recordedfuture alert content entities source id`
-action\_result\.data\.\*\.alerts\.\*\.alert\.content\.entities\.\*\.documents\.\*\.source\.name | string | `recordedfuture alert content entities source name`
-action\_result\.data\.\*\.alerts\.\*\.alert\.content\.entities\.\*\.documents\.\*\.source\.type | string | `recordedfuture alert content entities source type`
-action\_result\.data\.\*\.alerts\.\*\.alert\.content\.entities\.\*\.documents\.\*\.title | string | `recordedfuture alert content entities type`
-action\_result\.data\.\*\.alerts\.\*\.alert\.content\.entities\.\*\.documents\.\*\.url | string | `recordedfuture alert content entities url`
-action\_result\.data\.\*\.alerts\.\*\.alert\.content\.entities\.\*\.entity | string | `recordedfuture alert content entities entity`
-action\_result\.data\.\*\.alerts\.\*\.alert\.content\.id | string | `recordedfuture alert content id`
-action\_result\.data\.\*\.alerts\.\*\.alert\.content\.review\.assignee | string | `recordedfuture alert content review assignee`
-action\_result\.data\.\*\.alerts\.\*\.alert\.content\.review\.note | string | `recordedfuture alert content review note`
-action\_result\.data\.\*\.alerts\.\*\.alert\.content\.review\.noteAuthor | string | `recordedfuture alert content review note author`
-action\_result\.data\.\*\.alerts\.\*\.alert\.content\.review\.noteDate | string | `recordedfuture alert content review note data`
-action\_result\.data\.\*\.alerts\.\*\.alert\.content\.review\.status | string | `recordedfuture alert content review note status`
-action\_result\.data\.\*\.alerts\.\*\.alert\.content\.rule\.id | string | `recordedfuture alert content rule id`
-action\_result\.data\.\*\.alerts\.\*\.alert\.content\.rule\.name | string | `recordedfuture alert content rule name`
-action\_result\.data\.\*\.alerts\.\*\.alert\.content\.rule\.url | string | `recordedfuture alert content rule url`
-action\_result\.data\.\*\.alerts\.\*\.alert\.content\.title | string | `recordedfuture alert content rule title`
-action\_result\.data\.\*\.alerts\.\*\.alert\.content\.triggered | string | `recordedfuture alert content triggered`
-action\_result\.data\.\*\.alerts\.\*\.alert\.content\.type | string | `recordedfuture alert content type`
-action\_result\.data\.\*\.alerts\.\*\.alert\.content\.url | string | `recordedfuture alert content url`
-action\_result\.data\.\*\.alerts\.\*\.alert\.entities\.Document | string | `recordedfuture alert content entities document`
-action\_result\.data\.\*\.alerts\.\*\.alert\.entities\.EmailAddress | string | `email` `recordedfuture alert content entities email address`
-action\_result\.data\.\*\.alerts\.\*\.alert\.triggered | string | `recordedfuture alert triggered`
+action\_result\.parameter\.timeframe | string |
+action\_result\.data\.\*\.rule\.name | string |
action\_result\.data\.\*\.rule\.id | string | `recordedfuture alert rule id`
-action\_result\.data\.\*\.rule\.name | string | `recordedfuture alert rule id`
-action\_result\.data\.\*\.rule\.url | string | `recordedfuture alert rule url`
-action\_result\.summary\.returned\_number\_of\_alerts | numeric | `recordedfuture alert number of alerts`
+action\_result\.data\.\*\.rule\.url | string |
+action\_result\.data\.\*\.alerts\.\*\.id | string | `recordedfuture alert id`
+action\_result\.data\.\*\.alerts\.\*\.review\.assignee | string |
+action\_result\.data\.\*\.alerts\.\*\.review\.statusDate | string |
+action\_result\.data\.\*\.alerts\.\*\.review\.status | string |
+action\_result\.data\.\*\.alerts\.\*\.review\.noteDate | string |
+action\_result\.data\.\*\.alerts\.\*\.review\.statusChangeBy | string |
+action\_result\.data\.\*\.alerts\.\*\.review\.noteAuthor | string |
+action\_result\.data\.\*\.alerts\.\*\.review\.note | string |
+action\_result\.data\.\*\.alerts\.\*\.title | string |
+action\_result\.data\.\*\.alerts\.\*\.triggered | string |
+action\_result\.data\.\*\.alerts\.\*\.type | string |
+action\_result\.data\.\*\.alerts\.\*\.url | string |
+action\_result\.data\.\*\.alerts\.\*\.entities\.alert\.\* | string | `recordedfuture alert id`
+action\_result\.data\.\*\.alerts\.entities\.city\.\*\.entity | string |
+action\_result\.data\.\*\.alerts\.entities\.city\.\*\.authors | string |
+action\_result\.data\.\*\.alerts\.entities\.city\.\*\.fragment | string |
+action\_result\.data\.\*\.alerts\.entities\.city\.\*\.source | string |
+action\_result\.data\.\*\.alerts\.entities\.city\.\*\.title | string |
+action\_result\.data\.\*\.alerts\.entities\.city\.\*\.sourceUrl | string |
+action\_result\.data\.\*\.alerts\.entities\.country\.\*\.entity | string |
+action\_result\.data\.\*\.alerts\.entities\.country\.\*\.authors | string |
+action\_result\.data\.\*\.alerts\.entities\.country\.\*\.fragment | string |
+action\_result\.data\.\*\.alerts\.entities\.country\.\*\.source | string |
+action\_result\.data\.\*\.alerts\.entities\.country\.\*\.title | string |
+action\_result\.data\.\*\.alerts\.entities\.country\.\*\.sourceUrl | string |
+action\_result\.data\.\*\.alerts\.entities\.cyberVulnerability\.\*\.entity | string | `cve`
+action\_result\.data\.\*\.alerts\.entities\.cyberVulnerability\.\*\.authors | string |
+action\_result\.data\.\*\.alerts\.entities\.cyberVulnerability\.\*\.fragment | string |
+action\_result\.data\.\*\.alerts\.entities\.cyberVulnerability\.\*\.source | string |
+action\_result\.data\.\*\.alerts\.entities\.cyberVulnerability\.\*\.title | string |
+action\_result\.data\.\*\.alerts\.entities\.cyberVulnerability\.\*\.sourceUrl | string |
+action\_result\.data\.\*\.alerts\.entities\.email\.\*\.entity | string | `email`
+action\_result\.data\.\*\.alerts\.entities\.email\.\*\.authors | string |
+action\_result\.data\.\*\.alerts\.entities\.email\.\*\.fragment | string |
+action\_result\.data\.\*\.alerts\.entities\.email\.\*\.source | string |
+action\_result\.data\.\*\.alerts\.entities\.email\.\*\.title | string |
+action\_result\.data\.\*\.alerts\.entities\.email\.\*\.sourceUrl | string |
+action\_result\.data\.\*\.alerts\.entities\.hash\.\*\.entity | string | `file`
+action\_result\.data\.\*\.alerts\.entities\.hash\.\*\.authors | string |
+action\_result\.data\.\*\.alerts\.entities\.hash\.\*\.fragment | string |
+action\_result\.data\.\*\.alerts\.entities\.hash\.\*\.source | string |
+action\_result\.data\.\*\.alerts\.entities\.hash\.\*\.title | string |
+action\_result\.data\.\*\.alerts\.entities\.hash\.\*\.sourceUrl | string |
+action\_result\.data\.\*\.alerts\.entities\.malwareCategory\.\*\.entity | string |
+action\_result\.data\.\*\.alerts\.entities\.malwareCategory\.\*\.authors | string |
+action\_result\.data\.\*\.alerts\.entities\.malwareCategory\.\*\.fragment | string |
+action\_result\.data\.\*\.alerts\.entities\.malwareCategory\.\*\.source | string |
+action\_result\.data\.\*\.alerts\.entities\.malwareCategory\.\*\.title | string |
+action\_result\.data\.\*\.alerts\.entities\.malwareCategory\.\*\.sourceUrl | string |
+action\_result\.data\.\*\.alerts\.entities\.malwareCategory\.\*\.entity | string | `domain`
+action\_result\.data\.\*\.alerts\.entities\.domain\.\*\.authors | string |
+action\_result\.data\.\*\.alerts\.entities\.domain\.\*\.fragment | string |
+action\_result\.data\.\*\.alerts\.entities\.domain\.\*\.source | string |
+action\_result\.data\.\*\.alerts\.entities\.domain\.\*\.title | string |
+action\_result\.data\.\*\.alerts\.entities\.domain\.\*\.sourceUrl | string |
+action\_result\.data\.\*\.alerts\.entities\.ip\.\*\.entity | string | `ip`
+action\_result\.data\.\*\.alerts\.entities\.ip\.\*\.authors | string |
+action\_result\.data\.\*\.alerts\.entities\.ip\.\*\.fragment | string |
+action\_result\.data\.\*\.alerts\.entities\.ip\.\*\.source | string |
+action\_result\.data\.\*\.alerts\.entities\.ip\.\*\.title | string |
+action\_result\.data\.\*\.alerts\.entities\.ip\.\*\.sourceUrl | string |
+action\_result\.data\.\*\.alerts\.entities\.operatingSystem\.\*\.entity | string |
+action\_result\.data\.\*\.alerts\.entities\.operatingSystem\.\*\.authors | string |
+action\_result\.data\.\*\.alerts\.entities\.operatingSystem\.\*\.fragment | string |
+action\_result\.data\.\*\.alerts\.entities\.operatingSystem\.\*\.source | string |
+action\_result\.data\.\*\.alerts\.entities\.operatingSystem\.\*\.title | string |
+action\_result\.data\.\*\.alerts\.entities\.operatingSystem\.\*\.sourceUrl | string |
+action\_result\.data\.\*\.alerts\.entities\.product\.\*\.entity | string |
+action\_result\.data\.\*\.alerts\.entities\.product\.\*\.authors | string |
+action\_result\.data\.\*\.alerts\.entities\.product\.\*\.fragment | string |
+action\_result\.data\.\*\.alerts\.entities\.product\.\*\.source | string |
+action\_result\.data\.\*\.alerts\.entities\.product\.\*\.title | string |
+action\_result\.data\.\*\.alerts\.entities\.product\.\*\.sourceUrl | string |
+action\_result\.data\.\*\.alerts\.entities\.technology\.\*\.entity | string |
+action\_result\.data\.\*\.alerts\.entities\.technology\.\*\.authors | string |
+action\_result\.data\.\*\.alerts\.entities\.technology\.\*\.fragment | string |
+action\_result\.data\.\*\.alerts\.entities\.technology\.\*\.source | string |
+action\_result\.data\.\*\.alerts\.entities\.technology\.\*\.title | string |
+action\_result\.data\.\*\.alerts\.entities\.technology\.\*\.sourceUrl | string |
+action\_result\.data\.\*\.alerts\.entities\.url\.\*\.entity | string | `url`
+action\_result\.data\.\*\.alerts\.entities\.url\.\*\.authors | string |
+action\_result\.data\.\*\.alerts\.entities\.url\.\*\.fragment | string |
+action\_result\.data\.\*\.alerts\.entities\.url\.\*\.source | string |
+action\_result\.data\.\*\.alerts\.entities\.url\.\*\.title | string |
+action\_result\.data\.\*\.alerts\.entities\.url\.\*\.sourceUrl | string |
+action\_result\.data\.\*\.alerts\.entities\.vulnerability\.\*\.entity | string | `cve`
+action\_result\.data\.\*\.alerts\.entities\.vulnerability\.\*\.authors | string |
+action\_result\.data\.\*\.alerts\.entities\.vulnerability\.\*\.fragment | string |
+action\_result\.data\.\*\.alerts\.entities\.vulnerability\.\*\.source | string |
+action\_result\.data\.\*\.alerts\.entities\.vulnerability\.\*\.title | string |
+action\_result\.data\.\*\.alerts\.entities\.vulnerability\.\*\.sourceUrl | string |
+action\_result\.data\.\*\.alerts\.evidence\.\*\.criticality | numeric | `recordedfuture risk criticality`
+action\_result\.data\.\*\.alerts\.evidence\.\*\.criticalityLabel | string | `recordedfuture risk criticality label`
+action\_result\.data\.\*\.alerts\.evidence\.\*\.evidenceString | string | `recordedfuture evidence string`
+action\_result\.data\.\*\.alerts\.evidence\.\*\.mitigationString | string | `recordedfuture mitigation string`
+action\_result\.data\.\*\.alerts\.evidence\.\*\.rule | string | `recordedfuture evidence rule`
+action\_result\.data\.\*\.alerts\.evidence\.\*\.timestamp | string | `recordedfuture evidence timestamp`
+action\_result\.summary\.total\_number\_of\_alerts | string |
+action\_result\.summary\.alerts\_returned | string |
+action\_result\.summary\.rule\_name | string |
action\_result\.summary\.rule\_id | string | `recordedfuture alert rule id`
-action\_result\.summary\.rule\_name | string | `recordedfuture rule name`
-action\_result\.summary\.total\_number\_of\_alerts | numeric | `recordedfuture alert number of alerts`
action\_result\.message | string | `recordedfuture result message`
summary\.total\_objects | numeric | `recordedfuture total objects`
summary\.total\_objects\_successful | numeric | `recordedfuture total objects successful`
-## action: 'alert rule lookup'
+## action: 'alert lookup'
+Get details on an alert
+
+Type: **investigate**
+Read only: **True**
+
+#### Action Parameters
+PARAMETER | REQUIRED | DESCRIPTION | TYPE | CONTAINS
+--------- | -------- | ----------- | ---- | --------
+**alert\_id** | required | Alert ID to use for the lookup | string | `recordedfuture alert id`
+
+#### Action Output
+DATA PATH | TYPE | CONTAINS
+--------- | ---- | --------
+action\_result\.status | string | `recordedfuture result status`
+action\_result\.parameter\.alert\_id | string | `recordedfuture alert id`
+action\_result\.\*\.id | string | `recordedfuture alert id`
+action\_result\.\*\.review\.assignee | string |
+action\_result\.\*\.review\.statusDate | string |
+action\_result\.\*\.review\.status | string |
+action\_result\.\*\.review\.noteDate | string |
+action\_result\.\*\.review\.statusChangeBy | string |
+action\_result\.\*\.review\.noteAuthor | string |
+action\_result\.\*\.review\.note | string |
+action\_result\.\*\.rule\.name | string |
+action\_result\.\*\.rule\.id | string | `recordedfuture alert rule id`
+action\_result\.\*\.rule\.url | string |
+action\_result\.\*\.title | string |
+action\_result\.\*\.triggered | string |
+action\_result\.\*\.type | string |
+action\_result\.\*\.url | string |
+action\_result\.data\.\*\.entities\.alert\.\* | string | `recordedfuture alert id`
+action\_result\.data\.\*\.entities\.city\.\*\.entity | string |
+action\_result\.data\.\*\.entities\.city\.\*\.authors | string |
+action\_result\.data\.\*\.entities\.city\.\*\.fragment | string |
+action\_result\.data\.\*\.entities\.city\.\*\.source | string |
+action\_result\.data\.\*\.entities\.city\.\*\.title | string |
+action\_result\.data\.\*\.entities\.city\.\*\.sourceUrl | string |
+action\_result\.data\.\*\.entities\.country\.\*\.entity | string |
+action\_result\.data\.\*\.entities\.country\.\*\.authors | string |
+action\_result\.data\.\*\.entities\.country\.\*\.fragment | string |
+action\_result\.data\.\*\.entities\.country\.\*\.source | string |
+action\_result\.data\.\*\.entities\.country\.\*\.title | string |
+action\_result\.data\.\*\.entities\.country\.\*\.sourceUrl | string |
+action\_result\.data\.\*\.entities\.cyberVulnerability\.\*\.entity | string | `cve`
+action\_result\.data\.\*\.entities\.cyberVulnerability\.\*\.authors | string |
+action\_result\.data\.\*\.entities\.cyberVulnerability\.\*\.fragment | string |
+action\_result\.data\.\*\.entities\.cyberVulnerability\.\*\.source | string |
+action\_result\.data\.\*\.entities\.cyberVulnerability\.\*\.title | string |
+action\_result\.data\.\*\.entities\.cyberVulnerability\.\*\.sourceUrl | string |
+action\_result\.data\.\*\.entities\.email\.\*\.entity | string | `email`
+action\_result\.data\.\*\.entities\.email\.\*\.authors | string |
+action\_result\.data\.\*\.entities\.email\.\*\.fragment | string |
+action\_result\.data\.\*\.entities\.email\.\*\.source | string |
+action\_result\.data\.\*\.entities\.email\.\*\.title | string |
+action\_result\.data\.\*\.entities\.email\.\*\.sourceUrl | string |
+action\_result\.data\.\*\.entities\.hash\.\*\.entity | string | `file`
+action\_result\.data\.\*\.entities\.hash\.\*\.authors | string |
+action\_result\.data\.\*\.entities\.hash\.\*\.fragment | string |
+action\_result\.data\.\*\.entities\.hash\.\*\.source | string |
+action\_result\.data\.\*\.entities\.hash\.\*\.title | string |
+action\_result\.data\.\*\.entities\.hash\.\*\.sourceUrl | string |
+action\_result\.data\.\*\.entities\.malwareCategory\.\*\.entity | string |
+action\_result\.data\.\*\.entities\.malwareCategory\.\*\.authors | string |
+action\_result\.data\.\*\.entities\.malwareCategory\.\*\.fragment | string |
+action\_result\.data\.\*\.entities\.malwareCategory\.\*\.source | string |
+action\_result\.data\.\*\.entities\.malwareCategory\.\*\.title | string |
+action\_result\.data\.\*\.entities\.malwareCategory\.\*\.sourceUrl | string |
+action\_result\.data\.\*\.entities\.domain\.\*\.entity | string | `domain`
+action\_result\.data\.\*\.entities\.domain\.\*\.authors | string |
+action\_result\.data\.\*\.entities\.domain\.\*\.fragment | string |
+action\_result\.data\.\*\.entities\.domain\.\*\.source | string |
+action\_result\.data\.\*\.entities\.domain\.\*\.title | string |
+action\_result\.data\.\*\.entities\.domain\.\*\.sourceUrl | string |
+action\_result\.data\.\*\.entities\.ip\.\*\.entity | string | `ip`
+action\_result\.data\.\*\.entities\.ip\.\*\.authors | string |
+action\_result\.data\.\*\.entities\.ip\.\*\.fragment | string |
+action\_result\.data\.\*\.entities\.ip\.\*\.source | string |
+action\_result\.data\.\*\.entities\.ip\.\*\.title | string |
+action\_result\.data\.\*\.entities\.ip\.\*\.sourceUrl | string |
+action\_result\.data\.\*\.entities\.operatingSystem\.\*\.entity | string |
+action\_result\.data\.\*\.entities\.operatingSystem\.\*\.authors | string |
+action\_result\.data\.\*\.entities\.operatingSystem\.\*\.fragment | string |
+action\_result\.data\.\*\.entities\.operatingSystem\.\*\.source | string |
+action\_result\.data\.\*\.entities\.operatingSystem\.\*\.title | string |
+action\_result\.data\.\*\.entities\.operatingSystem\.\*\.sourceUrl | string |
+action\_result\.data\.\*\.entities\.product\.\*\.entity | string |
+action\_result\.data\.\*\.entities\.product\.\*\.authors | string |
+action\_result\.data\.\*\.entities\.product\.\*\.fragment | string |
+action\_result\.data\.\*\.entities\.product\.\*\.source | string |
+action\_result\.data\.\*\.entities\.product\.\*\.title | string |
+action\_result\.data\.\*\.entities\.product\.\*\.sourceUrl | string |
+action\_result\.data\.\*\.entities\.technology\.\*\.entity | string |
+action\_result\.data\.\*\.entities\.technology\.\*\.authors | string |
+action\_result\.data\.\*\.entities\.technology\.\*\.fragment | string |
+action\_result\.data\.\*\.entities\.technology\.\*\.source | string |
+action\_result\.data\.\*\.entities\.technology\.\*\.title | string |
+action\_result\.data\.\*\.entities\.technology\.\*\.sourceUrl | string |
+action\_result\.data\.\*\.entities\.url\.\*\.entity | string | `url`
+action\_result\.data\.\*\.entities\.url\.\*\.authors | string |
+action\_result\.data\.\*\.entities\.url\.\*\.fragment | string |
+action\_result\.data\.\*\.entities\.url\.\*\.source | string |
+action\_result\.data\.\*\.entities\.url\.\*\.title | string |
+action\_result\.data\.\*\.entities\.url\.\*\.sourceUrl | string |
+action\_result\.data\.\*\.entities\.vulnerability\.\*\.entity | string | `cve`
+action\_result\.data\.\*\.entities\.vulnerability\.\*\.authors | string |
+action\_result\.data\.\*\.entities\.vulnerability\.\*\.fragment | string |
+action\_result\.data\.\*\.entities\.vulnerability\.\*\.source | string |
+action\_result\.data\.\*\.entities\.vulnerability\.\*\.title | string |
+action\_result\.data\.\*\.entities\.vulnerability\.\*\.sourceUrl | string |
+action\_result\.data\.\*\.evidence\.\*\.criticality | numeric | `recordedfuture risk criticality`
+action\_result\.data\.\*\.evidence\.\*\.criticalityLabel | string | `recordedfuture risk criticality label`
+action\_result\.data\.\*\.evidence\.\*\.evidenceString | string | `recordedfuture evidence string`
+action\_result\.data\.\*\.evidence\.\*\.mitigationString | string | `recordedfuture mitigation string`
+action\_result\.data\.\*\.evidence\.\*\.rule | string | `recordedfuture evidence rule`
+action\_result\.data\.\*\.evidence\.\*\.timestamp | string | `recordedfuture evidence timestamp`
+action\_result\.summary\.alert\_title | string |
+action\_result\.summary\.triggered | string |
+action\_result\.message | string | `recordedfuture result message`
+summary\.total\_objects | numeric | `recordedfuture total objects`
+summary\.total\_objects\_successful | numeric | `recordedfuture total objects successful`
+
+## action: 'alert rule search'
Search for alert rule IDs by name
Type: **investigate**
@@ -184,10 +397,10 @@ DATA PATH | TYPE | CONTAINS
--------- | ---- | --------
action\_result\.status | string | `recordedfuture result status`
action\_result\.parameter\.rule\_search | string | `recordedfuture alert rule search`
-action\_result\.data\.\*\.rule\.id | string | `recordedfuture alert rule id`
-action\_result\.data\.\*\.rule\.name | string | `recordedfuture alert rule name`
-action\_result\.summary\.returned\_number\_of\_rules | numeric | `recordedfuture alerts number of rules`
-action\_result\.summary\.rule\_id\_list | string | `recordedfuture alerts rule ids`
+action\_result\.data\.\*\.id | string | `recordedfuture alert rule id`
+action\_result\.data\.\*\.name | string | `recordedfuture alert rule name`
+action\_result\.summary\.rules\_returned | numeric | `recordedfuture alerts number of rules`
+action\_result\.summary\.rule\_id\_list | string | `recordedfuture alert rule id`
action\_result\.summary\.total\_number\_of\_rules | numeric | `recordedfuture rules count total`
action\_result\.message | string | `recordedfuture result message`
summary\.total\_objects | numeric | `recordedfuture total objects`
@@ -789,4 +1002,23 @@ action\_result\.data\.\*\.name | string | `ip` `ipv6` `domain` `file` `hash
action\_result\.message | string | `recordedfuture threat assessment result message`
action\_result\.summary\.contexts\_available\_for\_threat\_assessment | string | `recordedfuture threat assessment contexts`
summary\.total\_objects | numeric | `recordedfuture threat assessment total objects`
-summary\.total\_objects\_successful | numeric | `recordedfuture threat assessment total objects successful`
\ No newline at end of file
+summary\.total\_objects\_successful | numeric | `recordedfuture threat assessment total objects successful`
+
+## action: 'on poll'
+Ingest alerts from Recorded Future
+
+Type: **ingest**
+Read only: **True**
+
+This action will fetch alerts for the specified rule IDs and within the specified timeframe\. When limiting the number of events to ingest, it will ingest the most recent events\.
+
+#### Action Parameters
+PARAMETER | REQUIRED | DESCRIPTION | TYPE | CONTAINS
+--------- | -------- | ----------- | ---- | --------
+**start\_time** | optional | Parameter ignored for this app | numeric |
+**end\_time** | optional | Parameter ignored for this app | numeric |
+**container\_count** | optional | Maximum number of events to query for | numeric |
+**artifact\_count** | optional | Parameter ignored in this app | numeric |
+
+#### Action Output
+No Output
\ No newline at end of file
diff --git a/RELEASENOTES.md b/RELEASENOTES.md
index 9c5b60b..a32ea2f 100644
--- a/RELEASENOTES.md
+++ b/RELEASENOTES.md
@@ -1,5 +1,23 @@
# RELEASE NOTES
+## VERSION 4.0
+
+This version adds on_poll functionality to the Recorded Future integration app for
+Splunk (SOAR) to enable download and processing of Recorded Future alerts.
+
+There are two new actions: alert lookup and alert update.
+
+Two actions have changed name to better describe their functionality:
+1. from alert rule lookup to alert rule search
+2. alert data lookup to alert search
+
+The Recored Future alert structure has been cleaned up to provide better visibility
+of the information included.
+
+Entities within the alerts have been marked up by type so that the relevant data is
+easier to find when writing playbooks.
+
+
## VERSION 3.1
Recorded Future Links have been added to the intelligence lookups. These are entities
diff --git a/alert_lookup_results.html b/alert_lookup_results.html
new file mode 100644
index 0000000..9ed0f10
--- /dev/null
+++ b/alert_lookup_results.html
@@ -0,0 +1,229 @@
+{% extends 'widgets/widget_template.html' %}
+{% load custom_template %}
+
+{% block custom_title_prop %}{% if title_logo %}style="background-size: auto 60%; background-position: 50%; background-repeat: no-repeat; background-image: url('/app_resource/{{ title_logo }}');"{% endif %}{% endblock %}
+{% block title1 %}{{ title1 }}{% endblock %}
+{% block title2 %}{{ title2 }}{% endblock %}
+{% block custom_tools %}
+{% endblock %}
+
+{% block widget_content %}
+
+
+
+
+
+
+
+