Running a scan

Let the scan through your WAF

Allow Interopt's addresses through Cloudflare, AWS WAF, Azure, Cloud Armor, Akamai, Fastly, Imperva, F5, Vercel and others.

A WAF, bot control or rate limit that blocks or challenges the scan stops its attack requests before they reach your application. The vulnerabilities behind it go untested. Allow Interopt's addresses, and only those, through each control in front of the target, and keep every control on for everyone else.

What to allow

  • Interopt's addresses. The New scan form lists them under Before you start → Allowlist scanner traffic. See Scanner IP addresses. They are IPv4 addresses; the scan doesn't connect over IPv6. Allow every address listed, and compare the list with your rule before a scan, since it can grow.
  • The connecting address. Match the address the WAF sees the connection come from, not X-Forwarded-For or a similar header. Anyone can set those headers, and the scan may send its own values in them when it tests how your application trusts them.
  • Only the hosts in scope. Limit the rule to the target's hostname, plus any API host, hosts named under Only test, and hosts you select under Other hosts. Testers send attack requests to all of them.
  • Ahead of everything else. Put the rule before your managed rules, bot rules and rate limits. A rule lower in the order never runs for a request an earlier rule already blocked.
  • Every control that can block or challenge. Managed WAF rules, bot protection, JavaScript or CAPTCHA challenges, rate limits and IP reputation each stop a scan on their own.

Don't switch a control off for everyone to let the scan through. Where a staging copy runs the same WAF configuration as production, scan that, and add the rule there. For one scan, remove the rule once the scan has finished. If the asset has scheduled scans or you retest findings, keep the rule, or turn it on before each run.

A WAF exception keyed on a header or cookie you add under Extra headers or cookies doesn't cover the check the scan makes while preparing, so allow by address.

What the scan checks first

On a white-box scan of a URL you supply, the Preparing stage ends with "Checking the running application". It requests your start page and a path that doesn't exist, each once as is and once with a harmless attack string in an interopt_probe query parameter. The scan also reads headers, cookies and server names that identify a CDN or WAF, such as Cloudflare, AWS WAF, Akamai, Imperva or Azure Front Door.

  • The attack string is blocked and the plain request isn't: the scan pauses before testing starts. Its reason begins "A WAF in front of", followed by your URL, the WAF's name when it was recognized, and the responses it got, such as "HTTP 403 with a block page". Add the rule, then select Resume scan; it continues where it stopped. While a scan is paused in Preparing, cancelling it returns its credits.
  • A CDN or WAF is recognized but doesn't block: testing starts. A test the WAF stops later doesn't clear a finding. The finding keeps its verdict from the code, with a note that the live test was blocked by a WAF.
  • Every request is challenged or blocked, with or without the attack string: the scan doesn't pause, but testers can't get past the challenge either. Allow the addresses before starting.
  • The start page starts returning a block mid-scan, such as after a rate limit or an automatic ban: the scan pauses with a reason that begins "A WAF in front of the instance now blocks". Allow the addresses through the control that banned them, then resume.

A scan paused on your side that isn't resumed within 7 days fails.

Cloudflare

Cloudflare's own guides: custom rules, the Skip action and IP lists.

Go to Settings → Lists → Create new list, choose the IP list type and name it, for example interopt_scanner. Select Add items and enter each of Interopt's addresses.

In the zone, go to Security rules and select Create rule → Custom rules. Name the rule and use the expression editor:

Expression
(ip.src in $interopt_scanner and http.host in {"app.example.com" "api.example.com"})

Under Choose action, select Skip, then select All remaining custom rules, All rate limiting rules, All managed rules and All Super Bot Fight Mode rules. Also skip the other products you have on, such as Browser Integrity Check, Security Level and User Agent Blocking. Keep Log matching requests on.

Select Deploy, then move the rule to the top of the custom rules list.

  • Bot Fight Mode, on the Free plan, can't be skipped by a custom rule. Cloudflare doesn't apply it to a request an IP Access rule with the Allow action matches first, so add one per address. An IP Access rule covers the whole zone, so remove it after the scan.
  • Cloudflare Access: when the application sits behind Access, add a policy to its Access application with the Bypass action and an Include rule on IP ranges with Interopt's addresses. Cloudflare doesn't log requests a Bypass policy lets through. See Access policies.

AWS WAF

AWS's own guides: IP sets, IP set match statements and rule priority.

In the AWS WAF console, choose IP sets → Create IP set. For Region, choose Global (CloudFront) when the protection pack (web ACL) protects a CloudFront distribution, or the Region of the Application Load Balancer, API Gateway or other regional resource. Choose IPv4 and enter each scanner address on its own line, with /32 after a single address.

Open the protection pack (web ACL) associated with the target's distribution, load balancer or API, and add a custom rule. In the rule builder, choose Originates from an IP address in, select the IP set, and keep the source IP address as the address to use rather than a forwarded IP header. To limit it to the hosts in scope, add an AND condition on the Host header.

Set the action to Allow and move the rule to the top of the list. Allow ends evaluation, so managed rule groups such as Bot Control and rate-based rules further down don't run for those addresses.

With Shield Advanced automatic application layer DDoS mitigation, Shield adds its rule group at priority 10,000,000, after your rules. An Allow rule above it lets the addresses through. See Shield's rule group.

Azure Front Door

Microsoft's own guides: custom rules and IP rules.

Open the WAF policy associated with the Front Door domains in scope and go to Custom rules → Add custom rule.

Set Rule type to Match and Priority to a number lower than every other custom rule, rate limit rules included. Set Match type to IP address, Match variable to SocketAddr, Operation to Does contain, and enter Interopt's addresses. Under Then, select Allow traffic.

Select Add, then save the policy.

Allow stops evaluation, so managed rule sets, the bot manager rule set included, don't run for a matching request. SocketAddr is the address that connected to Front Door; RemoteAddr can come from X-Forwarded-For.

The same rule with the Azure CLI:

Azure CLI
az network front-door waf-policy rule create \
  --resource-group <resource-group> --policy-name <policy> \
  --name AllowInteropt --priority 1 --rule-type MatchRule --action Allow --defer
az network front-door waf-policy rule match-condition add \
  --resource-group <resource-group> --policy-name <policy> --name AllowInteropt \
  --match-variable SocketAddr --operator IPMatch --values <address-1> <address-2>

Azure Application Gateway

Microsoft's own guides: custom rules and examples.

Open the WAF policy associated with the gateway or its listener for the application, and go to Custom rules → Add custom rule.

Give it a priority lower than every other custom rule. Set the match variable to RemoteAddr with the IPMatch operator and Interopt's addresses. To limit it to the hosts in scope, add a second condition on the Host request header.

Set the action to Allow, add the rule and save the policy.

Allow skips every later custom rule and the managed rule sets. With Front Door in front of the gateway, add the rule on Front Door: the gateway then sees Front Door's addresses.

Google Cloud Armor

Google's own guide: security policy rules.

In the Google Cloud console, go to Cloud Armor policies and select the policy attached to the backend services in scope.

On the Rules tab, select Add rule. Choose Basic mode and enter Interopt's addresses under Match. Set Action to Allow.

Under Priority, enter a number lower than every rule that can deny, throttle or challenge: preconfigured WAF rules, rate limiting rules, reCAPTCHA bot management rules and the Adaptive Protection auto-deploy rule. Select Add.

Evaluation stops at the first matching rule, so a lower-numbered Allow rule also takes precedence over rules Adaptive Protection deploys. With gcloud:

gcloud
gcloud compute security-policies rules create 100 \
  --security-policy <policy> \
  --description "Interopt scan" \
  --src-ip-ranges "<address-1>","<address-2>" \
  --action allow

Akamai App & API Protector

Akamai's references: bypass network lists and client lists in a match target.

In Control Center, create a client list of type IP with Interopt's addresses and activate it.

In the security configuration, open the security policy that covers the hostnames in scope and add the client list to its bypass network lists. Lists there are exempt from the WAF.

Save and activate the new configuration version on the network the target is served from.

Rate controls and Bot Manager decide on their own. Once the scan is testing, check Web Security Analytics for requests from the list that rate controls or Bot Manager denied, and add an exception for the list in that control.

Fastly Next-Gen WAF

Fastly's own guides: lists and request rules.

In the Fastly control panel, go to Security → Next-Gen WAF → Lists, select the workspace, and choose Add workspace list. Choose the IP address type and enter Interopt's addresses.

Go to Security → Next-Gen WAF → Rules and select Add workspace rule. Leave Type on Request. Add the condition IP address Is in list with your list, and a condition on the domain to limit it to the hosts in scope.

Under Actions, choose Allow. Under Details, use Change expiration to end the rule after the scan window, then select Create workspace rule.

Allow takes precedence over block rules, account rules included. Advanced rate limiting rules can't use Allow, so add the condition IP address Is not in list to each one that could count the scan.

Imperva Cloud WAF

Imperva's own guide: policies.

In the Cloud Security Console, create an Allowlist policy with Interopt's addresses as client IPs.

Apply it to the sites in scope only.

Allowlisted addresses bypass every security policy on those sites. For a narrower exception, add the addresses as an exception to the WAF Rules policy instead; the site's other policies then still apply to them and can still stop the scan.

F5 BIG-IP Advanced WAF

F5's own guide: IP address exceptions.

Go to Security → Application Security → IP Addresses → IP Address Exceptions, select the security policy of the application, and select Create.

Enter an address with netmask 255.255.255.255. Set Block this IP Address to Never block this IP Address, and enable Ignore in Anomaly Detection, Ignore in Learning Suggestions and Ignore IP Address Intelligence.

Leave Policy Builder trusted IP disabled: it would teach the policy that the scan's attack requests are normal traffic. Leave Never log traffic from this IP Address off, so the scan stays in your logs.

Select Create, repeat for each address, then select Apply Policy.

A bot defense or DoS profile on the virtual server has its own allowlist; add the addresses there too.

F5 WAF for NGINX

F5's own guide: IP address lists. Formerly NGINX App Protect WAF.

Add a list whose requests are never blocked to the policy, then reload NGINX, or recompile the policy bundle on deployments that compile policies:

policy.json
{
  "policy": {
    "name": "app_policy",
    "template": { "name": "POLICY_TEMPLATE_NGINX_BASE" },
    "enforcementMode": "blocking",
    "ip-address-lists": [
      {
        "name": "interopt_scanner",
        "blockRequests": "never",
        "ipAddresses": [{ "ipAddress": "<scanner address>/32" }]
      }
    ]
  }
}

ModSecurity and Coraza

For ModSecurity or Coraza with the OWASP Core Rule Set, such as on a Kubernetes ingress controller, add an exclusion that removes the Core Rule Set for Interopt's addresses. It has to load before the Core Rule Set, for example in REQUEST-900-EXCLUSION-RULES-BEFORE-CRS.conf. See the Core Rule Set's tuning guide.

REQUEST-900-EXCLUSION-RULES-BEFORE-CRS.conf
SecRule REMOTE_ADDR "@ipMatch <scanner addresses, comma-separated>" \
    "id:1001,phase:1,pass,t:none,nolog,ctl:ruleRemoveByTag=OWASP_CRS"

Vercel Firewall

Vercel's own guides: custom rules and system bypass rules.

In the project, open Firewall, select ⋯ → Configure, then Add New... → Rule.

Name the rule. Under Configure, set the condition to IP Address, choose Is any of and enter Interopt's addresses, one per line. Add an AND condition on the hostname to limit it to the hosts in scope.

Set Then to Bypass and select Save Rule. Move the rule above your other custom rules.

Select Review Changes, then Publish.

Bypass lets the request through custom rules and managed rulesets, bot protection included. Vercel's automatic DDoS mitigations are separate: on Pro and Enterprise, add a system bypass rule for the same addresses. Attack Mode challenges every visitor, and the scan can't pass a challenge. A deployment behind Deployment Protection asks every visitor to sign in to Vercel, so scan a domain it doesn't cover.

Other WAFs, CDNs and bot protection

For Sucuri, DataDome, Barracuda, FortiWeb, Azure API Management policies, an application's own rate limiter or any other control:

  • Allow Interopt's addresses as the connecting address, limited to the hosts in scope, ahead of every rule that can block, challenge or rate-limit.
  • Use the control's allow or bypass action, not its log-only mode for everyone.
  • When one control sits behind another, such as a WAF behind a CDN, allow the addresses at the outer one first. The inner one sees the outer one's addresses unless it reads the client address from a header the outer one sets.
  • Where a rate limit can't be exempted, choose Light under Load on your application so the scan sends requests more slowly. See Configure a scan.

Check that it worked

  • In your WAF: filter its events or logs on Interopt's addresses once the scan is preparing. Requests to the start page with an interopt_probe parameter should show your allow rule matching, and none blocked or challenged.
  • In Interopt: on the scan's Overview tab, the timeline moves past "Checking the running application" into Mapping. A scan paused with a reason that begins "A WAF in front of" is still blocked: the rule doesn't match yet, sits below a rule that blocks, or misses one of the controls.

On this page