<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>Peakhour.IO</title><link href="https://www.peakhour.io/" rel="alternate"></link><link href="https://www.peakhour.io/feeds/all.atom.xml" rel="self"></link><id>https://www.peakhour.io/</id><updated>2026-08-03T11:00:00+10:00</updated><entry><title>Neither Consent Nor an App-Store Ban Makes a Residential IP Direct</title><link href="https://www.peakhour.io/blog/consent-app-store-ban-residential-ip-direct/" rel="alternate"></link><published>2026-08-03T11:00:00+10:00</published><updated>2026-08-03T11:00:00+10:00</updated><author><name>AC</name></author><id>tag:www.peakhour.io,2026-08-03:/blog/consent-app-store-ban-residential-ip-direct/</id><summary type="html">&lt;p&gt;Consent can govern how a device joins a proxy network. An app-store ban can close one distribution route. Neither tells a destination whether a request from a residential IP originated inside the household.&lt;/p&gt;</summary><content type="html">&lt;p&gt;LG can remove every residential proxy SDK from its television app store. That may protect households and make one source of proxy capacity harder to operate. It will not make the next residential IP arriving at a login page trustworthy.&lt;/p&gt;
&lt;p&gt;The distinction is easy to lose in the argument over smart TV apps. Consent governs how a device joins a proxy network. App-store policy governs one way the software reaches that device. Neither tells a website whether the next request from that household connection originated inside the household.&lt;/p&gt;
&lt;p&gt;That is the part security and fraud teams have to operate.&lt;/p&gt;
&lt;h2&gt;The App Store Had a Real Problem&lt;/h2&gt;
&lt;p&gt;Spur Intelligence Labs &lt;a href="https://spur.us/blog/smart-tv-apps-residential-proxy-sdks"&gt;downloaded and inspected 6,038 LG webOS and Samsung Tizen app packages&lt;/a&gt;. It found confirmed residential proxy SDK fingerprints in 2,058 of them. More than 42% of the LG apps were affected.&lt;/p&gt;
&lt;p&gt;The apps included games, screensavers and utilities. Some presented a choice between advertising and sharing the television's connection. Spur also found consent language saying that proxy activity could continue after the app closed.&lt;/p&gt;
&lt;p&gt;LG's response was direct. The company &lt;a href="https://krebsonsecurity.com/2026/07/lg-to-ban-residential-proxies-from-smart-tv-apps/"&gt;told KrebsOnSecurity&lt;/a&gt; that developers must remove the residential proxy option from their webOS apps or have those apps suspended. It also said it would strengthen its evaluation of developer submissions.&lt;/p&gt;
&lt;p&gt;That is a reasonable platform control. A television is shared household equipment, not a personal phone that one adult necessarily administers. A one-time prompt does not show that the person holding the remote owns the internet connection, understands persistent background operation or still remembers the decision months later.&lt;/p&gt;
&lt;p&gt;Removing the SDK reduces that exposure. It does not turn residential traffic back into direct traffic.&lt;/p&gt;
&lt;h2&gt;Consent Describes Enrolment&lt;/h2&gt;
&lt;p&gt;A meaningful consent record can establish something important: an authorised person knowingly allowed a particular device and software version to share resources under a stated set of terms.&lt;/p&gt;
&lt;p&gt;That is a higher standard than a buried clause or software installed without the device owner's knowledge. It should include a plain explanation, an affirmative choice, a visible participation state and a withdrawal path that actually removes the device from every pool receiving its capacity.&lt;/p&gt;
&lt;p&gt;Even strong consent has a boundary. It does not show who later bought access to the connection. It does not prove that customer vetting worked, that destination restrictions held or that the request now reaching a website is harmless.&lt;/p&gt;
&lt;p&gt;There are at least three relationships involved:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The device and network owner decides whether the connection may be shared.&lt;/li&gt;
&lt;li&gt;The proxy provider decides which customers and uses it will permit.&lt;/li&gt;
&lt;li&gt;The destination decides what a relayed request may do to an account, transaction or API.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Consent speaks to the first relationship. Provider controls speak to the second. Neither can make the third decision on the destination's behalf.&lt;/p&gt;
&lt;p&gt;Consent can make the supply relationship consensual. It cannot make every request using that supply legitimate.&lt;/p&gt;
&lt;h2&gt;An App-Store Ban Describes Distribution&lt;/h2&gt;
&lt;p&gt;App stores can remove applications, reject updates and block known SDKs. Those actions matter because they can reduce supply, protect device owners and raise the cost of enrolling more endpoints.&lt;/p&gt;
&lt;p&gt;The policies are not all the same. Amazon's &lt;a href="https://developer.amazon.com/docs/policy-center/device-and-system-abuse.html"&gt;Device and System Abuse Policy&lt;/a&gt; prohibits apps that facilitate proxy services to third parties. Google Play permits proxy services only when proxying is the app's &lt;a href="https://support.google.com/googleplay/android-developer/answer/16559646?hl=en"&gt;primary, user-facing core purpose&lt;/a&gt;. LG has chosen to remove residential proxy functionality from webOS apps.&lt;/p&gt;
&lt;p&gt;Each rule governs software distributed through that platform. None covers every route by which a household connection can become a proxy exit. Capacity can also come from software on phones and computers, applications obtained elsewhere, compromised routers, infected streaming devices and pre-installed software. Our investigation into &lt;a href="/blog/bandwidth-sharing-residential-proxy-supply-chain/"&gt;how bandwidth sharing feeds residential proxy networks&lt;/a&gt; follows those supply paths separately.&lt;/p&gt;
&lt;p&gt;A store can close its door. It cannot certify that an address seen by an unrelated website is no longer available through another device, supplier or reseller.&lt;/p&gt;
&lt;h2&gt;The Provider Can Disappear While the Addresses Remain&lt;/h2&gt;
&lt;p&gt;The July 2026 action against NetNut makes this distinction measurable. Google, the FBI and industry partners disrupted accounts, applications and domains associated with the network. &lt;a href="https://cloud.google.com/blog/topics/threat-intelligence/google-continued-disruption-residential-proxy-networks"&gt;Google said&lt;/a&gt; the action caused significant degradation and reduced the available device pool by millions.&lt;/p&gt;
&lt;p&gt;Layer3 Intel then measured what happened to the observed exit inventory. Its &lt;a href="https://layer3intel.com/blog/measuring-the-netnut-takedown"&gt;NetNut takedown analysis&lt;/a&gt; reported a 99.92% fall in unique NetNut exit IPs observed per hour by 5 July. At the branded network layer, the service had collapsed.&lt;/p&gt;
&lt;p&gt;The address layer told a less tidy story. Of the IPv4 addresses observed through NetNut in its final one to two days, 78.81% appeared through other proxy networks during the following 14 days.&lt;/p&gt;
&lt;p&gt;That result does not prove that the same televisions, routers or other devices moved between providers. Public IP addresses change, multiple devices can share an address through carrier-grade NAT, and several suppliers or resellers may expose overlapping inventory. Layer3 Intel also estimated, after applying its selected June baseline, that about 1.06 million fewer addresses reappeared than ordinary churn predicted. The takedown had a measurable effect.&lt;/p&gt;
&lt;p&gt;The bounded conclusion is still useful: a provider name can almost disappear while much of its recently observed public-address inventory remains visible elsewhere. &lt;a href="/blog/when-proxy-network-dies-ips-survive/"&gt;Our analysis of the measurement&lt;/a&gt; sets out what that overlap can and cannot establish.&lt;/p&gt;
&lt;p&gt;Provider identity is not a stable security boundary. App-store presence is not one either.&lt;/p&gt;
&lt;h2&gt;The Destination Sees the Last Step&lt;/h2&gt;
&lt;p&gt;The website receiving the traffic cannot inspect the television, recover the consent screen or ask which app store approved the software. It sees the end of a longer chain:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;device -&amp;gt; public IP -&amp;gt; supplier -&amp;gt; proxy pool -&amp;gt; reseller -&amp;gt; buyer -&amp;gt; destination
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Most of that history is hidden at request time. The destination can observe the connection, the client and the work being attempted.&lt;/p&gt;
&lt;p&gt;A request from an Australian residential ISP may belong to a customer at home. It may also be a request sent from another country and relayed through that connection. The address locates the exit. It does not authenticate the operator.&lt;/p&gt;
&lt;p&gt;Peakhour therefore treats &lt;a href="/products/residential-proxy-detection/"&gt;residential proxy detection&lt;/a&gt; as evidence inside the request decision. It sits beside credentials, account state, network and client fingerprints, route sensitivity, behaviour and recent outcomes.&lt;/p&gt;
&lt;p&gt;The same proxy observation can support different actions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Opening a public, cached page may require no intervention beyond recording the signal.&lt;/li&gt;
&lt;li&gt;Trying one password across many accounts may justify a shared rate limit or block.&lt;/li&gt;
&lt;li&gt;Changing a recovery email from a first-seen client may require stronger verification.&lt;/li&gt;
&lt;li&gt;Repeating expensive API work across rotating addresses may call for a limit keyed on the credential, client and route rather than the IP alone.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The proxy result changes how much evidence the service requires. It does not select the action by itself.&lt;/p&gt;
&lt;h2&gt;A Compliant Path Still Has Value&lt;/h2&gt;
&lt;p&gt;The limits of consent do not make consent unimportant. The limits of app-store enforcement do not make enforcement pointless.&lt;/p&gt;
&lt;p&gt;If a platform permits bandwidth-sharing software, it should demand more than a provider's assurance that users opted in. A credible path needs authoritative and recurring consent, a persistent participation indicator, effective withdrawal, buyer and use-case controls, private-network protections, supplier and reseller lineage, incident handling and independently testable records.&lt;/p&gt;
&lt;p&gt;Those controls can distinguish accountable supply from hidden or compromised enrolment. They can protect households and make abuse harder. They cannot guarantee that no residential connection will carry a proxy request, and they cannot tell a destination what to do with the request already in flight.&lt;/p&gt;
&lt;p&gt;The mistake is expecting one control to answer a question it cannot observe.&lt;/p&gt;
&lt;p&gt;Consent answers whether a device was knowingly enrolled. An app-store decision answers whether a distribution channel permits the software. The destination still has to decide whether the request may log in, reset an account, buy limited inventory, scrape an API or consume expensive origin work.&lt;/p&gt;
&lt;p&gt;That decision belongs on the request path, using current evidence. A residential address tells us where the request left the network. It does not tell us who initiated it or what they intend to do.&lt;/p&gt;
&lt;p&gt;For the operating model, read &lt;a href="/blog/proxy-flag-is-not-a-security-policy/"&gt;A Proxy Flag Is Not a Security Policy&lt;/a&gt; and &lt;a href="/blog/proxy-takedown-is-not-security-control/"&gt;A Proxy Takedown Is Not a Security Control&lt;/a&gt;.&lt;/p&gt;</content><category term="Residential Proxies"></category><category term="Residential Proxies"></category><category term="Bot Management"></category><category term="Smart TVs"></category><category term="App Security"></category><category term="Threat Detection"></category><category term="Account Protection"></category></entry><entry><title>A Proxy Takedown Is Not a Security Control</title><link href="https://www.peakhour.io/blog/proxy-takedown-is-not-security-control/" rel="alternate"></link><published>2026-08-03T09:00:00+10:00</published><updated>2026-08-03T10:30:00+10:00</updated><author><name>AC</name></author><id>tag:www.peakhour.io,2026-08-03:/blog/proxy-takedown-is-not-security-control/</id><summary type="html">&lt;p&gt;Proxy-network enforcement can reduce supply and protect device owners. Your application still needs current intelligence, behaviour correlation, route-specific controls, and measured request decisions.&lt;/p&gt;</summary><content type="html">&lt;p&gt;A residential proxy network is disrupted on Tuesday. On Wednesday, a password-spraying campaign is still reaching your login route through consumer IP addresses. The takedown changed upstream supply. It did not stop the campaign at your edge.&lt;/p&gt;
&lt;p&gt;Legal action, platform enforcement, domain seizures, malware removal, and industry coordination matter. They can protect device owners, remove capacity, raise operating costs, and expose relationships that were previously difficult to see. They do not inspect the request currently approaching your application or decide whether it should be allowed to change an account.&lt;/p&gt;
&lt;p&gt;That is the boundary security and fraud teams need to keep clear. A takedown is an ecosystem intervention. A provider label is time-bound intelligence. A request decision is a control in the path of the work being attempted.&lt;/p&gt;
&lt;p&gt;The first article in this series compares &lt;a href="/blog/ipidea-netnut-proxy-takedowns/"&gt;what the IPIDEA and NetNut actions changed&lt;/a&gt;. The second examines &lt;a href="/blog/when-proxy-network-dies-ips-survive/"&gt;why a network can disappear while its former IP inventory remains visible elsewhere&lt;/a&gt;. This final article starts after enforcement: when the network has changed, the headlines have moved on, and the application still needs to handle live traffic.&lt;/p&gt;
&lt;h2&gt;Disruption Changes the Network, Not the Destination's Job&lt;/h2&gt;
&lt;p&gt;Google's January 2026 &lt;a href="https://cloud.google.com/blog/topics/threat-intelligence/disrupting-largest-residential-proxy-network"&gt;IPIDEA disruption&lt;/a&gt; combined legal action against control and marketing domains, intelligence sharing, and Google Play Protect enforcement. Google said the action significantly degraded the network and reduced its available device pool by millions. It also warned that reseller agreements created overlap between exit pools and made definitive attribution difficult.&lt;/p&gt;
&lt;p&gt;In July, Google took &lt;a href="https://cloud.google.com/blog/topics/threat-intelligence/google-continued-disruption-residential-proxy-networks"&gt;coordinated action against NetNut&lt;/a&gt;. Google said it disabled accounts and services used for command and control, shared intelligence, and used Play Protect against applications incorporating known NetNut SDKs. It estimated the network at a minimum of two million devices and reported 316 distinct threat clusters using suspected NetNut exits during one week in June.&lt;/p&gt;
&lt;p&gt;Those are Google's findings and estimates, not a claim that every address associated with either provider was malicious. They still show why enforcement deserves support. Reducing compromised supply helps the people whose connections were being used and makes abuse infrastructure more expensive.&lt;/p&gt;
&lt;p&gt;The destination's exposure is different. Google also said that operators affected by the earlier IPIDEA disruption began buying capacity from competitors and acting as resellers. A storefront can lose part of its own pool while continuing to sell access sourced elsewhere. Buyers can move as well. Demand, tooling, accounts, target lists, and attack behaviour do not disappear with a control domain.&lt;/p&gt;
&lt;p&gt;If your production rule is &lt;code&gt;provider = IPIDEA&lt;/code&gt;, the disruption may make that rule less accurate precisely when the incident looks most successful.&lt;/p&gt;
&lt;h2&gt;Expect Migration Before You Expect Silence&lt;/h2&gt;
&lt;p&gt;Post-disruption network-layer observations reinforce that warning, but they need careful attribution. Lumen's Black Lotus Labs reported from its own backbone telemetry that IPIDEA lost traffic and victim population after the January action, then rebuilt infrastructure and recovered. The same &lt;a href="https://www.lumen.com/blog/en-us/symbiotic-parasites-the-modern-proxy-ecosystem"&gt;Black Lotus Labs proxy-ecosystem report&lt;/a&gt; describes backend connections and resale relationships across several networks.&lt;/p&gt;
&lt;p&gt;That report reflects Lumen's visibility, detection methods, and assessments. It is not a complete census of the internet, and an infrastructure relationship does not prove that every request, exit, or customer belongs to one named operator. Its operational lesson is narrower and useful: supplier and reseller relationships can change faster than a static provider label.&lt;/p&gt;
&lt;p&gt;After a disruption, assume four kinds of movement until evidence shows otherwise:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;existing exits reconnect through replacement infrastructure;&lt;/li&gt;
&lt;li&gt;a provider buys or resells another pool;&lt;/li&gt;
&lt;li&gt;customers shift to a different storefront or whitelabel service;&lt;/li&gt;
&lt;li&gt;the same operator rotates through new IPs while keeping its browser, credentials, request sequence, and target set.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The defender's task is not to guess the next brand name. It is to keep the intelligence current and preserve enough behavioural continuity to recognise the work after the address changes.&lt;/p&gt;
&lt;h2&gt;Rebaseline the Intelligence&lt;/h2&gt;
&lt;p&gt;A disruption date should trigger a data review, not an automatic claim of coverage.&lt;/p&gt;
&lt;p&gt;Take a pre-action baseline by route: request volume, proxy prevalence, provider attribution, challenge completion, authentication outcomes, blocks, &lt;code&gt;429&lt;/code&gt; responses, transaction completion, origin work, analyst review, and support contacts. Then compare the same measures immediately after the action and as the market adapts.&lt;/p&gt;
&lt;p&gt;Refresh feeds and internal observations on their own collection cadence. Do not merge a historical provider association into a permanent property of the IP. For each proxy or network result, retain:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;observed_at
indicator or network value
provider attribution, if any
attribution source and dataset version
confidence and reason
first_seen and last_seen where available
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;code&gt;observed_at&lt;/code&gt; matters because a residential address can leave a pool, return to a different subscriber, or appear under another reseller. Confidence matters because “seen as an exit” and “attributed to this provider” are different claims. Provider attribution should be allowed to decay, be superseded, or remain unknown.&lt;/p&gt;
&lt;p&gt;This is the provenance contract described in &lt;a href="/blog/residential-proxy-decision-logging/"&gt;What a Residential Proxy Decision Log Should Contain&lt;/a&gt;. Keep the current request, the time-bound observation, the policy revision, the selected action, and the outcome connected. A retrospective feed correction should not silently rewrite what the control knew at decision time.&lt;/p&gt;
&lt;h2&gt;Correlate the Actor's Work Across IP Rotation&lt;/h2&gt;
&lt;p&gt;IP rotation is meant to break IP-only memory. Build continuity from the parts of the operation that are harder or more expensive to change together.&lt;/p&gt;
&lt;p&gt;Useful correlation keys include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;account, tenant, API credential, session, or target object;&lt;/li&gt;
&lt;li&gt;credential reuse and failure outcomes across many accounts;&lt;/li&gt;
&lt;li&gt;versioned TLS, HTTP, browser, or device fingerprint cohorts;&lt;/li&gt;
&lt;li&gt;route order, timing, retry behaviour, and automation cadence;&lt;/li&gt;
&lt;li&gt;checkout, promotion, recovery, or payment-instrument patterns;&lt;/li&gt;
&lt;li&gt;request cost and repeated origin or database work.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;None of those fields proves identity by itself. A common browser fingerprint can group many legitimate users, and an account can be shared. The value comes from agreement across independent observations and from the route being protected.&lt;/p&gt;
&lt;p&gt;&lt;a href="/blog/residential-proxy-detection-apis-without-javascript/"&gt;Residential Proxy Detection for APIs Without JavaScript&lt;/a&gt; applies the same principle to machine traffic: use network and protocol evidence in the request path, then combine it with the API identities and outcomes already available. Do not make browser JavaScript a prerequisite for detecting rotation against an API.&lt;/p&gt;
&lt;h2&gt;Keep the Action Route-Specific&lt;/h2&gt;
&lt;p&gt;The takedown does not tell you what to do with a request. Neither does the proxy flag. As &lt;a href="/blog/proxy-flag-is-not-a-security-policy/"&gt;A Proxy Flag Is Not a Security Policy&lt;/a&gt; explains, the signal should change how much corroboration or friction a request needs, not select one global response.&lt;/p&gt;
&lt;p&gt;Use the action that fits the route and the cost of error:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Allow&lt;/strong&gt; low-risk activity when the session and behaviour are consistent.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Log&lt;/strong&gt; new or uncertain intelligence while measuring the local population.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Challenge&lt;/strong&gt; an interactive client when it can provide more evidence and has a safe recovery path.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Rate limit&lt;/strong&gt; repeated or expensive behaviour across the account, client cohort, route, token, and outcome keys that survive IP rotation.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Step up&lt;/strong&gt; authentication or transaction verification when the request can transfer account control or value.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Block&lt;/strong&gt; when evidence is strong, harm is current, and a narrower action cannot protect the route.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Account creation, login, password reset, checkout, and public APIs have different identities and failure modes. &lt;a href="/blog/route-specific-residential-proxy-controls/"&gt;Five Routes, Five Residential Proxy Decisions&lt;/a&gt; provides a concrete policy split. The important post-disruption change is to tune each contract with current observations rather than adding a site-wide deny rule for yesterday's provider.&lt;/p&gt;
&lt;h2&gt;Measure Protection and Customer Cost Together&lt;/h2&gt;
&lt;p&gt;An enforcement event can make a threat-intelligence chart fall without improving an application's outcome. A provider-labelled cohort may shrink because attribution changed. Attackers may reduce request rate, move to a new pool, or switch routes. Legitimate customers may still be caught behind shared networks.&lt;/p&gt;
&lt;p&gt;Measure the control where the business feels it:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;successful login, recovery, checkout, signup, and API completion;&lt;/li&gt;
&lt;li&gt;confirmed abuse, account loss, fraud, scraping, and costly operations;&lt;/li&gt;
&lt;li&gt;challenge presentation, completion, failure, and abandonment;&lt;/li&gt;
&lt;li&gt;blocks and limits overturned by analysts;&lt;/li&gt;
&lt;li&gt;origin work and application cost avoided;&lt;/li&gt;
&lt;li&gt;support contacts, time to resolution, and exception volume;&lt;/li&gt;
&lt;li&gt;policy changes, rollbacks, and rules past their review date.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Support cost is part of control cost. If a policy creates a queue of customers who cannot recover accounts, the team needs to see that beside the reduction in suspicious requests. &lt;a href="/products/residential-proxy-detection/"&gt;Peakhour Residential Proxy Detection&lt;/a&gt; keeps the proxy signal in the live web and API decision. &lt;a href="/products/bot-management/"&gt;Bot Management&lt;/a&gt; and &lt;a href="/products/advanced-rate-limiting/"&gt;Advanced Rate Limiting&lt;/a&gt; add behavioural and route-aware controls, while &lt;a href="/products/api-security/"&gt;API Security&lt;/a&gt; protects machine-facing operations without assuming an interactive browser.&lt;/p&gt;
&lt;p&gt;The objective is a measurable change in harmful outcomes without an unacceptable change in legitimate completion.&lt;/p&gt;
&lt;h2&gt;Questions to Ask a Security or Fraud Vendor&lt;/h2&gt;
&lt;p&gt;Post-disruption due diligence should test operational evidence, not invite another pool-size claim.&lt;/p&gt;
&lt;p&gt;Ask:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Do you retain &lt;code&gt;observed_at&lt;/code&gt;, source, dataset or detector version, confidence, and provider-attribution reason separately?&lt;/li&gt;
&lt;li&gt;How quickly can a provider label decay or change after infrastructure, reseller, or ownership movement?&lt;/li&gt;
&lt;li&gt;Can you show what changed in your coverage after the IPIDEA and NetNut actions, including misses and attribution uncertainty?&lt;/li&gt;
&lt;li&gt;Can your controls correlate behaviour across rotating IPs without treating a fingerprint as a person?&lt;/li&gt;
&lt;li&gt;Can we set different allow, log, challenge, rate-limit, step-up, and block policies by route and API operation?&lt;/li&gt;
&lt;li&gt;Does API detection work in the request path without a JavaScript lookup or a second application call?&lt;/li&gt;
&lt;li&gt;Will the decision record show the inputs, policy revision, reason codes, action, and later outcome?&lt;/li&gt;
&lt;li&gt;Can we compare security outcomes with customer completion, support cases, analyst overturns, and origin cost?&lt;/li&gt;
&lt;li&gt;Who owns an emergency rule, when does it expire, and how quickly can we roll it back?&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;A credible answer should expose limits. If the vendor cannot distinguish an enforcement event, a provider association, and a request decision, it will be difficult for your team to do so during an incident.&lt;/p&gt;
&lt;h2&gt;Keep the Boundary Honest&lt;/h2&gt;
&lt;p&gt;Takedowns are necessary work. They protect consumers and disrupt infrastructure at a scale an individual destination cannot reach. They should continue.&lt;/p&gt;
&lt;p&gt;Your application still has to judge the request in front of it.&lt;/p&gt;
&lt;p&gt;Refresh the intelligence. Keep its time, source, attribution, and confidence. Follow behaviour across address changes. Apply a route-specific action. Record what happened next, including the customer's cost.&lt;/p&gt;
&lt;p&gt;Enforcement can reduce the supply of abusive infrastructure. Only a control on the destination's current request path can protect the account, transaction, or API operation being attempted now.&lt;/p&gt;</content><category term="Security"></category><category term="Residential Proxies"></category><category term="Bot Management"></category><category term="Fraud Prevention"></category><category term="Threat Intelligence"></category><category term="Account Protection"></category></entry><entry><title>When a Proxy Network Dies but Its IPs Survive</title><link href="https://www.peakhour.io/blog/when-proxy-network-dies-ips-survive/" rel="alternate"></link><published>2026-08-03T08:30:00+10:00</published><updated>2026-08-03T10:30:00+10:00</updated><author><name>AC</name></author><id>tag:www.peakhour.io,2026-08-03:/blog/when-proxy-network-dies-ips-survive/</id><summary type="html">&lt;p&gt;A proxy takedown can erase a brand without removing all of its former exit addresses. Here is what post-takedown IP overlap proves, what it cannot prove, and the sourcing evidence buyers should demand.&lt;/p&gt;</summary><content type="html">&lt;p&gt;A residential proxy network goes dark. Its domains are seized, its control systems are disrupted and its branded pool almost disappears. Two weeks later, many of the same public IP addresses appear through other proxy services.&lt;/p&gt;
&lt;p&gt;Did the takedown fail? Did the same devices move? Were several providers selling the same supply all along?&lt;/p&gt;
&lt;p&gt;The honest answer is narrower: the address inventory overlapped across time. That is valuable evidence, but it is not device identity, ownership or motive.&lt;/p&gt;
&lt;p&gt;This distinction matters to security and fraud teams deciding what to do with traffic. It also matters to buyers, auditors and researchers trying to establish whether a proxy provider controls the supply chain it describes.&lt;/p&gt;
&lt;h2&gt;One Address Sits Above Several Relationships&lt;/h2&gt;
&lt;p&gt;The destination website sees the last layer in a longer chain:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;device -&amp;gt; public IP -&amp;gt; SDK or supplier -&amp;gt; proxy pool -&amp;gt; reseller -&amp;gt; buyer -&amp;gt; destination
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Each arrow represents a separate relationship.&lt;/p&gt;
&lt;p&gt;The &lt;strong&gt;device&lt;/strong&gt; may be a phone, laptop, streaming box, household gateway or server. Software on it, or elsewhere on the same network, sends a buyer's traffic out through a &lt;strong&gt;public IP&lt;/strong&gt; assigned by an ISP or mobile carrier.&lt;/p&gt;
&lt;p&gt;An &lt;strong&gt;SDK or supplier&lt;/strong&gt; enrols that capacity. A &lt;strong&gt;proxy pool&lt;/strong&gt; makes it selectable. A &lt;strong&gt;reseller&lt;/strong&gt; may buy the service upstream and sell it under another name. A &lt;strong&gt;buyer&lt;/strong&gt; chooses a location or session through an API. The &lt;strong&gt;destination&lt;/strong&gt; sees a request from the exit address, not this commercial history.&lt;/p&gt;
&lt;p&gt;Those layers do not map one-to-one. Several devices can share one public address through a household router or carrier-grade NAT. One device can receive different addresses over time. One supplier can feed several pools. A pool can combine direct supply with upstream inventory. A reseller may not know which device, supplier or SDK produced a particular session.&lt;/p&gt;
&lt;p&gt;Our article on &lt;a href="/blog/bandwidth-sharing-residential-proxy-supply-chain/"&gt;how bandwidth sharing feeds residential proxy networks&lt;/a&gt; covers the ways capacity enters this chain. The question here is different: what can we infer when a named network disappears but addresses associated with it remain visible elsewhere?&lt;/p&gt;
&lt;h2&gt;What the NetNut Measurement Found&lt;/h2&gt;
&lt;p&gt;On 2 July 2026, Google, the FBI, Lumen and other partners took action against the NetNut residential proxy network, also known as Popa. Our &lt;a href="/blog/ipidea-netnut-proxy-takedowns/"&gt;comparison of the IPIDEA and NetNut actions&lt;/a&gt; separates the controls and public claims involved. &lt;a href="https://cloud.google.com/blog/topics/threat-intelligence/google-continued-disruption-residential-proxy-networks"&gt;Google said&lt;/a&gt; it disabled accounts and services used for command and control, shared technical intelligence, and updated Play Protect to disable applications known to contain NetNut SDKs. Google estimated that the network included at least two million devices and said it had high confidence that multiple proxy brands white-labelled NetNut capacity.&lt;/p&gt;
&lt;p&gt;Layer3 Intel then published a useful post-event measurement. Its &lt;a href="https://layer3intel.com/blog/measuring-the-netnut-takedown"&gt;NetNut takedown analysis&lt;/a&gt; says the number of unique NetNut exit IPs it observed per hour fell by &lt;strong&gt;99.92%&lt;/strong&gt; by 5 July. At the brand or gateway layer, that is a decisive decline.&lt;/p&gt;
&lt;p&gt;The cross-network result was less absolute. Layer3 Intel took IPv4 addresses it had observed through NetNut in the 30 days before the shutdown and checked whether they appeared through other networks during the following 14 days. Among addresses seen through NetNut in the final one to two days, &lt;strong&gt;78.81% reappeared&lt;/strong&gt; elsewhere.&lt;/p&gt;
&lt;p&gt;The researchers also tried to account for ordinary churn. They applied reappearance rates from a 4 June placebo cutoff to the July cohort. On that basis, they expected about 17.96 million recent addresses to reappear and observed 16.90 million. The difference produced a baseline-adjusted estimate of &lt;strong&gt;about 1.06 million IP addresses removed from the wider proxy ecosystem beyond normal churn&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;These measurements support three bounded findings:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;NetNut's branded, observable exit service collapsed.&lt;/li&gt;
&lt;li&gt;Much of the recent public-address inventory associated with NetNut was observable through other proxy networks after the disruption.&lt;/li&gt;
&lt;li&gt;Reappearance was lower than the selected June baseline, consistent with a real takedown effect beyond ordinary address churn.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That is already operationally important. A provider name can disappear while some of the address inventory remains commercially reachable.&lt;/p&gt;
&lt;h2&gt;An IP Match Is Not a Device Match&lt;/h2&gt;
&lt;p&gt;The same measurement does not prove that the same physical device survived, moved between suppliers or carried two SDKs.&lt;/p&gt;
&lt;p&gt;Public addresses are assigned to connections, not permanently engraved on devices. DHCP leases expire. Mobile subscribers move between network gateways. Consumer routers reconnect. Carrier-grade NAT lets many subscribers share public addresses from a provider-controlled pool. &lt;a href="https://www.rfc-editor.org/rfc/rfc6598"&gt;RFC 6598&lt;/a&gt; documents shared address space used by service providers for CGNAT, but the ambiguity exists outside that range too: the destination only sees the translated public address.&lt;/p&gt;
&lt;p&gt;If &lt;code&gt;203.0.113.x&lt;/code&gt; appears through Network A before a cutoff and Network B afterwards, several explanations fit:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;the same device was available through both networks;&lt;/li&gt;
&lt;li&gt;different devices behind the same household or carrier address were enrolled;&lt;/li&gt;
&lt;li&gt;an ISP reassigned the address to a different subscriber;&lt;/li&gt;
&lt;li&gt;a shared upstream supplied both pools;&lt;/li&gt;
&lt;li&gt;one provider resold another provider's capacity;&lt;/li&gt;
&lt;li&gt;the enumeration system attributed one of the observations incorrectly.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;IP overlap increases confidence that address inventory is shared or recycled across the market. It does not identify which explanation is correct for any one address.&lt;/p&gt;
&lt;p&gt;It also does not prove supplier ownership. A provider may own infrastructure, contract directly with a supplier, buy capacity through an intermediary, or combine all three. Nor does overlap prove that a device owner did not consent. Consent belongs to a specific person, device, software version, disclosure and time. An IP address contains none of those records.&lt;/p&gt;
&lt;p&gt;Most importantly, overlap does not prove motive. It can show that a buyer's request travelled through an observed exit. It cannot establish what the supplier, reseller or provider knew, why a buyer selected the route, or whether the destination request was benign or abusive.&lt;/p&gt;
&lt;p&gt;Google's earlier &lt;a href="https://cloud.google.com/blog/topics/threat-intelligence/disrupting-largest-residential-proxy-network"&gt;IPIDEA investigation&lt;/a&gt; reached beyond address overlap. It analysed applications, Windows binaries, SDK code, command infrastructure and shared server pools, and paired that technical work with platform and legal action. Even then, Google noted that overlaps between exit nodes made definitive quantification and attribution difficult. That is the right standard: use IP observations as one part of a multi-layer attribution, not as a shortcut through the layers.&lt;/p&gt;
&lt;h2&gt;Read the 1.06 Million Estimate as an Estimate&lt;/h2&gt;
&lt;p&gt;Layer3 Intel's analysis is stronger than a simple before-and-after count because it recognises ordinary churn and uses an age-matched comparison. Its scale and high-frequency observation also give it a useful view of the market.&lt;/p&gt;
&lt;p&gt;The public methodology still leaves material uncertainty:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Enumeration is proprietary.&lt;/strong&gt; The post describes the volume and timing of observations, but does not publish the complete sampling system, provider coverage, request selection, deduplication rules or validation set. Readers cannot independently reproduce the population from the article alone.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;An IP is a noisy unit.&lt;/strong&gt; Dynamic addressing and CGNAT break a stable link between address, subscriber and device. Counting distinct IPv4 addresses can overstate devices and obscure shared use.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The windows choose what can reappear.&lt;/strong&gt; The source cohort covers 30 days; the follow-up covers 14. Shorter or longer windows would change both the raw overlap and the churn model.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;There is one published placebo cutoff.&lt;/strong&gt; A single June comparison is useful, but it does not show the normal week-to-week distribution, seasonal effects or whether that period was representative.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No confidence intervals are published.&lt;/strong&gt; The 1.06 million figure is presented as a point estimate. The post does not provide uncertainty bounds, sensitivity analysis or an error rate for network attribution.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The counterfactual is observational.&lt;/strong&gt; The difference from baseline is consistent with the takedown removing capacity. Other simultaneous supplier, demand, enforcement or measurement changes could contribute.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;None of these limits makes the result useless. They set its resolution. “About 1.06 million fewer addresses reappeared than this baseline predicted” is supported by the published method. “Exactly 1.06 million devices were removed” is not.&lt;/p&gt;
&lt;h2&gt;What a Sourcing Claim Can Responsibly Prove&lt;/h2&gt;
&lt;p&gt;A vendor can responsibly prove facts about processes and records it controls.&lt;/p&gt;
&lt;p&gt;It can show which entity contracted each direct supplier, which software package enrolled a device, what disclosure was presented, how affirmative consent was recorded, how withdrawal works, which versions were active, and whether a buyer's session can be traced to that evidence. It can document reseller dependencies, prohibit undisclosed sub-supply, test compliance and publish exceptions.&lt;/p&gt;
&lt;p&gt;A policy page can prove that a policy exists. A contract can prove that parties accepted terms. Neither proves that every active exit followed the policy.&lt;/p&gt;
&lt;p&gt;“Ethically sourced” is therefore too broad unless the provider defines the claim and its coverage. Does it apply only to a proprietary pool? To upstream suppliers? To every session sold by resellers? Does consent come from the device user, the account holder, the network owner or all relevant parties? How quickly is an exit removed after withdrawal?&lt;/p&gt;
&lt;p&gt;The strongest claim is session-level and time-bound: for this delivered connection, the provider can trace the supply path to a named enrolment mechanism and current evidence, subject to stated audit limitations. Anything less should be described at its actual scope.&lt;/p&gt;
&lt;h2&gt;What Auditors and Buyers Should Request&lt;/h2&gt;
&lt;p&gt;Do not ask only whether sourcing is ethical. Ask for evidence that follows the chain:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;a current inventory of direct suppliers, upstream pools and white-label dependencies;&lt;/li&gt;
&lt;li&gt;the percentage of delivered traffic covered by direct, auditable sourcing rather than policy language alone;&lt;/li&gt;
&lt;li&gt;SDK names, package hashes, versions, distribution channels and signed build provenance;&lt;/li&gt;
&lt;li&gt;the exact user disclosure and consent event, including timestamp, software version and withdrawal path;&lt;/li&gt;
&lt;li&gt;proof that the person giving consent had authority over the device and network connection;&lt;/li&gt;
&lt;li&gt;controls for CGNAT, reassigned addresses, duplicate exits and concurrent appearance across providers;&lt;/li&gt;
&lt;li&gt;session-level lineage from buyer request to pool, supplier and enrolment record, sampled by an independent auditor;&lt;/li&gt;
&lt;li&gt;contractual limits on sub-suppliers, plus evidence that those limits are tested;&lt;/li&gt;
&lt;li&gt;complaint, removal and incident records, including time to disable an exit across every downstream reseller;&lt;/li&gt;
&lt;li&gt;methodology for advertised pool size, unique-IP counts and active-device counts, with uncertainty and deduplication rules;&lt;/li&gt;
&lt;li&gt;independent test results, exceptions and remediation, not only a clean summary statement.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Buyers should also keep their own record: product and upstream named at purchase time, contract revision, stated sourcing basis, session identifiers where available, destination and purpose, and the control used to prevent abuse. A provider's assurance does not transfer accountability for how the buyer uses the route.&lt;/p&gt;
&lt;h2&gt;Defenders Still Have a Request to Judge&lt;/h2&gt;
&lt;p&gt;Post-takedown research can improve proxy intelligence. It cannot turn an IP address into a verdict.&lt;/p&gt;
&lt;p&gt;An address that reappears across pools may deserve closer observation, especially on login, account recovery, checkout or expensive APIs. The action should still depend on route, account state, client consistency, behaviour and recent outcomes. That is why &lt;a href="/blog/proxy-flag-is-not-a-security-policy/"&gt;a proxy flag is not a security policy&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Keep the provenance of the observation as well. Record which network label was seen, when it was observed, which dataset and version supplied it, what other evidence changed the action, and what happened next. Our guide to &lt;a href="/blog/residential-proxy-decision-logging/"&gt;residential proxy decision logging&lt;/a&gt; sets out that operating record.&lt;/p&gt;
&lt;p&gt;A takedown can kill a service without retiring every address that passed through it. The surviving IPs tell us that the market has shared, changing inventory. To say who supplied it, whether a device owner consented, or why a request was sent, we have to follow the rest of the chain.&lt;/p&gt;
&lt;p&gt;For the destination, the work continues with the request. The final article in this series explains why &lt;a href="/blog/proxy-takedown-is-not-security-control/"&gt;a proxy takedown is not a security control&lt;/a&gt; and what security and fraud teams should rebaseline after a disruption.&lt;/p&gt;</content><category term="Residential Proxies"></category><category term="Residential Proxies"></category><category term="Threat Intelligence"></category><category term="Fraud Prevention"></category><category term="Supply Chain"></category><category term="Bot Management"></category><category term="Security Research"></category></entry><entry><title>IPIDEA and NetNut: What Two Residential Proxy Takedowns Actually Changed</title><link href="https://www.peakhour.io/blog/ipidea-netnut-proxy-takedowns/" rel="alternate"></link><published>2026-08-03T08:00:00+10:00</published><updated>2026-08-03T10:30:00+10:00</updated><author><name>AC</name></author><id>tag:www.peakhour.io,2026-08-03:/blog/ipidea-netnut-proxy-takedowns/</id><summary type="html">&lt;p&gt;Google's 2026 actions against IPIDEA and NetNut disrupted control infrastructure, applications and commercial supply. They did not make residential traffic safe by default.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Two large residential proxy networks were disrupted within six months. In late January, Google announced action against IPIDEA. In July, Google, the FBI, Lumen and other partners acted against NetNut, also known as Popa.&lt;/p&gt;
&lt;p&gt;Both operations interfered with infrastructure that connected home devices to paying proxy customers. Both prompted Android protections and intelligence sharing. Both were expected to affect providers beyond the name on the announcement.&lt;/p&gt;
&lt;p&gt;They were not identical operations, and neither removed residential proxy risk from a login page, checkout, advertising campaign or API.&lt;/p&gt;
&lt;p&gt;For security and fraud teams, the useful question is narrower than whether a network was “taken down”. Which parts stopped working, which sources of supply became harder to use, and what still reaches the application?&lt;/p&gt;
&lt;h2&gt;The Actions Hit Different Parts of the System&lt;/h2&gt;
&lt;p&gt;The &lt;a href="https://cloud.google.com/blog/topics/threat-intelligence/disrupting-largest-residential-proxy-network"&gt;IPIDEA action announced in January&lt;/a&gt; combined several controls.&lt;/p&gt;
&lt;p&gt;Google said it used legal action to take down domains used to control devices and proxy traffic, as well as domains used to market proxy products and software development kits. Google Play Protect was configured to warn users, remove known applications containing IPIDEA SDKs and block future installation attempts on certified Android devices. Google also shared technical intelligence with platform providers, law enforcement and researchers. Cloudflare disrupted domain resolution.&lt;/p&gt;
&lt;p&gt;The &lt;a href="https://cloud.google.com/blog/topics/threat-intelligence/google-continued-disruption-residential-proxy-networks"&gt;July action against NetNut&lt;/a&gt; had a different public description. Google disabled Google accounts and associated services that it said NetNut used for command and control. It shared intelligence about SDKs and backend infrastructure, while Play Protect warned users and disabled known applications containing NetNut SDKs. Separately, Alarum Technologies, NetNut's parent company, &lt;a href="https://www.sec.gov/Archives/edgar/data/1725332/000121390026075170/ea029706002ex99-2.htm"&gt;confirmed in an SEC filing&lt;/a&gt; that the FBI had seized domains associated with NetNut and that additional domains were later seized.&lt;/p&gt;
&lt;p&gt;That distinction matters. A domain seizure, a disabled cloud account and removal of an application are not interchangeable:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;C2 and domain disruption&lt;/strong&gt; can stop enrolled devices finding instructions or carrying proxy traffic through known control paths.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Account and service suspension&lt;/strong&gt; removes infrastructure hosted on a provider's platform.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Play Protect enforcement&lt;/strong&gt; reduces active Android supply and makes the same known applications harder to reinstall.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Intelligence sharing&lt;/strong&gt; lets other platforms and network operators identify related software and infrastructure.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Each action raises operating cost. None proves that every endpoint, reseller account or replacement control path has disappeared.&lt;/p&gt;
&lt;h2&gt;IPIDEA Exposed a Shared Supply Chain&lt;/h2&gt;
&lt;p&gt;Google's IPIDEA investigation described more than 600 Android applications across multiple download sources, 3,075 Windows file hashes that contacted its first-tier domains, and a changing pool of roughly 7,400 second-tier servers. Google also connected several proxy, VPN and SDK brands to common operators and infrastructure.&lt;/p&gt;
&lt;p&gt;The company said the disruption reduced the available device pool by millions. It also observed more than 550 tracked threat groups using addresses identified as IPIDEA exits during one seven-day period in January 2026. The reported activity included password spraying and access to victim SaaS and on-premises environments.&lt;/p&gt;
&lt;p&gt;The overlap is more useful to buyers than the largest headline number. Different product names and SDK labels fed common infrastructure, while reseller and partnership arrangements created overlap between exit pools. A buyer choosing a second brand could still be purchasing access to the same upstream capacity.&lt;/p&gt;
&lt;p&gt;That structure is covered in more detail in &lt;a href="/blog/bandwidth-sharing-residential-proxy-supply-chain/"&gt;How Bandwidth Sharing Feeds Residential Proxy Networks&lt;/a&gt;. The point for this comparison is that IPIDEA's disruption reached beyond one storefront because control, distribution and supply were shared.&lt;/p&gt;
&lt;h2&gt;NetNut Showed the Commercial Effect More Clearly&lt;/h2&gt;
&lt;p&gt;Google estimated that the NetNut network contained at least two million devices. During one week in June, it observed 316 distinct threat clusters using suspected NetNut exits, including cybercrime and espionage groups. Google also said NetNut ran a substantial white-label reseller programme and assessed with high confidence that a number of popular proxy brands were reselling the network.&lt;/p&gt;
&lt;p&gt;Those figures should not be placed in a league table against IPIDEA's. “Devices removed” is not the same measure as an estimated network size. “Tracked threat groups” and “distinct threat clusters” may not use the same counting method. The observations came from different weeks and networks. They establish material scale and misuse, not a defensible ranking.&lt;/p&gt;
&lt;p&gt;The stronger comparison is operational. Google later reported that some networks affected by the IPIDEA action appeared resilient: operators whose own supply degraded bought capacity from competitors and became resellers. Its NetNut action was designed with that adaptation in mind.&lt;/p&gt;
&lt;p&gt;Alarum's disclosures show that the July action did affect the business. On 3 July, the company said the seized domains were disrupting part of its services and could have a material adverse effect if the disruption continued. It subsequently &lt;a href="https://www.sec.gov/Archives/edgar/data/1725332/000121390026075170/ea029706002ex99-3.htm"&gt;announced a temporary pause&lt;/a&gt; of traffic through relevant network services. In its &lt;a href="https://www.sec.gov/Archives/edgar/data/1725332/000121390026077383/ea029779901ex99-1.htm"&gt;13 July update&lt;/a&gt;, Alarum said the events had materially affected its business and operations, that an external forensic review was continuing, and that an efficiency plan was expected to affect roughly one-third of its workforce. It was still evaluating how to restore service.&lt;/p&gt;
&lt;p&gt;That is evidence of business and service disruption. It is not evidence that every NetNut-related device was cleaned, every reseller lost access, or all residential capacity sold under other names stopped.&lt;/p&gt;
&lt;h2&gt;Accountability Requires Keeping the Claims Separate&lt;/h2&gt;
&lt;p&gt;This market has competing accounts of the same infrastructure.&lt;/p&gt;
&lt;p&gt;In its March 2026 &lt;a href="https://www.sec.gov/Archives/edgar/data/1725332/000121390026031556/ea0281588-20f_alarum.htm"&gt;annual report&lt;/a&gt;, Alarum described its network as serving business uses including public web-data collection, price comparison, advertising verification and cybersecurity. It said its experience allowed customers to collect data ethically and effectively. These are the provider's descriptions of its products and intended uses.&lt;/p&gt;
&lt;p&gt;Google reported different findings from its threat intelligence and technical investigation. It linked NetNut SDK components to home devices and larger botnets, reported suspected exits used by cybercrime and espionage clusters, and said many brands white-labelled NetNut capacity. For IPIDEA, it reported applications with unclear disclosure, common infrastructure behind several brands, and extensive use by tracked threat groups.&lt;/p&gt;
&lt;p&gt;Alarum's official response did not address or endorse Google's technical characterisation, and it did not publish a competing completed investigation. It acknowledged the domain seizures and disruption, said it was investigating whether third parties had misused its services or network, promised cooperation with law enforcement and later said its external review had reached no final conclusions.&lt;/p&gt;
&lt;p&gt;The evidence therefore supports several restrained conclusions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Google identified infrastructure and software it attributed to the two proxy networks and observed serious misuse of their exits.&lt;/li&gt;
&lt;li&gt;Google reported significant degradation and reduced device availability; Alarum's disclosures independently confirm disruption to NetNut's operations.&lt;/li&gt;
&lt;li&gt;Reseller and white-label relationships make a retail provider name weak evidence of independent supply.&lt;/li&gt;
&lt;li&gt;Public reporting does not establish that every customer used the services unlawfully, that every enrolled device joined without consent, or that corporate management directed every observed act.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For procurement and accountability teams, that last boundary is not a reason to ignore the findings. It is a reason to ask better questions. A provider should be able to identify its upstream networks, explain how each endpoint was enrolled, show how consent can be withdrawn, disclose white-label dependencies, describe customer controls, and produce evidence when those claims are challenged.&lt;/p&gt;
&lt;p&gt;“Ethically sourced” is not useful due diligence unless the buyer can test what it means.&lt;/p&gt;
&lt;h2&gt;The Destination Risk Continued&lt;/h2&gt;
&lt;p&gt;A takedown acts upstream. The protected application sits downstream.&lt;/p&gt;
&lt;p&gt;When an SDK is removed or a control domain is seized, some devices leave a pool and some routes fail. That reduces available supply and may interrupt active campaigns. It does not reverse requests already made, clean every non-Android device, reveal every replacement domain, or prevent an operator buying another provider's exits.&lt;/p&gt;
&lt;p&gt;The destination still receives requests from consumer and small-business IP addresses. Some belong to customers. Some are shared through carrier-grade NAT. Some are privacy services. Some are residential proxy exits that have not yet appeared in a feed. The application cannot infer who controls a request from the address alone.&lt;/p&gt;
&lt;p&gt;This is especially important when the household owner may also be a victim. &lt;a href="/blog/application-defence-compromised-home-devices/"&gt;When Home Devices Become Attack Infrastructure&lt;/a&gt; explains why application teams should preserve evidence without attributing the request to the subscriber.&lt;/p&gt;
&lt;h2&gt;What Buyers Can Now Demand&lt;/h2&gt;
&lt;p&gt;The two operations give procurement, security and fraud buyers better questions to put to a proxy supplier.&lt;/p&gt;
&lt;p&gt;Ask the vendor to identify the retail provider, upstream source, reseller relationship, endpoint-enrolment method and removal process. Contract for notification when an upstream source changes. A new brand or ASN is not proof of a new supply chain.&lt;/p&gt;
&lt;p&gt;Ask which proportion of delivered sessions can be traced to direct, auditable sourcing. Require the assurance to cover upstream and white-label capacity, not only a proprietary pool. Check whether withdrawal removes an exit from every downstream reseller and how the provider proves that happened.&lt;/p&gt;
&lt;p&gt;Ask what the provider knew and when. A policy page states an intention. Session-level supplier, software, consent and removal records provide evidence that can be tested.&lt;/p&gt;
&lt;p&gt;The takedowns removed real infrastructure and imposed real costs. They also demonstrated why disruption is a continuing process rather than a permanent state. Shared supply can move and resellers can change upstream providers.&lt;/p&gt;
&lt;p&gt;The operational response belongs in the final article in this series, &lt;a href="/blog/proxy-takedown-is-not-security-control/"&gt;A Proxy Takedown Is Not a Security Control&lt;/a&gt;. It covers the live detection, route policy and outcome measures a destination service should rebaseline after enforcement.&lt;/p&gt;
&lt;p&gt;The next article in this series, &lt;a href="/blog/when-proxy-network-dies-ips-survive/"&gt;When a Proxy Network Dies but Its IPs Survive&lt;/a&gt;, examines what post-takedown address overlap can prove and where the inference stops.&lt;/p&gt;</content><category term="Residential Proxies"></category><category term="Residential Proxies"></category><category term="Bot Management"></category><category term="Fraud Prevention"></category><category term="Threat Detection"></category><category term="Account Protection"></category><category term="Supply Chain Security"></category></entry><entry><title>When Home Devices Become Attack Infrastructure</title><link href="https://www.peakhour.io/blog/application-defence-compromised-home-devices/" rel="alternate"></link><published>2026-08-01T12:30:00+10:00</published><updated>2026-08-03T10:30:00+10:00</updated><author><name>AC</name></author><id>tag:www.peakhour.io,2026-08-01:/blog/application-defence-compromised-home-devices/</id><summary type="html">&lt;p&gt;Application teams cannot clean compromised televisions, routers, or household devices. They can stop treating the residential address as proof and control what the relayed request is allowed to do.&lt;/p&gt;</summary><content type="html">&lt;p&gt;A compromised streaming box under a customer's television is not an endpoint your application team can patch.&lt;/p&gt;
&lt;p&gt;It can still send traffic to your login page.&lt;/p&gt;
&lt;p&gt;Residential proxy and botnet supply increasingly includes ordinary connected devices: streaming boxes, routers, phones, PCs, projectors, and other hardware that stays online behind a consumer connection. Some owners knowingly share bandwidth. Some accept a vague disclosure inside an app. Others never consent because the device or software was compromised.&lt;/p&gt;
&lt;p&gt;The sourcing problem matters to platforms, app stores, vendors, ISPs, and law enforcement. The destination service has a more immediate job. It must decide what the request is allowed to do.&lt;/p&gt;
&lt;h2&gt;The Exit Looks Like a Customer Network&lt;/h2&gt;
&lt;p&gt;When third-party traffic leaves through a household device, the destination sees the household's public IP. The address may belong to a well-known Australian ISP. It may have no negative reputation. It may also be shared with legitimate activity from the same home or carrier network.&lt;/p&gt;
&lt;p&gt;This is why an IP allow-list, deny-list, or country rule cannot establish who controls the request. The source is real. The relationship between that source and the operator is hidden.&lt;/p&gt;
&lt;p&gt;Our earlier article, &lt;a href="/blog/bandwidth-sharing-residential-proxy-supply-chain/"&gt;How Bandwidth Sharing Feeds Residential Proxy Networks&lt;/a&gt;, explains the supply chain. The defensive consequence is that trust has to move up from the address to the request, session, route, and behaviour.&lt;/p&gt;
&lt;h2&gt;Quiet Monetisation Changes the Compromise&lt;/h2&gt;
&lt;p&gt;In 2025, Palo Alto Networks Unit 42 documented attackers exploiting vulnerable GeoServer instances and deploying a legitimate passive-income application and SDK. The code matched the vendor's official version; the installation and use were unauthorised. Unit 42's &lt;a href="https://unit42.paloaltonetworks.com/attackers-sell-your-bandwidth-using-sdks/"&gt;proxyware campaign report&lt;/a&gt; explains why legitimate binaries can still be part of a compromise.&lt;/p&gt;
&lt;p&gt;That payload can be quieter than ransomware or cryptomining. It produces recurring value without making the device's failure obvious. For a destination application, quieter supply means a proxy exit can remain useful for longer.&lt;/p&gt;
&lt;p&gt;The FBI's 2025 &lt;a href="https://www.fbi.gov/investigate/cyber/alerts/2025/home-internet-connected-devices-facilitate-criminal-activity"&gt;BADBOX 2.0 alert&lt;/a&gt; described Android-based streaming devices, projectors, tablets, digital picture frames, and aftermarket vehicle systems affected before purchase or during setup. The FBI said compromised devices could become part of residential proxy services and botnets used for criminal activity.&lt;/p&gt;
&lt;p&gt;These reports do not mean every inexpensive smart device is compromised. They show why household provenance is not a security verdict.&lt;/p&gt;
&lt;h2&gt;What the Application Can Observe&lt;/h2&gt;
&lt;p&gt;The destination cannot inspect the television or router. It can observe the work attempted through it:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;route and operation;&lt;/li&gt;
&lt;li&gt;authentication and account state;&lt;/li&gt;
&lt;li&gt;residential proxy and broader IP context;&lt;/li&gt;
&lt;li&gt;TLS, HTTP, and browser fingerprint cohorts;&lt;/li&gt;
&lt;li&gt;device and session history where available;&lt;/li&gt;
&lt;li&gt;request timing and sequence;&lt;/li&gt;
&lt;li&gt;credential exposure;&lt;/li&gt;
&lt;li&gt;failures, retries, and response-code loops;&lt;/li&gt;
&lt;li&gt;application and origin cost.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Several devices may also share the public address. A permanent household ban can punish the subscriber whose device was compromised. Correlate the behaviour using keys that fit the route.&lt;/p&gt;
&lt;h2&gt;Control the Sensitive Journey&lt;/h2&gt;
&lt;p&gt;The action should follow what the request can change or consume.&lt;/p&gt;
&lt;p&gt;For public cached content, proxy use may need no intervention. For login, count failures across account and client cohorts rather than relying on the exit. For password reset, keep responses consistent and limit repeated recovery attempts. For checkout or account changes, carry the earlier session risk forward and request stronger verification when the consequence rises. For expensive APIs, use identity- and cost-aware budgets.&lt;/p&gt;
&lt;p&gt;&lt;a href="/products/residential-proxy-detection/"&gt;Peakhour Residential Proxy Detection&lt;/a&gt; contributes a live network signal for browser and API traffic. Bot Management combines it with the route, client and behaviour already visible in the request path. The objective is not to identify the appliance. It is to stop relayed traffic from inheriting unconditional trust from the household address.&lt;/p&gt;
&lt;h2&gt;Platform Enforcement Reduces Supply, Not Every Request&lt;/h2&gt;
&lt;p&gt;Since &lt;a href="https://support.google.com/googleplay/android-developer/announcements/13412212?hl=en"&gt;August 2019&lt;/a&gt;, Google Play has required an app facilitating proxy services to third parties to make proxying its primary, user-facing core purpose. The current &lt;a href="https://support.google.com/googleplay/android-developer/answer/16559646?hl=en"&gt;Device and Network Abuse policy&lt;/a&gt; retains that rule. It gives Google a basis for removing unrelated apps that hide proxy functionality, regardless of whether an SDK vendor describes enrolment as consensual.&lt;/p&gt;
&lt;p&gt;That policy can reduce deceptive supply. Device takedowns and legal action can disrupt infrastructure. Google's &lt;a href="https://cloud.google.com/blog/topics/threat-intelligence/disrupting-largest-residential-proxy-network"&gt;IPIDEA operation&lt;/a&gt; combined legal action, platform enforcement, and industry coordination.&lt;/p&gt;
&lt;p&gt;Application controls are still required. Existing exits do not disappear at once, private pools remain, and new supply can emerge before datasets identify it.&lt;/p&gt;
&lt;p&gt;The 2026 actions against IPIDEA and NetNut show both sides of that boundary. Our &lt;a href="/blog/ipidea-netnut-proxy-takedowns/"&gt;takedown comparison&lt;/a&gt; covers the upstream disruption; the follow-up on &lt;a href="/blog/when-proxy-network-dies-ips-survive/"&gt;surviving proxy IP inventory&lt;/a&gt; explains why an address seen after a takedown does not, by itself, identify the device or supplier behind it.&lt;/p&gt;
&lt;h2&gt;Preserve Evidence Without Blaming the Customer&lt;/h2&gt;
&lt;p&gt;When an event is challenged or blocked, record the route, proxy and network evidence, client cohort, account or token context, policy revision, selected action, and outcome. Avoid language that says the household owner attacked the service. The evidence usually supports a narrower statement: traffic reached the application through this connection and matched this behaviour.&lt;/p&gt;
&lt;p&gt;That distinction matters for support, fraud review, and incident response. The subscriber may be a victim too.&lt;/p&gt;
&lt;p&gt;Application teams cannot repair every compromised box on the internet. They can refuse to let a residential address stand in for identity, intent, or permission.&lt;/p&gt;</content><category term="Security"></category><category term="Residential Proxies"></category><category term="IoT Security"></category><category term="Bot Management"></category><category term="Application Security"></category><category term="Threat Detection"></category></entry><entry><title>Residential Proxies Turn Layer 7 DDoS Into a Route Problem</title><link href="https://www.peakhour.io/blog/residential-proxies-layer-7-ddos/" rel="alternate"></link><published>2026-08-01T12:20:00+10:00</published><updated>2026-08-01T12:20:00+10:00</updated><author><name>AC</name></author><id>tag:www.peakhour.io,2026-08-01:/blog/residential-proxies-layer-7-ddos/</id><summary type="html">&lt;p&gt;A distributed pool can keep each residential IP quiet while expensive application routes fail. Mitigation has to follow request cost and behaviour, not only traffic volume.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Not every Layer 7 DDoS attack looks large at the edge.&lt;/p&gt;
&lt;p&gt;A residential proxy pool can spread requests across thousands of consumer addresses. Each exit sends a modest amount of traffic. Per-IP limits stay quiet. Aggregate bandwidth may look manageable. The application still falls over because the requests concentrate on work that is expensive to perform.&lt;/p&gt;
&lt;p&gt;Search, login, checkout, GraphQL, report generation, uncached rendering, and API aggregation can fail long before the network link is full. Residential distribution turns the incident into a route and resource problem.&lt;/p&gt;
&lt;h2&gt;Count the Work, Not Just the Requests&lt;/h2&gt;
&lt;p&gt;Two HTTP requests can have radically different cost.&lt;/p&gt;
&lt;p&gt;A cached image may be served at the edge with no origin work. A search request may query several indexes. A login can invoke password hashing, credential checks, session state, and downstream identity services. A GraphQL operation can expand into many resolvers. An export can hold database and worker capacity for seconds or minutes.&lt;/p&gt;
&lt;p&gt;Cloudflare's explanation of &lt;a href="https://www.cloudflare.com/learning/ddos/application-layer-ddos-attack/"&gt;application-layer DDoS attacks&lt;/a&gt; describes the core distinction: Layer 7 attacks target the application work involved in processing apparently legitimate requests.&lt;/p&gt;
&lt;p&gt;Map the routes before an incident:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;which requests are cacheable;&lt;/li&gt;
&lt;li&gt;which invoke database, search, identity, payment, or third-party dependencies;&lt;/li&gt;
&lt;li&gt;which hold workers, connections, queues, or memory;&lt;/li&gt;
&lt;li&gt;which can be assigned a cost class;&lt;/li&gt;
&lt;li&gt;which business journeys must remain available under pressure.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Requests per second is still useful. It is not the complete capacity model.&lt;/p&gt;
&lt;h2&gt;IP Limits See the Distribution, Not the Campaign&lt;/h2&gt;
&lt;p&gt;A per-IP limit catches simple floods and protects against one noisy client. Keep it as one layer.&lt;/p&gt;
&lt;p&gt;Residential proxies are designed to distribute source addresses. A campaign can remain below an IP threshold while one fingerprint cohort, route sequence, query shape, account pattern, or operation class grows rapidly across the fleet.&lt;/p&gt;
&lt;p&gt;Useful aggregate keys include:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;route + fingerprint cohort
operation + query cost class
login route + account + failed outcome
tenant + API credential + expensive operation
route + proxy state + response outcome
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;No key is universally safe. A common browser or mobile SDK can create a large legitimate cohort. Observe bucket sizes and successful outcomes before using a grouping key for enforcement.&lt;/p&gt;
&lt;h2&gt;Proxy Detection Changes Confidence&lt;/h2&gt;
&lt;p&gt;A residential proxy result does not prove DDoS. It changes how the request is interpreted when other evidence agrees.&lt;/p&gt;
&lt;p&gt;For example:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;a new residential exit fetching one cached page adds little risk;&lt;/li&gt;
&lt;li&gt;many exits sharing a narrow client cohort and repeatedly missing cache on an expensive route add more;&lt;/li&gt;
&lt;li&gt;the same pattern causing queue growth, timeouts, and origin errors supports immediate mitigation.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Google's &lt;a href="https://cloud.google.com/blog/topics/threat-intelligence/disrupting-largest-residential-proxy-network"&gt;IPIDEA investigation&lt;/a&gt; showed how large and commercially interconnected a residential exit pool can become. Application defenders should assume source diversity is purchasable.&lt;/p&gt;
&lt;p&gt;&lt;a href="/products/ddos-protection/"&gt;Peakhour DDoS Protection&lt;/a&gt; combines anomaly detection, route-aware rate limits, bot and WAAP context, cache policy, and origin protection in one request path. RESIP contributes a signal; the action comes from the route, behaviour, and current service pressure.&lt;/p&gt;
&lt;h2&gt;Preserve a Clean Path&lt;/h2&gt;
&lt;p&gt;Emergency mitigation often fails by protecting the server from everyone.&lt;/p&gt;
&lt;p&gt;Decide in advance which journeys need to survive:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;existing authenticated sessions;&lt;/li&gt;
&lt;li&gt;account recovery;&lt;/li&gt;
&lt;li&gt;checkout or payment confirmation;&lt;/li&gt;
&lt;li&gt;status and support information;&lt;/li&gt;
&lt;li&gt;partner or operational APIs;&lt;/li&gt;
&lt;li&gt;cacheable public content.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Controls can then narrow around the attacked resource. Serve cacheable responses at the edge. Reduce budgets for costly anonymous operations. Apply stricter limits to repeated failures. Challenge interactive browsers where there is a recovery path. Preserve authenticated or known-good traffic when the evidence supports it.&lt;/p&gt;
&lt;p&gt;Challenges do not solve every flood. Browser automation can complete them, and challenge generation can itself consume capacity. Machine-to-machine APIs need protocol-appropriate responses. &lt;a href="https://www.rfc-editor.org/rfc/rfc6585.html#section-4"&gt;RFC 6585&lt;/a&gt; defines HTTP &lt;code&gt;429 Too Many Requests&lt;/code&gt; and the optional &lt;code&gt;Retry-After&lt;/code&gt; header, but clients and operators still need to prevent retries from amplifying pressure.&lt;/p&gt;
&lt;h2&gt;Watch the Origin Outcome&lt;/h2&gt;
&lt;p&gt;Mitigation evidence should connect the request to what happened behind it:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;cache hit or miss;&lt;/li&gt;
&lt;li&gt;origin request avoided;&lt;/li&gt;
&lt;li&gt;application latency and response status;&lt;/li&gt;
&lt;li&gt;queue, worker, connection, and dependency pressure;&lt;/li&gt;
&lt;li&gt;rate-limit, challenge, or block action;&lt;/li&gt;
&lt;li&gt;successful user journey completion;&lt;/li&gt;
&lt;li&gt;policy revision and activation time.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A rising block count only describes the control. Protection is visible when essential routes remain available, origin pressure falls, and legitimate completion stays within an acceptable range.&lt;/p&gt;
&lt;h2&gt;Rehearse the Policy Before the Flood&lt;/h2&gt;
&lt;p&gt;During an incident, teams reach for the keys they already have. If every counter is bound to source IP, residential distribution will force a broad emergency rule.&lt;/p&gt;
&lt;p&gt;Choose one expensive route now. Measure normal cost and cohort sizes. Add observation counters for route, identity, fingerprint, proxy state, and outcome. Define the threshold that indicates resource pressure, the first reversible action, the owner, and the rollback condition.&lt;/p&gt;
&lt;p&gt;For the first rehearsal, one expensive route is enough. If the team can describe its normal cost, see distributed pressure, apply a bounded action, and preserve legitimate completion, it has a mitigation pattern worth extending. An address ban on its own does not provide that pattern.&lt;/p&gt;</content><category term="Security"></category><category term="DDoS"></category><category term="Residential Proxies"></category><category term="Rate Limiting"></category><category term="Bot Management"></category><category term="Origin Protection"></category></entry><entry><title>Five Routes, Five Residential Proxy Decisions</title><link href="https://www.peakhour.io/blog/route-specific-residential-proxy-controls/" rel="alternate"></link><published>2026-08-01T12:10:00+10:00</published><updated>2026-08-01T12:10:00+10:00</updated><author><name>AC</name></author><id>tag:www.peakhour.io,2026-08-01:/blog/route-specific-residential-proxy-controls/</id><summary type="html">&lt;p&gt;Account creation, login, password reset, checkout, and public APIs should not share one residential-proxy action. Each route needs its own evidence and failure policy.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Account creation and password reset may sit under the same &lt;code&gt;/account/&lt;/code&gt; prefix. They are not the same security decision. One creates a new identity; the other can transfer control of an existing one.&lt;/p&gt;
&lt;p&gt;The same problem appears when a team applies one residential-proxy action across login, checkout, and public APIs. Low-risk traffic is rejected, shared networks create support cases, and the attacker moves to an unlabelled exit or another route.&lt;/p&gt;
&lt;p&gt;Policy has to begin with what each request can do. These five routes have different identities, costs, recovery paths, and abuse patterns, so the proxy result changes each one differently.&lt;/p&gt;
&lt;h2&gt;1. Account Creation&lt;/h2&gt;
&lt;p&gt;Signup abuse creates fake accounts for promotion fraud, spam, inventory reservation, scraping, or later account farming. A residential proxy helps the operator distribute registrations and make geography look ordinary.&lt;/p&gt;
&lt;p&gt;Useful evidence includes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;registrations across a shared device or fingerprint cohort;&lt;/li&gt;
&lt;li&gt;repeated email, phone, payment, referral, or promotion patterns;&lt;/li&gt;
&lt;li&gt;verification completion and time to complete;&lt;/li&gt;
&lt;li&gt;route sequence before and after signup;&lt;/li&gt;
&lt;li&gt;residential proxy and network context;&lt;/li&gt;
&lt;li&gt;account creation velocity across IPs and client cohorts.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A first-seen proxy result may only justify logging. Proxy use combined with repeated device evidence and failed verification can justify a shared limit or stronger verification. Preserve legitimate households and mobile networks by avoiding one-account-per-IP assumptions.&lt;/p&gt;
&lt;h2&gt;2. Login&lt;/h2&gt;
&lt;p&gt;Login protection has to handle password mistakes, credential stuffing, password spraying, and targeted account takeover without turning the attack into an account lockout service.&lt;/p&gt;
&lt;p&gt;The &lt;a href="https://cheatsheetseries.owasp.org/cheatsheets/Credential_Stuffing_Prevention_Cheat_Sheet.html"&gt;OWASP Credential Stuffing Prevention Cheat Sheet&lt;/a&gt; recommends layered controls including MFA, breached-password checks, connection and device fingerprinting, and defence in depth.&lt;/p&gt;
&lt;p&gt;For a residential proxy login, look at:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;exposed credential state;&lt;/li&gt;
&lt;li&gt;failures against this account across all IPs;&lt;/li&gt;
&lt;li&gt;accounts attempted by this client cohort;&lt;/li&gt;
&lt;li&gt;familiar device and session history;&lt;/li&gt;
&lt;li&gt;normal or abnormal route sequence;&lt;/li&gt;
&lt;li&gt;success, failure, MFA, and challenge outcomes.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;One failure from a new address is weak evidence. Distributed failures across many accounts with a shared cohort are stronger. Rate limit the behaviour, not merely the exit.&lt;/p&gt;
&lt;h2&gt;3. Password Reset&lt;/h2&gt;
&lt;p&gt;Password reset is both a recovery mechanism and a route to account control. It also leaks information if response behaviour reveals whether an account exists.&lt;/p&gt;
&lt;p&gt;OWASP's &lt;a href="https://cheatsheetseries.owasp.org/cheatsheets/Forgot_Password_Cheat_Sheet.html"&gt;Forgot Password Cheat Sheet&lt;/a&gt; recommends consistent messages and response timing, side-channel delivery, rate limiting, and protection against excessive reset requests.&lt;/p&gt;
&lt;p&gt;Residential proxy use should raise attention when it appears with account enumeration, repeated reset initiation, token guessing, or a new client followed by recovery-factor changes.&lt;/p&gt;
&lt;p&gt;The action may be a tighter account-and-cohort limit, delayed processing, step-up verification, or a user notification. A broad IP block can stop legitimate recovery for every person sharing the exit.&lt;/p&gt;
&lt;h2&gt;4. Checkout and Stored Value&lt;/h2&gt;
&lt;p&gt;Checkout risk is not limited to card testing. Automated clients can reserve scarce inventory, abuse promotions, drain loyalty balances, test stored payment instruments, or change shipping details after account takeover.&lt;/p&gt;
&lt;p&gt;Connect the network signal to the transaction:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;established account and device history;&lt;/li&gt;
&lt;li&gt;payment, address, basket, and promotion changes;&lt;/li&gt;
&lt;li&gt;velocity across accounts and instruments;&lt;/li&gt;
&lt;li&gt;prior login or recovery risk in the same session;&lt;/li&gt;
&lt;li&gt;repeated declines and response patterns;&lt;/li&gt;
&lt;li&gt;inventory or application cost created by the request.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A proxy signal on a normal repeat purchase may add little. The same signal after a breached-credential login and recovery-email change should carry more weight. Step-up verification or a bounded transaction hold can be safer than a network-wide deny.&lt;/p&gt;
&lt;h2&gt;5. Public and Partner APIs&lt;/h2&gt;
&lt;p&gt;APIs often lack browser JavaScript and interactive challenge support. They may also expose expensive search, export, GraphQL, or object-access operations.&lt;/p&gt;
&lt;p&gt;Use the identities the API already has: tenant, token, API key, client certificate, object, operation, and schema outcome. Add network and fingerprint cohorts where they help group rotation.&lt;/p&gt;
&lt;p&gt;The &lt;a href="https://owasp.org/API-Security/editions/2023/en/0x11-t10/"&gt;OWASP API Security Top 10&lt;/a&gt; calls out unrestricted resource consumption and unrestricted access to sensitive business flows. Residential proxy rotation can distribute both. Route-aware limits should account for operation cost rather than applying one requests-per-minute value to the whole API.&lt;/p&gt;
&lt;p&gt;Machine clients cannot complete a browser challenge. A predictable &lt;code&gt;429&lt;/code&gt;, reduced operation budget, token step-up, or deny response may be the correct protocol action.&lt;/p&gt;
&lt;h2&gt;One Signal, Five Policies&lt;/h2&gt;
&lt;p&gt;&lt;a href="/products/residential-proxy-detection/"&gt;Peakhour Residential Proxy Detection&lt;/a&gt; feeds proxy evidence into the request decision with IP, credentials, device, behaviour, and route context. &lt;a href="/products/advanced-rate-limiting/"&gt;Advanced Rate Limiting&lt;/a&gt; can count using route, ASN, country, IP, TLS fingerprint, response code, and other request attributes.&lt;/p&gt;
&lt;p&gt;That allows each route to have its own contract:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Route&lt;/th&gt;
&lt;th&gt;Primary concern&lt;/th&gt;
&lt;th&gt;Useful action&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Account creation&lt;/td&gt;
&lt;td&gt;Scaled fake accounts&lt;/td&gt;
&lt;td&gt;Verify and limit across client cohorts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Login&lt;/td&gt;
&lt;td&gt;Credential reuse and spraying&lt;/td&gt;
&lt;td&gt;Count failures across account and cohort&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Password reset&lt;/td&gt;
&lt;td&gt;Enumeration and account recovery abuse&lt;/td&gt;
&lt;td&gt;Consistent responses, account limits, step-up&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Checkout&lt;/td&gt;
&lt;td&gt;Fraud and stored-value loss&lt;/td&gt;
&lt;td&gt;Transaction-aware verification or hold&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;API&lt;/td&gt;
&lt;td&gt;Resource and business-flow abuse&lt;/td&gt;
&lt;td&gt;Identity- and cost-aware limits&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Run new policies in monitor mode first. Record proxy prevalence, actions, successful completion, false positives, challenge outcomes, and origin cost. Move to enforcement by route, with an owner and rollback condition.&lt;/p&gt;
&lt;p&gt;The implementation work is to give each route an explicit contract, then verify that its action protects the journey it was written for. A shared proxy result can feed all five contracts without forcing all five routes into the same response.&lt;/p&gt;</content><category term="Account Protection"></category><category term="Residential Proxies"></category><category term="Account Protection"></category><category term="API Security"></category><category term="Rate Limiting"></category><category term="Bot Management"></category></entry><entry><title>Privacy Relay, Corporate VPN, or Residential Proxy?</title><link href="https://www.peakhour.io/blog/privacy-relay-vpn-residential-proxy-policy/" rel="alternate"></link><published>2026-08-01T12:00:00+10:00</published><updated>2026-08-03T10:30:00+10:00</updated><author><name>AC</name></author><id>tag:www.peakhour.io,2026-08-01:/blog/privacy-relay-vpn-residential-proxy-policy/</id><summary type="html">&lt;p&gt;An anonymised connection is not automatically abusive. Security policy should distinguish expected privacy and corporate access from proxy use that appears beside risky behaviour.&lt;/p&gt;</summary><content type="html">&lt;p&gt;An application sees a login from an address that does not match the user's apparent location. The connection belongs to a relay, VPN, or proxy network.&lt;/p&gt;
&lt;p&gt;That is a reason to look closer. It is not a reason to call the user malicious.&lt;/p&gt;
&lt;p&gt;Privacy relays, corporate VPNs, consumer VPNs, carrier-grade NAT, and residential proxies all weaken the old assumption that an IP address describes one person in one place. They do it for different reasons and with different operating models. A security policy that reduces them to &lt;code&gt;anonymous=true&lt;/code&gt; will either miss abuse or punish legitimate users.&lt;/p&gt;
&lt;h2&gt;Privacy Services Deliberately Separate Identity from Destination&lt;/h2&gt;
&lt;p&gt;Apple says iCloud Private Relay uses separate internet relays so no single party can see both who a user is and which sites they visit. It also lets the user preserve a general location or use a broader country-and-time-zone location. Apple's &lt;a href="https://support.apple.com/en-us/102602"&gt;Private Relay overview&lt;/a&gt; explains the scope and the role of the relay addresses.&lt;/p&gt;
&lt;p&gt;That design changes what a website can infer from the source IP. It does not remove the session, account, route, browser, or request behaviour available to the application.&lt;/p&gt;
&lt;p&gt;A corporate VPN creates a different pattern. Many employees may exit through a small set of company gateways. The source can be stable and organisation-owned, but the address still represents a population rather than one device. A consumer VPN may rotate gateways and mix unrelated subscribers. Carrier-grade NAT can make a normal mobile or broadband address shared even when no privacy product is involved; &lt;a href="https://www.rfc-editor.org/rfc/rfc6598"&gt;RFC 6598&lt;/a&gt; documents shared address space reserved for carrier deployments.&lt;/p&gt;
&lt;p&gt;Residential proxy services are different again. A remote operator deliberately routes through consumer or ISP connectivity so the destination sees the household exit. Mobile proxy services use the same broad model through carrier connectivity, but should remain separately labelled because their sharing and attribution conditions differ. Either form of supply may come from an informed participant, an embedded SDK, compromised software or another path.&lt;/p&gt;
&lt;p&gt;The network categories matter. They still do not establish intent.&lt;/p&gt;
&lt;h2&gt;Define the Expected Population&lt;/h2&gt;
&lt;p&gt;Policy should reflect the application and route.&lt;/p&gt;
&lt;p&gt;A workforce portal may know its corporate VPN ranges and require device or certificate evidence. A consumer service should expect mobile networks, privacy relays, travel, and shared households. A country-restricted service may need stronger location verification than an online catalogue. An API used by fixed partners can enforce network expectations that would be unreasonable on a public login page.&lt;/p&gt;
&lt;p&gt;Ask:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Is this network type expected for this user population?&lt;/li&gt;
&lt;li&gt;Is the route public, authenticated, sensitive, or expensive?&lt;/li&gt;
&lt;li&gt;Does the account have established device and session history?&lt;/li&gt;
&lt;li&gt;Is the apparent location material to the transaction?&lt;/li&gt;
&lt;li&gt;Can the client provide another form of evidence?&lt;/li&gt;
&lt;li&gt;What does a false rejection cost?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The answer determines whether the network signal should be ignored, logged, challenged, or combined with stronger controls.&lt;/p&gt;
&lt;h2&gt;Use Context to Separate Risk from Privacy&lt;/h2&gt;
&lt;p&gt;&lt;a href="/products/ip-intelligence/"&gt;Peakhour IP Intelligence&lt;/a&gt; and &lt;a href="/products/residential-proxy-detection/"&gt;Residential Proxy Detection&lt;/a&gt; place network context beside credentials, device history, fingerprints, behaviour, route, and recent events.&lt;/p&gt;
&lt;p&gt;Consider two logins through privacy infrastructure.&lt;/p&gt;
&lt;p&gt;The first uses an established session, familiar device history, a normal route sequence, and one successful authentication. The second attempts many accounts, carries an exposed credential, has no normal session history, and repeats the same failure pattern across rotating addresses.&lt;/p&gt;
&lt;p&gt;Both hide or replace the direct source address. Only one presents a strong account-abuse pattern.&lt;/p&gt;
&lt;p&gt;The policy should be able to express that difference. Blocking every relay or VPN is not contextual security. It is a network-category ban.&lt;/p&gt;
&lt;h2&gt;Geography Needs the Same Restraint&lt;/h2&gt;
&lt;p&gt;IP geolocation is an estimate of network presence, not proof of a person's physical location. VPN gateways, relays, mobile routing, satellite networks, corporate egress, and proxy exits can all separate the address from the user.&lt;/p&gt;
&lt;p&gt;Use geography as evidence proportionate to the decision. A content preference may tolerate a coarse estimate. A regulated transaction may require account evidence, verified identity, payment context, or an explicit location control beyond an IP lookup.&lt;/p&gt;
&lt;p&gt;Avoid impossible-travel rules that treat every IP change as physical movement. A session can switch between mobile, Wi-Fi, VPN, and relay paths without the person travelling at all. Look for continuity in the account, device, session, and behaviour before escalating.&lt;/p&gt;
&lt;h2&gt;Choose an Action That Can Be Recovered From&lt;/h2&gt;
&lt;p&gt;The action can then scale with the evidence:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Allow expected privacy or corporate access with consistent session evidence.&lt;/li&gt;
&lt;li&gt;Log an unfamiliar network category on low-consequence routes.&lt;/li&gt;
&lt;li&gt;Apply tighter rate limits when repeated behaviour spans accounts or rotating exits.&lt;/li&gt;
&lt;li&gt;Challenge an interactive client when network change appears beside account risk.&lt;/li&gt;
&lt;li&gt;Require step-up verification for recovery, payment, or access-control changes.&lt;/li&gt;
&lt;li&gt;Block confirmed automated abuse with bounded route and policy scope.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Challenges are not perfect humanity tests. Automation can complete them, while privacy tools, accessibility software, or broken browser environments can cause legitimate failures. Measure completion and provide a recovery path.&lt;/p&gt;
&lt;h2&gt;Retain the Reason&lt;/h2&gt;
&lt;p&gt;When a policy acts, retain the network category, source, route, contributing evidence, action, and outcome. “Anonymous IP” is too vague for support or incident review.&lt;/p&gt;
&lt;p&gt;The record should show whether the deciding factor was proxy use, an exposed credential, failure velocity, a new device, a route sequence, or several observations agreeing. That evidence lets the team tune the control without adding broad exceptions that erase protection.&lt;/p&gt;
&lt;p&gt;Privacy and security are not opposing verdicts attached to an address. They are requirements the application has to handle at the same time.&lt;/p&gt;</content><category term="Security"></category><category term="Privacy"></category><category term="Residential Proxies"></category><category term="VPN"></category><category term="IP Intelligence"></category><category term="False Positives"></category></entry><entry><title>What a Residential Proxy Decision Log Should Contain</title><link href="https://www.peakhour.io/blog/residential-proxy-decision-logging/" rel="alternate"></link><published>2026-08-01T11:50:00+10:00</published><updated>2026-08-01T11:50:00+10:00</updated><author><name>AC</name></author><id>tag:www.peakhour.io,2026-08-01:/blog/residential-proxy-decision-logging/</id><summary type="html">&lt;p&gt;A useful proxy event records the request, signal provenance, policy, action, and outcome. A timestamp and a risk score are not enough to explain an enforcement decision.&lt;/p&gt;</summary><content type="html">&lt;p&gt;A log line that says &lt;code&gt;proxy=true&lt;/code&gt; is intelligence. It is not a decision record.&lt;/p&gt;
&lt;p&gt;When a customer asks why a login was challenged, a fraud analyst reviews an account event, or an engineer tunes a rate limit, the team needs to reconstruct what the control knew and what it did. A timestamp, IP address, and final risk score cannot answer that on their own.&lt;/p&gt;
&lt;p&gt;&lt;a href="/products/residential-proxy-detection/"&gt;Peakhour Residential Proxy Detection&lt;/a&gt; keeps the proxy result inside the request decision with IP, credential, device, behaviour, and route context. The record should preserve that connection without becoming an indiscriminate collection of personal data.&lt;/p&gt;
&lt;h2&gt;Record the Request Being Judged&lt;/h2&gt;
&lt;p&gt;The event comes first. The detector explains one part of it.&lt;/p&gt;
&lt;p&gt;Useful request fields include:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;observed_at
request_id and trace_id
service, host and route class
HTTP method
response status
account, tenant, session or API-key reference where permitted
edge location and origin target
cache outcome and whether origin was reached
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Avoid logging secrets, complete session tokens, passwords, payment data, or unrestricted request bodies. The &lt;a href="https://cheatsheetseries.owasp.org/cheatsheets/Logging_Cheat_Sheet.html"&gt;OWASP Logging Cheat Sheet&lt;/a&gt; recommends excluding or masking access tokens, authentication passwords, sensitive personal data, and other values whose collection creates more risk than operational value.&lt;/p&gt;
&lt;p&gt;Use stable references where the investigation needs continuity, and keep their purpose and retention bounded.&lt;/p&gt;
&lt;h2&gt;Keep Signal Provenance&lt;/h2&gt;
&lt;p&gt;The value of a signal depends on how it was produced.&lt;/p&gt;
&lt;p&gt;For proxy and network evidence, retain:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;proxy_result and category
detector or feed name
detector version or dataset time
network type, ASN and country
client IP source and trusted forwarding hop
fingerprint method, version and capture point
browser or device evidence source
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;A fingerprint without a method and capture point cannot be compared safely. A country value without a source and observation time is difficult to audit after data changes. A forwarded IP taken from an untrusted header should never have reached policy in the first place.&lt;/p&gt;
&lt;p&gt;Flattening every input into one number leaves the analyst with a threshold and no explanation. Retain the factors that moved the score.&lt;/p&gt;
&lt;h2&gt;Record the Policy and the Action&lt;/h2&gt;
&lt;p&gt;The event should identify the control that made the decision:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;policy_id and revision
policy owner
mode: monitor or enforce
matched conditions
threshold and current counter state
selected action
action reason code
expiry or review date
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Reason codes should be stable enough to aggregate. Free-text analyst notes can add context, but they should not be the only explanation.&lt;/p&gt;
&lt;p&gt;The action field needs more detail than &lt;code&gt;blocked=true&lt;/code&gt;. Distinguish allow, log, challenge, rate limit, deny, route, and step-up outcomes. For a limit, keep the key class and interval without exposing sensitive raw values. For a challenge, record whether it was presented, completed, failed, expired, or abandoned.&lt;/p&gt;
&lt;h2&gt;Connect the Decision to Its Outcome&lt;/h2&gt;
&lt;p&gt;Security controls are judged by what happened next.&lt;/p&gt;
&lt;p&gt;Join the decision to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;successful login, signup, reset, checkout, or API completion;&lt;/li&gt;
&lt;li&gt;authentication failure and account lockout;&lt;/li&gt;
&lt;li&gt;challenge completion and abandonment;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;429&lt;/code&gt;, deny, or step-up response;&lt;/li&gt;
&lt;li&gt;origin request avoided or origin work created;&lt;/li&gt;
&lt;li&gt;support case, analyst disposition, or confirmed incident where available;&lt;/li&gt;
&lt;li&gt;policy rollback or exception.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is how a team distinguishes attack reduction from customer suppression. If challenges rise and successful account recovery falls, the proxy policy may be adding friction in the wrong place.&lt;/p&gt;
&lt;p&gt;NIST SP 800-92, the &lt;a href="https://csrc.nist.gov/pubs/sp/800/92/final"&gt;Guide to Computer Security Log Management&lt;/a&gt;, treats log management as a lifecycle of generating, transmitting, storing, analysing, and disposing of data. That lifecycle matters here. A detailed event that nobody can query, retain safely, or delete on schedule is not operational evidence.&lt;/p&gt;
&lt;h2&gt;Metrics Should Lead to a Decision&lt;/h2&gt;
&lt;p&gt;For an enforcement platform, useful measures should connect signals to route outcomes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;proxy prevalence by route and action;&lt;/li&gt;
&lt;li&gt;percentage of proxy-labelled traffic allowed, challenged, limited, and blocked;&lt;/li&gt;
&lt;li&gt;challenge completion for proxy and non-proxy cohorts;&lt;/li&gt;
&lt;li&gt;legitimate transaction completion after action;&lt;/li&gt;
&lt;li&gt;confirmed abuse caught with and without a proxy signal;&lt;/li&gt;
&lt;li&gt;false-positive and analyst-overturn rates;&lt;/li&gt;
&lt;li&gt;origin requests and application cost avoided;&lt;/li&gt;
&lt;li&gt;time from observation to policy change;&lt;/li&gt;
&lt;li&gt;rules past their review date.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A count of “risky sessions detected” is hard to act on. A rise in residential-proxy password-reset attempts with low challenge completion and repeated account failures can justify a route-specific change.&lt;/p&gt;
&lt;h2&gt;A Minimal Event&lt;/h2&gt;
&lt;p&gt;A compact decision record might resemble:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;request_id&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;req_...&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;route_class&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;account_recovery&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;proxy&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;result&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;category&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;residential&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;source&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;resip&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;fingerprint&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;method&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;ja4&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;version&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;pinned&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;capture&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;client_edge&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;credential_state&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;exposed_match&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;recent_outcome&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;repeated_failure&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;policy&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;id&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;recovery-risk&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;revision&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;mode&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;enforce&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;action&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;step_up&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;reason_codes&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;residential_proxy&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;exposed_credential&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;failure_velocity&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;outcome&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;pending&amp;quot;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The exact schema will differ by application. The contract should not: current request, signal provenance, policy revision, selected action, and measurable outcome.&lt;/p&gt;
&lt;p&gt;The schema is ready when a support engineer can explain a challenge, an analyst can reconstruct an account event, and the policy owner can measure the result without opening a second system. Anything collected beyond that needs a stated security purpose and retention period.&lt;/p&gt;</content><category term="Security"></category><category term="Residential Proxies"></category><category term="Security Logging"></category><category term="SIEM"></category><category term="Bot Management"></category><category term="Incident Response"></category></entry><entry><title>Keep Your CDN. Add Proxy and Bot Decisions at the Edge.</title><link href="https://www.peakhour.io/blog/proxy-bot-decisions-existing-cdn/" rel="alternate"></link><published>2026-08-01T11:40:00+10:00</published><updated>2026-08-01T11:40:00+10:00</updated><author><name>AC</name></author><id>tag:www.peakhour.io,2026-08-01:/blog/proxy-bot-decisions-existing-cdn/</id><summary type="html">&lt;p&gt;Replacing a CDN is not the only way to improve bot and proxy controls. The harder requirement is preserving trusted client context, enforceable policy, and decision evidence across the request path.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Security projects often begin with a false choice: replace the current CDN or accept the controls it already provides.&lt;/p&gt;
&lt;p&gt;Real environments are messier. A business may have a long-term CDN contract, cloud-specific routing, established cache rules, a migration freeze, or applications that cannot all move together. The security problem still exists. Residential proxy traffic, credential stuffing, scraping, API abuse, and Layer 7 floods do not wait for a platform consolidation programme.&lt;/p&gt;
&lt;p&gt;&lt;a href="/solutions/bring-your-own-edge/"&gt;Peakhour Bring Your Own Edge&lt;/a&gt; supports two first-class paths: Peakhour Edge can be the delivery layer, or Peakhour intelligence can operate alongside the edge provider already in place. The product value is not the diagram. It is retaining one decision model for request context, policy, action, and evidence in either deployment.&lt;/p&gt;
&lt;h2&gt;Decide Where the Authoritative Observation Happens&lt;/h2&gt;
&lt;p&gt;An application behind a CDN sees a connection from the CDN, not necessarily the original client-facing connection. That affects IP provenance, TLS fingerprints, geography, and rate counters.&lt;/p&gt;
&lt;p&gt;Before adding another control, map the path:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;client → existing edge → Peakhour decision point → origin
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;or:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;client → Peakhour Edge → origin
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;For every field used by policy, record where it was observed and who is allowed to set it. Client-supplied copies of forwarding or fingerprint headers must be removed at the trusted boundary. The authoritative edge can then set the value passed downstream.&lt;/p&gt;
&lt;p&gt;This is not bookkeeping. A rate limit built on a spoofable forwarded address is a client-controlled rate limit. A TLS fingerprint calculated at origin may describe the intermediary rather than the browser. Provenance determines whether the signal can safely change an action.&lt;/p&gt;
&lt;h2&gt;Keep Policy Close to the Consequence&lt;/h2&gt;
&lt;p&gt;A decision point earns its place only if it can still protect the route. It needs to prevent avoidable origin work, slow repeated behaviour, challenge an interactive browser, block a confirmed attack, or preserve a clean path during a flood.&lt;/p&gt;
&lt;p&gt;Peakhour combines IP intelligence, residential proxy detection, fingerprints, credentials, route behaviour, bot state, rate thresholds, and WAAP findings in that request path. The action can be allow, log, challenge, rate limit, or block. The existing CDN can remain responsible for the delivery work it already does well.&lt;/p&gt;
&lt;p&gt;This matters because enrichment without enforcement creates a timing and ownership gap. A lookup result delivered after the application has rendered a page, queried a database, or changed account state may still help an investigation. It did not protect that request.&lt;/p&gt;
&lt;p&gt;Network intelligence is useful on account creation, login, and password-reset routes when the signal remains connected to the request. Peakhour carries that context through to route-specific action and retains the outcome.&lt;/p&gt;
&lt;h2&gt;Migrate a Decision, Not the Whole Estate&lt;/h2&gt;
&lt;p&gt;A staged deployment can begin with one abused route:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Observe the request at the trusted boundary.&lt;/li&gt;
&lt;li&gt;Forward or derive the fields required by the policy.&lt;/li&gt;
&lt;li&gt;Run the new decision in monitor mode.&lt;/li&gt;
&lt;li&gt;Compare it with current CDN and origin outcomes.&lt;/li&gt;
&lt;li&gt;Apply one reversible action.&lt;/li&gt;
&lt;li&gt;Expand only after false positives and operational ownership are understood.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Login, account creation, search, scraping targets, and expensive API operations are good candidates because their behaviour is measurable and their business consequence is clear.&lt;/p&gt;
&lt;p&gt;Duplicating every rule in two systems is not a migration strategy. Decide which layer owns each action, how conflicts are resolved, and which record is authoritative. A request should not be challenged twice because two providers reached the same conclusion independently.&lt;/p&gt;
&lt;h2&gt;Preserve Cache and Origin Context&lt;/h2&gt;
&lt;p&gt;Bot and proxy decisions affect more than authentication. Scrapers and Layer 7 floods consume cache, transformation, application, and origin capacity.&lt;/p&gt;
&lt;p&gt;A useful decision record can include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;cache status and whether the request reached origin;&lt;/li&gt;
&lt;li&gt;route and request cost class;&lt;/li&gt;
&lt;li&gt;proxy, IP, fingerprint, credential, and bot evidence;&lt;/li&gt;
&lt;li&gt;rate-limit state and selected action;&lt;/li&gt;
&lt;li&gt;response status and origin health;&lt;/li&gt;
&lt;li&gt;policy revision and enforcement point.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That joined record shows whether a control actually protected capacity. Blocking more requests is not inherently better. Serving clean cache hits while throttling expensive automated misses may produce a stronger outcome than a broad deny rule.&lt;/p&gt;
&lt;h2&gt;Make the Trust Boundary Explainable&lt;/h2&gt;
&lt;p&gt;NIST's &lt;a href="https://csrc.nist.gov/pubs/sp/800/207/final"&gt;Zero Trust Architecture&lt;/a&gt; frames access around explicit resource decisions rather than implicit trust in network location. The same discipline helps at an application edge: evaluate the request from current evidence, enforce a resource-specific policy, and retain enough information to explain the decision.&lt;/p&gt;
&lt;p&gt;An existing CDN is not an obstacle to that model. An undefined trust boundary is.&lt;/p&gt;
&lt;p&gt;Use the delivery reality you have. Identify the client-facing observation point, choose the routes where better context can change an outcome, and assign policy ownership. Move delivery layers when the operational case supports it—not because a security feature forced an all-or-nothing migration.&lt;/p&gt;</content><category term="Security"></category><category term="Edge Security"></category><category term="CDN"></category><category term="Bot Management"></category><category term="Residential Proxies"></category><category term="Bring Your Own Edge"></category></entry><entry><title>Credential Stuffing Through “Clean” Residential IPs</title><link href="https://www.peakhour.io/blog/credential-stuffing-clean-residential-ips/" rel="alternate"></link><published>2026-08-01T11:30:00+10:00</published><updated>2026-08-01T11:30:00+10:00</updated><author><name>AC</name></author><id>tag:www.peakhour.io,2026-08-01:/blog/credential-stuffing-clean-residential-ips/</id><summary type="html">&lt;p&gt;A residential IP with no bad reputation can still carry a credential-stuffing attempt. Defend the login workflow by joining credential, route, client, and outcome evidence.&lt;/p&gt;</summary><content type="html">&lt;p&gt;The login came from an Australian consumer ISP. The address had no bad reputation and submitted one password. Viewed alone, the request barely deserved a second look.&lt;/p&gt;
&lt;p&gt;Across the account population, the same client pattern was trying credentials against one user after another while the source addresses changed. Residential proxy networks make that distribution cheap: each exit stays below a simple threshold, the geography looks plausible, and the campaign moves before an address develops a history.&lt;/p&gt;
&lt;p&gt;That is what the operator is buying when an exit is sold as “clean”: borrowed trust from the network and the people who normally use it. The application has to find continuity somewhere other than the address.&lt;/p&gt;
&lt;h2&gt;The Credential Is Only the Start&lt;/h2&gt;
&lt;p&gt;The &lt;a href="https://cheatsheetseries.owasp.org/cheatsheets/Credential_Stuffing_Prevention_Cheat_Sheet.html"&gt;OWASP Credential Stuffing Prevention Cheat Sheet&lt;/a&gt; recommends layered defences because no single control reliably separates every legitimate login from automated reuse. MFA, breached-password checks, device and connection signals, rate limits, and user notifications address different parts of the problem.&lt;/p&gt;
&lt;p&gt;At the edge, the request already carries several useful facts:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;the login route and response outcome;&lt;/li&gt;
&lt;li&gt;the account or username being attempted;&lt;/li&gt;
&lt;li&gt;whether the credential is known to be exposed;&lt;/li&gt;
&lt;li&gt;residential proxy and broader IP context;&lt;/li&gt;
&lt;li&gt;network and browser fingerprint cohorts;&lt;/li&gt;
&lt;li&gt;device and session history where available;&lt;/li&gt;
&lt;li&gt;recent attempts against this account and from this client pattern;&lt;/li&gt;
&lt;li&gt;what the client does before and after the login request.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="/products/breached-credentials/"&gt;Peakhour Breached Credential Scanning&lt;/a&gt; scores credential exposure beside proxy use, IP reputation, device history, behaviour, and login context. A breached match is not an automatic conviction. People reuse exposed passwords without knowing it. The match becomes urgent when it appears inside an active attack pattern.&lt;/p&gt;
&lt;h2&gt;Count Across More Than the Address&lt;/h2&gt;
&lt;p&gt;An IP-only login limit still protects against crude repetition. It sees one slice of the campaign.&lt;/p&gt;
&lt;p&gt;Credential stuffing needs counters that see both sides of the distribution:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;per account:     failed logins across all network sources
per cohort:      failed logins across rotating IPs
per credential:  exposed match plus repeated failure or success
per campaign:    shared route, timing and client shape across accounts
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;These counters answer different questions. A per-account limit protects one user even when every attempt comes from a new address. A fingerprint-cohort limit exposes a tool working through many accounts. A breached-credential match raises the cost of accepting an otherwise ordinary-looking login.&lt;/p&gt;
&lt;p&gt;Avoid permanent lockouts based only on attack traffic. They can be turned into a denial-of-service mechanism against known users. Throttling, temporary holds, step-up verification, and user alerts usually offer safer recovery paths.&lt;/p&gt;
&lt;h2&gt;Watch the Whole Account Journey&lt;/h2&gt;
&lt;p&gt;Stopping at the login form creates a blind spot. A successful credential-stuffing attempt may move immediately to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;token issue and refresh;&lt;/li&gt;
&lt;li&gt;email or phone change;&lt;/li&gt;
&lt;li&gt;password reset and MFA recovery;&lt;/li&gt;
&lt;li&gt;stored payment, wallet, loyalty, or gift-card access;&lt;/li&gt;
&lt;li&gt;address changes and checkout;&lt;/li&gt;
&lt;li&gt;creation of new API credentials or trusted devices.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Our article &lt;a href="/blog/credential-stuffing-after-the-login/"&gt;Credential Stuffing Does Not Stop at the Login Form&lt;/a&gt; covers those post-authentication routes. The important operational point is continuity: the same risk evidence should remain available when the session reaches a high-consequence action.&lt;/p&gt;
&lt;p&gt;A login accepted after a breached-credential match and residential proxy signal may still be allowed, but the session should not become fully trusted merely because the password worked. A recovery-email change or stored-value transfer can require stronger evidence.&lt;/p&gt;
&lt;h2&gt;“Clean” Is a Property of the Dataset&lt;/h2&gt;
&lt;p&gt;Security teams often say an IP is clean when it is absent from known abuse and proxy lists. That is a statement about current knowledge, not the connection's owner or purpose.&lt;/p&gt;
&lt;p&gt;Google's 2026 &lt;a href="https://cloud.google.com/blog/topics/threat-intelligence/disrupting-largest-residential-proxy-network"&gt;IPIDEA disruption report&lt;/a&gt; described millions of devices being removed from an available proxy pool and many tracked threat groups using the exits. Google also found multiple SDK brands and reseller relationships connected to shared infrastructure.&lt;/p&gt;
&lt;p&gt;The lesson is not that every unlabelled residential address is hostile. It is that a negative lookup cannot carry the decision. Freshness, private supply, reseller overlap, and device churn create a period in which the request arrives before the label.&lt;/p&gt;
&lt;p&gt;Peakhour's &lt;a href="/products/residential-proxy-detection/"&gt;Residential Proxy Detection&lt;/a&gt; evaluates the live request and places the result inside the wider account decision. Browser evidence can add context, while login APIs still receive network, credential, route, rate, and outcome controls without depending on JavaScript.&lt;/p&gt;
&lt;h2&gt;Apply Friction Where the Consequence Changes&lt;/h2&gt;
&lt;p&gt;For login and account routes, policy might respond like this:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Allow a familiar session with no adverse credential or behaviour evidence.&lt;/li&gt;
&lt;li&gt;Log a residential proxy result on a low-risk or first-seen login.&lt;/li&gt;
&lt;li&gt;Rate limit distributed failures across the account and client cohort.&lt;/li&gt;
&lt;li&gt;Challenge when proxy use, an exposed credential, and unusual device or route behaviour agree.&lt;/li&gt;
&lt;li&gt;Require step-up verification for recovery, payment, or account-control changes.&lt;/li&gt;
&lt;li&gt;Block a confirmed automated campaign with bounded route and policy scope.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Measure successful login and recovery completion beside attack reduction. A control that suppresses failures by preventing real customers from signing in is not a successful account-protection policy.&lt;/p&gt;
&lt;p&gt;Treat “clean” as a statement about the dataset at that moment. Make the account decision from the credential, client, route, and recent outcomes that arrived with the address.&lt;/p&gt;</content><category term="Account Protection"></category><category term="Credential Stuffing"></category><category term="Residential Proxies"></category><category term="Breached Credentials"></category><category term="Account Protection"></category><category term="Bot Management"></category></entry><entry><title>The IP Changed. Did the Actor?</title><link href="https://www.peakhour.io/blog/correlate-actors-across-rotating-ips/" rel="alternate"></link><published>2026-08-01T11:20:00+10:00</published><updated>2026-08-01T11:20:00+10:00</updated><author><name>AC</name></author><id>tag:www.peakhour.io,2026-08-01:/blog/correlate-actors-across-rotating-ips/</id><summary type="html">&lt;p&gt;Residential proxy rotation defeats IP-only counters. The answer is not a new identity claim, but a carefully chosen set of cohort, account, route, and outcome keys.&lt;/p&gt;</summary><content type="html">&lt;p&gt;An attacker can change an IP address faster than most teams can change a rule.&lt;/p&gt;
&lt;p&gt;Residential proxy services make that rotation routine. A client can send one request through a household connection in Sydney, the next through a mobile network in Melbourne, and another through an address that has never appeared in a reputation feed. An IP-only counter sees three quiet sources. The application may still be dealing with one operator and one campaign.&lt;/p&gt;
&lt;p&gt;The tempting response is to find a replacement identifier. There is no universal one.&lt;/p&gt;
&lt;p&gt;Network fingerprints, browser attributes, cookies, accounts, API keys, timing, and route sequences can all help correlate requests. Each can also be shared, copied, cleared, or changed. The practical goal is not to prove a person. It is to keep enough continuity to control a specific behaviour.&lt;/p&gt;
&lt;h2&gt;Ask What Stayed the Same&lt;/h2&gt;
&lt;p&gt;When addresses rotate, look for continuity in the work being attempted:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;the same account or set of accounts;&lt;/li&gt;
&lt;li&gt;a repeated username or credential corpus;&lt;/li&gt;
&lt;li&gt;one API token, tenant, or application identifier;&lt;/li&gt;
&lt;li&gt;a stable TLS or HTTP fingerprint cohort;&lt;/li&gt;
&lt;li&gt;the same route sequence and parameter shape;&lt;/li&gt;
&lt;li&gt;similar timing, retries, and failure outcomes;&lt;/li&gt;
&lt;li&gt;a narrow set of ASNs, countries, or network categories;&lt;/li&gt;
&lt;li&gt;consistent application cost or object enumeration.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;One field may be weak. Several observations agreeing can support a bounded action.&lt;/p&gt;
&lt;p&gt;Google's &lt;a href="https://cloud.google.com/blog/topics/threat-intelligence/disrupting-largest-residential-proxy-network"&gt;IPIDEA investigation&lt;/a&gt; described shared residential proxy infrastructure supplied through multiple SDK brands and reseller arrangements. That is useful context for defenders: provider names and exit addresses can change while the commercial path behind them remains connected.&lt;/p&gt;
&lt;h2&gt;Fingerprints Group Clients; They Do Not Name Them&lt;/h2&gt;
&lt;p&gt;A TLS fingerprint can reveal that connections share a normalised handshake shape. It cannot establish that they came from the same person, device, or process.&lt;/p&gt;
&lt;p&gt;This distinction matters because popular browsers create large cohorts. Attack tools can also imitate common handshakes. Our article &lt;a href="/blog/fingerprint-is-a-cohort-not-a-client/"&gt;A Network Fingerprint Is a Cohort, Not a Client&lt;/a&gt; covers the boundary in detail.&lt;/p&gt;
&lt;p&gt;Use a versioned fingerprint as one grouping key:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;method + version + value + capture point
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Then join it to the route and outcome. A common fingerprint that submits one successful login is uninteresting. The same cohort trying passwords against thousands of accounts through rotating residential networks is operationally useful.&lt;/p&gt;
&lt;p&gt;Fingerprint provenance matters as much here as it does in API protection. At an origin behind a CDN, the visible connection may be the CDN hop. Only compare values captured at equivalent, trusted points.&lt;/p&gt;
&lt;h2&gt;Build Counters Around the Abuse&lt;/h2&gt;
&lt;p&gt;&lt;a href="/products/advanced-rate-limiting/"&gt;Peakhour Advanced Rate Limiting&lt;/a&gt; can use route, headers, ASN, country, IP, TLS fingerprint, response code, and bot state as concrete inputs. The right key depends on what needs protection.&lt;/p&gt;
&lt;p&gt;For credential stuffing:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;account + failed outcome
fingerprint cohort + login route + failed outcome
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;For scraping:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;fingerprint cohort + resource family
API credential + operation + cost class
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;For account creation:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;device cohort + signup route + verification outcome
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Use more than one counter when the abuse can move between dimensions. A per-account limit protects one user. A cohort-wide limit sees distribution across accounts. A per-IP limit still catches crude bursts. No single key has to solve the campaign.&lt;/p&gt;
&lt;p&gt;Avoid the opposite error: a key so broad that it turns a shared mobile SDK or current browser release into one actor. Before enforcement, inspect bucket sizes and successful outcomes. If one cohort contains a material part of normal traffic, it is an observation key, not a direct blocking key.&lt;/p&gt;
&lt;h2&gt;Route Sequence Can Carry Continuity&lt;/h2&gt;
&lt;p&gt;Automation often performs the same steps even when its network changes.&lt;/p&gt;
&lt;p&gt;A normal account session might load a page, obtain a token, submit one credential, establish a session, and continue to an expected destination. A distributed credential campaign may call the login endpoint directly, repeat a narrow header set, receive the same failure, change the account, and start again.&lt;/p&gt;
&lt;p&gt;The individual requests are small. The sequence exposes the job.&lt;/p&gt;
&lt;p&gt;Keep this evidence purpose-bound. A security control does not need to build a permanent profile of a person. It needs enough recent history to decide whether a sensitive route is being used as intended. Our &lt;a href="/blog/privacy-respecting-account-security-risk-signals/"&gt;Account Security Without Tracking People&lt;/a&gt; explains that privacy boundary.&lt;/p&gt;
&lt;h2&gt;Expect the Actor to Adapt&lt;/h2&gt;
&lt;p&gt;Once a counter begins to work, the traffic will change. The operator may randomise headers, switch browser versions, slow the cadence, distribute accounts across more cohorts, or move to another route.&lt;/p&gt;
&lt;p&gt;That does not make the original control a failure. It means the campaign has paid an adaptation cost. Keep the decision record so the next change is visible:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;policy revision and activation time;&lt;/li&gt;
&lt;li&gt;key dimensions and thresholds;&lt;/li&gt;
&lt;li&gt;allowed, limited, challenged, and blocked counts;&lt;/li&gt;
&lt;li&gt;successful business outcomes;&lt;/li&gt;
&lt;li&gt;origin and application cost;&lt;/li&gt;
&lt;li&gt;new cohorts and routes after enforcement.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Set an expiry or review date. Fingerprint populations and browser versions drift. Emergency rules should not survive their evidence by default.&lt;/p&gt;
&lt;h2&gt;Continuity Is a Working Hypothesis&lt;/h2&gt;
&lt;p&gt;The honest question is not “did we identify the actor?” It is “do these requests share enough evidence that one control should count them together?”&lt;/p&gt;
&lt;p&gt;That wording leaves room for uncertainty. It also produces a policy an operator can test.&lt;/p&gt;
&lt;p&gt;Start with one abused route. Compare IP-only counters with a small number of composite candidates. Observe bucket size, legitimate completion, failed outcomes, and origin cost. Apply a reversible action to the key that separates the behaviour without turning a common client cohort into collateral damage.&lt;/p&gt;
&lt;p&gt;The IP will change. A well-built control follows the work, not the address.&lt;/p&gt;</content><category term="Rate Limiting"></category><category term="Rate Limiting"></category><category term="Residential Proxies"></category><category term="Network Fingerprinting"></category><category term="Bot Management"></category><category term="API Security"></category></entry><entry><title>Residential Proxy Detection for APIs Without JavaScript</title><link href="https://www.peakhour.io/blog/residential-proxy-detection-apis-without-javascript/" rel="alternate"></link><published>2026-08-01T11:10:00+10:00</published><updated>2026-08-01T11:10:00+10:00</updated><author><name>AC</name></author><id>tag:www.peakhour.io,2026-08-01:/blog/residential-proxy-detection-apis-without-javascript/</id><summary type="html">&lt;p&gt;APIs cannot depend on browser JavaScript to expose proxy abuse. They need server-side network, protocol, identity, route, and outcome evidence in the request path.&lt;/p&gt;</summary><content type="html">&lt;p&gt;A mobile application posts directly to a login API. No page is rendered and no browser script runs. The route still needs to recognise residential proxy use and repeated automation before it accepts a credential or creates expensive origin work.&lt;/p&gt;
&lt;p&gt;The same constraint applies to partner integrations, backend services, command-line clients, and machine-to-machine workloads. A detection that begins only after a client-side collector runs leaves those routes with a thinner control.&lt;/p&gt;
&lt;p&gt;&lt;a href="/products/residential-proxy-detection/"&gt;Peakhour Residential Proxy Detection&lt;/a&gt; evaluates the request without making JavaScript a precondition. When a browser is present, browser and device evidence can strengthen the decision. When it is not, the control still has network, protocol, identity, route, rate, and outcome context to work with.&lt;/p&gt;
&lt;h2&gt;The Route Sets the Policy&lt;/h2&gt;
&lt;p&gt;An API is not one security surface. A public product query, a login mutation, a password-reset endpoint, a payment instruction, and an administrative export have different costs and different identities.&lt;/p&gt;
&lt;p&gt;The &lt;a href="https://owasp.org/API-Security/editions/2023/en/0x11-t10/"&gt;OWASP API Security Top 10&lt;/a&gt; separates risks such as broken object authorisation, unrestricted resource consumption, sensitive business flows, and inventory failures because the route's purpose matters. Proxy use does not remove that context. It makes route-aware controls more important.&lt;/p&gt;
&lt;p&gt;Before deciding how to use a proxy result, document:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;the operation and its business consequence;&lt;/li&gt;
&lt;li&gt;whether it is authenticated;&lt;/li&gt;
&lt;li&gt;the account, tenant, token, API key, or object identity available;&lt;/li&gt;
&lt;li&gt;expected request and response shapes;&lt;/li&gt;
&lt;li&gt;the application work created by one call;&lt;/li&gt;
&lt;li&gt;normal error and retry behaviour;&lt;/li&gt;
&lt;li&gt;whether the client is interactive or machine-to-machine.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A residential exit calling a public, cacheable endpoint may be ordinary. The same exit cycling through reset tokens or forcing expensive GraphQL operations deserves a different response.&lt;/p&gt;
&lt;h2&gt;What the Server Can Observe&lt;/h2&gt;
&lt;p&gt;Server-side proxy and automation decisions can use several evidence classes.&lt;/p&gt;
&lt;h3&gt;Network context&lt;/h3&gt;
&lt;p&gt;IP intelligence can describe the ASN, network type, geography, known proxy use, hosting status, and recent reputation. These fields are useful, but none proves the original operator's location or intent.&lt;/p&gt;
&lt;h3&gt;Protocol fingerprints&lt;/h3&gt;
&lt;p&gt;TLS and HTTP characteristics can group connections that use similar client stacks. JA4 publishes both canonical and raw representations; the &lt;a href="https://github.com/FoxIO-LLC/ja4/blob/main/technical_details/JA4.md"&gt;JA4 technical specification&lt;/a&gt; documents what is selected and normalised. Cisco Mercury's &lt;a href="https://github.com/cisco/mercury/blob/main/doc/npf.md"&gt;Network Protocol Fingerprint specification&lt;/a&gt; provides a structured, versioned representation of protocol observations.&lt;/p&gt;
&lt;p&gt;These are cohort keys, not identities. A common mobile SDK may place many legitimate clients in one cohort. An automation framework can copy a popular handshake. The value appears when the fingerprint is combined with the route, identity, outcomes, and recent behaviour.&lt;/p&gt;
&lt;h3&gt;API identity and state&lt;/h3&gt;
&lt;p&gt;An API often has stronger keys than an IP address: account, token, tenant, client certificate, API key, device registration, or object identifier. A limit can follow failed behaviour across rotating addresses when one of those keys remains stable.&lt;/p&gt;
&lt;h3&gt;Request behaviour&lt;/h3&gt;
&lt;p&gt;Useful patterns include invalid route order, enumeration across objects, repeated authentication failures, token refresh without normal session history, schema deviations, abnormal response-code loops, and requests that create unusual application cost.&lt;/p&gt;
&lt;h2&gt;Capture Point Matters&lt;/h2&gt;
&lt;p&gt;Network evidence is only meaningful when its provenance is known.&lt;/p&gt;
&lt;p&gt;If an application sits behind a CDN or reverse proxy, the TLS connection visible at origin may belong to that intermediary. A fingerprint calculated there may describe the CDN-to-origin hop, not the client. A forwarded header can carry the client-facing value, but only if the boundary strips untrusted copies, sets the authoritative field, and records the collector and version.&lt;/p&gt;
&lt;p&gt;Keep fields such as:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;capture:      client-facing edge
method:       ja4
version:      pinned implementation
value:        versioned fingerprint value
source:       trusted edge collector
observed_at:  timestamp
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Without that provenance, two equal hashes may describe different capture points. The policy cannot safely compare them.&lt;/p&gt;
&lt;h2&gt;Use Composite Limits&lt;/h2&gt;
&lt;p&gt;An IP-only limit is easy to distribute around. A single global fingerprint limit can be just as dangerous because it may group a large legitimate population.&lt;/p&gt;
&lt;p&gt;Build the key for the route:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;login: fingerprint + account + failed outcome
API:   fingerprint + tenant + operation
reset: account + route + proxy state
query: API credential + cost class
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Use only the fields that preserve the behaviour you are trying to count. Too few fields mix unrelated users. Too many divide the campaign into invisible buckets.&lt;/p&gt;
&lt;p&gt;When a limit is reached, return a predictable response. &lt;a href="https://www.rfc-editor.org/rfc/rfc6585.html#section-4"&gt;RFC 6585 defines HTTP 429&lt;/a&gt; for too many requests and permits a &lt;code&gt;Retry-After&lt;/code&gt; header. That does not solve abuse by itself, but it gives legitimate clients a protocol they can handle and gives operators a clear outcome to measure.&lt;/p&gt;
&lt;h2&gt;JavaScript Is Additional Evidence&lt;/h2&gt;
&lt;p&gt;A browser that runs JavaScript is not necessarily human. Automation can execute scripts, preserve cookies, complete challenges, and reproduce browser behaviour. Conversely, privacy tools, accessibility software, content blockers, and broken client environments can interfere with collection.&lt;/p&gt;
&lt;p&gt;Browser evidence can improve the request decision. Its presence is not proof of legitimacy, and its absence is not proof of abuse.&lt;/p&gt;
&lt;p&gt;For Peakhour, the core decision can run for direct API traffic. Optional browser signals add context on interactive routes. Both feed the same action model: allow, log, challenge where appropriate, rate limit, or block, with the reason retained.&lt;/p&gt;
&lt;h2&gt;Deploy One Route First&lt;/h2&gt;
&lt;p&gt;Choose one API route with a known abuse problem. Record proxy state, network category, fingerprint method and capture point, API identity, request outcome, response code, and application cost. Observe enough traffic to understand normal clients and shared cohorts.&lt;/p&gt;
&lt;p&gt;Then add one reversible policy. For example, rate limit failed logins across &lt;code&gt;account + fingerprint&lt;/code&gt; when residential proxy use and abnormal failure velocity occur together. Track successful logins, false positives, &lt;code&gt;429&lt;/code&gt; responses, origin load, and support cases before expanding it.&lt;/p&gt;
&lt;p&gt;This first policy should leave the team with a clear comparison: what the API saw before the new evidence, which requests received a different action, and whether legitimate completion or origin load changed. That result is more useful than trying to recreate a browser check around every API call.&lt;/p&gt;</content><category term="API Security"></category><category term="API Security"></category><category term="Residential Proxies"></category><category term="Network Fingerprinting"></category><category term="Rate Limiting"></category><category term="Bot Management"></category></entry><entry><title>A Proxy Flag Is Not a Security Policy</title><link href="https://www.peakhour.io/blog/proxy-flag-is-not-a-security-policy/" rel="alternate"></link><published>2026-08-01T11:00:00+10:00</published><updated>2026-08-01T11:00:00+10:00</updated><author><name>AC</name></author><id>tag:www.peakhour.io,2026-08-01:/blog/proxy-flag-is-not-a-security-policy/</id><summary type="html">&lt;p&gt;Residential proxy detection is useful evidence. The security decision still has to account for the route, credentials, client history, behaviour, and cost of getting the action wrong.&lt;/p&gt;</summary><content type="html">&lt;p&gt;At Peakhour, a residential proxy match changes how much trust we place in a request. It never selects the action on its own.&lt;/p&gt;
&lt;p&gt;The match tells us that the network presenting the traffic may not be where the operator is sitting. Whether that matters depends on what the request is trying to do, what else is known about the client, and the cost of getting the action wrong. Treating a proxy label as policy collapses those questions into one bit. The rule becomes easy to configure and hard to operate.&lt;/p&gt;
&lt;p&gt;&lt;a href="/products/residential-proxy-detection/"&gt;Residential proxy detection&lt;/a&gt; therefore sits inside the live request decision beside IP reputation, credentials, device history, network fingerprints, behaviour, route sensitivity, and recent outcomes. It changes the level of evidence we require.&lt;/p&gt;
&lt;h2&gt;The Same Signal Means Different Things on Different Routes&lt;/h2&gt;
&lt;p&gt;Consider three requests from the same residential proxy exit:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A visitor opens a cached product page.&lt;/li&gt;
&lt;li&gt;A client tries one password against 200 accounts.&lt;/li&gt;
&lt;li&gt;An authenticated user changes the recovery email on a high-value account.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The network fact is identical. The consequences are not.&lt;/p&gt;
&lt;p&gt;The first request may need no action beyond logging. The second has a pattern consistent with credential stuffing and needs a shared limit or block. The third may justify step-up verification because the action can transfer control of an account. A site-wide proxy deny rule misses those distinctions.&lt;/p&gt;
&lt;p&gt;This is also why a global risk score can be frustrating in production. A score can help rank events, but the operator still needs to know what raised it and which action is proportionate. Peakhour's concern is where that context meets enforcement: on the request path, before origin work and account state changes occur.&lt;/p&gt;
&lt;h2&gt;Residential Does Not Mean One Person&lt;/h2&gt;
&lt;p&gt;Public IP addresses are weak identity keys even when no proxy is involved. Carrier-grade NAT allows many subscribers to share address space; &lt;a href="https://www.rfc-editor.org/rfc/rfc6598"&gt;RFC 6598&lt;/a&gt; reserves a shared range specifically for that purpose. Households, offices, mobile networks, privacy services, and public Wi-Fi also put unrelated users behind common addresses.&lt;/p&gt;
&lt;p&gt;A residential proxy complicates the picture further. The address belongs to a real consumer network, but the request may have originated elsewhere. A clean reputation may mean the exit is new. A poor reputation may reflect one abusive user while ordinary subscribers share the same public address.&lt;/p&gt;
&lt;p&gt;This cuts both ways:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Absence from a proxy list is not proof that the request is direct.&lt;/li&gt;
&lt;li&gt;Presence on a proxy list is not proof that the request is malicious.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Google's 2026 disruption of the IPIDEA network showed the scale of the timing problem. Google identified hundreds of Android applications and thousands of Windows binaries connected with the proxy infrastructure, and observed many tracked threat groups using its exits. The investigation also found multiple SDK brands and reseller relationships feeding shared infrastructure. The details are in Google's &lt;a href="https://cloud.google.com/blog/topics/threat-intelligence/disrupting-largest-residential-proxy-network"&gt;IPIDEA disruption report&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;A provider label or yesterday's reputation cannot carry the whole decision.&lt;/p&gt;
&lt;h2&gt;Build the Decision from the Request Outward&lt;/h2&gt;
&lt;p&gt;A workable policy starts with the route.&lt;/p&gt;
&lt;p&gt;For each protected route, record:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;what the request can read, change, or spend;&lt;/li&gt;
&lt;li&gt;whether it creates expensive application or database work;&lt;/li&gt;
&lt;li&gt;which identity is available, such as account, session, API key, or none;&lt;/li&gt;
&lt;li&gt;whether an interactive challenge is possible;&lt;/li&gt;
&lt;li&gt;what a false block would cost the user and the business;&lt;/li&gt;
&lt;li&gt;which recent outcomes make repetition suspicious.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Then add the network and client evidence. A residential proxy result becomes more useful when it agrees with other observations: a breached credential, an unseen device, a fingerprint shared across rotating IPs, failed outcomes across many accounts, an invalid route sequence, or an abnormal request rate.&lt;/p&gt;
&lt;p&gt;The policy can then choose among real actions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Allow&lt;/strong&gt; when the route is low risk and the session is otherwise consistent.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Log&lt;/strong&gt; when the signal is new or the cost of intervention is higher than the current evidence supports.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Challenge&lt;/strong&gt; when the client can provide more evidence and there is a safe recovery path.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Rate limit&lt;/strong&gt; when repeated behaviour is the problem, especially across accounts, fingerprints, API credentials, or costly operations.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Block&lt;/strong&gt; when the evidence is strong, harm is current, and narrower controls cannot protect the route.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Peakhour evaluates that context in the request path. Browser signals can add evidence when a browser is present, while API traffic can still be assessed without requiring JavaScript. The selected action and its inputs remain part of the decision record rather than disappearing into a standalone lookup.&lt;/p&gt;
&lt;h2&gt;Scores Need Reasons and Actions Need Owners&lt;/h2&gt;
&lt;p&gt;A security team should be able to answer three questions after a request is challenged or blocked:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Which observations changed the decision?&lt;/li&gt;
&lt;li&gt;Which policy revision selected the action?&lt;/li&gt;
&lt;li&gt;Did the action protect the route without breaking legitimate completion?&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If the only retained field is &lt;code&gt;risk_score: 87&lt;/code&gt;, review becomes guesswork. Keep the useful components: route, proxy result, IP category, fingerprint provenance, account or token state, recent failures, threshold state, action, policy revision, and origin outcome.&lt;/p&gt;
&lt;p&gt;Every enforcement rule also needs an owner and an expiry condition. Proxy networks change. Client populations change. A rule created during an incident should not become permanent merely because nobody knows why it exists.&lt;/p&gt;
&lt;p&gt;Start in observation mode on one sensitive route. Measure ordinary variation, proxy prevalence, successful completion, challenge outcomes, and false positives. Move to enforcement when the evidence supports a specific action. Roll back when the customer cost exceeds the risk reduction.&lt;/p&gt;
&lt;p&gt;On a sensitive route, the proxy match may justify corroborating evidence or a reversible action. On a low-risk route, logging may be enough. In both cases, the team should be able to show which facts changed the decision and what happened afterwards. That is how proxy intelligence becomes an operable control rather than another label in a feed.&lt;/p&gt;</content><category term="Security"></category><category term="Residential Proxies"></category><category term="Bot Management"></category><category term="Account Protection"></category><category term="Risk Scoring"></category><category term="Edge Security"></category></entry><entry><title>How Bandwidth Sharing Feeds Residential Proxy Networks</title><link href="https://www.peakhour.io/blog/bandwidth-sharing-residential-proxy-supply-chain/" rel="alternate"></link><published>2026-08-01T10:00:00+10:00</published><updated>2026-08-03T10:30:00+10:00</updated><author><name>AC</name></author><id>tag:www.peakhour.io,2026-08-01:/blog/bandwidth-sharing-residential-proxy-supply-chain/</id><summary type="html">&lt;p&gt;Residential proxy capacity can come from bandwidth-sharing apps, monetisation SDKs, compromised servers, and pre-infected consumer devices. Here is why consent and a residential IP are not enough to establish trust.&lt;/p&gt;</summary><content type="html">&lt;p&gt;A request arrives at your login page from a normal Australian broadband connection. The IP belongs to a consumer ISP. The location is plausible. It is not on a data centre list or a public proxy feed.&lt;/p&gt;
&lt;p&gt;What the request does not tell you is who controls it.&lt;/p&gt;
&lt;p&gt;The connection may belong to a real customer. It may also be the exit point for somebody on the other side of the world who bought access to it by the gigabyte. The device supplying that access could be running a bandwidth-sharing app, carrying a monetisation SDK inside an unrelated utility, compromised by malware, or sold with unwanted software already installed.&lt;/p&gt;
&lt;p&gt;That supply chain is why residential proxy traffic is difficult to handle. The IP address is real. The trust attached to it is not.&lt;/p&gt;
&lt;h2&gt;Bandwidth Sharing Turns Connectivity Into Inventory&lt;/h2&gt;
&lt;p&gt;Bandwidth-sharing software lets a third party route traffic through someone else's internet connection. At the destination, the traffic leaves through the participant's residential or mobile IP address rather than the operator's original network.&lt;/p&gt;
&lt;p&gt;The commercial pitch is usually simple: share unused bandwidth and earn a little money, or let an app developer earn revenue without showing more advertising. There are legitimate and clearly disclosed versions of that arrangement. The problem is that the same machinery also works when the disclosure is vague, the SDK is hidden inside an unrelated app, or the device owner never agreed at all.&lt;/p&gt;
&lt;p&gt;Once enrolled, the device becomes supply. A proxy provider or reseller can package that supply by country, city, ISP, session duration, or available capacity. A buyer does not need to know whether the exit came from an informed participant, an obscure clause in an app's terms, or a compromised device. They pay for the route.&lt;/p&gt;
&lt;p&gt;&lt;img alt="A direct request reaches an application from the customer device, while a residential proxy request passes from a remote operator through a proxy service and household exit." src="/static/images/blog/residential-proxy-diagram.png"&gt;&lt;/p&gt;
&lt;p&gt;For the website receiving the request, those sourcing distinctions are mostly invisible. It sees a consumer IP address and has to decide whether the request belongs to a customer.&lt;/p&gt;
&lt;h2&gt;There Is More Than One Way Into the Pool&lt;/h2&gt;
&lt;p&gt;Residential proxy networks are not built from a single source. Their capacity can come from several different arrangements:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Explicit bandwidth-sharing apps.&lt;/strong&gt; The user installs software whose stated purpose is to sell or share some of their connection.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Monetisation SDKs.&lt;/strong&gt; A developer embeds third-party code in a game, utility, browser extension, VPN, or desktop application and is paid for active devices or transferred data.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Trojanised applications.&lt;/strong&gt; A useful-looking app performs its advertised function while quietly enrolling the device as a proxy exit.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Preloaded or setup-time software.&lt;/strong&gt; Cheap streaming boxes and other connected devices can arrive compromised or download a backdoor when first configured.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Post-compromise installation.&lt;/strong&gt; An attacker exploits a server or endpoint, then installs otherwise legitimate bandwidth-monetisation software to generate recurring income.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These paths sit on a spectrum from deliberate participation to outright compromise. They produce a similar result for the destination service: third-party traffic exits through an address that looks residential.&lt;/p&gt;
&lt;h2&gt;The Quiet Payload Is Often the Point&lt;/h2&gt;
&lt;p&gt;The most revealing development is not a new proxy protocol. It is the use of legitimate proxyware as a payload.&lt;/p&gt;
&lt;p&gt;In 2025, &lt;a href="https://unit42.paloaltonetworks.com/attackers-sell-your-bandwidth-using-sdks/"&gt;Palo Alto Networks Unit 42 documented a campaign&lt;/a&gt; that exploited vulnerable GeoServer instances and deployed a legitimate passive-income app and SDK. The SDK used by the attacker was identical to the vendor's official version. Instead of encrypting files or consuming enough CPU to announce itself like a cryptominer, the software quietly monetised the victim's bandwidth.&lt;/p&gt;
&lt;p&gt;That changes the economics of a compromise. The attacker does not need to sell access once or deploy noisy malware immediately. A compromised machine can produce a smaller recurring return while its connection is resold. Legitimate code also gives endpoint security a harder judgement to make: the binary may be real, while the installation and use are unauthorised.&lt;/p&gt;
&lt;p&gt;This is not only a server problem. In 2025, the &lt;a href="https://www.fbi.gov/investigate/cyber/alerts/2025/home-internet-connected-devices-facilitate-criminal-activity"&gt;FBI warned about BADBOX 2.0&lt;/a&gt;, which affected Android-based TV boxes, projectors, digital picture frames, aftermarket vehicle systems, and other connected devices. Some were compromised before purchase; others downloaded backdoored applications during setup. Once connected to a home network, those devices could become part of botnet and residential proxy activity.&lt;/p&gt;
&lt;p&gt;An inexpensive box under a television is attractive infrastructure. It stays powered on, sits behind a real household connection, and rarely receives the scrutiny given to a laptop or phone.&lt;/p&gt;
&lt;h2&gt;2026 Made the Scale Harder to Dismiss&lt;/h2&gt;
&lt;p&gt;In January 2026, Google said it had &lt;a href="https://cloud.google.com/blog/topics/threat-intelligence/disrupting-largest-residential-proxy-network"&gt;disrupted the IPIDEA residential proxy network&lt;/a&gt; through legal action, platform enforcement, and industry coordination.&lt;/p&gt;
&lt;p&gt;Google's investigation found more than 600 Android applications across multiple download sources connecting to the network's command infrastructure. It also identified 3,075 Windows binaries and described millions of devices being removed from the available proxy pool. During one seven-day period, Google observed more than 550 tracked threat groups using IPIDEA exit nodes to obscure activity including password spraying and access to SaaS and on-premises systems.&lt;/p&gt;
&lt;p&gt;Those numbers matter, but the structure matters more. Google found different SDK brands feeding shared infrastructure, along with overlaps between proxy exit pools created by reseller and partnership arrangements. A provider name is therefore not a reliable boundary. The device supplying an exit, the company marketing the SDK, the reseller selling access, and the operator using the connection may all be different parties.&lt;/p&gt;
&lt;p&gt;Taking down one set of domains can disrupt a network. It does not remove the incentive to rebuild the supply somewhere else.&lt;/p&gt;
&lt;h2&gt;Consent Is Not a Security Verdict&lt;/h2&gt;
&lt;p&gt;Proxy providers often frame sourcing as a consent question: did the device user agree to share bandwidth? That is important, but it is not enough.&lt;/p&gt;
&lt;p&gt;There are at least three separate parties whose interests matter:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;The device user&lt;/strong&gt;, who should understand that strangers can send traffic through their device and IP address.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The network owner or ISP&lt;/strong&gt;, whose service terms and security controls may not allow resale or third-party routing.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The destination service&lt;/strong&gt;, which never agreed to treat paid proxy traffic as a normal local customer.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;A tick buried in a long terms-of-service document is weak evidence that the first party understood the arrangement. It says nothing about the other two. Even genuinely informed consent only explains how an exit joined the pool. It does not make the buyer's login attempt, checkout request, scrape, or password reset benign.&lt;/p&gt;
&lt;p&gt;Google Play has drawn this boundary since &lt;a href="https://support.google.com/googleplay/android-developer/announcements/13412212?hl=en"&gt;August 2019&lt;/a&gt;, when it added proxy services as an example under its Device and Network Abuse policy. Apps may facilitate proxy services to third parties only when proxying is their &lt;a href="https://support.google.com/googleplay/android-developer/answer/16559646?hl=en"&gt;primary, user-facing core purpose&lt;/a&gt;. Consent does not turn a hidden proxy SDK inside an unrelated game or utility into the app's core purpose.&lt;/p&gt;
&lt;p&gt;The rule is not new, and it did not eliminate SDK-sourced proxy capacity. More recent Android controls make persistent background activity easier to scrutinise, while operations such as Google's 2026 IPIDEA disruption show what stronger enforcement can remove from a pool. Platform action can reduce supply. It still cannot establish the intent behind every request that has already reached a website.&lt;/p&gt;
&lt;p&gt;Google's later NetNut action made the same limitation easier to measure. Our comparison of the &lt;a href="/blog/ipidea-netnut-proxy-takedowns/"&gt;IPIDEA and NetNut residential proxy takedowns&lt;/a&gt; follows what happened to the infrastructure, the suppliers and the destination risk.&lt;/p&gt;
&lt;h2&gt;Why IP Reputation Arrives Late&lt;/h2&gt;
&lt;p&gt;An IP reputation database can identify known proxy exits. It cannot reliably answer who is controlling a connection right now.&lt;/p&gt;
&lt;p&gt;Residential pools change quickly as phones move between networks, apps open and close, devices reconnect, and operators shift infrastructure. One public IP can also represent many unrelated people behind carrier-grade NAT. A clean label may mean the exit is new. A bad label may describe one abusive session while legitimate users share the same address.&lt;/p&gt;
&lt;p&gt;This creates two predictable errors:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Trusting a residential address because it is absent from a proxy list.&lt;/li&gt;
&lt;li&gt;Blocking an address so broadly that ordinary users sharing the connection are caught with it.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The answer is not to discard IP intelligence. It is to stop treating it as identity.&lt;/p&gt;
&lt;h2&gt;Detect the Relay, Then Judge the Request&lt;/h2&gt;
&lt;p&gt;The sourcing story explains why a request may be suspicious. It does not decide what your application should do.&lt;/p&gt;
&lt;p&gt;Useful detection combines several kinds of evidence:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Per-connection network and protocol fingerprints that can reveal a relay even when the IP looks ordinary.&lt;/li&gt;
&lt;li&gt;Browser, device, TLS, and HTTP characteristics that do not agree with one another.&lt;/li&gt;
&lt;li&gt;Repeated behaviour that survives IP rotation, such as credential testing across many accounts or identical request timing.&lt;/li&gt;
&lt;li&gt;Route and account context, including whether the request is browsing a public page, attempting login, resetting a password, changing payment details, or calling an API directly.&lt;/li&gt;
&lt;li&gt;Recent outcomes such as failed authentication, challenge failure, unusual token use, or high-risk account changes.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is where &lt;a href="/products/residential-proxy-detection/"&gt;residential proxy detection&lt;/a&gt; belongs: inside the request decision, beside &lt;a href="/products/ip-intelligence/"&gt;IP intelligence&lt;/a&gt;, fingerprints, behaviour, credentials, and account state.&lt;/p&gt;
&lt;p&gt;A proxy signal on a public article may only be worth recording. The same signal on a login attempt with a first-seen client and failures across several accounts may justify a challenge or tighter rate limit. On a password reset or payment change, it may support step-up authentication or a block.&lt;/p&gt;
&lt;p&gt;The action should follow the evidence and the cost of being wrong.&lt;/p&gt;
&lt;h2&gt;What Security Teams Should Change&lt;/h2&gt;
&lt;p&gt;For application and fraud teams, the practical response is straightforward:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Map the sensitive web and API routes where proxy use should change a decision.&lt;/li&gt;
&lt;li&gt;Measure residential proxy traffic before enabling broad enforcement.&lt;/li&gt;
&lt;li&gt;Key rate limits on accounts, tokens, fingerprints, routes, and outcomes as well as IP addresses.&lt;/li&gt;
&lt;li&gt;Keep allow, monitor, rate-limit, challenge, and block as separate actions.&lt;/li&gt;
&lt;li&gt;Preserve a decision record so security, fraud, and support teams can explain why a request was handled differently.&lt;/li&gt;
&lt;li&gt;Review false positives by network type, especially mobile carriers and CGNAT-heavy ISPs.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Endpoint and network teams have a related job. They should inventory bandwidth-sharing and proxy software, review monetisation SDKs, monitor unusual long-lived outbound connections, restrict unapproved software on managed devices, and treat cheap connected hardware as part of the network attack surface rather than as an appliance that can be forgotten after setup.&lt;/p&gt;
&lt;h2&gt;The Address Is Real. The Assumption Is Not.&lt;/h2&gt;
&lt;p&gt;Bandwidth sharing has made an old security shortcut less defensible. Residential no longer means local, human, or trustworthy. It describes where traffic leaves the internet connection, not who initiated it or what they intend to do.&lt;/p&gt;
&lt;p&gt;Some proxy exits are knowingly shared. Some are poorly disclosed. Some are compromised. A destination service usually cannot see that history, and it should not need to settle the sourcing dispute before protecting an account or API.&lt;/p&gt;
&lt;p&gt;Detect the relay where you can. Combine that signal with what the request is doing. Then apply only the friction the evidence supports.&lt;/p&gt;
&lt;p&gt;For more background, read &lt;a href="/learning/residential-proxies/how-residential-proxy-networks-are-formed/"&gt;How Residential Proxy Networks Are Formed&lt;/a&gt; and &lt;a href="/blog/residential-proxies-api-account-abuse/"&gt;How Residential Proxies Changed API and Account Abuse&lt;/a&gt;.&lt;/p&gt;</content><category term="Residential Proxies"></category><category term="Residential Proxies"></category><category term="Bot Management"></category><category term="Threat Detection"></category><category term="Account Protection"></category><category term="Credential Stuffing"></category><category term="Fraud Prevention"></category></entry><entry><title>How to Tune F5 BIG-IP Advanced WAF</title><link href="https://www.peakhour.io/blog/how-to-tune-f5-big-ip-advanced-waf/" rel="alternate"></link><published>2026-07-29T10:15:00+10:00</published><updated>2026-07-29T10:15:00+10:00</updated><author><name>AC</name></author><id>tag:www.peakhour.io,2026-07-29:/blog/how-to-tune-f5-big-ip-advanced-waf/</id><summary type="html">&lt;p&gt;Run F5 BIG-IP Advanced WAF in Transparent mode, review staged matches and learning suggestions, and limit each exception to the URL, parameter, cookie or content profile that needs it.&lt;/p&gt;</summary><content type="html">&lt;p&gt;An F5 policy has three separate controls between a signature match and a blocked request.&lt;/p&gt;
&lt;p&gt;The policy has an enforcement mode. Each violation has Learn, Alarm and Block settings. Each signature or policy entity can also be in staging.&lt;/p&gt;
&lt;p&gt;Record all three before changing the policy.&lt;/p&gt;
&lt;h2&gt;Start a new policy in Transparent mode&lt;/h2&gt;
&lt;p&gt;Set a new policy, a major policy revision or a newly protected application to &lt;strong&gt;Transparent&lt;/strong&gt; under &lt;strong&gt;Security &amp;gt; Application Security &amp;gt; Policy Building &amp;gt; Learning and Blocking Settings&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Transparent mode allows requests through while the policy records violations. F5 normally generates a learning suggestion when the violation has Learn enabled. Save the change and select &lt;strong&gt;Apply Policy&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Blocking mode behaves differently. A request is blocked only when the policy is in Blocking mode, the violation has Block enabled and the matching entity or signature has left staging. &lt;a href="https://techdocs.f5.com/en-us/bigip-17-5-0/big-ip-asm-implementations/configuring-security-policy-blocking.html"&gt;F5 documents the interaction between enforcement mode, violation actions and staging&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;F5 calls the staging window the &lt;strong&gt;Enforcement Readiness Period&lt;/strong&gt;. The default is seven days. During that period, the policy does not enforce staged signatures or entities. Configure learning and logging to capture their matches. &lt;a href="https://techdocs.f5.com/en-us/bigip-17-5-0/big-ip-asm-implementations/changing-security-policy-settings.html"&gt;The policy settings guide explains Transparent mode and enforcement readiness&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Seven quiet days prove only that the traffic seen during those days was quiet. Include month-end jobs, imports, account recovery, administration, checkout, API writes and other flows that ordinary browsing misses.&lt;/p&gt;
&lt;p&gt;For an established blocking policy, stage the signatures or entities affected by a change. The rest of the policy can remain in force while those changes collect traffic.&lt;/p&gt;
&lt;h2&gt;Log staged signature matches&lt;/h2&gt;
&lt;p&gt;The default logging profile records illegal requests. A staged attack-signature match can be allowed and therefore needs an explicit logging choice.&lt;/p&gt;
&lt;p&gt;Create or edit an application-security logging profile under &lt;strong&gt;Security &amp;gt; Event Logs &amp;gt; Logging Profiles&lt;/strong&gt;. Set the request filter to &lt;strong&gt;Illegal requests, and requests that include staged attack signatures&lt;/strong&gt;. Associate the profile with the virtual server that runs the security policy.&lt;/p&gt;
&lt;p&gt;F5 supports local and remote logging profiles. Local logging competes for resources on the BIG-IP system; remote logging can send CSV, key-value or CEF records to a reporting system. &lt;a href="https://techdocs.f5.com/en-us/bigip-17-5-0/big-ip-asm-implementations/logging-application-security-events.html"&gt;F5 documents the logging destinations, staged-signature filter and virtual-server association&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Keep these fields for each investigation:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;security policy and virtual server;&lt;/li&gt;
&lt;li&gt;support ID and event time;&lt;/li&gt;
&lt;li&gt;hostname, URL and method;&lt;/li&gt;
&lt;li&gt;violation name;&lt;/li&gt;
&lt;li&gt;attack-signature ID and attack type;&lt;/li&gt;
&lt;li&gt;parameter, cookie, header or request area that matched;&lt;/li&gt;
&lt;li&gt;matched data;&lt;/li&gt;
&lt;li&gt;violation rating;&lt;/li&gt;
&lt;li&gt;enforcement mode and staging state;&lt;/li&gt;
&lt;li&gt;application response.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The support ID ties a user-facing block page to the stored request. The violation rating runs from 1 to 5. F5 describes 1 as most likely a false positive and 5 as most likely an attack. Use the rating to order the work, then read the request and ask the application owner what the input means. &lt;a href="https://techdocs.f5.com/en-us/bigip-17-5-0/big-ip-asm-implementations/working-with-violations.html"&gt;F5 lists the request details and explains violation ratings&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Group events by policy, violation, signature ID, URL, method and named request field. A signature firing in &lt;code&gt;comment&lt;/code&gt; on &lt;code&gt;POST /api/tickets&lt;/code&gt; needs a different review from the same signature firing in an authentication parameter.&lt;/p&gt;
&lt;p&gt;Request logs may contain credentials, personal information and customer text. Mark account numbers, tokens and other secrets as sensitive parameters so F5 masks their stored values. &lt;a href="https://techdocs.f5.com/en-us/bigip-17-5-0/big-ip-asm-implementations/adding-entities-to-a-security-policy.html"&gt;F5 documents the sensitive-parameter setting and log masking&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Read the request behind each learning suggestion&lt;/h2&gt;
&lt;p&gt;Traffic Learning turns observed violations and new entities into proposed policy changes. Open &lt;strong&gt;Security &amp;gt; Application Security &amp;gt; Policy Building &amp;gt; Traffic Learning&lt;/strong&gt;, select the policy and inspect the requests attached to each suggestion.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Accept Suggestion&lt;/strong&gt; changes the policy. Treat it like any other configuration change.&lt;/p&gt;
&lt;p&gt;Manual learning waits for an operator to accept a suggestion. Automatic learning can apply most suggestions after F5 has seen enough traffic, sessions, time and source addresses. Manual learning keeps each relaxation visible while a new or sensitive application is being tuned. &lt;a href="https://techdocs.f5.com/en-us/bigip-17-5-0/big-ip-asm-implementations/changing-how-a-security-policy-is-built.html"&gt;F5 describes Manual, Automatic and Disabled learning modes&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;A busy suggestion can still describe a busy attack. Confirm that the requests reached the expected application path, parsed successfully and produced the expected business result.&lt;/p&gt;
&lt;p&gt;Ask the developer who owns the endpoint:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;what values the field accepts;&lt;/li&gt;
&lt;li&gt;how the application parses them;&lt;/li&gt;
&lt;li&gt;whether the value is stored, rendered or executed;&lt;/li&gt;
&lt;li&gt;which server-side validation protects it;&lt;/li&gt;
&lt;li&gt;whether the field has the same meaning on every URL;&lt;/li&gt;
&lt;li&gt;which test request reproduces the legitimate match.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Accept a suggestion only after its scope matches the application behaviour. Ignore removes a suggestion from the normal Traffic Learning view; it does not repair a false positive. F5 lets operators accept, delete or ignore suggestions and inspect the requests behind them. &lt;a href="https://techdocs.f5.com/en-us/bigip-17-5-0/big-ip-asm-implementations/refining-security-policies-with-learning.html"&gt;The Traffic Learning guide documents those actions&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Check how F5 parsed the body&lt;/h2&gt;
&lt;p&gt;A JSON request treated as unparsed content produces different signature targets from a JSON request split into named parameters.&lt;/p&gt;
&lt;p&gt;Check the allowed URL and its &lt;strong&gt;Request Body Handling&lt;/strong&gt; setting. F5 can parse form data, JSON or XML, or scan an unparsed payload with content and value signatures. A JSON or XML setting also names the content profile used for validation. &lt;a href="https://techdocs.f5.com/en-us/bigip-17-5-0/big-ip-asm-implementations/adding-entities-to-a-security-policy.html"&gt;F5 lists the request-body handling modes in its allowed-URL documentation&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Match the profile to the content type the application accepts. Associate the profile with the correct URL or parameter. Reproduce malformed bodies with the same bytes because the application and F5 may recover from parser errors differently.&lt;/p&gt;
&lt;p&gt;Use explicit parameters for fields that need their own policy. F5 supports global, URL and flow parameters, and applies the most specific definition first: flow, then URL, then global. A free-text &lt;code&gt;comment&lt;/code&gt; field on one endpoint usually belongs at URL level.&lt;/p&gt;
&lt;p&gt;The &lt;strong&gt;Ignore value&lt;/strong&gt; parameter type removes parameter-based signature checks from that value while leaving other relevant signature checks active. A one-signature override removes less inspection. Reserve &lt;strong&gt;Ignore value&lt;/strong&gt; for data the application genuinely does not interpret.&lt;/p&gt;
&lt;h2&gt;Put the exception on the field or URL that needs it&lt;/h2&gt;
&lt;p&gt;F5 exposes several scopes for an attack-signature override:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;one signature on one URL parameter;&lt;/li&gt;
&lt;li&gt;one signature on one named cookie;&lt;/li&gt;
&lt;li&gt;one signature in a content profile;&lt;/li&gt;
&lt;li&gt;one signature on an allowed URL;&lt;/li&gt;
&lt;li&gt;one signature across the security policy.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Choose the scope that matches the application.&lt;/p&gt;
&lt;p&gt;For a false positive in &lt;code&gt;comment&lt;/code&gt; on &lt;code&gt;/api/tickets&lt;/code&gt;, define &lt;code&gt;comment&lt;/code&gt; as a URL parameter and disable the signature for that parameter. The same signature continues to inspect other parameters and other URLs.&lt;/p&gt;
&lt;p&gt;F5 also allows a signature override on an allowed cookie. Use that control when a named analytics or session-related cookie carries the legitimate value. Cookie names and values have their own configuration, so record which part produced the match.&lt;/p&gt;
&lt;p&gt;A content-profile override applies wherever that JSON, XML or plain-text profile is associated. Check every URL and parameter using the profile before changing it. &lt;a href="https://techdocs.f5.com/en-us/bigip-17-5-0/big-ip-asm-implementations/adding-json-support-to-an-existing-security-policy.html"&gt;F5 documents signature overrides and associations for JSON profiles&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;An allowed-URL override disables the selected signature for the whole URL. Every request field on that URL receives the exception. F5 describes URL-level signature overrides as a common operation and marks overridden signatures in the policy list. &lt;a href="https://techdocs.f5.com/en-us/bigip-17-5-0/big-ip-asm-implementations/adding-entities-to-a-security-policy.html"&gt;The allowed-URL and cookie procedures describe their attack-signature overrides&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Disabling a signature at policy level removes it from the whole application-security policy. Use that scope only when the signature is irrelevant to every request covered by the policy.&lt;/p&gt;
&lt;p&gt;Record the signature ID, signature revision, URL, parameter or cookie, matched examples, application owner and protections that remain.&lt;/p&gt;
&lt;h2&gt;Apply, synchronise and test the policy&lt;/h2&gt;
&lt;p&gt;Saving an edit does not put it into the active policy. Select &lt;strong&gt;Apply Policy&lt;/strong&gt;, wait for the operation to finish and confirm that the virtual server still has the intended application-security and logging profiles.&lt;/p&gt;
&lt;p&gt;Synchronise the change to the peer device when the BIG-IP pair uses manual ConfigSync. F5 can display a sync reminder after policy changes in a high-availability configuration. &lt;a href="https://techdocs.f5.com/en-us/bigip-17-5-0/big-ip-asm-implementations/configuring-general-asm-system-options.html"&gt;The Advanced WAF preferences guide describes Apply Policy confirmation, change logging and the ConfigSync reminder&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Replay:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;the original legitimate request;&lt;/li&gt;
&lt;li&gt;the same value in another parameter;&lt;/li&gt;
&lt;li&gt;the same value on another URL;&lt;/li&gt;
&lt;li&gt;a safe signature test in the excluded field;&lt;/li&gt;
&lt;li&gt;the safe test in a neighbouring field;&lt;/li&gt;
&lt;li&gt;malformed and oversized versions of the request;&lt;/li&gt;
&lt;li&gt;normal application traffic.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The legitimate request should complete without the false-positive event. The safe test in the excluded scope shows the inspection removed by the exception. Neighbouring fields and URLs should still produce the expected signature event.&lt;/p&gt;
&lt;p&gt;Check the support ID, signature ID, staging state and application response after every replay.&lt;/p&gt;
&lt;h2&gt;Compare and export the policy&lt;/h2&gt;
&lt;p&gt;Use &lt;strong&gt;Security &amp;gt; Application Security &amp;gt; Security Policies &amp;gt; Policy Diff&lt;/strong&gt; to compare the tuned policy with the earlier policy or a staging copy. F5 can compare active, inactive and exported policies.&lt;/p&gt;
&lt;p&gt;Export the policy before a large tuning session, signature update or BIG-IP upgrade. A readable XML export supports review and version control; a binary policy archive preserves a restorable copy.&lt;/p&gt;
&lt;p&gt;Compact XML omits attack-signature staging state and omits some settings that remain at their defaults. Use the full XML format when the review needs to show staging. Export user-defined attack signatures separately because a policy export contains their sets without the signatures themselves. &lt;a href="https://techdocs.f5.com/en-us/bigip-17-5-0/big-ip-asm-implementations/maintaining-security-policies.html"&gt;F5 documents Policy Diff and the export-format limits&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Stage signature updates and application releases&lt;/h2&gt;
&lt;p&gt;F5 Live Update places newly added attack signatures in staging. Updated signatures follow the policy's &lt;strong&gt;Updated Signature Enforcement&lt;/strong&gt; setting. Review that setting before installing an attack-signature update. &lt;a href="https://techdocs.f5.com/en-us/bigip-17-5-0/big-ip-asm-implementations/updating-security-components.html"&gt;F5 documents the post-update staging behaviour&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Keep signature staging enabled during the observation period. Review each high-volume match, then enforce the signatures that have clean traffic and tested application flows.&lt;/p&gt;
&lt;p&gt;Run the same process after an application release that changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;public URLs or methods;&lt;/li&gt;
&lt;li&gt;parameter names or value types;&lt;/li&gt;
&lt;li&gt;JSON, XML, GraphQL or multipart bodies;&lt;/li&gt;
&lt;li&gt;cookies and headers;&lt;/li&gt;
&lt;li&gt;uploads;&lt;/li&gt;
&lt;li&gt;authentication and account flows.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Tell the application team which policy changes are waiting in staging. The application team knows whether a new field belongs in the release.&lt;/p&gt;
&lt;h2&gt;Keep rate limiting in the DoS profile&lt;/h2&gt;
&lt;p&gt;F5 application-security policies inspect individual requests. BIG-IP Layer 7 DoS protection measures transaction rates and server latency through a separate DoS profile attached to the virtual server.&lt;/p&gt;
&lt;p&gt;Configure rate limiting under the DoS profile when repeated traffic is the problem. F5 can rate limit suspicious source addresses, countries, URLs or a site under attack. Transparent and Blocking modes for the DoS profile control whether those conditions are reported or mitigated. &lt;a href="https://techdocs.f5.com/en-us/bigip-17-5-0/big-ip-asm-implementations/preventing-dos-attacks-on-applications.html"&gt;F5 documents TPS-based detection, stress-based detection and request rate limiting&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Track WAF signature blocks and DoS rate limits as separate outcomes. A false-positive signature needs a policy exception. The application owner must set an acceptable rate and response for excessive legitimate traffic.&lt;/p&gt;
&lt;h2&gt;Move the policy to Blocking&lt;/h2&gt;
&lt;p&gt;Switch the policy from Transparent to Blocking after:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;normal and infrequent application flows have run;&lt;/li&gt;
&lt;li&gt;every repeated legitimate match has been classified;&lt;/li&gt;
&lt;li&gt;each exception has the smallest supported scope;&lt;/li&gt;
&lt;li&gt;staged entities and signatures have been reviewed;&lt;/li&gt;
&lt;li&gt;Learn, Alarm and Block settings match the intended response;&lt;/li&gt;
&lt;li&gt;the replay tests pass;&lt;/li&gt;
&lt;li&gt;the active and standby devices have the same applied policy.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Move a small application or virtual server first when the deployment supports it. Watch blocked requests, application errors and business transactions together.&lt;/p&gt;
&lt;p&gt;The blocking response includes a support ID. Keep the event long enough for support staff to find the exact request without storing customer content in the exception record.&lt;/p&gt;
&lt;p&gt;Review the policy after each application release and signature update. Remove an override when the field, parser or application behaviour that required it has gone.&lt;/p&gt;</content><category term="Application Security"></category><category term="F5"></category><category term="BIG-IP Advanced WAF"></category><category term="WAF"></category><category term="Application Security"></category><category term="False Positives"></category><category term="WAF Tuning"></category></entry><entry><title>How to Tune Google Cloud Armor WAF Rules</title><link href="https://www.peakhour.io/blog/how-to-tune-google-cloud-armor-waf/" rel="alternate"></link><published>2026-07-29T10:00:00+10:00</published><updated>2026-07-29T10:00:00+10:00</updated><author><name>AC</name></author><id>tag:www.peakhour.io,2026-07-29:/blog/how-to-tune-google-cloud-armor-waf/</id><summary type="html">&lt;p&gt;Tune Cloud Armor preconfigured WAF rules with preview traffic, versioned signatures, sensitivity levels, field exclusions and policy priority.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Cloud Armor evaluates security-policy rules by priority. The request log shows the preview rule that matched and the enforced rule that decided the request.&lt;/p&gt;
&lt;p&gt;An &lt;code&gt;allow&lt;/code&gt; rule at priority 100 accepts the request before a SQL injection rule at priority 1000 can inspect it. A WAF rule in preview records the action it would have taken while an enforced rule decides the request.&lt;/p&gt;
&lt;h2&gt;Preview one WAF rule&lt;/h2&gt;
&lt;p&gt;Cloud Armor preview belongs to individual security-policy rules. The configured action is recorded while policy evaluation continues to an enforced rule. Both results appear in the request log when the preview rule takes priority. &lt;a href="https://docs.cloud.google.com/armor/docs/security-policy-overview#preview-mode"&gt;Google documents this evaluation behaviour and the &lt;code&gt;--preview&lt;/code&gt; flag&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The commands below use a global service-level security policy. Add &lt;code&gt;--region=REGION&lt;/code&gt; to each command when working with a regional policy.&lt;/p&gt;
&lt;p&gt;Create or update the WAF rule with a deny action and preview enabled:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;gcloud&lt;span class="w"&gt; &lt;/span&gt;compute&lt;span class="w"&gt; &lt;/span&gt;security-policies&lt;span class="w"&gt; &lt;/span&gt;rules&lt;span class="w"&gt; &lt;/span&gt;create&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1000&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;--security-policy&lt;span class="w"&gt; &lt;/span&gt;app-policy&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;--expression&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;evaluatePreconfiguredWaf(&amp;#39;sqli-v422-stable&amp;#39;, {&amp;#39;sensitivity&amp;#39;: 1})&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;--action&lt;span class="w"&gt; &lt;/span&gt;deny-403&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;--preview&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;--description&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;SQLi v4.22 sensitivity 1&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Sensitivity 1 is a sensible starting point for most applications. It enables the higher-confidence signatures and usually produces less noise than higher levels. Google recommends starting new preconfigured WAF rules at sensitivity 1 and validating them in preview. &lt;a href="https://docs.cloud.google.com/armor/docs/best-practices#rule_tuning"&gt;The current Cloud Armor best-practices guide gives both recommendations&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Read both policy results in the request log&lt;/h2&gt;
&lt;p&gt;Cloud Armor adds its policy results to the load balancer’s per-request log. Request logging is disabled by default for new backend services, so enable it before starting the preview. Look for &lt;code&gt;previewSecurityPolicy&lt;/code&gt; to see the preview match and &lt;code&gt;enforcedSecurityPolicy&lt;/code&gt; to see the enforced result. The &lt;code&gt;preconfiguredExprIds&lt;/code&gt; array contains every WAF signature that triggered the matching policy rule. &lt;a href="https://docs.cloud.google.com/armor/docs/request-logging#security_policy_log_entries"&gt;Google lists the logging prerequisite and policy fields in the Cloud Armor request-logging reference&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;A Logs Explorer query can isolate the preview rule:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;resource.type=&amp;quot;http_load_balancer&amp;quot;
jsonPayload.previewSecurityPolicy.name=&amp;quot;app-policy&amp;quot;
jsonPayload.previewSecurityPolicy.priority=1000
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Group the results by:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;preconfiguredExprIds&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;request path and method;&lt;/li&gt;
&lt;li&gt;preview rule priority;&lt;/li&gt;
&lt;li&gt;enforced outcome;&lt;/li&gt;
&lt;li&gt;client or application flow;&lt;/li&gt;
&lt;li&gt;time and release version.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Use our &lt;a href="/blog/how-to-tune-your-waf/"&gt;general WAF tuning guide&lt;/a&gt; to classify those repeated matches and choose the smallest safe exception.&lt;/p&gt;
&lt;p&gt;Enable verbose logging for a short investigation when the ordinary log shows the signature but omits the input. It adds &lt;code&gt;matchedFieldType&lt;/code&gt;, &lt;code&gt;matchedFieldName&lt;/code&gt; and a short &lt;code&gt;matchedFieldValue&lt;/code&gt; snippet for requests matching preconfigured WAF rules. Those snippets can contain customer or personal data. Google recommends disabling verbose logging during normal operation. &lt;a href="https://docs.cloud.google.com/armor/docs/verbose-logging"&gt;The verbose-logging guide describes the extra fields and privacy risk&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Match the signature ID to the ruleset version&lt;/h2&gt;
&lt;p&gt;The name &lt;code&gt;sqli-v422-stable&lt;/code&gt; identifies the SQL injection ruleset built from CRS 4.22. A signature inside it has the same version in its ID, such as:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;owasp-crs-v042200-id942350-sqli
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Use the ID written by the policy log. Cloud Armor requires an opted-out signature ID to match the ruleset version, and rejects mismatched versions. &lt;a href="https://docs.cloud.google.com/armor/docs/rule-tuning#opt_out_rule_signatures"&gt;Google shows the versioned naming and requirement in its WAF tuning guide&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;A ruleset upgrade can add or change signatures. Put the new version in preview, compare its matches with the enforced version and promote it after reviewing the result.&lt;/p&gt;
&lt;p&gt;Google also publishes canary rulesets. Its recommended arrangement runs the canary at a higher priority in preview and the stable ruleset at a lower priority in enforcement. The canary records the requests it would deny while the stable rule protects the service. &lt;a href="https://docs.cloud.google.com/armor/docs/best-practices#use_stable_or_canary_rules"&gt;Google describes this stable-and-canary arrangement in its best practices&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Choose the sensitivity level first&lt;/h2&gt;
&lt;p&gt;Sensitivity levels run from 0 to 4. Choosing level 2 enables signatures at levels 1 and 2. Higher levels inspect for more patterns and tend to produce more false positives. Level 0 enables no signatures unless you explicitly opt them in. &lt;a href="https://docs.cloud.google.com/armor/docs/rule-tuning#choose_a_sensitivity_level"&gt;Google maps Cloud Armor sensitivity to CRS paranoia levels in the tuning documentation&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Choose a level that fits the application and the time available to investigate. A public marketing site with conventional inputs may run cleanly at a higher level. An API accepting templates or query fragments may need more work.&lt;/p&gt;
&lt;p&gt;Keep the chosen sensitivity and exclude the named field from the affected signature.&lt;/p&gt;
&lt;h2&gt;Opt out one noisy signature&lt;/h2&gt;
&lt;p&gt;If a signature is irrelevant wherever the policy rule applies, list its versioned ID in &lt;code&gt;opt_out_rule_ids&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;evaluatePreconfiguredWaf(
  &amp;#39;sqli-v422-stable&amp;#39;,
  {
    &amp;#39;sensitivity&amp;#39;: 2,
    &amp;#39;opt_out_rule_ids&amp;#39;: [
      &amp;#39;owasp-crs-v042200-id942350-sqli&amp;#39;
    ]
  }
)
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The WAF rule runs every SQL injection signature enabled at sensitivity 1 and 2 except the named signature.&lt;/p&gt;
&lt;p&gt;Use an opt-out after reviewing where the policy rule applies. A rule matching every request to a shared backend gives the exception the same reach.&lt;/p&gt;
&lt;h2&gt;Enable selected signatures at sensitivity 0&lt;/h2&gt;
&lt;p&gt;Set sensitivity to 0 when the rule needs only a few named signatures:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;evaluatePreconfiguredWaf(
  &amp;#39;xss-v422-stable&amp;#39;,
  {
    &amp;#39;sensitivity&amp;#39;: 0,
    &amp;#39;opt_in_rule_ids&amp;#39;: [
      &amp;#39;owasp-crs-v042200-id941150-xss&amp;#39;
    ]
  }
)
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Cloud Armor permits &lt;code&gt;opt_in_rule_ids&lt;/code&gt; only at sensitivity 0. Google recommends this approach when you want fewer signatures than you would otherwise opt out. &lt;a href="https://docs.cloud.google.com/armor/docs/configure-waf#configure_waf_rules"&gt;The setup guide documents the constraint and provides current CLI examples&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;An opt-in rule enables only the named signatures for the traffic matched by that policy rule. Record why each signature was selected and when to review the set.&lt;/p&gt;
&lt;h2&gt;Exclude the field that carries legitimate content&lt;/h2&gt;
&lt;p&gt;A request-field exclusion keeps a signature active and removes a selected input from its inspection.&lt;/p&gt;
&lt;p&gt;Cloud Armor can exclude named header values, cookie values, query-parameter values and URIs from an entire preconfigured ruleset or selected signatures. Header, cookie and query-parameter names remain inspected when their values are excluded. URI exclusions remove the matching URI from inspection for the selected target. &lt;a href="https://docs.cloud.google.com/armor/docs/rule-tuning#exclude_request_fields_from_inspection"&gt;Google documents each field’s behaviour and available match operators&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Suppose the cookie &lt;code&gt;analytics_id&lt;/code&gt; repeatedly triggers signature &lt;code&gt;942100&lt;/code&gt;. Add an exclusion to the existing SQLi policy rule:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;gcloud&lt;span class="w"&gt; &lt;/span&gt;compute&lt;span class="w"&gt; &lt;/span&gt;security-policies&lt;span class="w"&gt; &lt;/span&gt;rules&lt;span class="w"&gt; &lt;/span&gt;add-preconfig-waf-exclusion&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1000&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;--security-policy&lt;span class="w"&gt; &lt;/span&gt;app-policy&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;--target-rule-set&lt;span class="w"&gt; &lt;/span&gt;sqli-v422-stable&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;--target-rule-ids&lt;span class="w"&gt; &lt;/span&gt;owasp-crs-v042200-id942100-sqli&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;--request-cookie-to-exclude&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;op=EQUALS,val=analytics_id&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The signature continues to inspect the cookie name and every other request field, excluding only the value of &lt;code&gt;analytics_id&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Request query parameters need one extra check. Cloud Armor rebuilds the URI and request line after removing an excluded query parameter. A signature that inspects the entire &lt;code&gt;REQUEST_BODY&lt;/code&gt; continues to inspect it, so the same parameter can trigger a body-wide signature. &lt;a href="https://docs.cloud.google.com/armor/docs/rule-tuning#request_query_parameters"&gt;Google calls out this behaviour in the query-parameter exclusion documentation&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;A policy rule with request-field exclusions cannot use the &lt;code&gt;allow&lt;/code&gt; action. Use the WAF’s deny action and let unmatched requests continue through the policy. &lt;a href="https://docs.cloud.google.com/armor/docs/waf-rules#limitations"&gt;This restriction appears in the current preconfigured WAF limitations&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Apply the tuned WAF rule to one route&lt;/h2&gt;
&lt;p&gt;Cloud Armor uses Common Expression Language expressions for advanced matches. Combine the route condition and WAF evaluation in one rule when an exception belongs to one application area:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;request.path.startsWith(&amp;#39;/api/messages&amp;#39;) &amp;amp;&amp;amp;
evaluatePreconfiguredWaf(&amp;#39;sqli-v422-stable&amp;#39;, {&amp;#39;sensitivity&amp;#39;: 1})
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Create a separate SQLi rule for the rest of the application and exclude &lt;code&gt;/api/messages&lt;/code&gt; from its expression. The route is then evaluated once under the tuned rule.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;!request.path.startsWith(&amp;#39;/api/messages&amp;#39;) &amp;amp;&amp;amp;
evaluatePreconfiguredWaf(&amp;#39;sqli-v422-stable&amp;#39;, {&amp;#39;sensitivity&amp;#39;: 1})
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Priority decides which matching rule takes effect. A smaller number has higher priority. An earlier &lt;code&gt;allow&lt;/code&gt; rule ends evaluation for the matching request, so later WAF rules never see it. &lt;a href="https://docs.cloud.google.com/armor/docs/best-practices#test_your_logic"&gt;Google explains the evaluation order and demonstrates the effect of an early allow&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Replay three requests when testing route logic:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;a legitimate request containing the known false-positive value;&lt;/li&gt;
&lt;li&gt;an attack string in the excluded field;&lt;/li&gt;
&lt;li&gt;an attack string in another field.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The legitimate request should pass. The attack string in the excluded field shows the exposure created by the exception. The attack string in another field should still trigger the WAF rule.&lt;/p&gt;
&lt;h2&gt;Set the request-body inspection limit&lt;/h2&gt;
&lt;p&gt;Cloud Armor inspects a configurable prefix of the request body: 8, 16, 32, 48 or 64 kB. The limit applies across the preconfigured WAF rules in the policy, and 64 kB is the maximum. Content after the limit can reach the backend without WAF body-signature inspection. &lt;a href="https://docs.cloud.google.com/armor/docs/configure-waf#update_inspection_limit_for_preconfigured_waf_rules"&gt;Google documents the available sizes and provides the policy update command&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Choose the size from the requests the application accepts. Check uploads, GraphQL, JSON APIs and form submissions separately. Google supports parsed URL-encoded and JSON bodies; other content and encodings, including XML, gzip, UTF-16 and multipart form data, receive rules over raw data. &lt;a href="https://docs.cloud.google.com/armor/docs/security-policy-overview#request_body_inspection_limitation"&gt;The security-policy overview describes the current body parsing behaviour&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Verbose logs include &lt;code&gt;inspectedBodySize&lt;/code&gt;, which helps confirm the active limit. Decide how the application handles larger bodies. Google suggests a separate content-length rule when the application can safely reject requests beyond the inspection limit, though &lt;code&gt;Content-Length&lt;/code&gt; deserves the same validation you would apply to any client-supplied header.&lt;/p&gt;
&lt;h2&gt;Identify who manages the policy&lt;/h2&gt;
&lt;p&gt;Service-level backend security policies attach to backend services. Send their false positives to the team that manages the backend policy.&lt;/p&gt;
&lt;p&gt;Hierarchical policies attach at the organization, folder or project level and flow down to projects. Send inherited false positives to the team that manages the hierarchical policy.&lt;/p&gt;
&lt;p&gt;Creating a hierarchical security policy requires Cloud Armor Enterprise Paygo and can enrol the project automatically. &lt;a href="https://docs.cloud.google.com/armor/docs/hierarchical-policies-overview"&gt;Google documents the commercial requirement and ownership model in the hierarchical policy guide&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Include the matched policy name and priority in each false-positive report. Give the policy team the field, route and application behaviour needed to review the exception.&lt;/p&gt;
&lt;p&gt;Hierarchical and service-level policies support different feature sets. Check the current feature table before moving a tuned rule between them. &lt;a href="https://docs.cloud.google.com/armor/docs/security-policy-overview#types_of_security_policies"&gt;Google maintains the comparison in its security-policy overview&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Disable preview after reviewing the matches&lt;/h2&gt;
&lt;p&gt;Run normal traffic, scheduled jobs and important application flows through the preview rule. Classify each recurring signature and field, then disable preview:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;gcloud&lt;span class="w"&gt; &lt;/span&gt;compute&lt;span class="w"&gt; &lt;/span&gt;security-policies&lt;span class="w"&gt; &lt;/span&gt;rules&lt;span class="w"&gt; &lt;/span&gt;update&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1000&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;--security-policy&lt;span class="w"&gt; &lt;/span&gt;app-policy&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;--no-preview
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Cloud Armor rule changes usually take several minutes to propagate. Watch the enforced policy outcome after the change and replay the requests used during tuning. &lt;a href="https://docs.cloud.google.com/armor/docs/waf-rules#limitations"&gt;Google lists propagation time among the preconfigured WAF limitations&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Keep the previous expression and exclusions in version control. Record the policy, priority, ruleset version, sensitivity, signature IDs, excluded fields and test requests.&lt;/p&gt;</content><category term="Application Security"></category><category term="WAF"></category><category term="Google Cloud Armor"></category><category term="Google Cloud"></category><category term="OWASP CRS"></category><category term="Application Security"></category><category term="False Positives"></category><category term="WAF Tuning"></category></entry><entry><title>How to Tune Cloudflare WAF When Rule 949110 Blocks a Request</title><link href="https://www.peakhour.io/blog/how-to-tune-cloudflare-waf/" rel="alternate"></link><published>2026-07-29T09:45:00+10:00</published><updated>2026-07-29T09:45:00+10:00</updated><author><name>AC</name></author><id>tag:www.peakhour.io,2026-07-29:/blog/how-to-tune-cloudflare-waf/</id><summary type="html">&lt;p&gt;Trace a Cloudflare OWASP anomaly-score block to the rules that raised the score, then choose the right override or exception.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Rule &lt;code&gt;949110&lt;/code&gt; blocked the request.&lt;/p&gt;
&lt;p&gt;In Cloudflare's OWASP managed ruleset, &lt;code&gt;949110: Inbound Anomaly Score Exceeded&lt;/code&gt; checks the total score produced by earlier detections. The rules that raised the score explain the block.&lt;/p&gt;
&lt;p&gt;Cloudflare puts that answer in Additional logs.&lt;/p&gt;
&lt;h2&gt;Start with the blocked event&lt;/h2&gt;
&lt;p&gt;Open &lt;strong&gt;Security &amp;gt; Events&lt;/strong&gt; in the Cloudflare dashboard and filter to the hostname, path, action and time of the request.&lt;/p&gt;
&lt;p&gt;Security Events shows traffic that Cloudflare acted on or flagged. Its top-level views group events by fields such as action, host, country and service. The sampled log beneath them contains a subset of individual security events, so a busy time range may hide the request you need. Narrowing the time range reduces sampling. &lt;a href="https://developers.cloudflare.com/waf/analytics/security-events/"&gt;Cloudflare documents the Security Events views and sampling behaviour&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Capture the details that identify the request:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ray ID;&lt;/li&gt;
&lt;li&gt;timestamp;&lt;/li&gt;
&lt;li&gt;hostname and path;&lt;/li&gt;
&lt;li&gt;method;&lt;/li&gt;
&lt;li&gt;WAF service and action;&lt;/li&gt;
&lt;li&gt;displayed rule ID and description;&lt;/li&gt;
&lt;li&gt;the application result reported by the user.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;One request can produce more than one security event. Keep the Ray ID and timestamp together while you follow the detections.&lt;/p&gt;
&lt;p&gt;If the displayed description is &lt;code&gt;949110: Inbound Anomaly Score Exceeded&lt;/code&gt;, open &lt;strong&gt;Additional logs&lt;/strong&gt;. Cloudflare places the OWASP rules triggered by that request there. &lt;a href="https://developers.cloudflare.com/waf/analytics/security-events/"&gt;The Security Events documentation describes those contributing OWASP records&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Additional logs deserve a manual check in the dashboard. Cloudflare says triggered OWASP rules shown there are absent from exported Security Events JSON. A log export containing only the final event can therefore leave out the detections that built the anomaly score. &lt;a href="https://developers.cloudflare.com/waf/analytics/security-events/"&gt;The Security Events documentation records that export limitation&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Find the rule that raised the score&lt;/h2&gt;
&lt;p&gt;Additional logs may show one contributing rule or several. Record each rule's description and Cloudflare rule ID.&lt;/p&gt;
&lt;p&gt;The description may begin with a familiar CRS-style number. Cloudflare's API and exception controls use Cloudflare's opaque rule ID. Use the identifier displayed by Cloudflare when you configure the rule.&lt;/p&gt;
&lt;p&gt;Group repeated matches by rule, field and route, then review each group with the application owner. A single support message containing SQL syntax may be legitimate. Different paths or different rules belong in separate investigations. The &lt;a href="/blog/how-to-tune-your-waf/"&gt;general WAF tuning guide&lt;/a&gt; explains how to classify each group and record an exception.&lt;/p&gt;
&lt;p&gt;Ask the developer who owns the route:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;what input the endpoint accepts;&lt;/li&gt;
&lt;li&gt;whether the request was parsed successfully;&lt;/li&gt;
&lt;li&gt;where the matching value is stored or rendered;&lt;/li&gt;
&lt;li&gt;which validation runs at the application;&lt;/li&gt;
&lt;li&gt;whether the field can carry executable syntax by design.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Choose an override or an exception&lt;/h2&gt;
&lt;p&gt;An &lt;strong&gt;override&lt;/strong&gt; changes the configuration of a managed rule or ruleset across that deployment. You can change an action, disable selected rules or adjust settings such as the OWASP anomaly score threshold and paranoia level.&lt;/p&gt;
&lt;p&gt;An &lt;strong&gt;exception&lt;/strong&gt; matches a set of requests and skips selected managed rules for those requests. Its expression can use the host, URI path, method and other Cloudflare Rules language fields.&lt;/p&gt;
&lt;p&gt;Use an override when the rule itself needs a different action across the deployment. Use an exception when a known application route needs different treatment.&lt;/p&gt;
&lt;p&gt;Cloudflare allows exceptions to skip:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;every remaining managed rule;&lt;/li&gt;
&lt;li&gt;one or more managed rulesets;&lt;/li&gt;
&lt;li&gt;one or more rules inside managed rulesets.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Select the contributing rule. A whole-ruleset exception removes far more inspection from the matching request. &lt;a href="https://developers.cloudflare.com/waf/managed-rules/waf-exceptions/"&gt;Cloudflare documents the three exception types and their order of precedence&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;For a false positive confined to message creation, the expression could be:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;http.host eq &amp;quot;api.example.com&amp;quot;
and http.request.uri.path eq &amp;quot;/v1/messages&amp;quot;
and http.request.method eq &amp;quot;POST&amp;quot;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Choose the Cloudflare rule ID found in Additional logs as the rule to skip.&lt;/p&gt;
&lt;p&gt;Cloudflare skips that rule for the complete matching request. Another field on &lt;code&gt;POST /v1/messages&lt;/code&gt; can trigger the same rule and receive the same exception. Record that consequence.&lt;/p&gt;
&lt;h2&gt;Place the exception before the managed ruleset&lt;/h2&gt;
&lt;p&gt;An exception works only on managed-ruleset execution rules listed after it in the same phase. Put the skip rule before the rule that executes the OWASP managed ruleset. &lt;a href="https://developers.cloudflare.com/waf/managed-rules/waf-exceptions/define-api/"&gt;Cloudflare's API documentation states that skip rules affect only later execute rules&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Cloudflare can run managed rulesets at account level on Enterprise plans and at zone level. Account-level rulesets execute before zone-level rulesets. An account-level exception affects account-level rules, while a zone-level exception affects zone-level rules. A zone exception cannot prevent an account-level rule from matching first. &lt;a href="https://developers.cloudflare.com/waf/managed-rules/waf-exceptions/"&gt;Cloudflare documents this scope and evaluation order&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Find the execute rule that produced the event. Add the exception at that level and before that execution. If the OWASP ruleset runs at both levels, inspect both deployments and decide which one needs the exception.&lt;/p&gt;
&lt;p&gt;Exceptions take priority over overrides. &lt;a href="https://developers.cloudflare.com/waf/account/managed-rulesets/"&gt;Cloudflare records that precedence in its managed-ruleset documentation&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Test the exception through Cloudflare&lt;/h2&gt;
&lt;p&gt;Send the original legitimate request through the hostname proxied by Cloudflare. An origin-only replay bypasses the configuration you are testing.&lt;/p&gt;
&lt;p&gt;Use a small test set:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;the legitimate request on the exempt route;&lt;/li&gt;
&lt;li&gt;the same input on another route;&lt;/li&gt;
&lt;li&gt;a safe request that triggers the contributing rule on the exempt route;&lt;/li&gt;
&lt;li&gt;the same test outside the exception;&lt;/li&gt;
&lt;li&gt;normal traffic that should pass unchanged.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Check Security Events after each request. Confirm the Ray ID, action, contributing rules and final result.&lt;/p&gt;
&lt;p&gt;The safe trigger on the exempt route shows what the exception allows. The same trigger outside the exception should still raise the contributing rule and reach &lt;code&gt;949110&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Cloudflare evaluates security products and rules in a defined sequence, and a terminating action stops later evaluation. An earlier custom-rule Block or Managed Challenge can determine the result before Managed Rules run. &lt;a href="https://developers.cloudflare.com/waf/concepts/"&gt;Cloudflare's WAF concepts guide describes this rule execution behaviour&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Set the anomaly threshold from real traffic&lt;/h2&gt;
&lt;p&gt;The OWASP anomaly threshold is the cumulative request score at which &lt;code&gt;949110&lt;/code&gt; applies the configured action. Raising it moves the block point for every request covered by that deployment.&lt;/p&gt;
&lt;p&gt;Use Security Events to see which rules contribute to normal requests before changing the threshold. A repeated false positive from one rule and one endpoint points towards an exception. A broad pattern of low-confidence detections may justify a threshold or paranoia-level review.&lt;/p&gt;
&lt;p&gt;Cloudflare supports overrides for the full ruleset, rule tags and individual rules. Tag and ruleset overrides can also affect future rules that Cloudflare adds under those selections. Individual rule overrides target the rule IDs you chose. &lt;a href="https://developers.cloudflare.com/waf/account/managed-rulesets/"&gt;The managed-ruleset documentation explains these override levels&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Test a threshold change with the same care as a rule exception. It changes when &lt;code&gt;949110&lt;/code&gt; acts across all covered traffic.&lt;/p&gt;
&lt;h2&gt;Record the exception and its rule IDs&lt;/h2&gt;
&lt;p&gt;Document:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;the Ray IDs and event times reviewed;&lt;/li&gt;
&lt;li&gt;the contributing Cloudflare rule IDs and descriptions;&lt;/li&gt;
&lt;li&gt;the anomaly threshold and paranoia level;&lt;/li&gt;
&lt;li&gt;the exception expression;&lt;/li&gt;
&lt;li&gt;the account or zone deployment it belongs to;&lt;/li&gt;
&lt;li&gt;its position before the managed-ruleset execute rule;&lt;/li&gt;
&lt;li&gt;what the selected rule stops inspecting;&lt;/li&gt;
&lt;li&gt;the developer who confirmed the application behaviour;&lt;/li&gt;
&lt;li&gt;the requests used for verification;&lt;/li&gt;
&lt;li&gt;the review date.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Recheck the exception after application changes and Cloudflare managed-rule updates. A new route can need different conditions. A revised rule can remove the original false positive.&lt;/p&gt;
&lt;p&gt;Rule &lt;code&gt;949110&lt;/code&gt; applies the configured action when the anomaly score crosses the threshold. Tune the rules that supplied the false-positive score.&lt;/p&gt;</content><category term="Application Security"></category><category term="Cloudflare WAF"></category><category term="WAF"></category><category term="OWASP CRS"></category><category term="Application Security"></category><category term="False Positives"></category><category term="WAF Tuning"></category></entry><entry><title>How to Tune Azure Application Gateway WAF</title><link href="https://www.peakhour.io/blog/how-to-tune-azure-application-gateway-waf/" rel="alternate"></link><published>2026-07-29T09:30:00+10:00</published><updated>2026-07-29T09:30:00+10:00</updated><author><name>AC</name></author><id>tag:www.peakhour.io,2026-07-29:/blog/how-to-tune-azure-application-gateway-waf/</id><summary type="html">&lt;p&gt;Start Azure Application Gateway WAF in Detection mode, find false positives in Log Analytics, narrow each exclusion and move into Prevention mode.&lt;/p&gt;</summary><content type="html">&lt;p&gt;An Azure WAF false positive usually arrives as a 403 and a complaint.&lt;/p&gt;
&lt;p&gt;Treat the 403 as the start of the investigation. The firewall log identifies the rule, the relevant part of the request and the policy that applied.&lt;/p&gt;
&lt;h2&gt;Put new policies into Detection mode&lt;/h2&gt;
&lt;p&gt;Use Detection mode while introducing a WAF policy, upgrading its managed ruleset or placing an existing application behind Application Gateway. The WAF records rule matches while every request continues to the application.&lt;/p&gt;
&lt;p&gt;Microsoft suggests reviewing one to two weeks of traffic before returning the policy to Prevention mode. Plan and supervise that period because attacks also continue to the application. &lt;a href="https://learn.microsoft.com/en-us/troubleshoot/azure/application-gateway/troubleshoot-waf-blocking-legitimate-requests-403"&gt;Microsoft documents this rollout in its Application Gateway WAF troubleshooting guide&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Before changing the mode, save the complete &lt;code&gt;policySettings&lt;/code&gt; block:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;az&lt;span class="w"&gt; &lt;/span&gt;network&lt;span class="w"&gt; &lt;/span&gt;application-gateway&lt;span class="w"&gt; &lt;/span&gt;waf-policy&lt;span class="w"&gt; &lt;/span&gt;show&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;--name&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="nv"&gt;$WAF_POLICY_NAME&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;--resource-group&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="nv"&gt;$RESOURCE_GROUP&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;--query&lt;span class="w"&gt; &lt;/span&gt;policySettings&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;--output&lt;span class="w"&gt; &lt;/span&gt;json
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The Azure CLI command &lt;code&gt;az network application-gateway waf-policy policy-setting update&lt;/code&gt; rewrites the policy settings. Microsoft warns that omitting &lt;code&gt;--request-body-check&lt;/code&gt; silently resets the setting to &lt;code&gt;false&lt;/code&gt;. Supply the current value when switching modes, then read the policy back and verify it. &lt;a href="https://learn.microsoft.com/en-us/troubleshoot/azure/application-gateway/troubleshoot-waf-blocking-legitimate-requests-403#resolution-c-temporarily-switch-to-detection-mode"&gt;The warning and corrected commands appear in Microsoft’s current troubleshooting procedure&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;For a policy that already inspects request bodies:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;az&lt;span class="w"&gt; &lt;/span&gt;network&lt;span class="w"&gt; &lt;/span&gt;application-gateway&lt;span class="w"&gt; &lt;/span&gt;waf-policy&lt;span class="w"&gt; &lt;/span&gt;policy-setting&lt;span class="w"&gt; &lt;/span&gt;update&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;--policy-name&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="nv"&gt;$WAF_POLICY_NAME&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;--resource-group&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="nv"&gt;$RESOURCE_GROUP&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;--state&lt;span class="w"&gt; &lt;/span&gt;Enabled&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;--mode&lt;span class="w"&gt; &lt;/span&gt;Detection&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;--request-body-check&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Use the value returned by the first command.&lt;/p&gt;
&lt;h2&gt;Send the firewall log to Log Analytics&lt;/h2&gt;
&lt;p&gt;Application Gateway produces access and firewall logs through Azure Monitor. Microsoft recommends the resource-specific Log Analytics tables for new diagnostic settings. WAF events then appear in &lt;code&gt;AGWFirewallLogs&lt;/code&gt;; the older Azure Diagnostics mode writes them to &lt;code&gt;AzureDiagnostics&lt;/code&gt;. &lt;a href="https://learn.microsoft.com/en-us/azure/application-gateway/application-gateway-diagnostics"&gt;Microsoft explains both collection modes and recommends the resource-specific tables&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Check which table receives your data before borrowing a query from another subscription.&lt;/p&gt;
&lt;p&gt;For a resource-specific table, start here:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;AGWFirewallLogs&lt;/span&gt;
&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;where&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;TimeGenerated&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ago&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;where&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Action&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Detected&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Matched&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;summarize&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;Events&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;count&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;Requests&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;dcount&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;TransactionId&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;Paths&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;make_set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;RequestUri&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="k"&gt;by&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;RuleId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Message&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;PolicyScope&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;PolicyScopeName&lt;/span&gt;
&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;order&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;by&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Events&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;desc&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;For a workspace using the older shared table:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;AzureDiagnostics&lt;/span&gt;
&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;where&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ResourceType&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;==&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;APPLICATIONGATEWAYS&amp;quot;&lt;/span&gt;
&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;where&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Category&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;==&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;ApplicationGatewayFirewallLog&amp;quot;&lt;/span&gt;
&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;where&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;action_s&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Detected&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Matched&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;summarize&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;Events&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;count&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;Requests&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;dcount&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;transactionId_s&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;Paths&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;make_set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;requestUri_s&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="k"&gt;by&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ruleId_s&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ruleGroup_s&lt;/span&gt;
&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;order&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;by&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Events&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;desc&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The current &lt;a href="https://learn.microsoft.com/en-us/azure/azure-monitor/reference/tables/agwfirewalllogs"&gt;&lt;code&gt;AGWFirewallLogs&lt;/code&gt; schema&lt;/a&gt; records the policy ID, policy scope and transaction ID. The transaction ID joins several rule events produced by one request.&lt;/p&gt;
&lt;p&gt;Open the highest-volume group first. Inspect several transactions and compare each rule message with the input the application expects.&lt;/p&gt;
&lt;h2&gt;Find the field that caused the match&lt;/h2&gt;
&lt;p&gt;Suppose rule &lt;code&gt;942100&lt;/code&gt; appears on &lt;code&gt;POST /api/messages&lt;/code&gt;. The endpoint accepts customer support text, and messages containing database errors trigger the SQL injection rule.&lt;/p&gt;
&lt;p&gt;The &lt;a href="/blog/how-to-tune-your-waf/"&gt;general WAF tuning guide&lt;/a&gt; explains how to classify the match. The Azure log supplies the rule, field and policy.&lt;/p&gt;
&lt;p&gt;Confirm four things before adding an exception:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;the same field causes the repeated matches;&lt;/li&gt;
&lt;li&gt;the application expects free text in that field;&lt;/li&gt;
&lt;li&gt;the requests complete normally in Detection mode;&lt;/li&gt;
&lt;li&gt;other fields on the endpoint still need SQL injection inspection.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The development team supplies the application context behind the WAF event. Ask how the field is parsed, validated, stored and rendered. Keep the request examples needed for the investigation, then remove any customer content from the exception record.&lt;/p&gt;
&lt;h2&gt;Exclude one field from one rule&lt;/h2&gt;
&lt;p&gt;Azure exclusion lists remove selected request attributes from managed-rule inspection while the WAF evaluates the rest of the request. Application Gateway v2 can exclude request headers, cookies, form fields, JSON entities and query-string arguments. Exclusions can apply globally or to selected managed rules. &lt;a href="https://learn.microsoft.com/en-us/azure/web-application-firewall/ag/application-gateway-waf-configuration"&gt;Microsoft’s exclusion-list guide describes the supported fields and per-rule configuration&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;For the message example, select &lt;code&gt;RequestArgValues&lt;/code&gt; with the selector &lt;code&gt;message&lt;/code&gt;, then limit the exclusion to rule &lt;code&gt;942100&lt;/code&gt; in the deployed CRS or DRS version. Replay the original request and a second request that places SQL injection text in another field. The support message should pass. The second field should still trigger the rule.&lt;/p&gt;
&lt;p&gt;Azure now skips &lt;code&gt;message&lt;/code&gt; for rule &lt;code&gt;942100&lt;/code&gt; and inspects the other request fields.&lt;/p&gt;
&lt;p&gt;Per-rule exclusions require the next-generation WAF engine with CRS 3.2, DRS 2.1 or a later ruleset. Microsoft currently recommends DRS 2.2. A global exclusion applies across the web application covered by the policy, so reserve it for a field that has the same meaning everywhere. &lt;a href="https://learn.microsoft.com/en-us/azure/web-application-firewall/ag/application-gateway-waf-configuration"&gt;Microsoft lists these version requirements and exclusion behaviour in the Application Gateway WAF documentation&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Give one site or path its own policy&lt;/h2&gt;
&lt;p&gt;A policy-level exclusion may cover more applications than the exception requires.&lt;/p&gt;
&lt;p&gt;Application Gateway can associate WAF policies globally, with a listener, or with a path-based rule. The most specific policy takes precedence. A listener policy can therefore tune one hostname, while a path policy can tune one URL area. &lt;a href="https://learn.microsoft.com/en-us/azure/web-application-firewall/ag/per-site-policies"&gt;Microsoft documents global, per-site and per-URI policy associations&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Use that layout when &lt;code&gt;message&lt;/code&gt; is free text on &lt;code&gt;/api/messages&lt;/code&gt; and a structured identifier elsewhere. Put the exclusion in the policy attached to the relevant path. Other listeners and paths keep their existing policy.&lt;/p&gt;
&lt;p&gt;Record the association alongside the exception. A future routing change can move traffic under a different policy without changing the exception itself.&lt;/p&gt;
&lt;h2&gt;Use request exceptions to skip a rule&lt;/h2&gt;
&lt;p&gt;Azure Application Gateway WAF also has request exceptions. They match a request attribute such as a URI, header or client address, then bypass a selected rule, rule group or ruleset for the matching request.&lt;/p&gt;
&lt;p&gt;Use a request exception when one rule cannot inspect any part of a known request safely. The selected rule stops evaluating the matching request, so describe the inspection removed and limit the exception to that rule where possible.&lt;/p&gt;
&lt;p&gt;As of July 2026, Application Gateway WAF request exceptions are in preview. They require Application Gateway v2 and the next-generation engine with CRS 3.2, DRS 2.1 or later. Each WAF policy supports up to 60 exceptions, subject to gateway and per-exception limits. Confirm availability, deployment tooling and support expectations before using them in production. &lt;a href="https://learn.microsoft.com/en-us/azure/web-application-firewall/ag/application-gateway-exceptions"&gt;Microsoft publishes the current status, supported scopes and limits on the request-exceptions page&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;An Allow rule bypasses the managed WAF&lt;/h2&gt;
&lt;p&gt;When that rule matches, Azure skips the managed DRS, CRS and Bot Protection rulesets for the request. HTTP DDoS rules still run. &lt;a href="https://learn.microsoft.com/en-us/azure/web-application-firewall/ag/application-gateway-exceptions#custom-rule-with-an-allow-action"&gt;Microsoft documents the exact consequence of a custom Allow action&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Reserve an &lt;code&gt;Allow&lt;/code&gt; rule for a tightly defined, trusted integration. Every matching request bypasses DRS, CRS and Bot Protection, including requests sent after an allowed client is compromised.&lt;/p&gt;
&lt;p&gt;Write the trust assumption into the rule description and the exception register. Include the owner, source, listener or path, expiry or review date, and the protections that remain.&lt;/p&gt;
&lt;h2&gt;Return to Prevention mode&lt;/h2&gt;
&lt;p&gt;Run the Detection policy until ordinary traffic and important manual flows produce no unexplained matches. Include login, password reset, checkout, file upload, API writes, administration and scheduled integrations.&lt;/p&gt;
&lt;p&gt;Then:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;save the current policy settings;&lt;/li&gt;
&lt;li&gt;change the mode to Prevention while preserving &lt;code&gt;requestBodyCheck&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;read the policy back;&lt;/li&gt;
&lt;li&gt;replay the requests used during tuning;&lt;/li&gt;
&lt;li&gt;monitor &lt;code&gt;Blocked&lt;/code&gt; events and 403 responses;&lt;/li&gt;
&lt;li&gt;keep a quick rollback procedure ready.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Enable Prevention in stages when separate listeners or applications have different risk. The first application may be clean while a monthly import on the second has never appeared in the logs.&lt;/p&gt;
&lt;p&gt;Recheck the same Log Analytics groups after application releases and managed-ruleset upgrades. A new field, content type or route changes what the WAF sees. Record the request, excluded field and owning policy for every exception.&lt;/p&gt;</content><category term="Application Security"></category><category term="WAF"></category><category term="Azure"></category><category term="Application Gateway"></category><category term="Application Security"></category><category term="False Positives"></category><category term="WAF Tuning"></category></entry><entry><title>How to Tune AWS WAF with Count, Labels and Rule Priority</title><link href="https://www.peakhour.io/blog/how-to-tune-aws-waf/" rel="alternate"></link><published>2026-07-29T09:15:00+10:00</published><updated>2026-07-29T09:15:00+10:00</updated><author><name>AC</name></author><id>tag:www.peakhour.io,2026-07-29:/blog/how-to-tune-aws-waf/</id><summary type="html">&lt;p&gt;Use Count overrides, managed-rule labels and rule priority to fix AWS WAF false positives while keeping the rest of the managed rule group in force.&lt;/p&gt;</summary><content type="html">&lt;p&gt;An AWS managed rule blocks a real customer. You find the request, change the entire rule group to Count and promise to revisit it next week.&lt;/p&gt;
&lt;p&gt;Six months later, it is still counting.&lt;/p&gt;
&lt;p&gt;AWS WAF lets you change one rule inside a managed rule group to Count, keep the label it adds to matching requests and add a blocking rule immediately after the group. The other managed rules keep their configured actions throughout the investigation.&lt;/p&gt;
&lt;p&gt;The &lt;a href="/blog/how-to-tune-your-waf/"&gt;general WAF tuning guide&lt;/a&gt; explains how to classify the request and document the exception. The AWS configuration begins with the managed rule that matched.&lt;/p&gt;
&lt;h2&gt;Put the rule in Count&lt;/h2&gt;
&lt;p&gt;Start with the named rule that caused the false positive.&lt;/p&gt;
&lt;p&gt;AWS WAF lets you apply a rule action override to an individual rule inside a managed rule group. Set that rule to &lt;code&gt;Count&lt;/code&gt;. The override changes how that rule handles matches in your web ACL; it leaves the managed rule group itself unchanged. AWS describes Count as a non-terminating action, so evaluation continues through the rules that follow. &lt;a href="https://docs.aws.amazon.com/waf/latest/developerguide/web-acl-rule-group-override-options.html"&gt;AWS documents individual rule action overrides and the behaviour of Count&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Use the individual override for this job. The older rule-group return override changes the result returned by the group after its internal evaluation. AWS recommends rule action overrides when you want the rules inside the group to count their matches.&lt;/p&gt;
&lt;p&gt;Keep the change small:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Record the managed rule group, version and rule name.&lt;/li&gt;
&lt;li&gt;Change that rule to Count.&lt;/li&gt;
&lt;li&gt;Leave the remaining rules at their current actions.&lt;/li&gt;
&lt;li&gt;Reproduce the legitimate request.&lt;/li&gt;
&lt;li&gt;Check the Count match and the label added by the managed rule.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;AWS Managed Rules add labels to matching requests, and later rules in the same web ACL can inspect those labels. &lt;a href="https://docs.aws.amazon.com/waf/latest/developerguide/waf-labels.html"&gt;AWS lists labels as the supported way to create exceptions for managed rule groups&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Read the request that matched&lt;/h2&gt;
&lt;p&gt;The sampled-requests view supports a quick investigation. Full WAF logs provide the history needed to compare matches across users, hosts or endpoints.&lt;/p&gt;
&lt;p&gt;With the rule set to Count, look for:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;the managed rule name;&lt;/li&gt;
&lt;li&gt;its fully qualified label;&lt;/li&gt;
&lt;li&gt;host, URI and method;&lt;/li&gt;
&lt;li&gt;the matching request component, when AWS supplies it;&lt;/li&gt;
&lt;li&gt;the final action taken on the request;&lt;/li&gt;
&lt;li&gt;the number of clients and routes producing the same match.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;AWS records Count matches from managed rule groups under &lt;code&gt;ruleGroupList[].nonTerminatingMatchingRules&lt;/code&gt;. Labels added during evaluation appear in the top-level &lt;code&gt;labels&lt;/code&gt; field. AWS populates &lt;code&gt;ruleMatchDetails&lt;/code&gt; for SQL injection and cross-site scripting match statements. Other managed detections may provide less detail. &lt;a href="https://docs.aws.amazon.com/waf/latest/developerguide/logging-fields.html"&gt;The AWS WAF log-field reference describes these fields and their limits&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Treat request data as customer data. Query strings, headers and bodies may contain credentials or personal information. Logging redaction applies to the configured log destination. Web ACL data protection masks matching data before it reaches either logs or sampled requests. Disable sampled requests when they could expose a field that data protection does not cover. &lt;a href="https://docs.aws.amazon.com/waf/latest/developerguide/waf-data-protection-and-logging.html"&gt;AWS explains the distinction in its logging and data-protection guidance&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Group repeated matches by rule name, label, host, path and method. Ask the developer who owns the route what the field means and how the application uses it. Investigate a JSON field containing source code separately from a malformed body that the application accepts.&lt;/p&gt;
&lt;h2&gt;Block the managed-rule label in the next rule&lt;/h2&gt;
&lt;p&gt;Suppose a managed SQL injection rule repeatedly matches legitimate messages sent to:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;POST api.example.com/v1/messages
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The managed rule now runs in Count and adds its documented label. Add a custom rule after the managed rule group. That custom rule should match:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;the managed-rule label
AND NOT (
    host = api.example.com
    AND path = /v1/messages
    AND method = POST
)
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Give the custom rule a Block action.&lt;/p&gt;
&lt;p&gt;Requests that match the managed rule continue to be blocked everywhere except the route you reviewed. On that route, this particular managed-rule match can pass to the rules that follow and eventually to the web ACL's default action.&lt;/p&gt;
&lt;p&gt;The order creates the behaviour. AWS WAF evaluates rules from the lowest numeric priority upwards. A later rule can see a label only after the managed rule has added it. Put the managed rule group first and the label-matching rule directly after it. &lt;a href="https://docs.aws.amazon.com/waf/latest/developerguide/web-acl-processing-order.html"&gt;AWS documents both priority order&lt;/a&gt; and &lt;a href="https://docs.aws.amazon.com/waf/latest/developerguide/waf-rule-label-overview.html"&gt;when labels become available to later rules&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Check the rules that come before the group as well. An earlier &lt;code&gt;Allow&lt;/code&gt; or &lt;code&gt;Block&lt;/code&gt; action ends evaluation before the managed rule runs. AWS documents &lt;code&gt;Allow&lt;/code&gt; and &lt;code&gt;Block&lt;/code&gt; as terminating actions, while Count continues to later rules. &lt;a href="https://docs.aws.amazon.com/waf/latest/developerguide/web-acl-rule-actions.html"&gt;The rule-action guide explains how actions and priority interact&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;The exception covers every field on the exempt route&lt;/h2&gt;
&lt;p&gt;The label tells you that the managed rule matched. AWS applies the later rule action to that match for the whole request.&lt;/p&gt;
&lt;p&gt;On the exempt route, the later Block rule ignores that label regardless of which request field caused the managed-rule match. A different field can trigger the same rule and receive the same exception.&lt;/p&gt;
&lt;p&gt;Keep the condition tied to the smallest stable part of the application:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;exact host;&lt;/li&gt;
&lt;li&gt;exact path or a reviewed path family;&lt;/li&gt;
&lt;li&gt;HTTP method;&lt;/li&gt;
&lt;li&gt;another server-controlled distinction, when one exists.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A query parameter, header or cookie supplied by the client can narrow which requests match the exception. Confirm the matched request component from the event investigation.&lt;/p&gt;
&lt;p&gt;AWS also supports a scope-down statement on a managed rule group. The statement selects which requests enter the group for inspection; every other request bypasses the whole group. Reserve that option for traffic the whole rule group should exclude. AWS describes this evaluation behaviour in its &lt;a href="https://docs.aws.amazon.com/waf/latest/developerguide/waf-rule-scope-down-statements.html"&gt;scope-down statement documentation&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Test the complete rule path&lt;/h2&gt;
&lt;p&gt;Replay this test set:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;the original legitimate request on the exempt route;&lt;/li&gt;
&lt;li&gt;the same harmless input on another route;&lt;/li&gt;
&lt;li&gt;a safe security test that triggers the managed rule on the exempt route;&lt;/li&gt;
&lt;li&gt;the same test on another route;&lt;/li&gt;
&lt;li&gt;requests that match earlier terminating rules;&lt;/li&gt;
&lt;li&gt;normal requests that should pass unchanged.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Then check the WAF logs. Confirm that the managed rule still counts and labels the request, the later rule blocks the label outside the exception, and the final action is the one you intended.&lt;/p&gt;
&lt;p&gt;Run the configuration against production traffic in Count while you establish its normal match rate. AWS recommends monitoring metrics, sampled requests and logs, then repeating the tuning cycle until the web ACL behaves as intended. AWS also recommends completing the final stage with production traffic. &lt;a href="https://docs.aws.amazon.com/waf/latest/developerguide/web-acl-testing-activities.html"&gt;Its testing guidance lays out that process&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Restore enforcement&lt;/h2&gt;
&lt;p&gt;The label rule can remain as the enforcement point when the application genuinely needs a route-specific exception. Document:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;the managed rule group and version;&lt;/li&gt;
&lt;li&gt;the original rule action;&lt;/li&gt;
&lt;li&gt;the overridden rule name and label;&lt;/li&gt;
&lt;li&gt;the hosts, paths and methods allowed through;&lt;/li&gt;
&lt;li&gt;the application owner who confirmed the behaviour;&lt;/li&gt;
&lt;li&gt;the requests used to test the change;&lt;/li&gt;
&lt;li&gt;the logs and metrics that will reveal a regression;&lt;/li&gt;
&lt;li&gt;the next review date.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If the development team removes the input that caused the false positive, remove the custom exception and return the managed rule to its original action. Test that change in Count first, then restore enforcement.&lt;/p&gt;
&lt;p&gt;Review the exception after managed rule group updates and application releases. AWS managed groups can use versioned releases, and the label, traffic shape or rule behaviour you investigated may change with the deployed version. &lt;a href="https://docs.aws.amazon.com/waf/latest/developerguide/aws-managed-rule-groups-list.html"&gt;AWS publishes the available managed groups, their rules and their labels&lt;/a&gt;.&lt;/p&gt;</content><category term="Application Security"></category><category term="AWS WAF"></category><category term="WAF"></category><category term="Application Security"></category><category term="Managed Rules"></category><category term="False Positives"></category><category term="WAF Tuning"></category></entry><entry><title>How to Tune Coraza on Caddy</title><link href="https://www.peakhour.io/blog/how-to-tune-coraza-waf/" rel="alternate"></link><published>2026-07-29T09:00:00+10:00</published><updated>2026-07-29T09:00:00+10:00</updated><author><name>AC</name></author><id>tag:www.peakhour.io,2026-07-29:/blog/how-to-tune-coraza-waf/</id><summary type="html">&lt;p&gt;Run Coraza and OWASP CRS on Caddy in DetectionOnly, read the audit log and limit each exclusion to the field and route that need it.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Coraza sits inside another server. The connector presents each request to Coraza, Coraza runs the rules and the connector applies the result.&lt;/p&gt;
&lt;p&gt;Handler order decides whether Coraza sees the request in time. Body handling decides which fields the rules can inspect. The logging phase decides what you can investigate later.&lt;/p&gt;
&lt;p&gt;The example deployment runs Coraza as Caddy middleware with OWASP Core Rule Set. The same CRS tuning principles apply to other Coraza connectors. Their installation, request handling and logging need their own tests.&lt;/p&gt;
&lt;h2&gt;Put Coraza in the request path&lt;/h2&gt;
&lt;p&gt;The official Caddy module is compiled into Caddy:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;xcaddy&lt;span class="w"&gt; &lt;/span&gt;build&lt;span class="w"&gt; &lt;/span&gt;--with&lt;span class="w"&gt; &lt;/span&gt;github.com/corazawaf/coraza-caddy/v2
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The module documentation requires &lt;code&gt;order coraza_waf first&lt;/code&gt; in the global options block, which places Coraza at the start of Caddy's HTTP handler order.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;order&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;coraza_waf&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;first&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;api&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;example&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;coraza_waf&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;load_owasp_crs&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;directives&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;`&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="n"&gt;Include&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="n"&gt;coraza&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;conf&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;recommended&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="n"&gt;SecRuleEngine&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;DetectionOnly&lt;/span&gt;

&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="n"&gt;SecAuditEngine&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;RelevantOnly&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="n"&gt;SecAuditLog&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nb"&gt;log&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;coraza&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;audit&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;log&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="n"&gt;SecAuditLogFormat&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;JSON&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="n"&gt;SecAuditLogType&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Serial&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="n"&gt;SecAuditLogParts&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ABFHZ&lt;/span&gt;

&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="n"&gt;Include&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="n"&gt;crs&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;setup&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;conf&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;example&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="n"&gt;Include&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="n"&gt;owasp_crs&lt;/span&gt;&lt;span class="o"&gt;/*.&lt;/span&gt;&lt;span class="n"&gt;conf&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="err"&gt;`&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;reverse_proxy&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;8080&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The Caddy connector's &lt;a href="https://github.com/corazawaf/coraza-caddy#using-owasp-core-ruleset"&gt;&lt;code&gt;load_owasp_crs&lt;/code&gt; option exposes the embedded Coraza CRS files&lt;/a&gt;. The three &lt;code&gt;Include&lt;/code&gt; lines then load the recommended Coraza configuration, the CRS setup and the rules.&lt;/p&gt;
&lt;p&gt;Coraza also supports &lt;a href="https://www.coraza.io/docs/tutorials/coreruleset/"&gt;CRS files installed on disk&lt;/a&gt;. A file-based installation loads the Coraza configuration first, &lt;code&gt;crs-setup.conf&lt;/code&gt; second and the CRS rule files last. Choose one source for CRS and record its version so you can compare rule changes during an upgrade.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.coraza.io/docs/seclang/directives/#secruleengine"&gt;&lt;code&gt;SecRuleEngine DetectionOnly&lt;/code&gt;&lt;/a&gt; runs the rules and suppresses disruptive actions such as &lt;code&gt;deny&lt;/code&gt;, &lt;code&gt;drop&lt;/code&gt; and &lt;code&gt;redirect&lt;/code&gt;. Legitimate requests can complete while you collect matches. Coraza sets &lt;a href="https://www.coraza.io/docs/seclang/directives/#secrequestbodylimitaction"&gt;&lt;code&gt;SecRequestBodyLimitAction&lt;/code&gt; to &lt;code&gt;ProcessPartial&lt;/code&gt;&lt;/a&gt; in this mode. Watch &lt;a href="https://www.coraza.io/docs/seclang/variables/#inbound_data_error"&gt;&lt;code&gt;INBOUND_DATA_ERROR&lt;/code&gt;&lt;/a&gt; because part of an oversized body may remain uninspected.&lt;/p&gt;
&lt;p&gt;Test the Caddy configuration before reloading it. Then send a safe request that triggers a known CRS rule through the public listener. Confirm that the Coraza event appears and the request reaches the upstream in &lt;code&gt;DetectionOnly&lt;/code&gt;.&lt;/p&gt;
&lt;h2&gt;Configure the Coraza audit log&lt;/h2&gt;
&lt;p&gt;The Caddy access log tells you that a request happened. The Coraza audit log tells you which WAF rule matched.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.coraza.io/docs/seclang/directives/#secauditengine"&gt;&lt;code&gt;SecAuditEngine RelevantOnly&lt;/code&gt;&lt;/a&gt; records transactions that produced a warning or error, along with response statuses selected by &lt;code&gt;SecAuditLogRelevantStatus&lt;/code&gt;. CRS rules normally carry the &lt;code&gt;auditlog&lt;/code&gt; action, so their matches can enter the audit log.&lt;/p&gt;
&lt;p&gt;The example uses &lt;a href="https://www.coraza.io/docs/seclang/directives/#secauditlogformat"&gt;Coraza's JSON audit format&lt;/a&gt; and leaves request-body part &lt;code&gt;C&lt;/code&gt; out of &lt;code&gt;SecAuditLogParts&lt;/code&gt;. Request bodies often contain passwords, personal information and customer text. Add body logging only for a controlled investigation, then remove it.&lt;/p&gt;
&lt;p&gt;The serial audit log in the example is convenient during initial tuning. &lt;a href="https://www.coraza.io/docs/seclang/directives/#secauditlogtype"&gt;Coraza warns that serial logging can slow the server&lt;/a&gt; because transactions share one file.&lt;/p&gt;
&lt;p&gt;Concurrent, HTTPS and syslog outputs suit deployments that need another destination. Send the records to a protected log system with rotation, retention limits and restricted access.&lt;/p&gt;
&lt;p&gt;Start each investigation with these fields:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;request time and transaction ID;&lt;/li&gt;
&lt;li&gt;hostname, method and URL;&lt;/li&gt;
&lt;li&gt;rule ID and message;&lt;/li&gt;
&lt;li&gt;CRS tags such as &lt;code&gt;attack-sqli&lt;/code&gt; or &lt;code&gt;attack-xss&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;matched variable name;&lt;/li&gt;
&lt;li&gt;matched data;&lt;/li&gt;
&lt;li&gt;request and response status.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The variable name identifies the input to investigate. &lt;code&gt;ARGS:message&lt;/code&gt; identifies an application field. &lt;code&gt;REQUEST_COOKIES:campaign&lt;/code&gt; identifies a cookie.&lt;/p&gt;
&lt;p&gt;Handle matched data as customer data. Keep enough to reproduce the result, then retain the rule ID, field name and explanation in the permanent exception record.&lt;/p&gt;
&lt;h2&gt;Check what Coraza parsed&lt;/h2&gt;
&lt;p&gt;CRS can inspect only the fields Coraza extracted from the request.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.coraza.io/docs/seclang/directives/#secrequestbodyaccess"&gt;&lt;code&gt;SecRequestBodyAccess On&lt;/code&gt;&lt;/a&gt; enables body buffering and processing. The selected processor determines which collections phase 2 rules can inspect. URL-encoded forms, multipart forms, JSON and XML produce different variables.&lt;/p&gt;
&lt;p&gt;For an unexpected body match, record:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;the request &lt;code&gt;Content-Type&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;REQBODY_PROCESSOR&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;REQBODY_ERROR&lt;/code&gt; and &lt;code&gt;REQBODY_ERROR_MSG&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;INBOUND_DATA_ERROR&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;the matched variable name.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="https://www.coraza.io/docs/reference/body-processing/"&gt;Coraza's current body-processing documentation&lt;/a&gt; shows processor selection by content type. The &lt;a href="https://www.coraza.io/docs/seclang/actions/#ctl"&gt;&lt;code&gt;ctl:requestBodyProcessor&lt;/code&gt; reference&lt;/a&gt; still describes explicit phase 1 selection for JSON and XML. Check &lt;code&gt;REQBODY_PROCESSOR&lt;/code&gt; on the Coraza version and connector you run, then select the processor explicitly when the expected processor is missing.&lt;/p&gt;
&lt;p&gt;A parsing error deserves its own investigation. Coraza documents the risk plainly: the application may accept a body that Coraza's parser rejected. Compare the application's parser with Coraza using the same bytes. Fix a wrong content type or processor selection before writing a rule exclusion.&lt;/p&gt;
&lt;p&gt;Body limits need the same care. &lt;a href="https://www.coraza.io/docs/seclang/directives/#secrequestbodylimitaction"&gt;&lt;code&gt;SecRequestBodyLimitAction ProcessPartial&lt;/code&gt;&lt;/a&gt; inspects the bytes that fit within the limit and sets &lt;a href="https://www.coraza.io/docs/seclang/variables/#inbound_data_error"&gt;&lt;code&gt;INBOUND_DATA_ERROR&lt;/code&gt;&lt;/a&gt;. Raise a limit when the application legitimately accepts larger bodies and the deployment can buffer them safely. Keep an alert for the limit condition so partial inspection remains visible.&lt;/p&gt;
&lt;h2&gt;Load exclusions in the correct order&lt;/h2&gt;
&lt;p&gt;CRS provides two places for local exclusions.&lt;/p&gt;
&lt;p&gt;Use the &lt;a href="/blog/how-to-tune-your-waf/"&gt;general WAF tuning guide&lt;/a&gt; to classify the match and define the exception. Load that exception according to the CRS rule order below.&lt;/p&gt;
&lt;p&gt;A runtime exclusion runs for matching transactions. Load it before CRS so it can change the transaction before the affected rule executes. CRS includes &lt;code&gt;REQUEST-900-EXCLUSION-RULES-BEFORE-CRS.conf.example&lt;/code&gt; for this purpose.&lt;/p&gt;
&lt;p&gt;A configure-time exclusion changes a loaded rule. Load it after CRS so the rule already exists. CRS includes &lt;code&gt;RESPONSE-999-EXCLUSION-RULES-AFTER-CRS.conf.example&lt;/code&gt; for these changes.&lt;/p&gt;
&lt;p&gt;Keep both files outside the CRS distribution. An upgrade can then replace CRS without replacing your application decisions.&lt;/p&gt;
&lt;p&gt;The order in a Caddy deployment looks like this:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;directives&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;`&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;Include&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;@coraza&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;conf&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;recommended&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;SecRuleEngine&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;DetectionOnly&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;Include&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;@crs&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;setup&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;conf&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;example&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;Include&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;etc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;coraza&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;REQUEST&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;900&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;EXCLUSION&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;RULES&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="k"&gt;BEFORE&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;CRS&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;conf&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;Include&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;@owasp_crs&lt;/span&gt;&lt;span class="cm"&gt;/*.conf&lt;/span&gt;
&lt;span class="cm"&gt;    Include /etc/coraza/RESPONSE-999-EXCLUSION-RULES-AFTER-CRS.conf&lt;/span&gt;
&lt;span class="cm"&gt;`&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;With &lt;code&gt;load_owasp_crs&lt;/code&gt; enabled, the &lt;a href="https://github.com/corazawaf/coraza-caddy/blob/82f09c076b75f0096b8c9ebc58e1ce53e2947198/coraza.go#L106-L108"&gt;Caddy connector merges the embedded CRS filesystem with the operating-system filesystem&lt;/a&gt;. The configuration can include embedded &lt;code&gt;@&lt;/code&gt; files and local &lt;code&gt;/etc/coraza&lt;/code&gt; exclusion files.&lt;/p&gt;
&lt;p&gt;The &lt;a href="https://coreruleset.org/docs/2-how-crs-works/2-3-false-positives-and-tuning/"&gt;CRS tuning guide explains the before-and-after placement&lt;/a&gt; and the available exclusion actions.&lt;/p&gt;
&lt;h2&gt;Exclude the field that caused the match&lt;/h2&gt;
&lt;p&gt;Suppose &lt;code&gt;POST /api/jobs&lt;/code&gt; accepts a JSON array. Rule 932125 repeatedly matches legitimate text in each &lt;code&gt;jobDescription&lt;/code&gt; field. In this example, the audit log reports variable names such as &lt;code&gt;ARGS:json.0.jobdescription&lt;/code&gt; and &lt;code&gt;ARGS:json.1.jobdescription&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Coraza accepts a regular expression for the collection key in &lt;code&gt;ctl:ruleRemoveTargetById&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c"&gt;# REQUEST-900-EXCLUSION-RULES-BEFORE-CRS.conf&lt;/span&gt;
&lt;span class="c"&gt;# Local rule ID 10010 must be unique in this deployment.&lt;/span&gt;
&lt;span class="nb"&gt;SecRule&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;REQUEST_FILENAME&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;@streq /api/jobs&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;\
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;id:10010,phase:1,pass,nolog,t:none,chain&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nb"&gt;SecRule&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;REQUEST_METHOD&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;@streq POST&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;\
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;t:none,ctl:ruleRemoveTargetById=932125;ARGS:/^json\.\d+\.jobdescription$/&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;This local rule runs only for &lt;code&gt;POST /api/jobs&lt;/code&gt;. Rule 932125 continues to inspect every other field in those requests and every field on other routes.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;/pattern/&lt;/code&gt; form is a Coraza feature. The &lt;a href="https://www.coraza.io/docs/seclang/actions/#ctl"&gt;Coraza action reference&lt;/a&gt; states that collection-key matching is case-insensitive because Coraza lowercases variable names. Use an exact key such as &lt;code&gt;ARGS:message&lt;/code&gt; when the application has one fixed field. A regular expression earns its place when the application produces a documented family of field names.&lt;/p&gt;
&lt;p&gt;A field can trigger several rules in one attack class. Coraza also supports &lt;code&gt;ctl:ruleRemoveTargetByTag&lt;/code&gt;, for example:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nb"&gt;ctl&lt;/span&gt;:ruleRemoveTargetByTag=attack-sqli;ARGS:message
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The exception removes the named field from every rule carrying the literal &lt;code&gt;attack-sqli&lt;/code&gt; tag. Record that scope and confirm that the application protects the field through parameterised queries and suitable validation.&lt;/p&gt;
&lt;p&gt;Configure-time exclusions suit fields with the same meaning everywhere:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c"&gt;# RESPONSE-999-EXCLUSION-RULES-AFTER-CRS.conf&lt;/span&gt;
&lt;span class="nb"&gt;SecRuleUpdateTargetById&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;942100&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;!REQUEST_COOKIES:campaign&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;This removes one named cookie from rule 942100 throughout the configuration. A route-specific runtime exclusion is the better starting point for an application field.&lt;/p&gt;
&lt;h2&gt;Check where a chained rule reads the field&lt;/h2&gt;
&lt;p&gt;Some CRS detections are chained rules. The first rule starts the chain and later rules add conditions.&lt;/p&gt;
&lt;p&gt;The &lt;a href="https://coreruleset.org/docs/2-how-crs-works/2-3-false-positives-and-tuning/"&gt;CRS tuning documentation&lt;/a&gt; states that target exclusions by ID affect only the first rule in a chain. An exclusion will have no effect when the field is inspected by a later chain member. Removing the complete rule may be the available answer.&lt;/p&gt;
&lt;p&gt;Find the rule in the CRS version you deployed. Check where the target appears in the chain. Then replay the request against that exact version. The rule source and replay result settle the question.&lt;/p&gt;
&lt;h2&gt;Replay the request before and after&lt;/h2&gt;
&lt;p&gt;Save the legitimate request that produced the false positive. Preserve its method, path, query string, content type, important headers and body bytes. Replace credentials and personal data with values that reproduce the same match.&lt;/p&gt;
&lt;p&gt;For example:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;curl&lt;span class="w"&gt; &lt;/span&gt;--silent&lt;span class="w"&gt; &lt;/span&gt;--show-error&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;--dump-header&lt;span class="w"&gt; &lt;/span&gt;before.headers&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;--output&lt;span class="w"&gt; &lt;/span&gt;before.body&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;--request&lt;span class="w"&gt; &lt;/span&gt;POST&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;--header&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Content-Type: application/json&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;--data-binary&lt;span class="w"&gt; &lt;/span&gt;@false-positive.json&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;https://api.example.com/api/jobs
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Run it once in &lt;code&gt;DetectionOnly&lt;/code&gt; before adding the exclusion. Confirm that:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;the application returns its normal response;&lt;/li&gt;
&lt;li&gt;the audit log contains the expected rule ID;&lt;/li&gt;
&lt;li&gt;the log names the expected field;&lt;/li&gt;
&lt;li&gt;the request body has no parser or size error.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Add the exclusion, validate the Caddy configuration and reload it. Send the same request bytes again:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;curl&lt;span class="w"&gt; &lt;/span&gt;--silent&lt;span class="w"&gt; &lt;/span&gt;--show-error&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;--dump-header&lt;span class="w"&gt; &lt;/span&gt;after.headers&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;--output&lt;span class="w"&gt; &lt;/span&gt;after.body&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;--request&lt;span class="w"&gt; &lt;/span&gt;POST&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;--header&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Content-Type: application/json&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;--data-binary&lt;span class="w"&gt; &lt;/span&gt;@false-positive.json&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;https://api.example.com/api/jobs
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The application response should stay the same. The false-positive match should disappear for the excluded field.&lt;/p&gt;
&lt;p&gt;Now send a control request that places a known CRS test value in another field on the same route. Rule 932125 should still inspect that field. Send the original test value to another route as well. The rule should still inspect it there.&lt;/p&gt;
&lt;p&gt;Expect these results:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;the legitimate request works;&lt;/li&gt;
&lt;li&gt;the rule still reads neighbouring fields;&lt;/li&gt;
&lt;li&gt;the rule still runs on other routes.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Keep the request fixtures in a protected test repository. Run them after Coraza, CRS, Caddy or application upgrades.&lt;/p&gt;
&lt;h2&gt;Switch Coraza from DetectionOnly to On&lt;/h2&gt;
&lt;p&gt;Switch &lt;code&gt;SecRuleEngine&lt;/code&gt; to &lt;code&gt;On&lt;/code&gt; in a staging environment after the common legitimate flows run without unexplained matches. Repeat the false-positive replay, the neighbouring-field control and the application's critical user journeys.&lt;/p&gt;
&lt;p&gt;Enable blocking for a limited production audience or hostname when the deployment allows it. Watch WAF responses, upstream errors and business transactions together. A clean audit log has little value when checkout or login has stopped working.&lt;/p&gt;
&lt;p&gt;Document every exception beside the configuration:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;who approved it;&lt;/li&gt;
&lt;li&gt;the affected hostname, method and route;&lt;/li&gt;
&lt;li&gt;the rule ID or tag;&lt;/li&gt;
&lt;li&gt;the excluded field;&lt;/li&gt;
&lt;li&gt;the request that reproduced the match;&lt;/li&gt;
&lt;li&gt;the controls that still inspect or validate the field;&lt;/li&gt;
&lt;li&gt;the date and CRS version tested.&lt;/li&gt;
&lt;/ul&gt;</content><category term="Application Security"></category><category term="Coraza"></category><category term="Caddy"></category><category term="OWASP CRS"></category><category term="WAF"></category><category term="Application Security"></category><category term="False Positives"></category><category term="WAF Tuning"></category></entry><entry><title>How Browsers Decide Whether to Use HTTP/3</title><link href="https://www.peakhour.io/blog/how-browsers-decide-to-use-http3/" rel="alternate"></link><published>2026-07-29T00:00:00+10:00</published><updated>2026-07-29T00:00:00+10:00</updated><author><name>AC</name></author><id>tag:www.peakhour.io,2026-07-29:/blog/how-browsers-decide-to-use-http3/</id><summary type="html">&lt;p&gt;HTTP/3 discovery is standardised. The decision to wait, race QUIC against TCP, remember a failure, or fall back is still browser policy.&lt;/p&gt;</summary><content type="html">&lt;p&gt;There is no HTTP/3 switch inside the TLS handshake.&lt;/p&gt;
&lt;p&gt;HTTP/1.1 and HTTP/2 both run over TCP. A browser can open TCP port 443, start TLS and use ALPN to choose between &lt;code&gt;http/1.1&lt;/code&gt; and &lt;code&gt;h2&lt;/code&gt;. HTTP/3 runs over QUIC, which uses UDP. By the time a normal TLS-over-TCP handshake begins, the browser has already chosen the wrong transport for HTTP/3.&lt;/p&gt;
&lt;p&gt;It has to learn that a QUIC endpoint exists first. Then it has to decide whether that information is worth acting on.&lt;/p&gt;
&lt;p&gt;Those are separate problems. The discovery mechanisms are covered by standards. The exact decision to wait for DNS, start TCP, race QUIC, abandon a slow attempt or remember a failure is not.&lt;/p&gt;
&lt;p&gt;That distinction explains why two browsers can visit the same site from the same network and use different HTTP versions without either one being broken.&lt;/p&gt;
&lt;h2&gt;Two ways to advertise HTTP/3&lt;/h2&gt;
&lt;p&gt;The older and more common route is an &lt;code&gt;Alt-Svc&lt;/code&gt; response header:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;Alt-Svc: h3=&amp;quot;:443&amp;quot;; ma=86400&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href="https://www.rfc-editor.org/rfc/rfc9114.html#section-3.1.1"&gt;RFC 9114, the HTTP/3 specification&lt;/a&gt;, says an origin can advertise an equivalent HTTP/3 endpoint this way. The browser receives the header over an existing HTTP/1.1 or HTTP/2 connection, stores the alternative service and may try QUIC.&lt;/p&gt;
&lt;p&gt;The catch is in the sequence. On a first visit, the browser needs an HTTP response before it sees the header. That first connection is already on TCP. A later request can use the cached HTTP/3 alternative.&lt;/p&gt;
&lt;p&gt;DNS can provide the information earlier. &lt;a href="https://www.rfc-editor.org/rfc/rfc9460.html"&gt;RFC 9460&lt;/a&gt; defines SVCB and HTTPS resource records. An HTTPS record can advertise ALPN protocols, ports, address hints and alternative endpoints:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;example.com. 300 IN HTTPS 1 . alpn=&amp;quot;h3,h2&amp;quot;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;A browser that receives this record in time can attempt HTTP/3 on the first visit. It does not need to make an HTTP/2 request just to discover that HTTP/3 exists.&lt;/p&gt;
&lt;p&gt;Neither advertisement proves that QUIC will work. UDP 443 may be blocked by a firewall, filtered by a corporate network or mishandled somewhere between the user and the edge. The certificate and authority still need to check out. The browser eventually has to test the path.&lt;/p&gt;
&lt;h2&gt;The standard stops before the interesting bit&lt;/h2&gt;
&lt;p&gt;RFC 9114 permits a client to try an advertised HTTP/3 service. If QUIC cannot be established, it recommends trying a TCP-based HTTP version. It does not set the browser's race timer or say how long a failed endpoint should remain suspect.&lt;/p&gt;
&lt;p&gt;RFC 9460 is similarly careful. It gives the client a set of service endpoints and parameters. It allows TCP and QUIC attempts when the advertised ALPN set supports both. It does not prescribe one universal ordering algorithm.&lt;/p&gt;
&lt;p&gt;So there is a standard for saying “HTTP/3 is available here”. There is no standard that says every browser must:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;wait the same amount of time for an HTTPS DNS answer;&lt;/li&gt;
&lt;li&gt;start QUIC before TCP;&lt;/li&gt;
&lt;li&gt;race both immediately;&lt;/li&gt;
&lt;li&gt;prefer the same IPv4 or IPv6 endpoint; or&lt;/li&gt;
&lt;li&gt;retry a failed QUIC path after the same interval.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Those choices belong to the implementation. They also change.&lt;/p&gt;
&lt;h2&gt;What Chromium currently does&lt;/h2&gt;
&lt;p&gt;Chromium source shows why a neat flowchart quickly becomes misleading.&lt;/p&gt;
&lt;p&gt;In its established connection path, Chromium can create separate jobs for the ordinary TCP route, a cached Alt-Svc alternative and an HTTP/3 endpoint learned through DNS. The &lt;a href="https://chromium.googlesource.com/chromium/src/+/refs/heads/main/net/http/http_stream_factory_job_controller.cc#907"&gt;HTTP stream job controller&lt;/a&gt; starts the alternative jobs and manages their competition with the main job.&lt;/p&gt;
&lt;p&gt;The Alt-Svc information is not rediscovered on every request. Chromium reads it from its stored &lt;a href="https://chromium.googlesource.com/chromium/src/+/refs/heads/main/net/http/http_stream_factory_job_controller.cc#1225"&gt;HTTP server properties&lt;/a&gt;, ignores alternatives already marked broken and can create a QUIC attempt from the remaining entry.&lt;/p&gt;
&lt;p&gt;That last part matters. If the TCP job succeeds while HTTP/3 fails, Chromium can &lt;a href="https://chromium.googlesource.com/chromium/src/+/refs/heads/main/net/http/http_stream_factory_job_controller.cc#1111"&gt;mark the alternative service as broken&lt;/a&gt;. Some failures are treated as specific to the current network and reconsidered after the default network changes. A failed QUIC attempt at the office does not have to poison HTTP/3 after the laptop moves to another network.&lt;/p&gt;
&lt;p&gt;DNS discovery is conditional too. The legacy path checks that HTTPS-record ALPN support and QUIC are enabled, that the request is HTTPS, that the connection is direct rather than proxied, and that the DNS alternative is not already marked broken. Merely publishing &lt;code&gt;alpn="h3"&lt;/code&gt; does not force Chrome to use it.&lt;/p&gt;
&lt;p&gt;Current Chromium also contains a separate &lt;a href="https://chromium.googlesource.com/chromium/src/+/refs/heads/main/net/http/http_stream_factory_job_controller.cc#787"&gt;Happy Eyeballs v3 connection-pool path&lt;/a&gt;. When that path is enabled and eligible, the request leaves the older job-controller sequence. This is a useful warning for anyone interpreting packet captures: “Chrome races these three jobs in this order” may accurately describe one build and be wrong for another.&lt;/p&gt;
&lt;p&gt;The durable conclusion is narrower. Chromium gathers candidates, uses remembered success and failure, and is prepared to let TCP and QUIC compete. The timings and plumbing are implementation details.&lt;/p&gt;
&lt;h2&gt;Firefox makes different choices&lt;/h2&gt;
&lt;p&gt;Firefox also has explicit HTTP/3 fallback policy rather than a simple protocol preference.&lt;/p&gt;
&lt;p&gt;Mozilla's current preferences enable HTTP/3 and &lt;a href="https://searchfox.org/mozilla-central/source/modules/libpref/init/StaticPrefList.yaml"&gt;fallback to HTTP/2 on error&lt;/a&gt;. Its networking code can consume Alt-Svc advertisements and use a DNS HTTPS record as an Alt-Svc-like input.&lt;/p&gt;
&lt;p&gt;That DNS path has conditions. In &lt;a href="https://searchfox.org/mozilla-central/source/netwerk/protocol/http/nsHttpChannel.cpp"&gt;&lt;code&gt;nsHttpChannel&lt;/code&gt;&lt;/a&gt;, HTTPS-record use depends on such things as the DNS strategy, proxy use, Firefox's encrypted-DNS mode and whether the current network has been judged able to resolve HTTPS records. In some circumstances Firefox waits for the record; in others it proceeds without making the request hostage to that answer.&lt;/p&gt;
&lt;p&gt;When Firefox chooses an HTTP/3 endpoint learned from DNS, &lt;a href="https://searchfox.org/mozilla-central/source/netwerk/protocol/http/nsHttpTransaction.cpp"&gt;&lt;code&gt;nsHttpTransaction&lt;/code&gt;&lt;/a&gt; has a fast-fallback path to a backup connection. After a failed HTTP/3 attempt it can also remove H3-capable SVCB candidates before retrying. If Firefox already has a usable HTTP/3 connection, the connection manager tries to dispatch work there before HTTP/2.&lt;/p&gt;
&lt;p&gt;That is a real preference, but it is not a promise that every fresh Firefox connection starts with QUIC. Cached state, proxy configuration, DNS-over-HTTPS status and the current network all affect the choice.&lt;/p&gt;
&lt;h2&gt;What Apple documents, and what it does not&lt;/h2&gt;
&lt;p&gt;Apple's &lt;a href="https://developer.apple.com/documentation/technotes/tn3102-http3-in-your-app"&gt;HTTP/3 technote&lt;/a&gt; recommends an HTTPS DNS record with &lt;code&gt;alpn="h3,h2"&lt;/code&gt; for service discovery. It also supports Alt-Svc and explains the practical difference: DNS can make HTTP/3 available on the first transaction, while an Alt-Svc-only client may use HTTP/2 first and apply the remembered advertisement on a later request.&lt;/p&gt;
&lt;p&gt;Apple also documents fallback to HTTP/2 or HTTP/1.1 when HTTP/3 is unavailable on the server or network.&lt;/p&gt;
&lt;p&gt;That is good deployment guidance. It is not a published Safari endpoint-selection algorithm. WebKit is open source, but much of the Apple platform networking behaviour involved here sits below the rendering engine. We should not turn one Safari test on one release and operating system into a claim about every Apple device.&lt;/p&gt;
&lt;p&gt;If Safari on macOS and Safari on iPadOS behave differently in a lab, record the versions, resolver, network and cache state. The difference is evidence worth investigating, not a new browser law.&lt;/p&gt;
&lt;h2&gt;DNS timing can decide the winner&lt;/h2&gt;
&lt;p&gt;An HTTPS record is useful only if the browser receives and uses it soon enough.&lt;/p&gt;
&lt;p&gt;A, AAAA and HTTPS answers may arrive through different resolver paths and at different times. The browser can wait for more complete endpoint information or begin connecting with the address it already has. Waiting can produce a better candidate set. It can also add visible delay when the missing answer never arrives.&lt;/p&gt;
&lt;p&gt;This is one reason browser traces vary with the operating system and DNS configuration. Chrome and Firefox both have internal DNS behaviour, but either can be affected by platform resolver choices, encrypted-DNS settings, proxies, caches and experiment flags.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.rfc-editor.org/info/rfc10029"&gt;RFC 10029, DNS Multiple QTYPEs&lt;/a&gt;, was published in July 2026 to let a DNS client request additional record types alongside its primary query. A client could ask for A, AAAA and HTTPS information and receive a combined response instead of waiting for three independently timed answers.&lt;/p&gt;
&lt;p&gt;That removes one possible source of timing skew. Publication does not mean browsers, resolvers and authoritative servers support it yet. It also cannot make a blocked UDP path work.&lt;/p&gt;
&lt;h2&gt;Happy Eyeballs is growing beyond IPv4 versus IPv6&lt;/h2&gt;
&lt;p&gt;Happy Eyeballs originally dealt with a familiar failure: an IPv6 address exists, but the IPv6 path is slow or broken. Rather than make the user wait for a timeout, the client tries another candidate.&lt;/p&gt;
&lt;p&gt;The active &lt;a href="https://datatracker.ietf.org/doc/draft-ietf-happy-happyeyeballs-v3/"&gt;Happy Eyeballs Version 3 Internet-Draft&lt;/a&gt; generalises that work. Its candidate model can account for service endpoints, transport protocols and ALPN, not only IPv6 and IPv4 addresses.&lt;/p&gt;
&lt;p&gt;That is the right shape for HTTP/3. A browser may be choosing among:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;HTTP/3 over QUIC to an IPv6 address;&lt;/li&gt;
&lt;li&gt;HTTP/3 over QUIC to an IPv4 address;&lt;/li&gt;
&lt;li&gt;HTTP/2 over TLS and TCP to either address; and&lt;/li&gt;
&lt;li&gt;endpoints with different priorities or ports from an HTTPS record.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Version 3 is still an Internet-Draft, not a finished standard. Chromium having a feature called Happy Eyeballs v3 does not mean its current behaviour is the final IETF algorithm, and it does not mean other browsers use the same timers.&lt;/p&gt;
&lt;h2&gt;What operators should do&lt;/h2&gt;
&lt;p&gt;Advertise HTTP/3 with both DNS HTTPS records and Alt-Svc.&lt;/p&gt;
&lt;p&gt;The HTTPS record gives capable clients a chance to use QUIC on the first connection. Alt-Svc reaches clients that learn alternatives through HTTP responses and provides a second discovery path. Keep HTTP/2 working on TCP 443 because HTTP/3 is an additional path, not a safe replacement for fallback.&lt;/p&gt;
&lt;p&gt;Then measure the versions separately. At the edge, record the negotiated HTTP version, QUIC handshake success, fallback rate, network and browser family. Test from clean profiles as well as warm ones: cached Alt-Svc and remembered QUIC failures can completely change the result.&lt;/p&gt;
&lt;p&gt;When a test surprises you, capture more than the browser name. Record:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;browser and operating-system versions;&lt;/li&gt;
&lt;li&gt;whether the profile was new or had visited before;&lt;/li&gt;
&lt;li&gt;the A, AAAA and HTTPS answers actually returned;&lt;/li&gt;
&lt;li&gt;Alt-Svc value and cache lifetime;&lt;/li&gt;
&lt;li&gt;whether UDP 443 worked on that network; and&lt;/li&gt;
&lt;li&gt;whether a proxy, VPN or encrypted-DNS mode was active.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Cloud Fellows has published its &lt;a href="https://sse-testcenter.org/protocol-negotiation.html"&gt;protocol-negotiation&lt;/a&gt; and &lt;a href="https://sse-testcenter.org/dns-https-alt-svc.html"&gt;DNS HTTPS versus Alt-Svc&lt;/a&gt; test setup. It is useful for reproducing these cases and comparing results across browser versions, operating systems and resolver configurations.&lt;/p&gt;
&lt;p&gt;HTTP/3 discovery has standards. Browser connection strategy is still a moving piece of software. For operators, the sensible response is not to predict one universal race. Advertise both paths, preserve fallback and measure what clients actually do.&lt;/p&gt;</content><category term="Performance"></category><category term="HTTP/3"></category><category term="QUIC"></category><category term="DNS"></category><category term="HTTPS Records"></category><category term="Alt-Svc"></category><category term="Web Performance"></category></entry><entry><title>How to Protect APIs From Unwanted Automation</title><link href="https://www.peakhour.io/blog/protecting-apis-from-unwanted-automation-attacks/" rel="alternate"></link><published>2026-07-29T00:00:00+10:00</published><updated>2026-07-29T00:00:00+10:00</updated><author><name>AC</name></author><id>tag:www.peakhour.io,2026-07-29:/blog/protecting-apis-from-unwanted-automation-attacks/</id><summary type="html">&lt;p&gt;An API cannot simply block automation. The practical job is to decide which automated use belongs on each route, then control the rest without breaking legitimate clients.&lt;/p&gt;</summary><content type="html">&lt;p&gt;APIs are built for automation. That makes “block the bots” a fairly useless brief.&lt;/p&gt;
&lt;p&gt;The same inventory endpoint might serve a mobile app, a partner feed and a scraper. All three clients can send valid requests. All three can hold valid credentials. The real question is whether that client is using that route in a way the business intended.&lt;/p&gt;
&lt;p&gt;That sounds obvious. In practice, many API controls are still applied across a hostname or an IP range, with little regard for what the route actually does.&lt;/p&gt;
&lt;h2&gt;Begin with the route that can hurt you&lt;/h2&gt;
&lt;p&gt;Pick a sensitive operation: login, password reset, account lookup, checkout, reservation, coupon redemption or a costly GraphQL query. Ask its owner three things:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Who is meant to call it?&lt;/li&gt;
&lt;li&gt;What does normal use look like?&lt;/li&gt;
&lt;li&gt;What should happen when use falls outside that pattern?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The answer will not always be “block”. A public catalogue may tolerate a fair amount of crawling. A reservation endpoint probably should not let one client hold the entire available inventory. A partner export needs a machine-readable error and a phone call to the partner, not a browser challenge.&lt;/p&gt;
&lt;p&gt;OWASP describes this problem as &lt;a href="https://owasp.org/API-Security/editions/2023/en/0xa6-unrestricted-access-to-sensitive-business-flows/"&gt;API6:2023 Unrestricted Access to Sensitive Business Flows&lt;/a&gt;. It includes automated purchasing, reservation abuse and referral fraud: ordinary application functions used for an unwanted purpose. The &lt;a href="https://owasp.org/www-project-automated-threats-to-web-applications/"&gt;OWASP Automated Threats project&lt;/a&gt; covers the familiar variants, including credential stuffing, scraping, scalping and inventory denial.&lt;/p&gt;
&lt;p&gt;Security can help enforce the decision, but it cannot invent the decision. The product or service owner has to say which use is legitimate and what the business is prepared to do about the rest.&lt;/p&gt;
&lt;h2&gt;Find the API you actually have&lt;/h2&gt;
&lt;p&gt;Policies written against an architecture diagram miss old mobile versions, forgotten staging hosts and endpoints that never made it into the OpenAPI file. Those routes still reach real systems.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://owasp.org/API-Security/editions/2023/en/0xa9-improper-inventory-management/"&gt;API9:2023 Improper Inventory Management&lt;/a&gt; calls for an inventory of hosts, environments, versions, endpoints and data flows. This is not paperwork for its own sake. You need a real route and method before you can attach a useful control to it.&lt;/p&gt;
&lt;p&gt;&lt;a href="/products/api-security/"&gt;Peakhour API Security&lt;/a&gt; discovers REST, GraphQL and WebSocket routes, including shadow and legacy endpoints. Where an OpenAPI or Swagger contract exists, Peakhour can show requests that have drifted from it.&lt;/p&gt;
&lt;p&gt;Schema is useful, but it is not intent. A perfectly valid checkout can still be abusive. Schema tells us what arrived and where; the route policy tells us whether to allow it.&lt;/p&gt;
&lt;h2&gt;Do not make JavaScript a requirement&lt;/h2&gt;
&lt;p&gt;A partner integration or machine-to-machine service does not need JavaScript to be protected. Peakhour can assess direct API traffic using route, method, schema result, authentication outcome, headers, protocol behaviour, network path, response code and request cadence.&lt;/p&gt;
&lt;p&gt;JavaScript is useful when the API call belongs to a browser-backed journey. It can add browser and device consistency signals, or support a challenge before a sensitive account action. That is optional evidence. A direct API client does not need JavaScript, and its absence is not evidence of abuse.&lt;/p&gt;
&lt;p&gt;This has an operational consequence: choose an action the intended client can complete. A customer resetting a password in a browser may be able to pass a step-up check. A partner batch cannot.&lt;/p&gt;
&lt;h2&gt;Count something that survives an IP change&lt;/h2&gt;
&lt;p&gt;An IP limit is easy to understand and sometimes it is enough. It is a poor fit for distributed credential testing, residential proxy traffic and clients behind carrier-grade NAT.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://owasp.org/API-Security/editions/2023/en/0xa4-unrestricted-resource-consumption/"&gt;API4:2023 Unrestricted Resource Consumption&lt;/a&gt; recommends limits suited to the operation. Password recovery, one-time-code validation, GraphQL batching and large responses have different costs and should not share one threshold.&lt;/p&gt;
&lt;p&gt;Peakhour's &lt;a href="/products/advanced-rate-limiting/"&gt;Advanced Rate Limiting&lt;/a&gt; can count using documented inputs including path, headers, IP, ASN, country, TLS fingerprint, response code and bot-verified status. Each rule has a threshold, interval and action, with counters showing what it allowed, blocked or saw cross the threshold.&lt;/p&gt;
&lt;p&gt;The important part is being able to explain the counter. “One hundred requests per minute” is not much of a policy until we know the route, which clients are grouped together, and why one hundred is the point at which use becomes harmful.&lt;/p&gt;
&lt;p&gt;Application context can improve that policy. An account, tenant, session or API credential may be a better unit than a network address, provided the integration supplies it safely. Do not casually copy credentials into logs or rule labels.&lt;/p&gt;
&lt;h2&gt;Treat fingerprints and proxy detection as evidence&lt;/h2&gt;
&lt;p&gt;Attackers rotate addresses because IP-only controls are easy to distribute around. Legitimate traffic also shares addresses in offices, hotels, universities and mobile carrier networks.&lt;/p&gt;
&lt;p&gt;TLS behaviour, HTTP/2 settings, header shape and browser consistency can group requests into a client cohort even as the source IP changes. That can reveal a tool family or a recurring campaign. It does not reveal the person operating it. Fingerprints collide, change and can be copied. They are evidence, not identity.&lt;/p&gt;
&lt;p&gt;The same caution applies to &lt;a href="/products/residential-proxy-detection/"&gt;residential proxy detection&lt;/a&gt;. A proxy signal can justify closer inspection or a tighter limit on a sensitive route. It is not a sound reason to block every request that looks residential.&lt;/p&gt;
&lt;h2&gt;Expect the first policy to be wrong&lt;/h2&gt;
&lt;p&gt;A mobile release changes its request shape. A partner runs a larger batch. A sale changes normal checkout traffic. The attacker slows down and moves from login to token refresh.&lt;/p&gt;
&lt;p&gt;We start sensitive API controls in monitoring unless the active harm demands an immediate block. Keep the route, evidence, action and response outcome together. &lt;a href="/products/log-forwarding/"&gt;Log forwarding&lt;/a&gt; sends that record to the customer's existing SIEM or observability platform.&lt;/p&gt;
&lt;p&gt;Before tightening a policy, we want two answers:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;What unwanted activity did it reduce?&lt;/li&gt;
&lt;li&gt;Which intended clients did it inconvenience?&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The &lt;a href="/case-studies/gumtree/"&gt;Gumtree case study&lt;/a&gt; is not an API-only case study. It is relevant because it records how this tuning works in production. Gumtree and Peakhour deployed progressively and adjusted controls against live traffic. Gumtree reported a 3.3x cleaner origin mix and an 80% reduction in Gumtree's internal fraud score. Those figures belong to the broader bot-management deployment, not to an isolated API feature.&lt;/p&gt;
&lt;h2&gt;One request should produce one decision&lt;/h2&gt;
&lt;p&gt;An automated campaign does not respect product categories. The same traffic can use valid API calls, stolen credentials, residential proxies and changing client fingerprints while also carrying payloads that need WAF inspection.&lt;/p&gt;
&lt;p&gt;Peakhour puts API protection, managed WAF/WAAP, bot management, advanced rate limiting, DDoS protection, anomaly detection and origin protection in the same request path. It can run on Peakhour Edge or &lt;a href="/solutions/bring-your-own-edge/"&gt;alongside an existing CDN or edge provider&lt;/a&gt;. Operators get one decision to review, with the evidence that produced it, rather than a pile of unrelated scores.&lt;/p&gt;
&lt;p&gt;&lt;a href="/solutions/use-case/api-bot-protection/"&gt;API Bot Protection&lt;/a&gt; shows how we apply that model to login, token, checkout and account routes.&lt;/p&gt;</content><category term="API Security"></category><category term="API Security"></category><category term="Bot Management"></category><category term="Rate Limiting"></category><category term="Residential Proxies"></category><category term="Fingerprinting"></category><category term="Threat Detection"></category></entry><entry><title>How to Tune Your WAF Without Turning It Off</title><link href="https://www.peakhour.io/blog/how-to-tune-your-waf/" rel="alternate"></link><published>2026-07-28T10:30:00+10:00</published><updated>2026-07-28T10:30:00+10:00</updated><author><name>AC</name></author><id>tag:www.peakhour.io,2026-07-28:/blog/how-to-tune-your-waf/</id><summary type="html">&lt;p&gt;A practical process for running a CRS-based or managed WAF in detection mode, finding repeatable false positives and writing narrow exceptions that survive real application traffic.&lt;/p&gt;</summary><content type="html">&lt;p&gt;The OWASP Core Rule Set has never seen your application.&lt;/p&gt;
&lt;p&gt;Generic patterns let it recognise common signs of SQL injection, cross-site scripting and protocol attacks. Tuning teaches it that your application stores a search expression in JSON, accepts links in a message field or receives an analytics cookie full of punctuation.&lt;/p&gt;
&lt;p&gt;So a new deployment will be noisy.&lt;/p&gt;
&lt;p&gt;Faced with that noise, teams often leave the WAF in log-only mode forever or disable each rule that causes a complaint. Teams need a repeatable route from noisy alerts to safe blocking.&lt;/p&gt;
&lt;p&gt;The work is repetitive and fairly unglamorous: observe real traffic, group related matches, understand the application field involved, write the narrowest safe exception and repeat until legitimate traffic no longer triggers unexplained alerts.&lt;/p&gt;
&lt;h2&gt;Start in detection-only mode&lt;/h2&gt;
&lt;p&gt;Introduce the full OWASP CRS to an existing production application in detection-only mode.&lt;/p&gt;
&lt;p&gt;On ModSecurity or Coraza, set &lt;code&gt;SecRuleEngine DetectionOnly&lt;/code&gt;. The engine records what the rules would have denied, dropped or redirected while allowing the requests through.&lt;/p&gt;
&lt;p&gt;Both engines support this rollout. The &lt;a href="https://github.com/owasp-modsecurity/ModSecurity/wiki/ModSecurity-Frequently-Asked-Questions-%28FAQ%29"&gt;ModSecurity FAQ recommends detection-only mode for a new ruleset&lt;/a&gt;, and &lt;a href="https://www.coraza.io/docs/seclang/directives/#secruleengine"&gt;Coraza implements the same setting&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Run it long enough to see the application's real shape. Allow at least a full week, and often one to two weeks, so the sample includes business days, a weekend and any less frequent jobs, imports or campaigns.&lt;/p&gt;
&lt;p&gt;Exercise authenticated actions, checkout, password reset, messaging, file upload, API writes and administrative tools manually because ordinary browsing may never reach them.&lt;/p&gt;
&lt;p&gt;Detection mode records rule matches while passing every request through, including attacks. Decide in advance what needs to be true before you enable blocking.&lt;/p&gt;
&lt;h2&gt;What changes between WAF products&lt;/h2&gt;
&lt;p&gt;The examples below use SecLang and OWASP CRS because they expose the rule ID, attack class and request field that caused a match. Managed WAFs record much the same information under different names, with varying precision for exceptions.&lt;/p&gt;
&lt;p&gt;Coraza also runs CRS 4. It is a Go implementation of SecLang, and the CRS project recommends it for new CRS 4 deployments. The &lt;a href="/blog/how-to-tune-coraza-waf/"&gt;Coraza tuning guide&lt;/a&gt; covers its audit logging, connectors and runtime exclusions in more detail.&lt;/p&gt;
&lt;p&gt;Body processors and chained rules can behave differently between engines and web-server connectors. Replay the requests that caused the false positive through the engine and connector that handle production traffic.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tuning job&lt;/th&gt;
&lt;th&gt;SecLang / CRS&lt;/th&gt;
&lt;th&gt;Managed WAF examples&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Observe without blocking&lt;/td&gt;
&lt;td&gt;&lt;code&gt;SecRuleEngine DetectionOnly&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Azure Detection mode, AWS rule-action override to Count, Google Cloud Armor preview&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Identify the detection&lt;/td&gt;
&lt;td&gt;numeric rule ID and message&lt;/td&gt;
&lt;td&gt;managed rule ID or name&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Identify the class&lt;/td&gt;
&lt;td&gt;CRS tag such as &lt;code&gt;attack-sqli&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;rule group, category or emitted label&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Identify the input&lt;/td&gt;
&lt;td&gt;&lt;code&gt;REQUEST_COOKIES:name&lt;/code&gt;, &lt;code&gt;ARGS:field&lt;/code&gt;, header or body target&lt;/td&gt;
&lt;td&gt;matched request component or exclusion selector&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Narrow the exception&lt;/td&gt;
&lt;td&gt;target removal by ID or tag, optionally limited to a route&lt;/td&gt;
&lt;td&gt;field exclusion, per-rule exception, label-based follow-on rule or rule skip limited by request conditions&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The last row is where the products differ most. ModSecurity and Coraza can stop one rule from inspecting one field on one route. Some managed WAFs can only skip the whole rule for requests matching that route. If that is the smallest exception available, write down exactly what the WAF will stop inspecting and decide whether the route is safe without that rule.&lt;/p&gt;
&lt;h2&gt;Group alerts before reviewing them&lt;/h2&gt;
&lt;p&gt;Reviewing WAF alerts one at a time hides repeated false positives.&lt;/p&gt;
&lt;p&gt;The same harmless field may trigger the same rule across thousands of requests. Conversely, two alerts with the same rule ID may come from completely different application behaviours and need different decisions.&lt;/p&gt;
&lt;p&gt;Group events using at least:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;hostname and URL;&lt;/li&gt;
&lt;li&gt;HTTP method;&lt;/li&gt;
&lt;li&gt;CRS rule ID;&lt;/li&gt;
&lt;li&gt;rule class or attack tag, such as &lt;code&gt;attack-sqli&lt;/code&gt; or &lt;code&gt;attack-xss&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;matched-data variable, including its collection and exact name;&lt;/li&gt;
&lt;li&gt;WAF action and response status;&lt;/li&gt;
&lt;li&gt;event count, distinct clients and spread over time.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For example, &lt;code&gt;REQUEST_COOKIES:analytics_id&lt;/code&gt; is much more useful than “SQL injection rule fired”. So is &lt;code&gt;ARGS:message&lt;/code&gt; on &lt;code&gt;POST /api/messages&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The rule ID tells you which detection fired. The attack class tells you which protection an exception would weaken. The matched variable identifies the request field that caused it. The URL and method show where the application uses that field.&lt;/p&gt;
&lt;p&gt;Keep a few examples of the matched values long enough to investigate them, but handle them carefully. Request fields can contain credentials, personal information and customer content. The exception record usually needs the variable name and an explanation, not a permanent copy of the raw value.&lt;/p&gt;
&lt;h2&gt;Expect false positives in a few places&lt;/h2&gt;
&lt;p&gt;A few kinds of input generate most legitimate matches.&lt;/p&gt;
&lt;h3&gt;Request cookies&lt;/h3&gt;
&lt;p&gt;Marketing, attribution, experimentation and client-state cookies often contain encoded or structured values. A generic SQLi, PHP or local-file-inclusion rule may find a suspicious fragment even though the application never treats that cookie as executable input.&lt;/p&gt;
&lt;p&gt;Keep inspection active for the &lt;code&gt;REQUEST_COOKIES&lt;/code&gt; collection and exclude only the cookie that caused the false positive.&lt;/p&gt;
&lt;p&gt;Identify the cookie name, the rules or attack classes it triggers, the routes where it appears, how often it occurs and whether those requests complete normally. If &lt;code&gt;REQUEST_COOKIES:analytics_id&lt;/code&gt; repeatedly triggers the same attack class for legitimate requests, consider an exception for that cookie alone.&lt;/p&gt;
&lt;p&gt;Cookie names need separate treatment. A rule matching &lt;code&gt;REQUEST_COOKIES_NAMES&lt;/code&gt; inspects the names. Capture the exact name safely before writing the exclusion.&lt;/p&gt;
&lt;h3&gt;Unparsed or malformed request bodies&lt;/h3&gt;
&lt;p&gt;Parser errors deserve their own investigation.&lt;/p&gt;
&lt;p&gt;When a selected body processor cannot parse a body, ModSecurity and Coraza set &lt;code&gt;REQBODY_ERROR&lt;/code&gt;. Record the &lt;code&gt;Content-Type&lt;/code&gt; and observed &lt;code&gt;REQBODY_PROCESSOR&lt;/code&gt; because JSON and XML processor selection varies by engine, connector and version. Confirm that a processor ran before relying on the error flag.&lt;/p&gt;
&lt;p&gt;A body that exceeds the configured inspection limit is a different case. It sets &lt;code&gt;INBOUND_DATA_ERROR&lt;/code&gt; and may be inspected only partially. In either case, part of the body may go uninspected, and an attacker can deliberately probe that behaviour.&lt;/p&gt;
&lt;p&gt;Ask the developer who owns the endpoint what it is meant to accept. Fix incorrect content types and body-processor configuration, reproduce the request, then check whether the application and WAF parse it the same way.&lt;/p&gt;
&lt;p&gt;Keep request-body inspection active for the application. Limit any parser exception to the host, URL, method and body behaviour you investigated.&lt;/p&gt;
&lt;h3&gt;Free-text fields&lt;/h3&gt;
&lt;p&gt;Messages, descriptions, comments, support tickets and search boxes are expected to contain language that resembles attack syntax. A customer can discuss SQL without attempting SQL injection. A marketplace listing can contain shell characters. A support message can include a URL.&lt;/p&gt;
&lt;p&gt;Exclude the named field on the affected route and keep inspection active for the rest of the request body.&lt;/p&gt;
&lt;p&gt;For example, the SecLang rule below removes &lt;code&gt;ARGS:message&lt;/code&gt; from every rule tagged &lt;code&gt;attack-sqli&lt;/code&gt; on the messaging endpoint. That is appropriate only if you have decided that SQLi inspection is too noisy for this field across the whole class. Every other argument still receives SQLi inspection, and scam, malicious-link or other attack classes can continue inspecting the message.&lt;/p&gt;
&lt;p&gt;Bring in the developer who owns the endpoint. They can confirm whether the field is genuinely free text, where it is stored or rendered, what server-side validation exists and which security checks still need to see it.&lt;/p&gt;
&lt;h3&gt;Application-specific structured fields&lt;/h3&gt;
&lt;p&gt;Some applications accept query languages, filters, templates, product metadata or nested JSON that naturally looks like code. The syntax may be legitimate, but these fields still deserve careful review before they are excluded.&lt;/p&gt;
&lt;p&gt;Confirm the schema and business use before creating an exception. Check that &lt;code&gt;MATCHED_VAR_NAME&lt;/code&gt; identifies one field, then use that exact named target. Nested JSON naming varies between engines and integrations. Keep SQLi inspection active for the rest of the API when one structured field needs an exception.&lt;/p&gt;
&lt;h2&gt;Make the smallest exception that works&lt;/h2&gt;
&lt;p&gt;Work down this list and stop as soon as the known false positive is fixed:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;host, exact URL, method, rule ID or attack class, and exact named variable;&lt;/li&gt;
&lt;li&gt;host, reviewed URL family, method, class, and named variable;&lt;/li&gt;
&lt;li&gt;host, exact URL and rule ID;&lt;/li&gt;
&lt;li&gt;host, rule ID;&lt;/li&gt;
&lt;li&gt;global named-variable exclusion.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Start with the first option. Move further down only when the logs and the application design justify a wider exception.&lt;/p&gt;
&lt;p&gt;A global exception can make sense for a named cookie or header that has no security meaning anywhere in the application. Before adding one, make sure the false positive appears across several routes and clients, and that those requests complete normally. Ask the development team to confirm that no backend interprets the field.&lt;/p&gt;
&lt;p&gt;Even then, remove only that named field from the relevant rule or attack class. An exception for &lt;code&gt;REQUEST_COOKIES:analytics_id&lt;/code&gt; removes one known input from SQLi inspection. An exception for the whole cookie collection removes every cookie.&lt;/p&gt;
&lt;p&gt;Reserve global exceptions for logs that identify the matched field. Unknown body fields, unresolved cookie names and parser failures need manual investigation.&lt;/p&gt;
&lt;h2&gt;Keep your exceptions outside CRS&lt;/h2&gt;
&lt;p&gt;Put application-specific exceptions in local configuration and leave the Core Rule Set files unchanged. This keeps CRS upgrades separate from changes made for your application.&lt;/p&gt;
&lt;p&gt;To stop one rule inspecting a named field everywhere, ModSecurity and Coraza support:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nb"&gt;SecRuleUpdateTargetById&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;942100&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;!REQUEST_COOKIES:analytics_id&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Load this directive after the CRS rules because the engine must load a rule before updating it.&lt;/p&gt;
&lt;p&gt;For a route-specific exception, use a runtime control before the CRS rule executes:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c"&gt;# Load before CRS, normally from REQUEST-900-EXCLUSION-RULES-BEFORE-CRS.conf.&lt;/span&gt;
&lt;span class="c"&gt;# Use this rule only for api.example.com.&lt;/span&gt;
&lt;span class="c"&gt;# Confirm that local rule ID 10001 is unused.&lt;/span&gt;
&lt;span class="nb"&gt;SecRule&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;REQUEST_FILENAME&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;@streq /api/messages&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;\
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;id:10001,phase:1,pass,nolog,t:none,chain&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nb"&gt;SecRule&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;REQUEST_METHOD&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;@streq POST&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;\
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;t:none,ctl:ruleRemoveTargetByTag=attack-sqli;ARGS:message&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;With this exception, SQLi rules stop reading &lt;code&gt;ARGS:message&lt;/code&gt; only on &lt;code&gt;POST /api/messages&lt;/code&gt;. They still inspect other fields and routes, while other attack classes can continue inspecting the message.&lt;/p&gt;
&lt;p&gt;The &lt;a href="https://coreruleset.org/docs/2-how-crs-works/2-3-false-positives-and-tuning/"&gt;CRS false-positive tuning guide&lt;/a&gt; documents configure-time and runtime exclusions by rule ID or tag. The &lt;code&gt;attack-sqli&lt;/code&gt; selector above is a literal tag that works with both ModSecurity and Coraza. ModSecurity runtime target selectors accept literal collection keys. &lt;a href="https://www.coraza.io/docs/seclang/actions/#ctl"&gt;Coraza also accepts regular expressions for collection keys&lt;/a&gt;, using &lt;code&gt;/pattern/&lt;/code&gt; syntax.&lt;/p&gt;
&lt;p&gt;A target exclusion may affect only the first rule in a chained CRS detection. Test the exact rules and requests on your deployed engine before relying on the exception.&lt;/p&gt;
&lt;p&gt;Use rule IDs or exact attack-class tags. Rule messages can change and may contain request data.&lt;/p&gt;
&lt;h2&gt;Managed WAFs expose different controls&lt;/h2&gt;
&lt;p&gt;Each managed provider expresses the exception differently.&lt;/p&gt;
&lt;p&gt;AWS Managed Rules can emit a label while an offending rule runs in &lt;code&gt;Count&lt;/code&gt; mode. A later custom rule can block that label everywhere except the route that produced the false positive. The exception affects enforcement for the whole managed rule on that route. &lt;a href="/blog/how-to-tune-aws-waf/"&gt;How to Tune AWS WAF&lt;/a&gt; follows that evaluation path from the first counted request to restored blocking.&lt;/p&gt;
&lt;p&gt;Azure Application Gateway WAF can exclude a named cookie, header or argument from a particular managed rule. Its request exceptions can instead skip a selected rule for matching traffic, and that feature is currently in preview. A custom &lt;code&gt;Allow&lt;/code&gt; rule bypasses the managed CRS, DRS and bot rules for the request. &lt;a href="/blog/how-to-tune-azure-application-gateway-waf/"&gt;How to Tune Azure Application Gateway WAF&lt;/a&gt; shows how to choose among those controls.&lt;/p&gt;
&lt;p&gt;Cloudflare exceptions skip a selected managed rule for the whole matching request. Security Events may show rule 949110 as the blocking event because it checks the final anomaly score; Additional logs identify the rules that added that score. &lt;a href="/blog/how-to-tune-cloudflare-waf/"&gt;How to Tune Cloudflare WAF&lt;/a&gt; covers that investigation and the ordering of account-level and zone-level exceptions.&lt;/p&gt;
&lt;p&gt;Google Cloud Armor can exclude a named request field from a versioned OWASP signature. Route-specific tuning also depends on the security-policy expression and rule priority, because a general WAF rule may inspect the same request later. &lt;a href="/blog/how-to-tune-google-cloud-armor-waf/"&gt;How to Tune Google Cloud Armor&lt;/a&gt; covers preview, signature selection and field exclusions.&lt;/p&gt;
&lt;p&gt;F5 BIG-IP Advanced WAF separates policy enforcement mode, violation actions and signature or entity staging. Its overrides can target a URL parameter, cookie, content profile, URL or the whole policy. &lt;a href="/blog/how-to-tune-f5-big-ip-advanced-waf/"&gt;How to Tune F5 BIG-IP Advanced WAF&lt;/a&gt; follows those controls from Transparent mode to tested blocking.&lt;/p&gt;
&lt;p&gt;Provider interfaces, ruleset versions and preview features change. Record the rule name or versioned signature, the field or request being exempted and what the WAF will still inspect. Test the requests that led to the exception before enabling it.&lt;/p&gt;
&lt;h2&gt;Iterate until the false positives are gone&lt;/h2&gt;
&lt;p&gt;After adding an exception, group the alerts again. Check whether that false-positive pattern disappeared, whether a related rule started matching the same field and whether another route was affected. Look for legitimate flows that the first observation window missed.&lt;/p&gt;
&lt;p&gt;Repeat the cycle:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;collect detection-only traffic that covers normal application use;&lt;/li&gt;
&lt;li&gt;group by route, method, rule ID, rule class and named variable;&lt;/li&gt;
&lt;li&gt;classify abusive traffic separately from legitimate matches;&lt;/li&gt;
&lt;li&gt;create or narrow exceptions;&lt;/li&gt;
&lt;li&gt;rerun automated and manual application flows;&lt;/li&gt;
&lt;li&gt;collect another window.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Aim for zero known false positives in the traffic you observed and the critical flows you tested. A new endpoint, cookie, client or release can produce fresh false positives tomorrow.&lt;/p&gt;
&lt;p&gt;Use a higher anomaly threshold only during tuning because it can allow attacks that the normal threshold would have blocked. Write an exception for the rule and field causing the false positive, then return to the intended threshold.&lt;/p&gt;
&lt;h2&gt;Document every exception&lt;/h2&gt;
&lt;p&gt;Give every exception an owner, a reason and a review date.&lt;/p&gt;
&lt;p&gt;Record:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;hostname, URL or URL family, and HTTP method;&lt;/li&gt;
&lt;li&gt;CRS version, rule IDs and attack-class tags;&lt;/li&gt;
&lt;li&gt;matched collection and exact variable name;&lt;/li&gt;
&lt;li&gt;sample event IDs and observation window;&lt;/li&gt;
&lt;li&gt;why the traffic is legitimate;&lt;/li&gt;
&lt;li&gt;which customer or application flow depends on it;&lt;/li&gt;
&lt;li&gt;what protection is removed and what remains active;&lt;/li&gt;
&lt;li&gt;developer and security approvers;&lt;/li&gt;
&lt;li&gt;date introduced and next review date;&lt;/li&gt;
&lt;li&gt;the release, incident or ticket associated with the change.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Keep the exception under version control. Give it a description that another engineer can understand without finding the original chat thread. Review it after CRS upgrades because rule IDs, paranoia levels and rule behaviour can change. The CRS project specifically recommends returning to detection mode long enough to exercise normal traffic after a major migration.&lt;/p&gt;
&lt;p&gt;Remove an exception when the application no longer needs it. If the application changes its cookie, parser or validation, restore inspection.&lt;/p&gt;
&lt;h2&gt;Decide what a WAF hit should do&lt;/h2&gt;
&lt;p&gt;Security and application owners must decide which matches to log, block, rate limit, challenge or review.&lt;/p&gt;
&lt;p&gt;With CRS anomaly scoring, an individual rule normally adds to a transaction score. The WAF blocks when the inbound score crosses the configured threshold, allowing several weak signals to add up before a customer is blocked.&lt;/p&gt;
&lt;p&gt;Decide which outcomes you need:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Log:&lt;/strong&gt; useful during tuning and for low-confidence signals.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Block:&lt;/strong&gt; appropriate when several signals point to an attack and the affected flow has been tested.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Rate limit:&lt;/strong&gt; useful for repeated behaviour across several requests.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Challenge or step up:&lt;/strong&gt; where the product supports it, useful for browser and account flows where a hard block would be unnecessarily disruptive.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Review:&lt;/strong&gt; appropriate for high-value actions where context matters more than a generic signature.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Respond to a single SQLi alert at the request level. Shared networks, mobile carriers and proxies make IP identity unreliable. Repeated WAF hits on the same route can inform a rate limit, but the limit should use the best available client, session or account key and have a clear window.&lt;/p&gt;
&lt;p&gt;Track WAF blocks and rate limits separately. A ModSecurity or Coraza block commonly returns &lt;code&gt;403&lt;/code&gt;; a rate limit commonly returns &lt;code&gt;429&lt;/code&gt;. If the logs say the WAF blocked a request but the origin returned success, find out why before trusting the enforcement reports.&lt;/p&gt;
&lt;h2&gt;Recheck the WAF after application releases&lt;/h2&gt;
&lt;p&gt;A release may add an endpoint, rename a field, introduce GraphQL, change JSON shape, add a marketing cookie or move validation between services. Any of those changes can make an old exception too broad or cause a new legitimate field to trigger CRS.&lt;/p&gt;
&lt;p&gt;Include the development team in the release process:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;list new or changed public routes and methods;&lt;/li&gt;
&lt;li&gt;identify free-text, upload and structured fields;&lt;/li&gt;
&lt;li&gt;run staging traffic through the same CRS configuration;&lt;/li&gt;
&lt;li&gt;test authenticated and high-value journeys;&lt;/li&gt;
&lt;li&gt;watch the grouped detections during the production rollout;&lt;/li&gt;
&lt;li&gt;give new or substantially changed routes an observation period before enforcing new rules on them;&lt;/li&gt;
&lt;li&gt;review whether old exceptions can be removed.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For major CRS upgrades, treat the ruleset itself as a release. A ruleset upgrade can change rule IDs and anomaly-score behaviour while the application stays the same.&lt;/p&gt;
&lt;h2&gt;Know when tuning is complete&lt;/h2&gt;
&lt;p&gt;A traditional WAF is ready to enforce when:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;normal production traffic, including the less common application flows, has been reviewed;&lt;/li&gt;
&lt;li&gt;critical application flows have been tested with developers;&lt;/li&gt;
&lt;li&gt;every high-volume legitimate match has a documented, narrow exception;&lt;/li&gt;
&lt;li&gt;parser failures and unresolved matched variables have named owners and specific resolutions;&lt;/li&gt;
&lt;li&gt;WAF blocks produce the expected response;&lt;/li&gt;
&lt;li&gt;rate limiting is handled separately from payload detection;&lt;/li&gt;
&lt;li&gt;exceptions are versioned, approved and reviewable;&lt;/li&gt;
&lt;li&gt;new rules and releases can be observed before they start blocking.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Once those checks pass, enable blocking in stages and keep watching the same groups of alerts. Revisit the exceptions whenever the application or ruleset changes.&lt;/p&gt;
&lt;p&gt;For the broader decision about where a WAF helps and where it does not, see &lt;a href="/blog/when-and-why-to-use-a-waf/"&gt;When and Why to Use a WAF&lt;/a&gt;. You can also read about Peakhour's &lt;a href="/products/waf/"&gt;web application firewall&lt;/a&gt;.&lt;/p&gt;</content><category term="Application Security"></category><category term="WAF"></category><category term="OWASP CRS"></category><category term="ModSecurity"></category><category term="Coraza"></category><category term="Application Security"></category><category term="False Positives"></category><category term="WAF Tuning"></category></entry><entry><title>When and Why to Use a WAF: A Guide for WAF Sceptics</title><link href="https://www.peakhour.io/blog/when-and-why-to-use-a-waf/" rel="alternate"></link><published>2026-07-28T10:00:00+10:00</published><updated>2026-07-28T10:00:00+10:00</updated><author><name>AC</name></author><id>tag:www.peakhour.io,2026-07-28:/blog/when-and-why-to-use-a-waf/</id><summary type="html">&lt;p&gt;WAFs are neither useless nor a security force field. Here is what they are good at, where they fail, and when putting one in front of an application makes sense.&lt;/p&gt;</summary><content type="html">&lt;p&gt;There are two popular opinions about web application firewalls.&lt;/p&gt;
&lt;p&gt;The first is that every public application needs one. Turn it on, enable the managed rules and enjoy protection from the OWASP Top 10, zero-days, bots and DDoS attacks.&lt;/p&gt;
&lt;p&gt;The second is that WAFs are expensive regex machines. They block customers, miss clever attacks and give management a green tick while the application remains vulnerable.&lt;/p&gt;
&lt;p&gt;The second group has better jokes. Neither group has the whole answer.&lt;/p&gt;
&lt;p&gt;A WAF is useful when it is given a job it can actually perform. It is disappointing when it is expected to understand an application better than the people who built it.&lt;/p&gt;
&lt;p&gt;The practical question is not “do WAFs work?” It is: which risks can this WAF reduce, what will it never understand, and who will operate it when the application changes?&lt;/p&gt;
&lt;h2&gt;What a WAF can see&lt;/h2&gt;
&lt;p&gt;A traditional WAF sits in the HTTP request path. It inspects requests and applies managed or custom rules before passing allowed traffic to the application.&lt;/p&gt;
&lt;p&gt;That position gives it a useful but limited view.&lt;/p&gt;
&lt;p&gt;It can see paths, methods, headers, cookies, query strings and supported request bodies. Depending on the product, it may also have access to IP reputation, network characteristics, bot signals, rate history and API schemas.&lt;/p&gt;
&lt;p&gt;It cannot naturally see the full business meaning of the request.&lt;/p&gt;
&lt;p&gt;The WAF may know that a customer requested &lt;code&gt;/api/invoices/123&lt;/code&gt;. The application knows whether that customer owns invoice 123. The WAF may see 200 valid checkout requests. The application knows whether they represent a wholesaler, a scalper or a broken integration.&lt;/p&gt;
&lt;p&gt;That boundary explains both the value and the frustration.&lt;/p&gt;
&lt;h2&gt;The criticism is mostly fair&lt;/h2&gt;
&lt;p&gt;WAF sceptics are right about several things.&lt;/p&gt;
&lt;p&gt;A determined attacker can bypass generic detection. Differences in encoding and HTTP parsing can cause a WAF and an application to interpret the same request differently. A 2024 study found &lt;a href="https://netsec.ccert.edu.cn/publications/sp24-wall"&gt;311 protocol-level evasion cases across 14 WAFs and 20 web frameworks&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;False positives are real too. Legitimate HTML, JSON, support messages or product descriptions may resemble an attack signature. Microsoft recommends introducing a WAF in detection mode, reviewing logs and tuning it before blocking. It says &lt;a href="https://learn.microsoft.com/en-us/azure/web-application-firewall/afds/waf-faq"&gt;this process may take several weeks&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;A WAF also cannot fix insecure application logic. It cannot repair broken object-level authorisation, make password recovery safe or decide whether a valid-looking transaction is fraudulent. Those controls belong in the application.&lt;/p&gt;
&lt;p&gt;And, yes, putting anything inline creates another dependency. A poor rule can block real customers. A provider can have an outage. A self-hosted appliance can fail open or fail closed.&lt;/p&gt;
&lt;p&gt;These are reasons to be precise about the job. They are not reasons to send every internet request directly to the origin.&lt;/p&gt;
&lt;h2&gt;Buying time during a patch window&lt;/h2&gt;
&lt;p&gt;The best reason to have a WAF is rarely mentioned on the product page. It buys time.&lt;/p&gt;
&lt;p&gt;When a serious vulnerability appears, the correct response is to fix the affected software. But finding every instance, testing the patch and deploying it safely may take hours or days. Third-party and legacy applications can take longer.&lt;/p&gt;
&lt;p&gt;A virtual patch can narrow that exposure window. A custom rule may block the vulnerable path, reject a malicious parameter or detect the request pattern associated with the exploit while the real patch is prepared.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://cheatsheetseries.owasp.org/cheatsheets/Virtual_Patching_Cheat_Sheet.html"&gt;OWASP's virtual patching guidance&lt;/a&gt; is clear about the boundary: correcting the source is the preferred remediation. The WAF rule is a compensating control, not permission to leave the vulnerability in place.&lt;/p&gt;
&lt;p&gt;That still makes it valuable. During an incident, ten minutes and two days are very different amounts of exposure.&lt;/p&gt;
&lt;h2&gt;Stopping expensive requests earlier&lt;/h2&gt;
&lt;p&gt;Applications are expensive places to reject bad traffic.&lt;/p&gt;
&lt;p&gt;By the time a request reaches application code it may have consumed a connection, invoked authentication, queried a database, called another API or triggered a paid service. A request does not need to contain an obvious exploit to create cost. It may simply repeat an expensive operation far more often than a legitimate user would.&lt;/p&gt;
&lt;p&gt;An edge control can reject common exploit traffic and excessive requests before that work happens.&lt;/p&gt;
&lt;p&gt;This is especially useful for login, search, registration, password reset, checkout and expensive API routes. Rate limits and bot controls can respond differently based on route, session, account outcome and other available evidence instead of treating every request from an IP address as the same actor.&lt;/p&gt;
&lt;p&gt;NIST recommends applying general WAF, bot and denial-of-service controls early in the API serving stack to protect upstream systems from malicious payloads and unrestricted resource consumption. It also &lt;a href="https://csrc.nist.gov/pubs/sp/800/228/upd1/final"&gt;treats those as separate capabilities&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;That distinction matters. A classic WAF does not automatically provide sophisticated bot management or network-scale DDoS protection. A broader WAAP service may bundle them, but buyers should check the controls rather than trust the acronym.&lt;/p&gt;
&lt;h2&gt;A control you can reach during an incident&lt;/h2&gt;
&lt;p&gt;Security incidents create awkward gaps between knowing there is a problem and having the final fix ready.&lt;/p&gt;
&lt;p&gt;Perhaps one endpoint is being abused. A new exploit is spreading. Login failures are climbing. A scraper is rotating through residential proxies. An old hostname that should have disappeared is suddenly receiving traffic.&lt;/p&gt;
&lt;p&gt;A centrally managed WAF gives the operations team somewhere to make a narrow, reversible change without waiting for several application releases. They can restrict a route, add a virtual patch, change a rate limit, challenge suspicious traffic or collect more detailed events while the investigation continues.&lt;/p&gt;
&lt;p&gt;That operational separation is valuable. The application team can work on the root cause while the security or operations team reduces immediate exposure.&lt;/p&gt;
&lt;p&gt;It also needs discipline. Emergency rules require owners and expiry dates. A temporary exclusion should not survive for years. Changes should be observed before blocking where the situation allows it.&lt;/p&gt;
&lt;h2&gt;Evidence before the origin&lt;/h2&gt;
&lt;p&gt;A WAF is often discussed only as a blocking device. Its position in the request path can be just as useful for understanding what is happening.&lt;/p&gt;
&lt;p&gt;Good events can show which route was targeted, which rule matched, what action was taken and whether the request reached the origin. Rate, bot and API signals can add context. Combined with application logs, this helps teams distinguish an attack from a customer problem, a broken integration or a badly tuned rule.&lt;/p&gt;
&lt;p&gt;The same visibility can expose weaknesses in the deployment itself:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;a forgotten API version receiving traffic;&lt;/li&gt;
&lt;li&gt;a hostname missing the expected policy;&lt;/li&gt;
&lt;li&gt;an origin that is still publicly reachable;&lt;/li&gt;
&lt;li&gt;an endpoint whose cost makes it an easy denial-of-service target;&lt;/li&gt;
&lt;li&gt;an exclusion that is much broader than anyone remembered.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This does not require blocking on day one. Observe mode can create value before the team is confident enough to enforce a decision.&lt;/p&gt;
&lt;h2&gt;When the case for a WAF is strong&lt;/h2&gt;
&lt;p&gt;A WAF is usually worth serious consideration when the application has several of these characteristics:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;customer accounts, payments or personal information;&lt;/li&gt;
&lt;li&gt;public APIs or expensive dynamic routes;&lt;/li&gt;
&lt;li&gt;third-party, legacy or slow-to-patch software;&lt;/li&gt;
&lt;li&gt;regular scanning, credential stuffing, scraping or automated abuse;&lt;/li&gt;
&lt;li&gt;multiple applications that need consistent emergency controls;&lt;/li&gt;
&lt;li&gt;compliance requirements for runtime web protection;&lt;/li&gt;
&lt;li&gt;an operations team able to tune rules and investigate events.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;PCI DSS provides one concrete example. Since 31 March 2025, Requirement 6.4.2 requires an automated technical solution in front of applicable public-facing web applications to continually detect and prevent web attacks. The &lt;a href="https://www.pcisecuritystandards.org/faqs/1593/"&gt;PCI Security Standards Council describes the requirement&lt;/a&gt; without requiring a particular product called a WAF.&lt;/p&gt;
&lt;p&gt;Compliance is a legitimate reason to deploy the control. It is not evidence that the deployment works.&lt;/p&gt;
&lt;h2&gt;When the case is weak&lt;/h2&gt;
&lt;p&gt;Not every website needs a large WAAP contract.&lt;/p&gt;
&lt;p&gt;A genuinely static, low-value site with no accounts, API or meaningful dynamic input presents a smaller application attack surface. Basic CDN protection, origin restriction, good patching and sensible security headers may be enough.&lt;/p&gt;
&lt;p&gt;The case is also weak when nobody will own the WAF. An ignored ruleset eventually becomes noisy, stale or full of broad exclusions. A dashboard that nobody checks is not defence in depth.&lt;/p&gt;
&lt;p&gt;Be cautious when the proposed product does not match the actual problem. A signature WAF is not the complete answer to sophisticated bots. An on-premises appliance cannot absorb a volumetric attack larger than its internet connection. Edge rules cannot repair business logic. A provider's “AI-powered” label does not establish an acceptable false-positive rate.&lt;/p&gt;
&lt;p&gt;Sometimes the right answer is a smaller control. Sometimes it is a different control. The point is to buy against the risk rather than the category name.&lt;/p&gt;
&lt;h2&gt;How not to become the WAF horror story&lt;/h2&gt;
&lt;p&gt;Most bad WAF experiences begin with the same mistake: enabling everything and immediately blocking production traffic.&lt;/p&gt;
&lt;p&gt;A safer deployment looks less exciting:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Define the job. Decide which applications, routes and abuse cases the WAF is expected to cover.&lt;/li&gt;
&lt;li&gt;Put all relevant traffic through it and restrict direct access to the origin.&lt;/li&gt;
&lt;li&gt;Start managed rules and new controls in observe or count mode.&lt;/li&gt;
&lt;li&gt;Review real production-shaped traffic and tune false positives narrowly.&lt;/li&gt;
&lt;li&gt;Test login, checkout, uploads, APIs and other important customer journeys before enforcement.&lt;/li&gt;
&lt;li&gt;Give every custom rule and virtual patch an owner, reason and review date.&lt;/li&gt;
&lt;li&gt;Monitor allowed as well as blocked traffic so false negatives do not disappear from view.&lt;/li&gt;
&lt;li&gt;Keep application-level authorisation, validation and rate controls in place.&lt;/li&gt;
&lt;li&gt;Test what happens when the WAF, agent or provider is unavailable.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;That is the difference between owning a control and merely paying for one.&lt;/p&gt;
&lt;h2&gt;Where this leaves us&lt;/h2&gt;
&lt;p&gt;A WAF is neither useless nor sufficient.&lt;/p&gt;
&lt;p&gt;It cannot understand every valid-looking abuse, prevent every bypass or rescue an application that ignores secure design. It introduces cost, tuning and another inline dependency.&lt;/p&gt;
&lt;p&gt;It can still stop a great deal of cheap hostile traffic, buy time during a vulnerability, prevent excessive work from reaching the origin, give operators a fast response point and leave evidence that helps explain an incident.&lt;/p&gt;
&lt;p&gt;Our two companion articles make each side of the case directly: &lt;a href="/blog/everyone-says-a-waf-is-useless/"&gt;Everyone Says a WAF Is Useless. Are They Right?&lt;/a&gt; and &lt;a href="/blog/your-application-needs-a-waf/"&gt;Your Application Needs a WAF. Just Not for the Reason You Think&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The conclusion is less catchy than either headline. Use a &lt;a href="/products/waf/"&gt;web application firewall&lt;/a&gt; when the application has something worth protecting, the WAF has a defined job and someone is responsible for operating it. Then keep fixing the code behind it.&lt;/p&gt;</content><category term="Application Security"></category><category term="WAF"></category><category term="WAAP"></category><category term="Application Security"></category><category term="API Security"></category><category term="Virtual Patching"></category><category term="Bot Management"></category></entry><entry><title>Your Application Needs a WAF. Just Not for the Reason You Think</title><link href="https://www.peakhour.io/blog/your-application-needs-a-waf/" rel="alternate"></link><published>2026-07-28T09:30:00+10:00</published><updated>2026-07-28T09:30:00+10:00</updated><author><name>AC</name></author><id>tag:www.peakhour.io,2026-07-28:/blog/your-application-needs-a-waf/</id><summary type="html">&lt;p&gt;A web application firewall will not fix insecure code. It can still give applications a valuable layer of protection when bugs, bots and attacks reach the front door.&lt;/p&gt;</summary><content type="html">&lt;p&gt;A web application firewall will not make bad code good.&lt;/p&gt;
&lt;p&gt;It will not repair broken access control. It will not redesign an unsafe checkout. It cannot decide whether a customer should be allowed to see a particular invoice, transfer money from an account or buy the last 200 tickets to a concert.&lt;/p&gt;
&lt;p&gt;If your public application has accounts, valuable APIs or expensive dynamic routes, you probably still need one.&lt;/p&gt;
&lt;p&gt;The case has nothing to do with an invisible shield or a promise to “solve the OWASP Top 10”. Public applications meet hostile traffic every day, software is imperfect and fixing the right thing often takes longer than attacking it.&lt;/p&gt;
&lt;p&gt;That is what a WAF is for.&lt;/p&gt;
&lt;h2&gt;The internet does not wait for your next release&lt;/h2&gt;
&lt;p&gt;Every public application receives traffic it did not ask for.&lt;/p&gt;
&lt;p&gt;Some of it is harmless background noise: crawlers looking for software that is not installed, scripts requesting old WordPress paths, scanners testing yesterday's vulnerability against every address they can find.&lt;/p&gt;
&lt;p&gt;Some of it is aimed directly at the application: SQL injection attempts, malicious uploads, path traversal, unusual encodings and requests crafted to trigger a known vulnerability.&lt;/p&gt;
&lt;p&gt;The application can reject those requests itself. Ideally, it will. But allowing every request to reach application code, authentication services, databases and third-party APIs is an expensive way to discover that something is hostile.&lt;/p&gt;
&lt;p&gt;A WAF creates an earlier decision point. It can discard common exploit traffic before the request reaches the part of the system that holds customer data or performs expensive work.&lt;/p&gt;
&lt;p&gt;That does not make the application secure. It means the application no longer has to face every cheap attack on its own.&lt;/p&gt;
&lt;h2&gt;Patches take time. WAF rules take less&lt;/h2&gt;
&lt;p&gt;The clearest reason to run a WAF is virtual patching.&lt;/p&gt;
&lt;p&gt;Suppose a serious vulnerability appears in a framework, CMS plugin or third-party product. The responsible answer is to patch it. But first the team has to identify every affected system, test the update, work around compatibility problems and arrange a safe deployment.&lt;/p&gt;
&lt;p&gt;The attacker does not have to do any of that.&lt;/p&gt;
&lt;p&gt;A targeted WAF rule can reduce the exposure while the real patch is prepared. It may block a particular path, parameter, payload or request shape associated with the exploit. It is not the final repair, but it can turn an open window into a much narrower one.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://cheatsheetseries.owasp.org/cheatsheets/Virtual_Patching_Cheat_Sheet.html"&gt;OWASP's virtual patching guidance&lt;/a&gt; is refreshingly practical about this. Fixing the source is the number-one technical remediation. A virtual patch is useful when that fix cannot happen immediately. The two controls are complementary, not rivals.&lt;/p&gt;
&lt;p&gt;This matters most for legacy applications, third-party software and systems with slow release cycles. Those are exactly the places where “just fix the code” can be correct advice and an inadequate incident response.&lt;/p&gt;
&lt;h2&gt;Your application should not absorb unlimited work&lt;/h2&gt;
&lt;p&gt;Not every damaging request contains an obvious attack string.&lt;/p&gt;
&lt;p&gt;A search request may be perfectly valid but expensive. A login attempt may fail normally while being one of a million credential-stuffing attempts. A scraper may request public pages exactly as a browser would, just much faster. A customer-facing API may trigger email, SMS, payment or database costs every time it is called.&lt;/p&gt;
&lt;p&gt;This is where a modern WAAP service goes beyond a traditional signature WAF. Rate limiting, bot management and application-layer DDoS controls can make decisions based on the route, request rate, account outcome, browser or network evidence, and the work the origin is being asked to perform.&lt;/p&gt;
&lt;p&gt;NIST recommends placing general WAF, bot and denial-of-service controls early in the API serving stack so malicious payloads and unrestricted resource consumption do not exhaust upstream systems. Importantly, &lt;a href="https://csrc.nist.gov/pubs/sp/800/228/upd1/final"&gt;NIST treats these as related but separate capabilities&lt;/a&gt;. Buying something called a WAF does not automatically mean all three are present.&lt;/p&gt;
&lt;p&gt;Reject bad or excessive work before it becomes expensive work.&lt;/p&gt;
&lt;h2&gt;Put the checks in different places&lt;/h2&gt;
&lt;p&gt;Good application security is built in layers because each layer knows something different.&lt;/p&gt;
&lt;p&gt;The application knows who owns an object, whether an account may perform an action and what a valid transaction looks like. It should remain authoritative for those decisions.&lt;/p&gt;
&lt;p&gt;The edge sees different evidence. It can compare traffic across routes and hosts, recognise widespread exploit patterns, apply an emergency rule across several applications and notice that one client is creating an unusual amount of work before the request reaches the origin.&lt;/p&gt;
&lt;p&gt;Neither view is complete.&lt;/p&gt;
&lt;p&gt;A WAF is valuable because it is independent of the code it protects. If an application developer makes a mistake, the WAF may still reject the exploit. If a WAF misses a clever request, the application should still validate it. One control can fail without immediately making the failure fatal.&lt;/p&gt;
&lt;p&gt;If either layer makes a mistake, the other still gets a chance to respond. That is the useful part of defence in depth.&lt;/p&gt;
&lt;h2&gt;It gives you somewhere to respond&lt;/h2&gt;
&lt;p&gt;During an incident, speed matters.&lt;/p&gt;
&lt;p&gt;Teams often know enough to reduce the risk before they know enough to ship the final fix. They may need to restrict a vulnerable endpoint, block an exploit pattern, lower a rate limit, challenge suspicious login traffic or temporarily exclude a region where an attack is concentrated.&lt;/p&gt;
&lt;p&gt;Doing that through application releases can be slow, especially when several services are affected. A centrally managed WAF gives operators somewhere to make a narrow, reversible change while the application teams investigate.&lt;/p&gt;
&lt;p&gt;The words “narrow” and “reversible” matter. Emergency blocks need owners and expiry dates. Rules should be tested in observe mode where time permits. Broad exclusions created during the incident should not quietly become permanent architecture.&lt;/p&gt;
&lt;p&gt;The WAF is useful here because it is an operational control, not because it knows more about the application than its developers do.&lt;/p&gt;
&lt;h2&gt;It leaves evidence at the front door&lt;/h2&gt;
&lt;p&gt;Prevention gets most of the attention, but visibility is one of the better reasons to have a WAF.&lt;/p&gt;
&lt;p&gt;When an application behaves strangely, the team needs to know what arrived before the failure. Which routes were targeted? Were requests blocked or allowed? Did the traffic share a network, client pattern or payload? Was a rate limit crossed? Did the attacker reach the origin directly?&lt;/p&gt;
&lt;p&gt;Useful WAF events can answer part of that story. Combined with origin and application logs, they help distinguish a real attack from a broken integration, a customer mistake or a badly tuned rule.&lt;/p&gt;
&lt;p&gt;They can also reveal traffic that nobody knew was public: an old API version, forgotten hostname, administrative route or direct-origin path.&lt;/p&gt;
&lt;p&gt;Logs are not automatically useful. A million unexplained rule matches can be worse than a smaller set of events tied to route, action and outcome. But without evidence at the entry point, incident response starts with a large blind spot.&lt;/p&gt;
&lt;h2&gt;Compliance is a reason, but not the best one&lt;/h2&gt;
&lt;p&gt;For organisations handling payment-card data, a runtime application control may not be optional. Since 31 March 2025, PCI DSS Requirement 6.4.2 requires an automated technical solution in front of applicable public-facing web applications to continually detect and prevent web attacks.&lt;/p&gt;
&lt;p&gt;The &lt;a href="https://www.pcisecuritystandards.org/faqs/1593/"&gt;PCI Security Standards Council describes the requirement&lt;/a&gt; without mandating a particular product called a WAF.&lt;/p&gt;
&lt;p&gt;That distinction matters. Compliance can justify the control, but it does not prove the control is effective. A WAF in log-only mode with nobody reading the alerts is not much of a defence. Neither is one with a public origin that attackers can reach directly.&lt;/p&gt;
&lt;p&gt;Passing an audit is a business requirement. Blocking useful attacks without blocking customers is the security requirement.&lt;/p&gt;
&lt;h2&gt;A WAF needs to be operated, not merely purchased&lt;/h2&gt;
&lt;p&gt;The case for a WAF comes with a condition: somebody has to own it.&lt;/p&gt;
&lt;p&gt;Managed rules need to be introduced carefully. Legitimate traffic needs to be observed. False positives need narrow corrections rather than sweeping allowlists. Important customer journeys need tests. Virtual patches need to be removed after the underlying vulnerability is fixed. Origins need to be locked down so the edge cannot be bypassed.&lt;/p&gt;
&lt;p&gt;The job is not finished when the DNS changes.&lt;/p&gt;
&lt;p&gt;The right first step is often detection rather than immediate blocking. Learn what normal traffic looks like, identify the noisy rules, find missing hostnames and understand which requests are expensive. Then move well-understood controls into enforcement.&lt;/p&gt;
&lt;p&gt;A badly operated WAF can block customers, miss attacks and create false confidence. That is a reason to operate it properly, not a reason to give the application no independent protection at all.&lt;/p&gt;
&lt;h2&gt;What a WAF is actually for&lt;/h2&gt;
&lt;p&gt;A WAF should make exploitation harder, give operators a faster response and reduce what reaches the origin. In practice that means stopping familiar attack traffic, buying time during a vulnerability, putting limits in front of expensive routes and recording enough evidence to explain what arrived.&lt;/p&gt;
&lt;p&gt;Developers still own secure design. The WAF gives them another layer, not an exemption.&lt;/p&gt;
&lt;p&gt;Our companion article, &lt;a href="/blog/everyone-says-a-waf-is-useless/"&gt;Everyone Says a WAF Is Useless. Are They Right?&lt;/a&gt;, takes the sceptical case seriously. WAFs can be bypassed. They can cause false positives. They create cost and another inline dependency.&lt;/p&gt;
&lt;p&gt;Those are real constraints. They define how a &lt;a href="/products/waf/"&gt;web application firewall&lt;/a&gt; should be deployed and judged.&lt;/p&gt;
&lt;p&gt;They do not change the basic reality: bugs happen, patches take time and bots are cheap. It is sensible to make hostile traffic cross one more independent decision point before it reaches the application.&lt;/p&gt;</content><category term="Application Security"></category><category term="WAF"></category><category term="WAAP"></category><category term="Application Security"></category><category term="API Security"></category><category term="Virtual Patching"></category><category term="Bot Management"></category></entry><entry><title>Everyone Says a WAF Is Useless. Are They Right?</title><link href="https://www.peakhour.io/blog/everyone-says-a-waf-is-useless/" rel="alternate"></link><published>2026-07-28T09:00:00+10:00</published><updated>2026-07-28T09:00:00+10:00</updated><author><name>AC</name></author><id>tag:www.peakhour.io,2026-07-28:/blog/everyone-says-a-waf-is-useless/</id><summary type="html">&lt;p&gt;Ten good reasons not to trust a web application firewall—and why most of them are arguments for using one properly, not going without one.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Spend long enough around application security and someone will tell you that web application firewalls are useless.&lt;/p&gt;
&lt;p&gt;They are easy to bypass. They block real customers. They cannot fix bad code. They cost money, need constant tuning and create one more thing that can fail.&lt;/p&gt;
&lt;p&gt;The annoying part is that none of this is entirely wrong.&lt;/p&gt;
&lt;p&gt;The mistake is jumping from “a WAF is imperfect” to “a WAF has no useful job”. A lock can be picked. We still lock the door. Security controls are allowed to solve a bounded problem.&lt;/p&gt;
&lt;p&gt;So here are ten excellent reasons not to use a WAF—and what they really tell us.&lt;/p&gt;
&lt;h2&gt;1. “We write secure code”&lt;/h2&gt;
&lt;p&gt;Good. Keep doing that.&lt;/p&gt;
&lt;p&gt;A WAF cannot repair broken access control, fix an insecure password reset flow or stop an application from selling the same scarce ticket twice. Those rules belong in the application because the application understands the customer, the object and the transaction.&lt;/p&gt;
&lt;p&gt;But even good teams ship bugs. Dependencies develop vulnerabilities. A vendor patch can take days to test. A legacy application may not have a team at all.&lt;/p&gt;
&lt;p&gt;This is where virtual patching earns its keep. A narrowly written WAF rule can block a known exploit while the real fix is prepared. &lt;a href="https://cheatsheetseries.owasp.org/cheatsheets/Virtual_Patching_Cheat_Sheet.html"&gt;OWASP describes the source-code fix as the preferred answer&lt;/a&gt;, while also recognising that an enforcement layer can reduce the exposure window.&lt;/p&gt;
&lt;p&gt;Secure code and a WAF are not competing ideas. One fixes the weakness. The other can make it harder to exploit in the meantime.&lt;/p&gt;
&lt;h2&gt;2. “Attackers can bypass it”&lt;/h2&gt;
&lt;p&gt;They can.&lt;/p&gt;
&lt;p&gt;Researchers have found WAF bypasses using alternative encodings, duplicated parameters and differences between the way a firewall and an application parse the same request. One 2024 study found &lt;a href="https://netsec.ccert.edu.cn/publications/sp24-wall"&gt;311 protocol-level evasion cases across 14 WAFs and 20 web frameworks&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;That finding should end any talk of a WAF as a force field. It should not convince us to pass every request straight to the application.&lt;/p&gt;
&lt;p&gt;Most hostile internet traffic is not a handcrafted masterpiece. It is scanning, probing and replaying familiar attacks across thousands of sites. Filtering that traffic does not make the application invulnerable. It removes a large amount of cheap, automated opportunity.&lt;/p&gt;
&lt;p&gt;A determined burglar may pick a lock. We still lock the door.&lt;/p&gt;
&lt;h2&gt;3. “WAFs block legitimate customers”&lt;/h2&gt;
&lt;p&gt;An untuned WAF certainly can.&lt;/p&gt;
&lt;p&gt;A product description, support ticket or API request may contain HTML, SQL-like text or unusual characters for perfectly innocent reasons. Turn every managed rule on, switch immediately to blocking mode and the first security incident may be your own checkout failing.&lt;/p&gt;
&lt;p&gt;Microsoft recommends starting a new WAF in detection mode, reviewing the logs and tuning it before enforcement. It also says &lt;a href="https://learn.microsoft.com/en-us/azure/web-application-firewall/afds/waf-faq"&gt;the process may take several weeks&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;What this rules out is the Friday-afternoon deployment: every managed rule enabled, blocking turned on and nobody watching checkout.&lt;/p&gt;
&lt;p&gt;Start by observing. Find the rules that match real traffic. Make exclusions as narrow as possible. Test important customer journeys. Then block what you understand.&lt;/p&gt;
&lt;h2&gt;4. “It cannot understand our business”&lt;/h2&gt;
&lt;p&gt;Correct. This may be the most important criticism on the list.&lt;/p&gt;
&lt;p&gt;A generic WAF cannot know that customer A should never see customer B's invoice. It cannot know whether buying 400 concert tickets is normal wholesale activity or scalping. It cannot decide whether a bank transfer fits the customer's history.&lt;/p&gt;
&lt;p&gt;Many serious API failures involve valid-looking requests used in the wrong context. The &lt;a href="https://owasp.org/API-Security/editions/2023/en/0x11-t10/"&gt;OWASP API Security Top 10&lt;/a&gt; is full of problems involving object ownership, authentication, permissions, resource consumption and sensitive business flows.&lt;/p&gt;
&lt;p&gt;Those controls need application context.&lt;/p&gt;
&lt;p&gt;There is still work suited to the edge: reject malformed requests, enforce broad limits, filter known exploit patterns and record what reached a sensitive route. A wider WAAP service may also add API schemas, bot signals and account-abuse controls. The application remains responsible for the final business decision.&lt;/p&gt;
&lt;h2&gt;5. “We already have a CDN”&lt;/h2&gt;
&lt;p&gt;You may already have the machinery for a WAF. That does not mean it is protecting anything.&lt;/p&gt;
&lt;p&gt;Is the managed ruleset enabled? Is it logging or blocking? Does it cover every public hostname and API version? Can an attacker connect directly to the origin? Are large or compressed request bodies inspected? Has anyone reviewed the exclusions since the last application release?&lt;/p&gt;
&lt;p&gt;A WAF only protects traffic that passes through it. Cloudflare's own troubleshooting guide says it only mitigates proxied traffic. AWS separately documents how to restrict an origin so visitors cannot bypass CloudFront and reach it directly.&lt;/p&gt;
&lt;p&gt;“We have a CDN” is an architecture statement. “All public traffic crosses an active, tested policy” is a security statement.&lt;/p&gt;
&lt;h2&gt;6. “A WAF will not stop a huge DDoS attack”&lt;/h2&gt;
&lt;p&gt;Also true.&lt;/p&gt;
&lt;p&gt;If an attack fills the network connection in front of an on-premises WAF, the appliance may be functioning perfectly while the website remains unreachable. Volumetric attacks need upstream capacity: an ISP, cloud network, CDN or dedicated scrubbing service able to absorb them before they reach the constrained link.&lt;/p&gt;
&lt;p&gt;Application-layer attacks are different. They target expensive searches, login endpoints, uncached pages, GraphQL queries or API operations that consume disproportionate origin resources. Rate limits and request-aware controls can help there.&lt;/p&gt;
&lt;p&gt;This is why the distinction between WAF and WAAP matters. A classic WAF filters HTTP requests. A WAAP bundle may combine that with bot management, API protection and application-layer DDoS controls. The acronym does not tell you which controls are included, licensed or switched on.&lt;/p&gt;
&lt;h2&gt;7. “Bots just rotate their IP addresses”&lt;/h2&gt;
&lt;p&gt;Yes, and an IP blocklist on its own is a fairly tired answer.&lt;/p&gt;
&lt;p&gt;Modern abuse can arrive through residential proxies, mobile networks, cloud platforms and large pools of short-lived addresses. If the only question is “have we seen this IP before?”, the attacker often wins by changing it.&lt;/p&gt;
&lt;p&gt;Useful bot management combines several weaker signals: request rate, route, session behaviour, account outcome, headers, network characteristics and browser evidence. The response can vary too. A suspicious request might be logged, slowed, challenged or given a tighter limit instead of being permanently blocked.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://cheatsheetseries.owasp.org/cheatsheets/Bot_Management_and_Anti-Automation_Cheat_Sheet.html"&gt;OWASP's bot-management guidance&lt;/a&gt; makes the goal clear: raise the cost of abusive automation while leaving legitimate people and useful bots alone.&lt;/p&gt;
&lt;p&gt;An IP list is easier. It is also further from the problem.&lt;/p&gt;
&lt;h2&gt;8. “It is another expensive security subscription”&lt;/h2&gt;
&lt;p&gt;Sometimes it is. WAF pricing can be a peculiar experience because a business may pay to inspect millions of requests it never wanted.&lt;/p&gt;
&lt;p&gt;The fair comparison is not “WAF bill versus zero”. It is the WAF bill against origin compute, emergency engineering, fraud, scraping, support calls, application downtime and the cost of investigating an incident with poor logs.&lt;/p&gt;
&lt;p&gt;That does not guarantee the WAF wins. A brochure site with no accounts, no API and almost no dynamic input may need little more than sensible CDN protection, origin restriction and good patching. A busy login or checkout path under constant automated abuse has a different calculation.&lt;/p&gt;
&lt;p&gt;The control should match the exposure. Buying the largest WAAP bundle available is not a security strategy.&lt;/p&gt;
&lt;h2&gt;9. “It is not set-and-forget”&lt;/h2&gt;
&lt;p&gt;No useful security control is.&lt;/p&gt;
&lt;p&gt;Applications change. New endpoints appear. Old APIs stay online longer than expected. Managed rules are updated. Attack traffic changes. An exclusion created during an incident quietly survives for three years.&lt;/p&gt;
&lt;p&gt;A WAF needs an owner, observable decisions, staged changes and periodic review. Virtual patches need expiry dates. Important customer journeys need regression tests. Logs need someone who will look at them.&lt;/p&gt;
&lt;p&gt;If nobody will operate the WAF, that is a legitimate reason not to buy an elaborate one. A permanently ignored dashboard is not defence in depth. It is interior decoration.&lt;/p&gt;
&lt;h2&gt;10. “Putting it inline creates another point of failure”&lt;/h2&gt;
&lt;p&gt;It does.&lt;/p&gt;
&lt;p&gt;A bad rule can block a site globally. A provider can have an outage. A self-hosted appliance can fail open or fail closed. In 2019, Cloudflare published a detailed account of how a WAF rule containing a poorly performing regular expression exhausted CPUs across its network.&lt;/p&gt;
&lt;p&gt;Inline controls need the same engineering discipline as the applications behind them: staged rollout, rollback, monitoring, tested failure modes and a clear way to recover.&lt;/p&gt;
&lt;p&gt;The origin, load balancer, DNS provider, identity service and database are points of failure too. We accept those dependencies when the service is worth it, then engineer around their failures. A WAF deserves the same treatment.&lt;/p&gt;
&lt;h2&gt;So, do you need a WAF?&lt;/h2&gt;
&lt;p&gt;Maybe not.&lt;/p&gt;
&lt;p&gt;If the site is genuinely static, low value and already protected by a capable edge, a premium WAAP service may solve very little. If nobody will tune it, test it or respond to its alerts, the product may create more confidence than protection.&lt;/p&gt;
&lt;p&gt;The case becomes much stronger when the application has accounts, payments, personal information, valuable APIs, third-party dependencies, slow patch cycles or a history of automated abuse. It becomes stronger again when the same edge can protect the origin, control bots, limit expensive routes and leave useful evidence for the people investigating incidents.&lt;/p&gt;
&lt;p&gt;A &lt;a href="/products/waf/"&gt;web application firewall&lt;/a&gt; does not make an insecure application secure. The honest claim is smaller: applications have bugs, patches take time and the public internet is noisy. A well-run WAF gives that noise one more place to stop before it becomes your application's problem.&lt;/p&gt;</content><category term="Application Security"></category><category term="WAF"></category><category term="WAAP"></category><category term="Application Security"></category><category term="API Security"></category><category term="Bot Management"></category><category term="DDoS Protection"></category></entry><entry><title>Two Lineages of TLS Fingerprinting: JA3, JA4 and Cisco Mercury</title><link href="https://www.peakhour.io/blog/two-lineages-tls-fingerprinting/" rel="alternate"></link><published>2026-07-26T09:00:00+10:00</published><updated>2026-07-26T09:00:00+10:00</updated><author><name>AC</name></author><id>tag:www.peakhour.io,2026-07-26:/blog/two-lineages-tls-fingerprinting/</id><summary type="html">&lt;p&gt;JA4 did not descend from Cisco Mercury. The two projects come from different strands of TLS fingerprinting research and solve different operational problems.&lt;/p&gt;</summary><content type="html">&lt;p&gt;It is tempting to draw the history of TLS fingerprinting as a single line: JA3, then JA4, with Cisco Mercury somewhere nearby. That version is tidy. It is also wrong.&lt;/p&gt;
&lt;p&gt;Two strands of work developed around the same observation: a TLS ClientHello exposes enough information to say something useful about the software that created it. One strand concentrated on portable identifiers that could be logged and exchanged. The other concentrated on retaining protocol structure and combining it with evidence that could improve classification.&lt;/p&gt;
&lt;p&gt;JA3 and JA4 belong mainly to the first strand. Cisco Mercury belongs mainly to the second. For the technical work that preceded JA3, see &lt;a href="/blog/before-ja3-tls-fingerprinting-history/"&gt;how TLS handshakes became fingerprints&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Before JA3&lt;/h2&gt;
&lt;p&gt;Passive fingerprinting predates TLS. Tools such as p0f identified operating-system characteristics from TCP/IP behaviour without sending probes to the target. Researchers later applied the same instinct to fields exposed during SSL and TLS negotiation.&lt;/p&gt;
&lt;p&gt;In 2009, Ivan Ristić published an &lt;a href="https://blog.ivanristic.com/2009/06/http-client-fingerprinting-using-ssl-handshake-analysis.html"&gt;SSL handshake fingerprinting experiment&lt;/a&gt; that compared ClientHello messages from web clients. Marek Majkowski followed with a &lt;a href="https://idea.popcount.org/2012-06-17-ssl-fingerprinting-for-p0f/"&gt;TLS fingerprinting patch for p0f&lt;/a&gt; in 2012. Lee Brotherston's &lt;a href="https://github.com/LeeBrotherston/tls-fingerprinting"&gt;FingerprinTLS&lt;/a&gt; later provided tools and a database for creating and matching TLS fingerprints.&lt;/p&gt;
&lt;p&gt;Salesforce's JA3 project drew directly on that work. JA3 serialised five ordered ClientHello feature groups, removed GREASE values and calculated an MD5 digest. The result was compact enough to put in a log, share in threat intelligence or match in a rule. The &lt;a href="https://github.com/salesforce/ja3"&gt;archived JA3 repository&lt;/a&gt; documents both the format and its debt to FingerprinTLS.&lt;/p&gt;
&lt;p&gt;JA3's compactness came with a cost. A digest does not explain why two clients differ. Ordered inputs also meant that harmless permutation could produce a different value. Most importantly, a matching digest did not prove that the traffic came from one application. Programs built on a shared TLS library could produce the same ClientHello.&lt;/p&gt;
&lt;h2&gt;The JA4 branch&lt;/h2&gt;
&lt;p&gt;FoxIO introduced JA4 in 2023 after Chrome began permuting TLS extension order. Peakhour saw the practical effect of that change in our &lt;a href="/blog/tls-extension-randomisation/"&gt;Chrome extension-randomisation analysis&lt;/a&gt;: a representation that preserved extension order split one common browser family into a large number of values.&lt;/p&gt;
&lt;p&gt;JA4 canonicalises selected ClientHello features before hashing them. Its &lt;code&gt;a_b_c&lt;/code&gt; structure keeps a readable summary in the first section, a digest of sorted cipher identifiers in the second, and a digest derived from extensions and signature algorithms in the third. This makes the components useful independently. An analyst can group on part of a JA4 value without pretending every field is identical.&lt;/p&gt;
&lt;p&gt;That is deliberate lossy compression. JA4 is useful because it throws away distinctions its designers judged unstable or unhelpful for this job. It is not a reversible rendering of the ClientHello, and its truncated SHA-256 sections do not provide a measure of semantic distance. The exact format is set out in the &lt;a href="https://github.com/FoxIO-LLC/ja4/blob/main/technical_details/JA4.md"&gt;FoxIO JA4 technical specification&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;JA4 is one method. JA4+ is the name used for a wider family that includes server, HTTP, TCP, SSH, certificate and other fingerprints. Those methods do not all share JA4's licence, which matters if the fingerprints will be built into a commercial service.&lt;/p&gt;
&lt;h2&gt;The Cisco research branch&lt;/h2&gt;
&lt;p&gt;Cisco's work took a different route. In 2016, Blake Anderson, Subharthi Paul and David McGrew studied how observable TLS features could help distinguish malware from enterprise traffic without decrypting it. Their paper, &lt;a href="https://arxiv.org/abs/1607.01639"&gt;Deciphering Malware's Use of TLS&lt;/a&gt;, also dealt with an awkward issue that still matters: malware-sandbox data can bias a classifier.&lt;/p&gt;
&lt;p&gt;Anderson and McGrew's 2017 &lt;a href="https://arxiv.org/abs/1706.08003"&gt;operating-system fingerprinting research&lt;/a&gt; combined evidence from TCP/IP, TLS and HTTP across multiple sessions. The point was not to mint a universally portable hash. It was to ask whether several kinds of passive evidence, accumulated over time, reduced uncertainty about the endpoint.&lt;/p&gt;
&lt;p&gt;The same multi-protocol approach appears in Cisco's Joy and Mercury projects. Mercury's Network Protocol Fingerprinting format represents selected protocol features as a tree of hexadecimal byte strings. The full form retains structure. Its naming can state the protocol and fingerprint rule version. An optional compact hash can be used where a fixed-length value is more practical. Cisco's current &lt;a href="https://github.com/cisco/mercury/blob/main/doc/npf.md"&gt;draft NPF specification&lt;/a&gt; defines fingerprints for TLS, QUIC, TCP, HTTP, SSH and other protocols.&lt;/p&gt;
&lt;p&gt;Mercury also keeps fingerprint generation separate from process classification. That distinction is easy to miss.&lt;/p&gt;
&lt;h2&gt;A fingerprint and a label are different things&lt;/h2&gt;
&lt;p&gt;In Cisco's 2020 paper, &lt;a href="https://arxiv.org/abs/2009.01939"&gt;Accurate TLS Fingerprinting Using Destination Context and Knowledge Bases&lt;/a&gt;, the authors found that common TLS fingerprints mapped to many processes. For the 100 most prevalent fingerprints in their May 2020 data, the median was 24.5 process names per fingerprint.&lt;/p&gt;
&lt;p&gt;Their response was not a longer hash. They combined the fingerprint with destination address, port and server name, then used a weighted naïve Bayes classifier backed by a continually updated knowledge base.&lt;/p&gt;
&lt;p&gt;That produces an inference, not a property embedded in the fingerprint string. The result depends on labelled observations, their age, the monitored environment and the destination evidence available for the connection. The open Mercury repository can generate fingerprints without possessing Cisco's production knowledge base.&lt;/p&gt;
&lt;p&gt;This is the clearest difference between the two lineages:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;JA3 and JA4 define portable representations for selected TLS observations.&lt;/li&gt;
&lt;li&gt;Mercury NPF retains a richer, versioned representation that can be fed into a separate analysis system.&lt;/li&gt;
&lt;li&gt;Mercury's destination-context classifier is another layer again.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;None of these layers proves who made a request.&lt;/p&gt;
&lt;h2&gt;Where the lineages meet&lt;/h2&gt;
&lt;p&gt;The projects respond to many of the same protocol changes. Both JA4 and recent Mercury formats sort selected TLS fields to reduce instability caused by permutation. Both deal explicitly with GREASE. Both recognise that operators need compact values for logs as well as enough detail to investigate differences.&lt;/p&gt;
&lt;p&gt;They make different trade-offs. JA4 is convenient for grouping and interchange. Mercury's full NPF form is better suited to inspection and to analysis that benefits from retained structure. JA4's wider family adds fingerprints for other observations, while Mercury is also a packet metadata collector and protocol-analysis library. Comparing only the length of their hashes misses most of the design.&lt;/p&gt;
&lt;p&gt;The lab article makes that concrete. In &lt;a href="/blog/one-clienthello-ja3-ja4-mercury-lab/"&gt;one ClientHello, three fingerprints&lt;/a&gt;, we run JA3, JA4 and Mercury against the same packet capture, record the exact tool versions and compare what each output preserves.&lt;/p&gt;</content><category term="Security"></category><category term="TLS Fingerprinting"></category><category term="JA3"></category><category term="JA4"></category><category term="Cisco Mercury"></category><category term="Network Fingerprinting"></category><category term="Threat Detection"></category></entry><entry><title>Before JA3: How TLS Handshakes Became Fingerprints</title><link href="https://www.peakhour.io/blog/before-ja3-tls-fingerprinting-history/" rel="alternate"></link><published>2026-07-19T09:00:00+10:00</published><updated>2026-07-19T09:00:00+10:00</updated><author><name>AC</name></author><id>tag:www.peakhour.io,2026-07-19:/blog/before-ja3-tls-fingerprinting-history/</id><summary type="html">&lt;p&gt;JA3 made TLS fingerprints easy to log and share, but the technical ideas behind it had already been tested in SSL Labs experiments, a p0f patch and FingerprinTLS.&lt;/p&gt;</summary><content type="html">&lt;p&gt;JA3 is often treated as the beginning of TLS fingerprinting. It was not. Its real contribution was narrower and, operationally, just as important: JA3 took a set of ideas that had been explored for years and turned them into a small identifier that ordinary security tools could carry.&lt;/p&gt;
&lt;p&gt;The path to that format runs through an SSL Labs experiment in 2009, an experimental p0f extension in 2012 and Lee Brotherston's FingerprinTLS work in 2015. Each step answered a different question. What can the cleartext handshake reveal? Which details survive often enough to identify a client? How do you turn those details into something an analyst can match? And, finally, how do you make the result portable?&lt;/p&gt;
&lt;p&gt;This is a documented lineage where the authors themselves cite the earlier work. The claim that JA3's decisive move was simplification is our interpretation of those sources, not a claim that every project shared one design plan.&lt;/p&gt;
&lt;h2&gt;2009: the cipher list as a client signature&lt;/h2&gt;
&lt;p&gt;In June 2009, Ivan Ristić described an experiment in &lt;a href="https://blog.ivanristic.com/2009/06/http-client-fingerprinting-using-ssl-handshake-analysis.html"&gt;HTTP client fingerprinting using SSL handshake analysis&lt;/a&gt;. He was working on SSL Labs and noticed a useful property of the initial handshake: clients sent different lists of supported cipher suites, and those lists were visible before encryption began.&lt;/p&gt;
&lt;p&gt;The important observation was not that any one cipher identified a browser. It was the combination of ciphers a client offered. Ristić recorded the entire list as a signature and compared it with the HTTP User-Agent seen after the connection was established. He then published &lt;a href="https://blog.ivanristic.com/2009/07/examples-of-the-information-collected-from-ssl-handshakes.html"&gt;examples collected from real SSL handshakes&lt;/a&gt;, showing that the approach could separate a range of browsers, command-line clients and crawlers.&lt;/p&gt;
&lt;p&gt;This early method was deliberately modest. It concentrated on the cipher-suite list. It did not define a general-purpose fingerprint containing every useful ClientHello feature, and it did not claim that a signature proved the identity of a process.&lt;/p&gt;
&lt;p&gt;Even so, the core technical idea was in place:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;unencrypted ClientHello
  -&amp;gt; implementation-dependent choices
  -&amp;gt; repeatable signature
  -&amp;gt; comparison with previously observed clients
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The handshake was no longer just cryptographic setup. It was passive metadata about the software constructing it.&lt;/p&gt;
&lt;h2&gt;2012: p0f adds order, extensions and matching rules&lt;/h2&gt;
&lt;p&gt;Marek Majkowski pushed the idea further in his 2012 &lt;a href="https://idea.popcount.org/2012-06-17-ssl-fingerprinting-for-p0f/"&gt;SSL fingerprinting patch for p0f&lt;/a&gt;. p0f was already known for passive operating-system fingerprinting at lower layers. Majkowski applied a similar signature-and-database model to SSL and TLS ClientHello messages.&lt;/p&gt;
&lt;p&gt;His post explicitly credits Ristić's 2009 work, then points to two details he believed deserved more attention: ordering and TLS extensions. The patch represented a fingerprint as four fields:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;requested version : ordered ciphers : ordered extensions : flags
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;That is a meaningful technical step. Cipher suites are normally sent in preference order, and extension order can differ between implementations. Retaining those sequences gives the signature more discriminatory power than an unordered inventory. The flags recorded other behaviours, such as compression support or an unusual relationship between record and handshake versions.&lt;/p&gt;
&lt;p&gt;The implementation did more than print a string. It matched the result against a database of signatures that could contain wildcards and return a browser family, possible versions and sometimes a platform. The &lt;a href="https://gist.github.com/majek/2721464"&gt;original p0f patch and notes&lt;/a&gt; are still useful because they expose the boundary between observation and label: one part generates the raw signature; another compares it with knowledge gathered elsewhere.&lt;/p&gt;
&lt;p&gt;Majkowski also wrote with appropriate caution. His notes say that a ClientHello can sometimes identify the underlying SSL library and, for software with a custom build or distinctive feature set, may narrow the application version. "Sometimes" matters. Two applications using the same TLS stack can look alike, while one application can change its handshake when its library, configuration or build changes.&lt;/p&gt;
&lt;p&gt;The p0f work did not become the universal exchange format for TLS fingerprints. It did, however, demonstrate most of the ingredients that later systems would reuse: selected fields, preserved order, a serialised signature and a separate matching database.&lt;/p&gt;
&lt;h2&gt;2015: FingerprinTLS turns a method into a toolset&lt;/h2&gt;
&lt;p&gt;Lee Brotherston's 2015 work expanded the practical surface again. His DerbyCon and SecTor presentation, &lt;a href="https://archives.sector.ca/presentations15/BrotherstonTLS%20Fingerprinting%20SecTor.pdf"&gt;Stealthier Attacks and Smarter Defending with TLS Fingerprinting&lt;/a&gt;, examined TLS fingerprinting from both sides: defenders could recognise unexpected software, while an operator could alter a client's handshake to blend in or evade a simplistic rule.&lt;/p&gt;
&lt;p&gt;The associated &lt;a href="https://github.com/LeeBrotherston/tls-fingerprinting"&gt;FingerprinTLS repository&lt;/a&gt; packaged the approach into several working parts:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;FingerprinTLS&lt;/code&gt; detected TLS sessions on a live interface or in a PCAP, created fingerprints and matched them;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;fingerprints.json&lt;/code&gt; stored the known fingerprint database;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Fingerprintout&lt;/code&gt; exported observations into other forms, including Snort and Suricata rules.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This was broader than calculating a digest. It was a workflow for capturing a handshake, retaining many of its characteristics, associating that observation with known software and moving the result into operational tools.&lt;/p&gt;
&lt;p&gt;The project also made an awkward truth visible: rich fingerprints are not especially convenient interchange formats. FingerprinTLS could inspect more detail, but exporting that detail into a rule language could lose accuracy. Its README warned that Snort and Suricata exports might require tuning because their rule syntax could not express the full matching logic.&lt;/p&gt;
&lt;p&gt;That trade-off set the stage for JA3. A detailed signature helps an analyst explain why two handshakes differ. A compact value is easier to add to a connection log, compare across sensors and share with another team. It is difficult to optimise one representation for both jobs.&lt;/p&gt;
&lt;h2&gt;2017: JA3 chooses portability&lt;/h2&gt;
&lt;p&gt;Salesforce open-sourced JA3 in 2017. John Althouse's original &lt;a href="https://engineering.salesforce.com/open-sourcing-ja3-92c9e53c3c41/"&gt;JA3 announcement&lt;/a&gt; directly cites Ristić's 2009 post and Brotherston's 2015 research. It also states the team's design requirement plainly: the result had to work with existing monitoring systems and load balancers, be independent of the destination, and be easy for other tools to consume.&lt;/p&gt;
&lt;p&gt;JA3 selected five ordered ClientHello feature groups:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;TLS version,
cipher suites,
extension types,
supported groups,
elliptic-curve point formats
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;It rendered their numeric values into a comma-separated string, removed GREASE values, then calculated an MD5 digest. A long handshake description became a 32-character identifier.&lt;/p&gt;
&lt;p&gt;MD5 was not being used here to protect a password or prove integrity. It was a compact naming function. The security weakness of MD5 still means a JA3 value should not be treated as proof, but changing to a stronger digest would not solve the more common identification problem: unrelated software can naturally produce the same selected features, and software can deliberately copy another client's ClientHello.&lt;/p&gt;
&lt;p&gt;The simplification was substantial. Compared with FingerprinTLS, JA3 retained fewer fields and discarded the explanatory structure once the string was hashed. Compared with the p0f patch, it did not carry matching wildcards or classification rules in the fingerprint. What it gained was a common unit that could fit almost anywhere an operator could put a string.&lt;/p&gt;
&lt;p&gt;That was why JA3 travelled. A sensor could calculate the value, a SIEM could index it, an intelligence report could publish it and a rule could match it without every participant adopting the same fingerprint database or packet parser.&lt;/p&gt;
&lt;h2&gt;What JA3 inherited, and what it left behind&lt;/h2&gt;
&lt;p&gt;The documented history supports a few specific claims:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ristić showed in 2009 that an unencrypted SSL handshake, particularly its cipher list, could distinguish HTTP clients.&lt;/li&gt;
&lt;li&gt;Majkowski's 2012 p0f work explicitly built on that experiment and added ordered extensions, behavioural flags and database matching.&lt;/li&gt;
&lt;li&gt;Brotherston's 2015 research and FingerprinTLS made detailed capture, matching, creation and export available as a standalone toolset.&lt;/li&gt;
&lt;li&gt;Salesforce cited the earlier work when it released JA3 and designed a smaller representation for existing operational systems.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It does not support treating a fingerprint as an application identity. Every stage depended on a set of observed features and, when a software name was returned, knowledge collected outside the handshake itself. The label could be useful without being certain.&lt;/p&gt;
&lt;p&gt;That distinction is easier to see when the formats are run side by side. Our reproducible lab feeds &lt;a href="/blog/one-clienthello-ja3-ja4-mercury-lab/"&gt;one ClientHello to JA3, JA4 and Cisco Mercury&lt;/a&gt; and records both the compact outputs and the detail each format preserves.&lt;/p&gt;
&lt;p&gt;JA3 was not the final step either. JA4 later changed the normalisation and output structure to cope with modern sources of instability, while Cisco's research followed a more structured, context-aware path. Those are separate branches, not one straight succession. We trace them in &lt;a href="/blog/two-lineages-tls-fingerprinting/"&gt;Two Lineages of TLS Fingerprinting&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The useful lesson from the early history is not who coined the first fingerprint. It is that the representation determines the work you can do with it. Rich detail helps investigation. Compact identifiers help distribution. Neither turns a handshake into an identity document.&lt;/p&gt;</content><category term="Security"></category><category term="TLS Fingerprinting"></category><category term="JA3"></category><category term="FingerprinTLS"></category><category term="p0f"></category><category term="Network Fingerprinting"></category><category term="Security Research"></category></entry><entry><title>A Network Fingerprint Is a Cohort, Not a Client</title><link href="https://www.peakhour.io/blog/fingerprint-is-a-cohort-not-a-client/" rel="alternate"></link><published>2026-07-13T09:28:00+10:00</published><updated>2026-07-13T09:28:00+10:00</updated><author><name>AC</name></author><id>tag:www.peakhour.io,2026-07-13:/blog/fingerprint-is-a-cohort-not-a-client/</id><summary type="html">&lt;p&gt;TLS fingerprints group similar protocol implementations. They do not prove which application, device or person made a request.&lt;/p&gt;</summary><content type="html">&lt;p&gt;A TLS fingerprint usually tells you that two connections look alike under a particular set of rules. That is useful. It is not the same as showing that they came from the same client.&lt;/p&gt;
&lt;p&gt;The distinction becomes obvious when a common TLS library sits underneath many programs. Those programs can offer the same protocol version, cipher suites, extensions and signature algorithms. A fingerprint built from those fields groups them together even though their purpose, owner and risk are different.&lt;/p&gt;
&lt;p&gt;The reverse also happens. One application can generate several fingerprints after a browser update, operating-system change, feature rollout or configuration difference. A fixed application name does not imply a fixed ClientHello.&lt;/p&gt;
&lt;p&gt;The safest mental model is a cohort: traffic that looks the same after a fingerprint method has selected and normalised its inputs.&lt;/p&gt;
&lt;h2&gt;The method defines the cohort&lt;/h2&gt;
&lt;p&gt;JA3 preserves the order of its selected ClientHello feature lists. Change the order and the MD5 value changes. JA4 sorts selected identifiers before calculating two of its components, so permutations that split a JA3 cohort may remain grouped under JA4.&lt;/p&gt;
&lt;p&gt;Cisco Mercury can preserve more packet-derived structure in its full Network Protocol Fingerprint. Different Mercury rule versions also make different normalisation choices. A &lt;code&gt;tls/2&lt;/code&gt; value is therefore not just a longer spelling of JA4. It is the result of another feature-selection contract.&lt;/p&gt;
&lt;p&gt;This means there is no format-independent "real fingerprint" hiding underneath the tools. Each method answers its own equivalence question: which differences count, and which should be ignored?&lt;/p&gt;
&lt;p&gt;Our &lt;a href="/blog/one-clienthello-ja3-ja4-mercury-lab/"&gt;same-PCAP lab&lt;/a&gt; demonstrates that point without relying on a hypothetical browser. The three tools inspect the same ClientHello and produce representations with different retained detail.&lt;/p&gt;
&lt;h2&gt;Common does not mean safe&lt;/h2&gt;
&lt;p&gt;A popular browser fingerprint will naturally appear in a great deal of legitimate traffic. An attacker can also use a browser, drive one through automation, or imitate its TLS stack. Matching a common browser value therefore says little about intent by itself.&lt;/p&gt;
&lt;p&gt;The opposite shortcut is just as risky. An uncommon fingerprint is not proof of malware. Internal tools, older mobile applications, embedded devices, accessibility software and regional client variants can all be rare in one dataset.&lt;/p&gt;
&lt;p&gt;Rarity is relative to the observation point. A fingerprint that is common across a public content site may be unusual on an administrative API. A value common in one country, network or month may be rare in another.&lt;/p&gt;
&lt;h2&gt;Capture point changes what you see&lt;/h2&gt;
&lt;p&gt;TLS fingerprinting only works where the relevant handshake is visible. At an origin behind a CDN or reverse proxy, the TLS connection may have been terminated and replaced upstream. The origin can then observe the proxy's connection rather than the end user's ClientHello unless the edge explicitly forwards a derived fingerprint.&lt;/p&gt;
&lt;p&gt;That forwarded value also needs provenance. Operators should know which implementation and format version produced it, whether it came from the client-facing connection, and whether middleware transformed or sampled the traffic.&lt;/p&gt;
&lt;p&gt;Without that information, two values that look compatible may have been generated under different rules. Fastly has documented how implementation differences can undermine the portability promised by a shared hash in &lt;a href="https://www.fastly.com/blog/the-state-of-tls-fingerprinting-whats-working-what-isnt-and-whats-next"&gt;The State of TLS Fingerprinting&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Context can improve an inference&lt;/h2&gt;
&lt;p&gt;Cisco's Mercury research is helpful because it does not hide the ambiguity. The 2020 destination-context paper reports that one TLS fingerprint often maps to tens or hundreds of process names. Its classifier adds destination IP address, port and server name, backed by a labelled knowledge base, to rank the possible processes.&lt;/p&gt;
&lt;p&gt;That is stronger than treating a bare fingerprint as an application name. It is still conditional. Change the environment, the age of the knowledge base, the available destination fields or the software population and the probabilities can change. The paper's reported accuracy belongs to its datasets and experimental design, not to every network that runs Mercury.&lt;/p&gt;
&lt;p&gt;JA4 deployments often add context too. A security platform might combine the JA4 value with request rate, geography, path, account state or observations from other customers. Those extra fields are not secretly part of JA4. They are features in the surrounding detection system.&lt;/p&gt;
&lt;h2&gt;Use fingerprints where grouping helps&lt;/h2&gt;
&lt;p&gt;Fingerprints earn their place when grouping similar connections improves an investigation or control. Examples include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;counting login failures across rotating IP addresses;&lt;/li&gt;
&lt;li&gt;finding a TLS stack that appeared at the start of an incident;&lt;/li&gt;
&lt;li&gt;comparing a claimed browser with HTTP and browser-side evidence;&lt;/li&gt;
&lt;li&gt;monitoring drift after a client or library release;&lt;/li&gt;
&lt;li&gt;selecting traffic for review before writing a narrower rule.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For the decision and enforcement consequences, see &lt;a href="/blog/fingerprints-are-evidence-not-identity/"&gt;Fingerprints are evidence, not identity&lt;/a&gt;. The protocol-specific conclusion here is narrower: a matching TLS fingerprint places connections in a cohort defined by one method. It cannot tell you, on its own, who is on the other end.&lt;/p&gt;
&lt;p&gt;The practitioner follow-up, &lt;a href="/blog/using-network-fingerprints-in-bot-and-rate-limit-decisions/"&gt;Using network fingerprints in bot and rate-limit decisions&lt;/a&gt;, turns that boundary into a route-scoped policy and rollback model.&lt;/p&gt;</content><category term="Security"></category><category term="TLS Fingerprinting"></category><category term="JA3"></category><category term="JA4"></category><category term="Cisco Mercury"></category><category term="Network Fingerprinting"></category><category term="Bot Management"></category></entry><entry><title>From Joy to Mercury and EVE: Following Cisco's Network Fingerprinting Work</title><link href="https://www.peakhour.io/blog/from-joy-to-mercury-and-eve/" rel="alternate"></link><published>2026-07-13T09:28:00+10:00</published><updated>2026-07-13T09:28:00+10:00</updated><author><name>AC</name></author><id>tag:www.peakhour.io,2026-07-13:/blog/from-joy-to-mercury-and-eve/</id><summary type="html">&lt;p&gt;Cisco's open-source collectors, fingerprinting research and Encrypted Visibility Engine form a clear lineage, but they are not interchangeable parts of one public system.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Cisco's network fingerprinting work is often compressed into a neat product story: Joy became Mercury, and Mercury became the Encrypted Visibility Engine. There is a real lineage here, but that sentence hides more than it explains.&lt;/p&gt;
&lt;p&gt;Joy and Mercury are public software projects. Network Protocol Fingerprinting is a representation. The 2020 destination-context paper describes a classification system and the data needed to support it. EVE is a Cisco Secure Firewall capability backed by Cisco's operational data and machine-learning systems.&lt;/p&gt;
&lt;p&gt;Those pieces share ideas, authors and engineering history. They are not four names for the same thing.&lt;/p&gt;
&lt;h2&gt;Joy started with flow records, then looked inside them&lt;/h2&gt;
&lt;p&gt;Cisco released &lt;a href="https://github.com/cisco/joy"&gt;Joy&lt;/a&gt; as a BSD-licensed tool for collecting network flow and &lt;em&gt;intraflow&lt;/em&gt; data from live traffic or PCAP files. Its basic unit was recognisable to anyone who had worked with NetFlow or IPFIX: a flow with addresses, ports and counters. Joy then added observations from within that flow.&lt;/p&gt;
&lt;p&gt;Those observations included packet lengths and arrival times, byte distributions, TLS record sequences, visible TLS handshake fields, DNS data and selected HTTP fields. It wrote the results as JSON so researchers could feed them into analysis tools without building a packet parser first.&lt;/p&gt;
&lt;p&gt;That breadth matters. Joy was not originally just a ClientHello hash generator. It was a network-research instrument for asking what could still be learned from traffic when the application payload was encrypted.&lt;/p&gt;
&lt;p&gt;The research around Joy shows how Cisco used it. The 2016 paper &lt;a href="https://arxiv.org/abs/1607.01639"&gt;Deciphering Malware's Use of TLS (without Decryption)&lt;/a&gt; combined conventional flow measurements, packet-length and timing sequences, byte distributions and visible TLS handshake features. Its authors were interested in malware detection and family attribution, but they were also explicit about dataset bias. A sandbox operating system or its default TLS library could become an accidental shortcut for the classifier.&lt;/p&gt;
&lt;p&gt;In 2017, &lt;a href="https://arxiv.org/abs/1706.08003"&gt;OS Fingerprinting: New Techniques and a Study of Information Gain and Obfuscation&lt;/a&gt; used an extended Joy collector to record features from TCP SYN packets, TLS ClientHello messages and HTTP requests. The study combined evidence across protocols and sessions rather than expecting one handshake to provide a definitive operating-system label.&lt;/p&gt;
&lt;p&gt;The enduring idea was broader than any one model: retain useful network observations, join them to trustworthy labels where possible, and test what the combined evidence can support.&lt;/p&gt;
&lt;h2&gt;Mercury narrowed and hardened the collection path&lt;/h2&gt;
&lt;p&gt;The Joy repository now directs readers to Mercury for Cisco's more recent fingerprinting tools and data. &lt;a href="https://github.com/cisco/mercury"&gt;Mercury&lt;/a&gt; carries forward the packet-metadata and JSON-output model, but it is a separate implementation with a stronger focus on fast capture, protocol fingerprints and online analysis.&lt;/p&gt;
&lt;p&gt;The public repository contains a C++ application and library, along with the portable Python implementation &lt;code&gt;pmercury&lt;/code&gt;. Mercury can read PCAPs or live traffic, identify supported protocols and emit selected metadata. On Linux, its native collector uses the kernel's &lt;code&gt;AF_PACKET&lt;/code&gt; &lt;code&gt;TPACKETv3&lt;/code&gt; path and multiple workers. The repository describes use in some production applications, while still asking users to treat the open software as beta.&lt;/p&gt;
&lt;p&gt;Mercury also makes a useful boundary visible in its JSON:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;packet
  -&amp;gt; protocol metadata
  -&amp;gt; fingerprint object
  -&amp;gt; optional destination-context analysis
  -&amp;gt; analysis object
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The fingerprint is an observation. The analysis is an inference made from that observation and other data. They should not be collapsed into one label.&lt;/p&gt;
&lt;h2&gt;NPF is the representation, not the classifier&lt;/h2&gt;
&lt;p&gt;Mercury's fingerprints use Cisco's Network Protocol Fingerprinting format. NPF selects characteristic fields from an initial protocol message, normalises values that should not distinguish implementations, and writes the retained structure as a tree of hexadecimal byte strings.&lt;/p&gt;
&lt;p&gt;A full TLS fingerprint can therefore be inspected. Its &lt;code&gt;tls/2&lt;/code&gt; prefix identifies the protocol and rule version; parentheses and brackets preserve the selected tree structure and sorting decisions. Mercury can also use a compact hash nickname when fixed-length storage is more useful than inspection.&lt;/p&gt;
&lt;p&gt;The &lt;a href="https://github.com/cisco/mercury/blob/main/doc/npf.md"&gt;draft NPF specification&lt;/a&gt; covers more than TLS. It documents rules for protocols including QUIC, TCP, HTTP, SSH, STUN and OpenVPN. This is one point at which the Joy heritage remains visible: the project treats protocol evidence as a network-wide problem, not solely as a way to name TLS clients.&lt;/p&gt;
&lt;p&gt;Our guide to &lt;a href="/learning/fingerprinting/what-is-cisco-mercury-fingerprinting/"&gt;Cisco Mercury fingerprinting&lt;/a&gt; separates the collector, NPF representation, knowledge base and classifier in more detail. &lt;a href="/learning/fingerprinting/inside-mercury-npf-fingerprint/"&gt;Inside a Mercury NPF fingerprint&lt;/a&gt; works through the full notation.&lt;/p&gt;
&lt;h2&gt;The 2020 paper made the attribution problem explicit&lt;/h2&gt;
&lt;p&gt;A fingerprint is useful for grouping similar protocol implementations. It is often a poor application name.&lt;/p&gt;
&lt;p&gt;Blake Anderson and David McGrew quantified that problem in &lt;a href="https://arxiv.org/abs/2009.01939"&gt;Accurate TLS Fingerprinting Using Destination Context and Knowledge Bases&lt;/a&gt;. TLS libraries are shared. Common fingerprints can map to tens or hundreds of processes. A dictionary that assigns one process name to one fingerprint will therefore produce convincing-looking false positives.&lt;/p&gt;
&lt;p&gt;The paper added three destination features to the TLS fingerprint: destination address, destination port and the TLS server name, when present. A weighted naive Bayes classifier used those features and prevalence counts from a labelled knowledge base to rank candidate processes.&lt;/p&gt;
&lt;p&gt;The knowledge base was the difficult part. The researchers joined network observations to endpoint process data, generated fresh knowledge bases daily and merged them into an operational view. They also used malware-sandbox observations. The paper describes billions of connections, a changing population of fingerprints and destinations, and the need to discard stale data.&lt;/p&gt;
&lt;p&gt;Its reported results were strong, including a process-family F1 score above 0.99 and high precision and recall for the malware task. Those figures belong to the paper's datasets and evaluation. They are not an accuracy guarantee for a Mercury installation downloaded from GitHub.&lt;/p&gt;
&lt;p&gt;The authors also documented important limits: their endpoint data was dominated by desktop Windows and macOS systems, mobile and IoT coverage was absent, and most data came from one enterprise. They wrote that a site could build a custom knowledge base if it had suitable endpoint ground truth and network monitoring, but acknowledged the significant initial investment.&lt;/p&gt;
&lt;p&gt;That is the operational lesson. A classifier is not made current by having a good fingerprint format. It stays current through labelled collection, joining, curation, expiry and evaluation.&lt;/p&gt;
&lt;p&gt;For a closer reading, see &lt;a href="/learning/fingerprinting/destination-context-tls-attribution/"&gt;how destination context changes TLS attribution&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;EVE puts the research into a firewall product&lt;/h2&gt;
&lt;p&gt;Cisco describes its Encrypted Visibility Engine as work based on that earlier destination-context research. EVE first appeared in &lt;a href="https://www.cisco.com/c/en/us/td/docs/security/firepower/710/relnotes/firepower-release-notes-710/features.html"&gt;Secure Firewall 7.1&lt;/a&gt; as a disabled-by-default experimental beta for visibility only; it did not enforce actions and Cisco warned that it could produce false positives. The &lt;a href="https://www.cisco.com/c/en/us/td/docs/security/secure-firewall/release-notes/threat-defense/720/threat-defense-release-notes-72.html"&gt;7.2 release notes&lt;/a&gt; say EVE began working with QUIC and allowed high-confidence process assignments to feed application policy. &lt;a href="https://www.cisco.com/c/en/us/td/docs/security/secure-firewall/release-notes/threat-defense/730/threat-defense-release-notes-73.html"&gt;Version 7.3&lt;/a&gt; specifically added HTTP/3 and SMB-over-QUIC detection, along with indication-of-compromise events for unsafe applications.&lt;/p&gt;
&lt;p&gt;In Cisco's account of &lt;a href="https://blogs.cisco.com/security/how-eve-detects-malicious-uses-of-trustworthy-cloud-services"&gt;how EVE detects malicious use of trustworthy cloud services&lt;/a&gt;, the runtime inputs have the same recognisable shape:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;an NPF representing client-side protocol characteristics; and&lt;/li&gt;
&lt;li&gt;server context such as address, port and domain name.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;EVE uses machine learning over Cisco's labelled data to estimate the client process and detect suspicious encrypted traffic without decrypting its payload. Cisco says its training data is refreshed daily with network samples joined to endpoint ground truth, with additional malicious observations from Cisco Secure Malware Analytics.&lt;/p&gt;
&lt;p&gt;This is the clearest public link from NPF and the 2020 paper to the commercial system. It is also where careful wording matters most.&lt;/p&gt;
&lt;p&gt;The public Mercury repository is not a source release of the complete EVE service. Building Mercury does not provide Cisco's continuously collected production dataset, its current models, Secure Firewall integration, Talos context or product policy behaviour. Conversely, the fact that EVE uses NPF does not mean every detail of its current implementation is present in the open repository or frozen at the method described in the 2020 paper.&lt;/p&gt;
&lt;p&gt;Open code, published research and a maintained security product have different release cycles and different evidence behind them.&lt;/p&gt;
&lt;h2&gt;What the lineage actually establishes&lt;/h2&gt;
&lt;p&gt;There is a coherent progression:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;Joy
  broad flow and intraflow metadata for research

Mercury + NPF
  faster collection and versioned, multi-protocol fingerprints

2020 destination-context system
  fingerprints joined to destinations and endpoint labels

EVE
  Cisco-maintained classification in Secure Firewall
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;This is a lineage of ideas and systems, not a promise that each box is a drop-in edition of the next one.&lt;/p&gt;
&lt;p&gt;Joy established a practical way to collect visible evidence around encrypted flows. Mercury made protocol fingerprinting a more explicit and efficient part of that collection. NPF gave those fingerprints a structured, versioned form. The destination-context work showed why labelled, continuously refreshed context was necessary for process attribution. EVE operationalised those ideas inside a commercial firewall environment with data and integrations that do not ship with the public collector.&lt;/p&gt;
&lt;p&gt;That history also explains why Cisco's branch of fingerprinting developed differently from JA3 and JA4. A portable hash is useful for logging and exchange. Cisco's work kept returning to a harder question: what additional evidence, labels and maintenance are required before a network observation can support a process assessment?&lt;/p&gt;
&lt;p&gt;Neither approach turns a handshake into identity. Our &lt;a href="/blog/two-lineages-tls-fingerprinting/"&gt;two lineages of TLS fingerprinting&lt;/a&gt; article places Cisco's work alongside JA3 and JA4. The reproducible &lt;a href="/blog/one-clienthello-ja3-ja4-mercury-lab/"&gt;one ClientHello, three fingerprints lab&lt;/a&gt; shows the format differences without relying on any vendor classification database.&lt;/p&gt;</content><category term="Security"></category><category term="Cisco Joy"></category><category term="Cisco Mercury"></category><category term="Encrypted Visibility Engine"></category><category term="TLS Fingerprinting"></category><category term="Network Fingerprinting"></category><category term="Encrypted Traffic"></category></entry><entry><title>What an Open Network Fingerprint Database Should Publish</title><link href="https://www.peakhour.io/blog/open-network-fingerprint-database-schema/" rel="alternate"></link><published>2026-07-13T09:28:00+10:00</published><updated>2026-07-13T09:28:00+10:00</updated><author><name>AC</name></author><id>tag:www.peakhour.io,2026-07-13:/blog/open-network-fingerprint-database-schema/</id><summary type="html">&lt;p&gt;A useful open fingerprint database needs provenance, competing labels, raw evidence, format versions and licences—not another unexplained hash list.&lt;/p&gt;</summary><content type="html">&lt;p&gt;An open fingerprint database should let another researcher disagree with it.&lt;/p&gt;
&lt;p&gt;That requires more than a hash and an application name. The row needs to show which bytes produced the fingerprint, how the label was established, where the traffic was observed, which software generated the value and what competing explanations remain plausible.&lt;/p&gt;
&lt;p&gt;Most public databases were built for a narrower purpose. Historical JA3 lists made values easy to share. Threat feeds made malware observations easy to match. Nmap and p0f made signature rules executable. TLS observatories count what appears at their vantage points. Those are sensible designs for their jobs.&lt;/p&gt;
&lt;p&gt;They do not yet add up to a reusable open ground-truth corpus.&lt;/p&gt;
&lt;h2&gt;Start with observations, not verdicts&lt;/h2&gt;
&lt;p&gt;The fundamental database object should be an observation:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;observation_id&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;...&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;observed_at&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;2026-07-12T00:00:00Z&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;capture&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;position&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;client-facing edge&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;collector&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;mercury&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;collector_revision&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;3172786...&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;source&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;controlled-client-run&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;fingerprints&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[],&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;labels&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[],&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;evidence&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[],&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;licence&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;...&amp;quot;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The observation can then carry several fingerprint methods and several candidate labels. This is safer than making the hash the primary truth and forcing one application name into the same row.&lt;/p&gt;
&lt;h2&gt;Store the reversible material&lt;/h2&gt;
&lt;p&gt;Each fingerprint entry should contain the published identifier and the material used to derive it:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;method&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;ja4&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;implementation&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;FoxIO Python&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;implementation_revision&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;...&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;value&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;t12d2709h2_..._...&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;raw_value&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;t12d2709h2_002f,...&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;source_message_digest&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;sha256:...&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;truncated&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;For JA3, retain the five-part source string beside the MD5. For JA4, retain &lt;code&gt;JA4_r&lt;/code&gt; where collection policy permits it. For Mercury, retain the complete versioned NPF string rather than only its hash nickname. For HASSH, retain the algorithm lists. For a matcher rule, retain the response bytes or sanitised fixture that satisfied it.&lt;/p&gt;
&lt;p&gt;This permits field-level comparison, implementation testing and migration when a definition changes. It also exposes incompatible values hidden behind a common field name.&lt;/p&gt;
&lt;h2&gt;Make labels many-to-many&lt;/h2&gt;
&lt;p&gt;Labels should be separate evidence-backed assertions:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;type&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;process&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;value&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;example-client&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;version&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;1.2.3&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;source&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;endpoint-telemetry-join&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;review_state&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;reviewed&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;confidence&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.94&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;first_seen&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;...&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;last_seen&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;...&amp;quot;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;One fingerprint can have several process labels because applications share libraries. One process can have several fingerprints because versions, platforms and configurations differ. The schema should preserve counts and conflict instead of selecting one winner during ingestion.&lt;/p&gt;
&lt;p&gt;Cisco Mercury's public &lt;a href="https://github.com/cisco/mercury/blob/main/doc/resources.md"&gt;resource schema&lt;/a&gt; points in this direction: fingerprint entries contain candidate processes, observation counts, operating systems and destinations. The production database is private, but the many-to-many model is the right starting point.&lt;/p&gt;
&lt;h2&gt;Describe how ground truth was produced&lt;/h2&gt;
&lt;p&gt;Use a controlled vocabulary for evidence sources:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;controlled_capture
endpoint_process_join
malware_sandbox
reviewed_pcap
active_probe_match
passive_observation
community_submission
derived_from_external_database
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Each type needs its own metadata. An endpoint join should record the join window and ambiguity rules. A controlled capture should name the client build, operating system and generation script. A malware sandbox label should identify the sample and distinguish the sandbox process from the malware process. A community submission should identify what a reviewer actually checked.&lt;/p&gt;
&lt;p&gt;Derived labels should never masquerade as independent evidence. If a mapping was imported from an older JA3 list, cite that row and keep its original uncertainty.&lt;/p&gt;
&lt;h2&gt;Separate prevalence from classification&lt;/h2&gt;
&lt;p&gt;Prevalence belongs in observation aggregates:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;source&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;university-vantage-a&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;first_seen&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;...&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;last_seen&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;...&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;count&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;184233&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;It should not silently increase application-label confidence. A common fingerprint is not necessarily well-labelled; a rare fingerprint is not necessarily suspicious.&lt;/p&gt;
&lt;p&gt;The &lt;a href="https://tlsfingerprint.io/"&gt;TLS Fingerprint Observatory&lt;/a&gt; demonstrates the value of publishing counts even when labels are missing. Its large unlabelled TLS corpus is more useful for prevalence research than a catalogue filled with guesses.&lt;/p&gt;
&lt;h2&gt;Represent threat observations explicitly&lt;/h2&gt;
&lt;p&gt;A malware feed should attach an observation, not overwrite the fingerprint's identity:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;type&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;malware-sandbox-observation&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;family&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;example-family&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;sample_sha256&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;...&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;observed_at&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;...&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;known_good_evaluation&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;not-performed&amp;quot;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;This retains the warning published by sources such as &lt;a href="https://sslbl.abuse.ch/blacklist/"&gt;SSLBL&lt;/a&gt;. It allows a consumer to ask whether a fingerprint was seen in malware without treating every matching benign process as infected.&lt;/p&gt;
&lt;h2&gt;Publish validation sets and negative evidence&lt;/h2&gt;
&lt;p&gt;A useful database should include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;controlled positive captures;&lt;/li&gt;
&lt;li&gt;known-good observations that share supposedly malicious fingerprints;&lt;/li&gt;
&lt;li&gt;deliberately conflicting labels;&lt;/li&gt;
&lt;li&gt;client upgrades that changed fingerprints;&lt;/li&gt;
&lt;li&gt;malformed and truncated handshakes;&lt;/li&gt;
&lt;li&gt;captures before and after a TLS-terminating proxy;&lt;/li&gt;
&lt;li&gt;implementation conformance cases.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Negative and conflicting evidence is not database dirt. It tells consumers where a label stops working.&lt;/p&gt;
&lt;h2&gt;Version the data and the interpretation&lt;/h2&gt;
&lt;p&gt;Every release should state:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;schema version;&lt;/li&gt;
&lt;li&gt;database snapshot identifier;&lt;/li&gt;
&lt;li&gt;fingerprint implementation revisions;&lt;/li&gt;
&lt;li&gt;collection time range;&lt;/li&gt;
&lt;li&gt;label additions, removals and merges;&lt;/li&gt;
&lt;li&gt;retired mappings;&lt;/li&gt;
&lt;li&gt;licence changes;&lt;/li&gt;
&lt;li&gt;reproducible validation results.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Consumers should be able to pin a snapshot and explain which database caused a decision. A live service may remain convenient, but an incident review needs the state that existed when the event was classified.&lt;/p&gt;
&lt;h2&gt;Make licensing part of the schema&lt;/h2&gt;
&lt;p&gt;Fingerprint method, implementation and dataset rights are separate.&lt;/p&gt;
&lt;p&gt;Core JA4 is BSD-licensed. Other JA4+ methods use different FoxIO terms. Nmap's data files use the Nmap Public Source License. A combined historical repository may contain rows imported under different licences. An API may permit lookup but prohibit bulk redistribution.&lt;/p&gt;
&lt;p&gt;Store a licence or source-rights reference for each imported dataset and, where necessary, each record. If the rights are unclear, publish a pointer and transformation recipe rather than republishing the row.&lt;/p&gt;
&lt;h2&gt;Provide a confidence model that can be audited&lt;/h2&gt;
&lt;p&gt;A score without calibration is decoration. For each label type, document:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;what the score estimates;&lt;/li&gt;
&lt;li&gt;the labelled validation set;&lt;/li&gt;
&lt;li&gt;true-positive and false-positive definitions;&lt;/li&gt;
&lt;li&gt;treatment of unseen applications;&lt;/li&gt;
&lt;li&gt;time and environment holdouts;&lt;/li&gt;
&lt;li&gt;how conflicts and stale observations affect the score.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Where calibration is unavailable, use review states such as &lt;code&gt;submitted&lt;/code&gt;, &lt;code&gt;reproduced&lt;/code&gt;, &lt;code&gt;reviewed&lt;/code&gt; and &lt;code&gt;contested&lt;/code&gt; instead of inventing numeric precision.&lt;/p&gt;
&lt;h2&gt;The minimum viable open record&lt;/h2&gt;
&lt;p&gt;If full packet evidence cannot be published, a useful minimum is:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;method and rule version
implementation revision
compact and raw fingerprint
candidate label, including version/platform
ground-truth method
capture position
first and last seen
observation count
confidence or review state
evidence reference
licence
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;That is more expensive than a CSV containing &lt;code&gt;hash,name&lt;/code&gt;. It is also what makes the mapping useful outside the environment and assumptions of its original collector.&lt;/p&gt;
&lt;p&gt;The public ecosystem already contains most of the parts: JA4DB's cross-method model, the TLS observatory's prevalence data, Mercury's candidate-process and destination schema, FingerprinTLS's retained ClientHello fields, and executable fixtures in matcher projects such as Rapid7 Recog. The missing step is to combine those strengths without erasing provenance.&lt;/p&gt;
&lt;p&gt;For the current resource landscape, see &lt;a href="/learning/fingerprinting/public-network-fingerprint-databases/"&gt;Public Network Fingerprint Databases and What They Cover&lt;/a&gt;. For the import checklist, see &lt;a href="/learning/fingerprinting/how-to-evaluate-a-fingerprint-database/"&gt;How to Evaluate a Network Fingerprint Database&lt;/a&gt;.&lt;/p&gt;</content><category term="Security"></category><category term="Network Fingerprinting"></category><category term="TLS Fingerprinting"></category><category term="JA4"></category><category term="Cisco Mercury"></category><category term="Security Research"></category></entry><entry><title>Public Fingerprint Databases Are Not Ground Truth</title><link href="https://www.peakhour.io/blog/public-fingerprint-databases-are-not-ground-truth/" rel="alternate"></link><published>2026-07-13T09:28:00+10:00</published><updated>2026-07-13T09:28:00+10:00</updated><author><name>AC</name></author><id>tag:www.peakhour.io,2026-07-13:/blog/public-fingerprint-databases-are-not-ground-truth/</id><summary type="html">&lt;p&gt;We reviewed the main public fingerprint resources. The formats are open, but current application labels and auditable ground truth remain scarce.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Network fingerprint formats are public. Reliable labels are not.&lt;/p&gt;
&lt;p&gt;We reviewed the main public JA3, JA4, TLS, TCP, HTTP, SSH, JARM, DHCP, operating-system and service-fingerprint resources. The result was not one large ecosystem of interchangeable databases. It was a set of much narrower things: small mapping samples, old signature lists, active-probe rules, malware feeds, account services and a large observatory whose TLS records are almost entirely unlabelled.&lt;/p&gt;
&lt;p&gt;That is not a criticism of the maintainers. It is a warning about what happens after a fingerprint field reaches a dashboard. A precise-looking value invites a precise-looking name. The evidence behind that name may be a controlled capture, a best guess from 2018, a community submission or a malware sandbox observation that was never compared with benign traffic.&lt;/p&gt;
&lt;p&gt;Those labels should not produce the same decision.&lt;/p&gt;
&lt;h2&gt;The largest public TLS database has almost no TLS labels&lt;/h2&gt;
&lt;p&gt;The relaunched &lt;a href="https://tlsfingerprint.io/"&gt;TLS Fingerprint Observatory&lt;/a&gt; is an unusually valuable public resource. It exposes more than a million distinct TLS fingerprints and billions of passive observations from the University of Colorado Boulder and Merit Network. Records can include first and last seen, counts by source, cipher suites, extensions, groups, signature algorithms, ALPN and other parsed fields.&lt;/p&gt;
&lt;p&gt;At the time of our review, essentially none of the TLS fingerprints had implementation labels.&lt;/p&gt;
&lt;p&gt;That fact makes the observatory more credible, not less. The collection can answer prevalence and protocol-evolution questions without pretending it knows which application created every handshake. Its smaller QUIC corpus has several hundred controlled labels, often tied to generated capture files.&lt;/p&gt;
&lt;p&gt;The limitation is equally clear. A prevalence database cannot become a browser or malware classifier merely because its records are detailed. The labels require another source of truth.&lt;/p&gt;
&lt;h2&gt;The public JA4 database is a sample, not JA4DB&lt;/h2&gt;
&lt;p&gt;FoxIO maintains &lt;a href="https://ja4db.foxio.io/"&gt;JA4DB&lt;/a&gt;, a hosted service covering several JA4-family methods, applications and detection guidance. It is the closest current service to a multi-surface mapping database.&lt;/p&gt;
&lt;p&gt;The public file most people can inspect is different. FoxIO's &lt;a href="https://github.com/FoxIO-LLC/ja4/blob/main/ja4plus-mapping.csv"&gt;&lt;code&gt;ja4plus-mapping.csv&lt;/code&gt;&lt;/a&gt; contains 66 data rows. Only 35 carry a core JA4 value; the other JA4+ columns are sparser.&lt;/p&gt;
&lt;p&gt;That file is useful documentation. It shows how an application, library, device, operating system and several network observations can sit in one row. It is not broad enough to serve as a general browser, bot or malware catalogue.&lt;/p&gt;
&lt;p&gt;The hosted service is now account-oriented. Its bulk-data licence and per-record provenance are not publicly clear enough to call it an open database. Core JA4's BSD licence does not automatically cover the hosted labels, and it does not cover all other JA4+ methods under the same terms.&lt;/p&gt;
&lt;h2&gt;The open JA3 mappings are mostly historical&lt;/h2&gt;
&lt;p&gt;Salesforce's archived &lt;a href="https://github.com/salesforce/ja3/tree/master/lists"&gt;JA3 lists&lt;/a&gt; contain roughly 159 application mappings for macOS and Linux. The repository describes them as example or best-guess material. They have no per-row capture date, client version, source PCAP or confidence.&lt;/p&gt;
&lt;p&gt;Trisul's &lt;a href="https://github.com/trisulnsm/ja3prints"&gt;ja3prints&lt;/a&gt; is larger: 626 JSONL mappings assembled from Salesforce examples, malware-traffic-analysis captures, FingerprinTLS and browser additions. Its last update was in 2018, and the combined dataset does not have a clear repository-wide licence.&lt;/p&gt;
&lt;p&gt;The historical &lt;a href="https://github.com/LeeBrotherston/tls-fingerprinting"&gt;FingerprinTLS&lt;/a&gt; database preserves richer ClientHello fields than JA3, which makes it valuable for research. It is now archived, and many records lack consistent capture dates, operating-system evidence and confidence.&lt;/p&gt;
&lt;p&gt;These sources still matter. They document the lineage and can help with an older incident. They should not silently become current application ground truth.&lt;/p&gt;
&lt;h2&gt;Rules are not observations&lt;/h2&gt;
&lt;p&gt;Some of the strongest public databases are actually matcher corpora.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/nmap/nmap/blob/master/nmap-os-db"&gt;Nmap's OS database&lt;/a&gt; contains actively maintained probe-response signatures. &lt;a href="https://github.com/nmap/nmap/blob/master/nmap-service-probes"&gt;Nmap service probes&lt;/a&gt; combine test payloads with regular expressions that extract products and versions. &lt;a href="https://github.com/rapid7/recog"&gt;Rapid7 Recog&lt;/a&gt; maintains XML signatures for SSH, HTTP, SNMP, favicons, JARM and other surfaces. p0f's &lt;code&gt;p0f.fp&lt;/code&gt; contains passive TCP and HTTP traits, although its upstream corpus is now dated.&lt;/p&gt;
&lt;p&gt;These resources can be excellent at their stated job. A rule match means that a response satisfied the signature. It does not establish population prevalence, exclusivity or a particular process behind the connection.&lt;/p&gt;
&lt;p&gt;Flattening a matcher result into the same table as an observed application mapping discards that distinction.&lt;/p&gt;
&lt;h2&gt;Malware observation is not malware identity&lt;/h2&gt;
&lt;p&gt;SSLBL publishes a &lt;a href="https://sslbl.abuse.ch/blacklist/"&gt;JA3 blacklist&lt;/a&gt; under CC0. It records fingerprints observed while analysing more than 25 million malware PCAPs and offers both CSV and Suricata rules.&lt;/p&gt;
&lt;p&gt;SSLBL also says the values were not tested against known-good traffic and may cause substantial false positives.&lt;/p&gt;
&lt;p&gt;That warning is part of the data. A row supports this statement:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;malware samples assigned this family label produced this JA3
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;It does not support this statement:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;every connection with this JA3 is that malware
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Shared libraries make the second statement unsafe. Cisco's &lt;a href="https://arxiv.org/abs/2009.01939"&gt;destination-context research&lt;/a&gt; examined public malware JA3 indicators and found that many were more strongly associated with benign processes in its enterprise observations.&lt;/p&gt;
&lt;p&gt;VirusTotal's behavioural pivots have the same boundary. Files sharing a JA4 may be related malware, come from one developer or merely use the same TLS library. The pivot begins an investigation; it does not finish one.&lt;/p&gt;
&lt;h2&gt;Mercury publishes the schema, not the labels&lt;/h2&gt;
&lt;p&gt;Cisco Mercury offers one of the clearest public designs for a fingerprint knowledge base. Its &lt;a href="https://github.com/cisco/mercury/blob/main/doc/resources.md"&gt;resource documentation&lt;/a&gt; describes mappings from fingerprints to candidate processes, process counts, operating-system observations and destinations. The classifier can use destination address, port and server name to rank those candidates.&lt;/p&gt;
&lt;p&gt;The current Cisco-labelled resource database is not in the public repository.&lt;/p&gt;
&lt;p&gt;This is an honest architectural boundary. The NPF format, collector and database contract are inspectable. The production labels depend on continuously collected endpoint, network and malware-analysis data that Cisco does not publish as an open corpus.&lt;/p&gt;
&lt;h2&gt;What is actually missing&lt;/h2&gt;
&lt;p&gt;The public ecosystem does not mainly need another hash list. It needs evidence attached to each mapping:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;the raw or reversible fingerprint;&lt;/li&gt;
&lt;li&gt;the method and implementation version;&lt;/li&gt;
&lt;li&gt;an independent label source;&lt;/li&gt;
&lt;li&gt;capture position and environment;&lt;/li&gt;
&lt;li&gt;first and last seen;&lt;/li&gt;
&lt;li&gt;observation count;&lt;/li&gt;
&lt;li&gt;competing labels;&lt;/li&gt;
&lt;li&gt;confidence and review state;&lt;/li&gt;
&lt;li&gt;a usable dataset licence.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Almost none of the public resources supplies all of these. Some optimise for scale, some for current labels, some for inspectability and some for rules that can run in an existing scanner.&lt;/p&gt;
&lt;p&gt;The practical response is to preserve those categories. Use an observatory for prevalence, a matcher corpus for response signatures, a threat feed for malware observations, and a mapping database for candidate labels. Then validate the result against local evidence before it reaches enforcement.&lt;/p&gt;
&lt;p&gt;The full directory is in &lt;a href="/learning/fingerprinting/public-network-fingerprint-databases/"&gt;Public Network Fingerprint Databases and What They Cover&lt;/a&gt;. The evaluation checklist is in &lt;a href="/learning/fingerprinting/how-to-evaluate-a-fingerprint-database/"&gt;How to Evaluate a Network Fingerprint Database&lt;/a&gt;.&lt;/p&gt;</content><category term="Security"></category><category term="Network Fingerprinting"></category><category term="TLS Fingerprinting"></category><category term="JA3"></category><category term="JA4"></category><category term="Threat Intelligence"></category></entry><entry><title>Does TLS Fingerprint Canonicalisation Hide Attacker Variation? How to Test It</title><link href="https://www.peakhour.io/blog/tls-fingerprint-canonicalisation-attacker-variation/" rel="alternate"></link><published>2026-07-13T09:28:00+10:00</published><updated>2026-07-13T09:28:00+10:00</updated><author><name>AC</name></author><id>tag:www.peakhour.io,2026-07-13:/blog/tls-fingerprint-canonicalisation-attacker-variation/</id><summary type="html">&lt;p&gt;Sorting makes TLS fingerprints more stable, but it also removes ordering evidence. Here is how to test whether the discarded variation matters.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Canonicalisation solves a real problem in TLS fingerprinting. If two ClientHello messages differ only because a client shuffled its extensions, treating them as unrelated fingerprints creates noise. Sorting those extensions puts the messages back into one cohort.&lt;/p&gt;
&lt;p&gt;It also destroys the original order.&lt;/p&gt;
&lt;p&gt;That is not automatically a mistake. A fingerprint is useful partly because it ignores variation that does not help with the job at hand. The unanswered question is whether some of the discarded variation separates ordinary client behaviour from automation, scanners or deliberate evasion.&lt;/p&gt;
&lt;p&gt;Our &lt;a href="/blog/one-clienthello-ja3-ja4-mercury-lab/"&gt;one-ClientHello lab&lt;/a&gt; cannot answer that. It proves that three pinned implementations produce recorded representations from the same bytes. It says nothing about a population of clients or attackers. Answering the canonicalisation question needs a corpus and a labelled experiment.&lt;/p&gt;
&lt;h2&gt;What gets collapsed?&lt;/h2&gt;
&lt;p&gt;JA3 removes GREASE values but otherwise preserves the order of the selected cipher, extension, supported-group and point-format lists. Change one of those ordered inputs and the MD5 digest changes.&lt;/p&gt;
&lt;p&gt;JA4 deliberately defines a broader equivalence class. Its canonical &lt;code&gt;b&lt;/code&gt; section hashes sorted cipher identifiers. Its &lt;code&gt;c&lt;/code&gt; section hashes sorted extension identifiers followed by signature algorithms in their advertised order. SNI and ALPN extension codes are omitted from that list because related information is represented in the readable &lt;code&gt;a&lt;/code&gt; section. FoxIO's &lt;a href="https://github.com/FoxIO-LLC/ja4/blob/main/technical_details/JA4.md"&gt;JA4 specification&lt;/a&gt; documents those choices.&lt;/p&gt;
&lt;p&gt;Cisco Mercury makes the rule version visible. In the current &lt;a href="https://github.com/cisco/mercury/blob/main/doc/npf.md"&gt;draft NPF specification&lt;/a&gt;, the older unversioned TLS format retains extension order, &lt;code&gt;tls/1&lt;/code&gt; sorts all represented extensions, and &lt;code&gt;tls/2&lt;/code&gt; sorts selected extensions while applying more specific inclusion and normalisation rules.&lt;/p&gt;
&lt;p&gt;These methods do not merely encode the same fingerprint differently. They define different ideas of “the same”.&lt;/p&gt;
&lt;h2&gt;Why Chrome forced the issue&lt;/h2&gt;
&lt;p&gt;Chrome's extension permutation rollout showed why order-sensitive identifiers can become operationally brittle. Peakhour's &lt;a href="/blog/tls-extension-randomisation/"&gt;2023 analysis&lt;/a&gt; recorded a sharp rise in unique order-sensitive signatures after the change. The browser family had not suddenly split into thousands of independent TLS implementations. Much of the new variation came from ordering.&lt;/p&gt;
&lt;p&gt;Sorting is an effective response if the goal is to recover the implementation cohort. It is also consistent with &lt;a href="https://chromestatus.com/feature/5124606246518784"&gt;Chrome's stated reason for making the change&lt;/a&gt;: servers and middleboxes should not depend on one fixed extension order.&lt;/p&gt;
&lt;p&gt;But an analyst may have another question. Does a tool permute extensions using the same mechanism and constraints as the browser it imitates? Does a scanner generate an ordering distribution that differs from Chrome's? Does malware preserve the static order supplied by its TLS library while claiming a Chrome user agent?&lt;/p&gt;
&lt;p&gt;A canonical JA4 can group those handshakes even when their ordering behaviour differs. That is expected. JA4 answered the cohort question, not every possible behavioural question.&lt;/p&gt;
&lt;h2&gt;The wrong experiment&lt;/h2&gt;
&lt;p&gt;Counting how many unique raw fingerprints map to one canonical fingerprint is a useful descriptive statistic. It is not, by itself, evidence that canonicalisation weakened detection.&lt;/p&gt;
&lt;p&gt;A common browser with extension permutation should produce many raw orders. A large raw-to-canonical ratio may therefore be evidence of normal deployment scale. Calling every collapsed value a loss of “fidelity” assumes that all variation was useful before the test has measured its relationship with any outcome.&lt;/p&gt;
&lt;p&gt;The reverse shortcut is also wrong. Stable canonical values do not prove that sorting is harmless for every detector. A field can be poor for application identification but useful for distinguishing one implementation path, library version or evasion technique.&lt;/p&gt;
&lt;p&gt;The experiment needs labels and a defined decision.&lt;/p&gt;
&lt;h2&gt;A testable study design&lt;/h2&gt;
&lt;p&gt;We would structure the study around observations, transformations and outcomes.&lt;/p&gt;
&lt;h3&gt;1. Preserve the original ClientHello&lt;/h3&gt;
&lt;p&gt;Store the permitted raw handshake metadata or a reversible representation alongside derived identifiers. Record:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;capture point and TLS termination path;&lt;/li&gt;
&lt;li&gt;sensor implementation and revision;&lt;/li&gt;
&lt;li&gt;timestamp and software-release period;&lt;/li&gt;
&lt;li&gt;JA3 source string and digest;&lt;/li&gt;
&lt;li&gt;JA4, &lt;code&gt;JA4_r&lt;/code&gt;, &lt;code&gt;JA4_o&lt;/code&gt; and &lt;code&gt;JA4_ro&lt;/code&gt; where the implementation provides them;&lt;/li&gt;
&lt;li&gt;a full, versioned Mercury NPF string;&lt;/li&gt;
&lt;li&gt;HTTP and browser claims kept separate from the TLS representation.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Without the raw or reversible material, a later study cannot recover the ordering that canonicalisation removed.&lt;/p&gt;
&lt;h3&gt;2. Define labels that do not come from the fingerprint&lt;/h3&gt;
&lt;p&gt;Labels need an independent source. Depending on the environment, that could include controlled browser runs, endpoint process telemetry, sandbox execution, signed test clients or reviewed incident cases.&lt;/p&gt;
&lt;p&gt;Do not label traffic as Chrome because its JA4 resembles Chrome and then report that JA4 identifies Chrome. That is circular evaluation.&lt;/p&gt;
&lt;p&gt;Cisco's destination-context research used joined endpoint and network observations to build process labels. The paper also discusses how sandbox and environment choices affect the resulting knowledge base. &lt;a href="https://arxiv.org/abs/2009.01939"&gt;Accurate TLS Fingerprinting Using Destination Context and Knowledge Bases&lt;/a&gt; is useful here because it treats ground truth as a system component rather than a list of famous hashes.&lt;/p&gt;
&lt;h3&gt;3. Compare representations at the same grouping level&lt;/h3&gt;
&lt;p&gt;Measure at least:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;raw ordered representation;&lt;/li&gt;
&lt;li&gt;canonical JA4;&lt;/li&gt;
&lt;li&gt;useful JA4 component combinations such as &lt;code&gt;JA4_ac&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;Mercury rule versions that preserve or sort different structures;&lt;/li&gt;
&lt;li&gt;raw ordering features added beside the canonical value.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The comparison should use the same captures, time split and labels. Otherwise a newer fingerprint method can appear better simply because it was evaluated on newer or cleaner data.&lt;/p&gt;
&lt;h3&gt;4. Use time and environment holdouts&lt;/h3&gt;
&lt;p&gt;Randomly splitting individual connections leaks near-duplicates between training and test data. Prefer a forward time split and, where possible, a separate network or capture environment.&lt;/p&gt;
&lt;p&gt;That exposes two operational questions: does the result survive a browser or library update, and does it survive outside the environment where the labels were collected?&lt;/p&gt;
&lt;h3&gt;5. Measure decisions, not just uniqueness&lt;/h3&gt;
&lt;p&gt;Useful measurements include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;collision and fragmentation rates by independently labelled client;&lt;/li&gt;
&lt;li&gt;precision and recall for a stated classification or detection task;&lt;/li&gt;
&lt;li&gt;false-positive rates on high-volume legitimate cohorts;&lt;/li&gt;
&lt;li&gt;stability across software releases;&lt;/li&gt;
&lt;li&gt;the incremental value of raw order after canonical identifiers and context are already present;&lt;/li&gt;
&lt;li&gt;review volume at an actual alert or policy threshold.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If adding original order improves a classifier by a tiny amount but creates millions of unstable keys, the operational cost may outweigh the gain. If it separates a specific impersonation technique with few false positives, keeping it as a secondary feature may be worthwhile.&lt;/p&gt;
&lt;h2&gt;Keep both when the questions differ&lt;/h2&gt;
&lt;p&gt;The design choice does not have to be raw or canonical.&lt;/p&gt;
&lt;p&gt;A compact canonical identifier is useful for grouping, counters, joins and rules. A raw or reversible representation is useful for investigation, feature research and migration when the canonical rules change. Storage policy can keep the compact value broadly and retain detailed material for a bounded sample, selected security events or an approved research window.&lt;/p&gt;
&lt;p&gt;That split also makes detector claims easier to audit. The rule can say it grouped on JA4 while the event retains enough source material to explain which handshake produced the value.&lt;/p&gt;
&lt;h2&gt;What we can say now&lt;/h2&gt;
&lt;p&gt;Sorting removes ordering information. It reduces fragmentation caused by clients that permute their lists. Both statements follow from the format definitions and can be demonstrated with controlled captures.&lt;/p&gt;
&lt;p&gt;Whether the removed order contains useful attacker variation is an empirical question tied to a dataset, capture point, label source and decision. Until that study is run, the honest position is to preserve the evidence needed to test it and avoid turning either uniqueness or stability into a claim of detection accuracy.&lt;/p&gt;
&lt;p&gt;For the wider format comparison, see &lt;a href="/learning/fingerprinting/mercury-vs-ja4-vs-ja3/"&gt;Mercury vs JA4 vs JA3&lt;/a&gt;. For the identity boundary that applies to every result, read &lt;a href="/blog/fingerprint-is-a-cohort-not-a-client/"&gt;A network fingerprint is a cohort, not a client&lt;/a&gt;.&lt;/p&gt;</content><category term="Security"></category><category term="TLS Fingerprinting"></category><category term="JA4"></category><category term="Cisco Mercury"></category><category term="Network Fingerprinting"></category><category term="Security Research"></category></entry><entry><title>Using Network Fingerprints in Bot and Rate-Limit Decisions</title><link href="https://www.peakhour.io/blog/using-network-fingerprints-in-bot-and-rate-limit-decisions/" rel="alternate"></link><published>2026-07-13T09:28:00+10:00</published><updated>2026-07-13T09:28:00+10:00</updated><author><name>AC</name></author><id>tag:www.peakhour.io,2026-07-13:/blog/using-network-fingerprints-in-bot-and-rate-limit-decisions/</id><summary type="html">&lt;p&gt;A practical way to use network fingerprints for bot and rate-limit decisions without mistaking a shared client cohort for identity.&lt;/p&gt;</summary><content type="html">&lt;p&gt;A network fingerprint is a useful rate-limit key. It is a poor verdict.&lt;/p&gt;
&lt;p&gt;That sounds like a small distinction, but it changes how a control behaves. A limit keyed only by source IP can miss a distributed scraper moving through thousands of addresses. Add a TLS or HTTP fingerprint and the requests may fall into a recognisable cohort. The operator can count and compare them even while the IPs rotate.&lt;/p&gt;
&lt;p&gt;The same key can also group thousands of ordinary users running the same browser release. If the control reads “this fingerprint is a bot” and blocks it everywhere, the grouping feature has become a false-positive multiplier.&lt;/p&gt;
&lt;p&gt;The practical job is to use the fingerprint where grouping helps, then make the decision from the route, behaviour and consequence. This article sets out one way to do that.&lt;/p&gt;
&lt;h2&gt;Start with the route, not the fingerprint&lt;/h2&gt;
&lt;p&gt;A request for a cached image and a request to submit a password do not deserve the same policy. Neither do a search request and an export that starts an expensive database job.&lt;/p&gt;
&lt;p&gt;Before adding fingerprint data, classify the routes that matter:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;what the request can change or disclose;&lt;/li&gt;
&lt;li&gt;whether it consumes scarce application or origin capacity;&lt;/li&gt;
&lt;li&gt;whether a legitimate user can retry safely;&lt;/li&gt;
&lt;li&gt;whether the client can complete a challenge;&lt;/li&gt;
&lt;li&gt;which identity is available, such as an account, session, API key or no identity at all;&lt;/li&gt;
&lt;li&gt;what an incorrect block would cost.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This route map sets the response. An unfamiliar cohort fetching public content might only be worth observing. The same cohort attempting passwords across many accounts may justify a tight shared limit. A fingerprint mismatch on an authenticated payment action may call for step-up verification rather than a network block.&lt;/p&gt;
&lt;p&gt;Route sensitivity also prevents a common emergency mistake: applying a site-wide rule because an attack was visible on one endpoint. Narrow rules are easier to explain, test and remove.&lt;/p&gt;
&lt;h2&gt;Use the fingerprint as a cohort key&lt;/h2&gt;
&lt;p&gt;JA3, JA4 and Cisco Mercury do not identify a person or device. Each method selects and normalises protocol fields, then groups connections that look equivalent under those rules. Our &lt;a href="/blog/one-clienthello-ja3-ja4-mercury-lab/"&gt;same-ClientHello lab&lt;/a&gt; shows how three methods produce three different representations from one handshake.&lt;/p&gt;
&lt;p&gt;That makes the fingerprint useful for questions such as:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Are login failures arriving from many IP addresses but one narrow set of client stacks?&lt;/li&gt;
&lt;li&gt;Did an expensive API route suddenly attract a new protocol cohort?&lt;/li&gt;
&lt;li&gt;Does traffic claiming to be a browser have a consistent TLS, HTTP and header shape?&lt;/li&gt;
&lt;li&gt;Did a cohort disappear after an abusive tool changed version, or did the fingerprinting rules change underneath us?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The key should be composite. A workable rate counter might resemble:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;route_class + fingerprint_method + fingerprint_version + fingerprint_value
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Depending on the abuse case, add an account, tenant, API credential, ASN or country. Do not throw every field into every key. An over-specific key divides a distributed campaign into buckets too small to see; an over-broad key combines unrelated users.&lt;/p&gt;
&lt;p&gt;Run a few candidate keys in observation mode and measure their bucket sizes. Look at both tails. A key that places half the site's users in one bucket is too blunt for direct enforcement, however suspicious that bucket looked during one incident.&lt;/p&gt;
&lt;h2&gt;Record where the value came from&lt;/h2&gt;
&lt;p&gt;Fingerprint provenance is operational data, not documentation trivia.&lt;/p&gt;
&lt;p&gt;At an origin behind a CDN or reverse proxy, the visible TLS connection may belong to that intermediary. A fingerprint forwarded in a header might describe the original client-facing connection, or it might describe a later hop. The receiving service cannot tell from the hash alone.&lt;/p&gt;
&lt;p&gt;For each event, keep at least:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;method:       ja4
version:      pinned implementation or rule version
value:        t13d..._..._...
capture:      client-facing edge
source:       named collector or trusted forwarding hop
observed_at:  timestamp
policy:       policy identifier and revision
action:       observe, challenge, rate-limit or block
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Where the format permits it, retaining the selected raw fields or unhashed representation makes later comparison much easier. Cisco Mercury's full Network Protocol Fingerprint is structured and versioned; its optional hash is a compact nickname that discards that structure. JA4 publishes both a canonical hashed form and a raw &lt;code&gt;JA4_r&lt;/code&gt; form. The details are in the &lt;a href="https://github.com/cisco/mercury/blob/main/doc/npf.md"&gt;Mercury NPF specification&lt;/a&gt; and &lt;a href="https://github.com/FoxIO-LLC/ja4/blob/main/technical_details/JA4.md"&gt;JA4 technical specification&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Trust the forwarding path as deliberately as any other security metadata. Strip client-supplied copies at the boundary, set the authoritative value there, and record the hop that produced it. Otherwise an attacker may be able to choose the value used by the policy.&lt;/p&gt;
&lt;h2&gt;Use an action ladder&lt;/h2&gt;
&lt;p&gt;Bot controls work better with space between “allow” and “block”. A simple ladder is observe, challenge, rate limit, then block. It is not a mandatory sequence for every request; it is a way to match disruption to confidence.&lt;/p&gt;
&lt;h3&gt;Observe&lt;/h3&gt;
&lt;p&gt;Observation is the right first action for a new cohort, a changed implementation or a weak hypothesis. Record volume, routes, account outcomes, response codes, request cost and how the cohort overlaps with known legitimate clients.&lt;/p&gt;
&lt;p&gt;Set an end date before starting. “Log this for seven days and review on Monday” produces a decision. “Log this” often produces another permanent stream nobody owns.&lt;/p&gt;
&lt;h3&gt;Challenge&lt;/h3&gt;
&lt;p&gt;A challenge asks the client for more evidence. It can separate some interactive browsers from simple automation, but it is not a universal test of humanity. Browser automation can complete challenges; privacy software, accessibility tools and broken JavaScript can make legitimate users fail them.&lt;/p&gt;
&lt;p&gt;Use challenges where the client can reasonably complete one and where failure has a safe recovery path. They are a poor fit for machine-to-machine APIs unless the protocol already defines an authentication or proof step.&lt;/p&gt;
&lt;h3&gt;Rate limit&lt;/h3&gt;
&lt;p&gt;Rate limiting fits repeated or costly behaviour. Count a cohort against the route it is affecting, then layer in the identities that make sense for that route. For example:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;login:  fingerprint + account + failed outcome
search: fingerprint + route + request cost
API:    fingerprint + tenant or credential + operation
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;A limit should say what it protects. Requests per minute is sometimes enough. Expensive operations may need a cost-weighted budget. Login protection may count failed attempts while allowing successful account recovery to proceed. Distributed abuse may need a cohort-wide ceiling plus per-account and per-IP limits so that no single key carries the whole policy.&lt;/p&gt;
&lt;p&gt;Return an explicit response and keep the retry behaviour predictable. The HTTP &lt;code&gt;429 Too Many Requests&lt;/code&gt; status was defined for rate limiting in &lt;a href="https://www.rfc-editor.org/rfc/rfc6585.html#section-4"&gt;RFC 6585&lt;/a&gt;, including the option to send &lt;code&gt;Retry-After&lt;/code&gt;. Clients still need sensible backoff, and operators need to watch whether retries are making origin pressure worse.&lt;/p&gt;
&lt;h3&gt;Block&lt;/h3&gt;
&lt;p&gt;Block when the evidence is strong, the harm is current, and a less disruptive action cannot protect the route. Good candidates include a confirmed exploit tool hitting the vulnerable route, a cohort causing active availability loss, or repeated abuse that has failed narrower controls.&lt;/p&gt;
&lt;p&gt;Keep the scope bounded: fingerprint method and version, affected route, relevant behaviour, start time, owner and expiry. A bare fingerprint deny-list with no incident context is hard to audit and tends to outlive its evidence.&lt;/p&gt;
&lt;p&gt;For a broader mapping of actions to evidence, see &lt;a href="/learning/fingerprinting/network-fingerprint-signals-and-security-decisions/"&gt;Network Fingerprint Signals and Security Decisions&lt;/a&gt; and &lt;a href="/learning/fingerprinting/network-fingerprinting-for-rate-limiting/"&gt;Network Fingerprinting for Rate Limiting&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Combine evidence before increasing friction&lt;/h2&gt;
&lt;p&gt;The most useful policy does not ask whether a fingerprint is good or bad. It asks whether several observations agree.&lt;/p&gt;
&lt;p&gt;Consider a login campaign. The source addresses rotate through residential networks. The TLS cohort is common because the tool drives a real browser. The fingerprint alone is weak. But the same traffic may attempt many accounts, reuse a route sequence, fail at a high rate, omit normal session history and arrive at a cadence unlike ordinary users. Together those observations justify a shared limit or challenge.&lt;/p&gt;
&lt;p&gt;Now reverse the example. A rare TLS cohort signs in successfully to one account from its usual region, follows a normal route sequence and maintains an established session. Rarity does not add much. Blocking it would mostly punish an unusual client.&lt;/p&gt;
&lt;p&gt;This is also the line between a format and a detection system. JA4 defines a fingerprint. Mercury defines fingerprint representations and includes separate analysis components. Any claim such as “this is Chrome”, “this is a scraper” or “this is malicious” comes from surrounding data and inference, not from the fingerprint characters themselves. &lt;a href="/blog/fingerprint-is-a-cohort-not-a-client/"&gt;A Network Fingerprint Is a Cohort, Not a Client&lt;/a&gt; explains that boundary in more detail. &lt;a href="/blog/fingerprints-are-evidence-not-identity/"&gt;Fingerprints Are Evidence, Not Identity&lt;/a&gt; covers the same problem across browser, network and behavioural fingerprints.&lt;/p&gt;
&lt;h2&gt;Expect versions and populations to drift&lt;/h2&gt;
&lt;p&gt;Browsers ship, TLS libraries change defaults, mobile applications update unevenly and attack tools copy popular handshakes. Fingerprint implementations also change their parsing rules. Store the method and implementation version so client drift can be separated from detector drift.&lt;/p&gt;
&lt;p&gt;Before changing an implementation, calculate old and new values side by side on a sample. Compare cohort sizes and known-good traffic by route. A partner API, mobile application and public website have different expected populations; a global label may be irrelevant to the local control.&lt;/p&gt;
&lt;h2&gt;Put expiry and rollback in the policy&lt;/h2&gt;
&lt;p&gt;Every enforcement rule needs an owner, reason, expiry and removal condition. Before enabling it, record request volume, successful transactions, challenges, &lt;code&gt;429&lt;/code&gt; responses and origin health. Compare the same measures afterwards. A falling attack rate is not success if legitimate completion falls with it.&lt;/p&gt;
&lt;p&gt;When a false positive appears, retain the fingerprint version, capture point, contributing evidence, route, identity, policy revision and rollback result. That record shows whether to change a threshold, split a route class, add an exception, demote the action or remove the fingerprint from the key.&lt;/p&gt;
&lt;h2&gt;A deployable first policy&lt;/h2&gt;
&lt;p&gt;For a first production use, choose one abused route. Generate a versioned fingerprint at a trusted capture point, log it beside the route and outcome, and observe cohort sizes long enough to include normal variation. Then choose one reversible action with success measures, rollback and an expiry.&lt;/p&gt;
&lt;p&gt;The fingerprint has done its job when it helps a team see and control a group of requests that an IP-only rule would miss. It has exceeded its job when the group is treated as proof of a client, person or intent.&lt;/p&gt;</content><category term="Security"></category><category term="Network Fingerprinting"></category><category term="TLS Fingerprinting"></category><category term="JA4"></category><category term="Bot Management"></category><category term="Rate Limiting"></category></entry><entry><title>One ClientHello, Three Fingerprints: JA3, JA4 and Mercury</title><link href="https://www.peakhour.io/blog/one-clienthello-ja3-ja4-mercury-lab/" rel="alternate"></link><published>2026-07-12T09:00:00+10:00</published><updated>2026-07-12T09:00:00+10:00</updated><author><name>AC</name></author><id>tag:www.peakhour.io,2026-07-12:/blog/one-clienthello-ja3-ja4-mercury-lab/</id><summary type="html">&lt;p&gt;A reproducible lab runs JA3, JA4 and Cisco Mercury against the same TLS ClientHello and compares what each fingerprint preserves.&lt;/p&gt;</summary><content type="html">&lt;p&gt;The easiest way to misunderstand network fingerprints is to compare example strings taken from different clients. We wanted a cleaner test: one packet capture, one TLS ClientHello and three fingerprint formats.&lt;/p&gt;
&lt;p&gt;The complete lab is checked into this site's source under &lt;code&gt;labs/network-fingerprinting/&lt;/code&gt;, and the &lt;a href="/static/downloads/network-fingerprinting-lab.tar.gz"&gt;publication bundle is available here&lt;/a&gt;. It pins the tool revisions, reconstructs the fixture, verifies its checksum, runs the tools and checks that their outputs refer to the same connection. Nothing in the comparison depends on a vendor database or an application label.&lt;/p&gt;
&lt;h2&gt;The input&lt;/h2&gt;
&lt;p&gt;The fixture is a 329-byte Peakhour-generated capture containing a local OpenSSL 3.5.6 ClientHello wrapped in one synthetic Ethernet/IPv4/TCP packet:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;10.1.1.1:40000 -&amp;gt; 10.2.2.2:443
SNI: lab.peakhour.test
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The lab stores the small fixture as base64 under an adjacent BSD 3-Clause licence and verifies the decoded PCAP with SHA-256 before using it. The reserved SNI and private addresses did not cross a network. We select packet 1 and TCP stream 0. That selection matters: saying that several tools read the same PCAP is weaker than proving that their output describes the same flow and ClientHello.&lt;/p&gt;
&lt;p&gt;The pinned revisions for this run are:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;Cisco Mercury  3172786645f70e1a8347d8cf020b736e185651e5
FoxIO JA4      0e54bc8371de34df94a35f2442c05bda2e8b2034
Salesforce JA3 502cc6395811c54743b0561419d61900a6df3ff7
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;These pins are part of the result. Fingerprint implementations and specifications change. A value without its method and version is harder to reproduce than it first appears.&lt;/p&gt;
&lt;h2&gt;Running the lab&lt;/h2&gt;
&lt;p&gt;From the repository root:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;./labs/network-fingerprinting/run.sh
python&lt;span class="w"&gt; &lt;/span&gt;labs/network-fingerprinting/verify.py
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The runner fetches the pinned source archives, builds or invokes the implementations in a temporary work directory, and writes evidence to &lt;code&gt;labs/network-fingerprinting/results/&lt;/code&gt;. The verifier checks the fixture and output checksums, connection tuple, SNI and output shape. The pinned source URLs are enforced by the runner rather than inferred by the verifier.&lt;/p&gt;
&lt;p&gt;This is a fingerprint-format lab, not a speed test. Build time, runtime and memory use depend heavily on language, wrapper and capture path, so we do not compare them here.&lt;/p&gt;
&lt;h2&gt;JA3: a portable exact-match digest&lt;/h2&gt;
&lt;p&gt;For this ClientHello, the canonical JA3 feature string is:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;771,49196-49200-159-52393-52392-52394-49195-49199-158-49188-49192-107-49187-49191-103-49162-49172-57-49161-49171-51-157-156-61-60-53-47,65281-0-11-10-35-16-22-23-13,29-23-30-24-25,0-1-2
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Its MD5 digest is:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;e1934f32e97b0bd52227953ca7d30118
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The digest is convenient for logs and exact lookup. On its own it does not show which cipher, extension or group changed. The pre-hash string retains enough information to investigate that difference, which is why throwing it away too early can make later analysis harder.&lt;/p&gt;
&lt;p&gt;JA3 removes GREASE values but otherwise retains the order of its selected lists. A client that permutes extension order can therefore generate a new JA3 digest without changing its effective TLS capabilities. The &lt;a href="https://github.com/salesforce/ja3"&gt;archived Salesforce JA3 repository&lt;/a&gt; defines the input fields and GREASE handling.&lt;/p&gt;
&lt;h2&gt;JA4: canonicalised components&lt;/h2&gt;
&lt;p&gt;The same ClientHello produces this JA4:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;t12d2709h2_a2460661a67a_36cef8aed422
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Its first section is readable:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;t&lt;/code&gt; means TLS over TCP;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;12&lt;/code&gt; is the highest supported TLS version after ignoring GREASE;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;d&lt;/code&gt; says a domain was present in SNI;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;27&lt;/code&gt; and &lt;code&gt;09&lt;/code&gt; are the cipher and extension counts after the format's exclusions;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;h2&lt;/code&gt; summarises the first ALPN value.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The second section is the first 12 hexadecimal characters of SHA-256 over sorted cipher identifiers. The third is a truncated SHA-256 value derived from sorted extension identifiers and the signature algorithms in their original order. The canonical &lt;a href="https://github.com/FoxIO-LLC/ja4/blob/main/technical_details/JA4.md"&gt;JA4 technical specification&lt;/a&gt; defines the exact exclusions and encodings.&lt;/p&gt;
&lt;p&gt;The lab also records &lt;code&gt;JA4_r&lt;/code&gt;, the raw form used by the FoxIO tooling:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;t12d2709h2_002f,0033,0035,0039,003c,003d,0067,006b,009c,009d,009e,009f,c009,c00a,c013,c014,c023,c024,c027,c028,c02b,c02c,c02f,c030,cca8,cca9,ccaa_000a,000b,000d,0016,0017,0023,ff01_0403,0503,0603,0807,0808,0809,080a,080b,0804,0805,0806,0401,0501,0601,0303,0301,0302,0402,0502,0602
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;That makes the normalisation visible. It also shows why JA4 is not fuzzy hashing: sorting makes selected permutations equivalent, while the hashes still support equality matching rather than semantic distance.&lt;/p&gt;
&lt;h2&gt;Mercury NPF: a retained protocol tree&lt;/h2&gt;
&lt;p&gt;Cisco Mercury 2.18 emits this &lt;code&gt;tls/2&lt;/code&gt; fingerprint for the same ClientHello:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;tls/2/(0303)(c02cc030009fcca9cca8ccaac02bc02f009ec024c028006bc023c0270067c00ac0140039c009c0130033009d009c003d003c0035002f)[(0000)(000a000c000a001d0017001e00180019)(000b000403000102)(000d002a0028040305030603080708080809080a080b080408050806040105010601030303010302040205020602)(0010000e000c02683208687474702f312e31)(0016)(0017)(ff01)]
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The value is longer because it is doing another job. Parentheses and square brackets describe an ordered tree of selected byte strings. In the draft NPF notation, square brackets mark a lexicographically sorted list. The &lt;code&gt;tls/2&lt;/code&gt; prefix names the protocol and fingerprint rule version.&lt;/p&gt;
&lt;p&gt;An analyst can inspect the retained values rather than relying only on a digest. Mercury also defines a compact hash nickname when a fixed-length index is needed, but that nickname loses the structure used for inspection, prefix comparison or approximate matching. Cisco's &lt;a href="https://github.com/cisco/mercury/blob/main/doc/npf.md"&gt;draft NPF specification&lt;/a&gt; documents both representations.&lt;/p&gt;
&lt;p&gt;The Mercury JSON includes the same source and destination tuple and the same SNI as the JA3 and JA4 records. It does not identify the client application in this lab because we did not run a labelled fingerprint knowledge base or the destination-context classifier. A packet-derived NPF value and a process assessment are separate outputs.&lt;/p&gt;
&lt;h2&gt;What the comparison establishes&lt;/h2&gt;
&lt;p&gt;All three methods observe the same ClientHello, but they define similarity differently.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Question&lt;/th&gt;
&lt;th&gt;JA3&lt;/th&gt;
&lt;th&gt;JA4&lt;/th&gt;
&lt;th&gt;Mercury NPF &lt;code&gt;tls/2&lt;/code&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Compact default&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;No; optional hash available&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Inspectable selected inputs&lt;/td&gt;
&lt;td&gt;Only if the pre-hash string is retained&lt;/td&gt;
&lt;td&gt;Partly in &lt;code&gt;a&lt;/code&gt;; fully in the recorded raw form&lt;/td&gt;
&lt;td&gt;Yes in the full tree&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Selected list sorting&lt;/td&gt;
&lt;td&gt;No, after GREASE removal&lt;/td&gt;
&lt;td&gt;Ciphers and most extensions&lt;/td&gt;
&lt;td&gt;Rule-specific selected extensions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Explicit format version in value&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Encoded field semantics, but no separate rule number&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Semantic or approximate comparison&lt;/td&gt;
&lt;td&gt;Not from the digest&lt;/td&gt;
&lt;td&gt;Component grouping, not hash distance&lt;/td&gt;
&lt;td&gt;Full structure can support richer matching&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Application attribution in the format&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The table does not produce a universal winner. JA3 remains useful where historical compatibility matters. JA4 is compact and handles selected permutations cleanly. Mercury retains more material for inspection and for analysis systems that need structured features.&lt;/p&gt;
&lt;p&gt;It also shows what none of the values can establish. The capture does not prove which person, device or application created the connection. Shared libraries, browser impersonation and software updates all complicate that inference. See &lt;a href="/blog/fingerprint-is-a-cohort-not-a-client/"&gt;A network fingerprint is a cohort, not a client&lt;/a&gt; for the operational consequences.&lt;/p&gt;
&lt;p&gt;For the history behind these design choices, read &lt;a href="/blog/two-lineages-tls-fingerprinting/"&gt;Two lineages of TLS fingerprinting&lt;/a&gt;. The durable format comparison is in &lt;a href="/learning/fingerprinting/mercury-vs-ja4-vs-ja3/"&gt;Mercury vs JA4 vs JA3&lt;/a&gt;.&lt;/p&gt;</content><category term="Security"></category><category term="TLS Fingerprinting"></category><category term="JA3"></category><category term="JA4"></category><category term="Cisco Mercury"></category><category term="Network Fingerprinting"></category><category term="Security Research"></category></entry><entry><title>How to fix your Adobe Commerce Overages with Fastly</title><link href="https://www.peakhour.io/blog/fixing-adobe-commerce-cdn-overages/" rel="alternate"></link><published>2026-07-01T08:13:00+10:00</published><updated>2026-07-01T08:13:00+10:00</updated><author><name>Dan</name></author><id>tag:www.peakhour.io,2026-07-01:/blog/fixing-adobe-commerce-cdn-overages/</id><summary type="html">&lt;p&gt;If you're consistently going over your contracted CDN egress on your Adobe Commerce contract here's how you can easily fix it.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Adobe Commerce merchants do not usually notice Fastly overages straight away.&lt;/p&gt;
&lt;p&gt;Traffic looks normal. Revenue looks normal. The site feels fine. Then the bill lands and CDN usage is well above contract.&lt;/p&gt;
&lt;p&gt;In our experience, the drivers of CDN overages are due to Adobe Commerce and Fastly default behaviour.&lt;/p&gt;
&lt;p&gt;The biggest culprits are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;shielding&lt;/li&gt;
&lt;li&gt;ESI forcing uncompressed HTML from origin&lt;/li&gt;
&lt;li&gt;PNG-heavy catalogues and storefront assets&lt;/li&gt;
&lt;li&gt;bot traffic pouring fuel on all of the above&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We recently worked with Dymocks and helped them reduce their CDN usage from &lt;strong&gt;55 TB of monthly traffic down to 6 TB&lt;/strong&gt; after 
we fixed the waste in the delivery path and filtered unwanted traffic, case study coming soon.&lt;/p&gt;
&lt;h2&gt;1. Shielding helps performance, but it can hurt your bill&lt;/h2&gt;
&lt;p&gt;Fastly shielding exists for a good reason. It 
reduces origin load and can improve cache efficiency by funnelling misses through a shield POP before they go back to origin.&lt;/p&gt;
&lt;p&gt;The catch is billing.&lt;/p&gt;
&lt;p&gt;Fastly is clear that traffic from one POP to another counts towards both &lt;strong&gt;request count&lt;/strong&gt; and &lt;strong&gt;billable bandwidth&lt;/strong&gt;. 
In the most extreme case, if everything is effectively a pass, request count and delivery bandwidth can almost double 
because the request is handled by two Fastly POPs instead of one.&lt;/p&gt;
&lt;p&gt;That means a cache miss is no longer a simple edge-to-origin event. It becomes:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;edge → shield → origin → shield → edge&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;If your cache hit rate is strong, that trade-off may still be worth it. If page caching is weak, purges are frequent, 
or large parts of the site are missing cache, shielding turns into a billing multiplier.&lt;/p&gt;
&lt;h2&gt;2. ESI (Edge Side Includes)&lt;/h2&gt;
&lt;p&gt;ESI is an old technology that allows a proxy (like Fastly) to 'assemble' pages using content fetched from another source.&lt;/p&gt;
&lt;p&gt;Adobe Commerce/Magento 2 will use ESI out of the box for its navigation bar. The reasoning is to allow the navigation
to be purged from the CDN independent of the page content. In theory this makes Full Page Caching more effective. In 
practise the difference is negligible as the Full Page Cache is cleared daily anyway. &lt;/p&gt;
&lt;p&gt;Fastly’s ESI documentation says ESI cannot be 
performed on content compressed at origin. Fastly needs to inspect the response body for &lt;code&gt;&amp;lt;esi:...&amp;gt;&lt;/code&gt; tags, and 
compressed content hides those tags from the parser.&lt;/p&gt;
&lt;p&gt;The default Fastly configuration for Adobe Commerce will strip the client &lt;code&gt;Accept-Encoding&lt;/code&gt; header
before the request goes to origin.&lt;/p&gt;
&lt;p&gt;The origin then returns &lt;strong&gt;uncompressed HTML&lt;/strong&gt;, Fastly scans it for ESI, and only later is the response compressed again 
at the EDGE before it is delivered to the browser.&lt;/p&gt;
&lt;p&gt;From the shopper’s point of view, nothing looks wrong. The page still arrives compressed at the edge. Performance may still look fine.&lt;/p&gt;
&lt;p&gt;From a billing point of view, it is a very different story.&lt;/p&gt;
&lt;p&gt;Magento’s default layout gives the top navigation block a &lt;a href="https://github.com/magento/magento2/blob/2.4-develop/app/code/Magento/Theme/view/frontend/layout/default.xml"&gt;&lt;code&gt;ttl="3600"&lt;/code&gt; in &lt;code&gt;default.xml&lt;/code&gt;&lt;/a&gt;, which makes it an ESI candidate out of the box. The &lt;a href="https://github.com/fastly/fastly-magento/blob/master/app/code/community/Fastly/CDN/etc/vcl_snippets/fetch.vcl"&gt;Fastly Magento VCL snippets&lt;/a&gt; also show the downstream effect: Fastly sets &lt;code&gt;x-compress-hint&lt;/code&gt; because “varnish doesn't compress ESIs”, so compression is pushed later in the chain.&lt;/p&gt;
&lt;p&gt;Now combine that with shielding.&lt;/p&gt;
&lt;p&gt;Say your page is:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;50 KB compressed&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;600 KB uncompressed&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If the request misses cache and shielding is enabled, you are not paying for a tidy 50 KB response. You are moving 
the &lt;strong&gt;600 KB&lt;/strong&gt; object through the shield path, and that larger object is counted across both the shield and edge legs.&lt;/p&gt;
&lt;p&gt;That is effectively a &lt;strong&gt;600 KB × 2&lt;/strong&gt; event.&lt;/p&gt;
&lt;p&gt;That is why broken page caching hurts twice:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;you get more misses&lt;/li&gt;
&lt;li&gt;each miss is much larger than most teams realise&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If enough HTML is missing cache, overages rise very fast.&lt;/p&gt;
&lt;h2&gt;3. A simple way to spot the problem in New Relic&lt;/h2&gt;
&lt;p&gt;An easy way to check for ESI driven egress is to open New Relic and look at CDN usage by content type. &lt;/p&gt;
&lt;p&gt;If &lt;strong&gt;&lt;code&gt;text/html&lt;/code&gt; is driving more usage than images&lt;/strong&gt;, that is a strong sign you are paying for uncompressed page responses on cache misses.&lt;/p&gt;
&lt;div class="text-center" style="padding: 20px 0px"&gt;
&lt;img src="/static/images/blog/esi-candidate.jpg" width="100%" alt="CDN Usage from New Relic Dashboard showing high HTML usage"/&gt;
&lt;em class="text-white"&gt;text/html content type being the top CDN usage content type is a red flag.&lt;/em&gt;
&lt;/div&gt;

&lt;p&gt;That pattern usually points back to the same combination:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ESI&lt;/li&gt;
&lt;li&gt;shielding&lt;/li&gt;
&lt;li&gt;weak cache hit rates&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;On a healthy eCommerce site, images are usually the major share of bandwidth. When HTML starts dominating, something is off.&lt;/p&gt;
&lt;h2&gt;4. PNGs are another quiet cost driver&lt;/h2&gt;
&lt;p&gt;Fastly can absolutely turn a PNG into &lt;strong&gt;WebP&lt;/strong&gt;, but that does &lt;strong&gt;not&lt;/strong&gt; automatically mean you get a small lossy image.&lt;/p&gt;
&lt;p&gt;Fastly’s own Image Optimizer reference says that if the &lt;strong&gt;source image is a lossless format&lt;/strong&gt;, the output &lt;strong&gt;defaults to lossless&lt;/strong&gt; 
when the chosen output format supports it. Fastly is explicit about the PNG case: with a &lt;strong&gt;PNG source&lt;/strong&gt; and 
&lt;code&gt;format=webp&lt;/code&gt;, &lt;code&gt;format=jxl&lt;/code&gt;, or &lt;code&gt;format=auto&lt;/code&gt;, the &lt;strong&gt;output image is lossless by default&lt;/strong&gt;. In other words, Fastly can 
transform a PNG into a &lt;strong&gt;lossless WebP&lt;/strong&gt; unless you explicitly force a lossy path. &lt;/p&gt;
&lt;p&gt;That is why PNG-heavy catalogues can still burn a lot of bandwidth even when teams think Fastly is “optimising” them. 
The image format may change, but the delivery path can still stay lossless, which means the file is often much larger 
than expected. Fastly also notes that lossless output preserves all image data and therefore produces larger 
file sizes, basically the same as the source image.  &lt;/p&gt;
&lt;p&gt;This is where many Adobe Commerce stores get caught out. Most merchants rely on the default Fastly image setup and do 
not add per-image parameters or rewrites. Fastly’s documentation says that most image transformations require query string 
parameters on individual requests, and its default behaviour notes that WebP quality is 85 for &lt;strong&gt;lossy&lt;/strong&gt; WebP images, 
not that every PNG source is automatically pushed into lossy Webp.&lt;/p&gt;
&lt;p&gt;If you want smaller files, you need to force the outcome. Fastly says you can do that by using &lt;code&gt;format=auto&lt;/code&gt; with 
&lt;code&gt;quality&amp;lt;100&lt;/code&gt;, or by explicitly using a lossy WebP path. Adobe Commerce’s Fastly image optimisation settings also 
expose a &lt;strong&gt;Force lossy conversion&lt;/strong&gt; option for this reason. &lt;/p&gt;
&lt;h2&gt;What to do about it&lt;/h2&gt;
&lt;p&gt;You do not need a full replatform to reduce overages. Most of the wins come from cleaning up the delivery path.&lt;/p&gt;
&lt;h3&gt;Review shielding&lt;/h3&gt;
&lt;p&gt;Start by measuring shielding, not assuming it is free.&lt;/p&gt;
&lt;p&gt;Disabling shielding can be a fast way to cut billable traffic. The trade-off is lower cache efficiency and more origin load, so this needs testing, not guesswork.&lt;/p&gt;
&lt;h3&gt;Remove ESI where it is not earning its keep&lt;/h3&gt;
&lt;p&gt;On many Adobe Commerce builds, ESI is there mainly so the navigation block can be flushed independently.&lt;/p&gt;
&lt;p&gt;That is rarely a good reason to pay for inflated HTML misses.&lt;/p&gt;
&lt;p&gt;The usual fix is:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;change the Magento layout or template so the block no longer needs ESI&lt;/li&gt;
&lt;li&gt;strip the &lt;code&gt;X-ESI&lt;/code&gt; path in VCL&lt;/li&gt;
&lt;li&gt;restore &lt;code&gt;Accept-Encoding&lt;/code&gt; to origin requests so HTML can travel compressed again&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is often the biggest bandwidth win because it reduces the size of every miss, not just edge delivery.&lt;/p&gt;
&lt;div class="text-center" style="padding: 20px 0px"&gt;
&lt;img src="/static/images/blog/esi-drop1.png" width="100%" alt="The effect of disabling ESI and enabling compression"/&gt;
&lt;em class="text-white"&gt;The immediate effect of disabling ESI and enabling compression from origin.&lt;/em&gt;
&lt;/div&gt;

&lt;h3&gt;Force lossy png conversions&lt;/h3&gt;
&lt;p&gt;Fortunately forcing lossy conversion of PNG images is relatively straightforward.&lt;/p&gt;
&lt;p&gt;Use VCL to rewrite image urls to include a query string, eg &lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;    /someimage.png
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;becomes&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;    /someimage.png?format=auto&amp;amp;quality=85
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Expect a 400kb source image to go to 100kb for no discernable difference. Play with quality for bigger gains.&lt;/p&gt;
&lt;h2&gt;Do not ignore bots&lt;/h2&gt;
&lt;p&gt;Then there is the traffic you never wanted in the first place.&lt;/p&gt;
&lt;p&gt;Bad bots amplify every weakness above. They hit uncached pages, search pages, category pages, and dynamic endpoints. 
That creates more misses, more uncompressed HTML fetches, more shield traffic, and more wasted bandwidth.&lt;/p&gt;
&lt;p&gt;This is why CDN cost control is not just a caching conversation. It is also a traffic quality conversation.&lt;/p&gt;
&lt;p&gt;If you can stop junk traffic before it burns CDN bandwidth, the savings stack on top of the caching fixes.&lt;/p&gt;
&lt;p&gt;That is where Peakhour fits. We help stores cut unwanted bot traffic before it turns into Fastly overages, and the 
upside can be dramatic. For example, we've helped one store go from &lt;strong&gt;55 TB per month down to 6 TB&lt;/strong&gt;.&lt;/p&gt;
&lt;h2&gt;Final thought&lt;/h2&gt;
&lt;p&gt;If your Fastly bill feels out of proportion to real shopper demand, start with two questions:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Why are we missing cache so often?&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Why is &lt;code&gt;text/html&lt;/code&gt; using so much bandwidth?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;If those numbers look wrong, the overage usually stops being mysterious.&lt;/p&gt;</content><category term="CDN"></category><category term="Fastly"></category><category term="Adobe Commerce"></category><category term="Bot Management"></category></entry><entry><title>Edge Security is now a Privacy Compliance Issue</title><link href="https://www.peakhour.io/blog/edge-security-and-privacy-compliance/" rel="alternate"></link><published>2026-06-25T08:13:00+10:00</published><updated>2026-06-25T08:13:00+10:00</updated><author><name>Dan</name></author><id>tag:www.peakhour.io,2026-06-25:/blog/edge-security-and-privacy-compliance/</id><summary type="html">&lt;p&gt;Recent guidelines from the Australian government have specified practical measures businesses need to take to protect personal information. Learn more.&lt;/p&gt;</summary><content type="html">&lt;p&gt;For Australian businesses, website security is no longer just an IT problem. If a website collects, processes or exposes personal information, edge security is now part of privacy compliance.&lt;/p&gt;
&lt;p&gt;That shift matters because many organisations still treat cyber compliance as an Essential Eight exercise. They focus on patching, MFA, backups, restricted administrative privileges and endpoint hardening. Those controls are important, but they do not fully protect the public-facing web applications, APIs, customer portals and login flows where personal information is often exposed.&lt;/p&gt;
&lt;p&gt;Under &lt;a href="https://www.legislation.gov.au/C2004A03712/2025-02-01/2025-02-01/text/1/epub/OEBPS/document_1/document_1.html#_Toc191455268"&gt;Australian Privacy Principle 11 — security of personal information&lt;/a&gt;, an APP entity that holds personal information must take reasonable steps to protect it from misuse, interference, loss, unauthorised access, unauthorised modification and unauthorised disclosure. The Act also makes clear that those steps include technical and organisational measures.&lt;/p&gt;
&lt;p&gt;That wording is important. It means privacy compliance is not limited to policies, contracts and internal IT controls. If customer data is reachable through a website or API, then the controls protecting that website or API become part of the privacy compliance story.&lt;/p&gt;
&lt;h2&gt;Essential Eight is the floor, not the whole building&lt;/h2&gt;
&lt;p&gt;The &lt;a href="https://www.cyber.gov.au/business-government/asds-cyber-security-frameworks/essential-eight"&gt;Essential Eight&lt;/a&gt; is a valuable baseline. The ACSC says it makes it much harder for adversaries to compromise systems, while also noting that no set of mitigation strategies can protect against all cyber threats.&lt;/p&gt;
&lt;p&gt;That distinction is important for web applications.&lt;/p&gt;
&lt;p&gt;A business can be mature against Essential Eight and still leave its public-facing website exposed. It may have MFA for staff, but no effective protection against credential stuffing on customer accounts. It may patch internal systems, but still allow bots to abuse login, checkout, account, booking or password reset endpoints. It may have backups, but no useful web-layer logs to understand whether personal information was accessed.&lt;/p&gt;
&lt;p&gt;Essential Eight helps reduce compromise risk across the corporate environment. Edge security helps protect the application layer where customers, bots, attackers and APIs interact in real time.&lt;/p&gt;
&lt;p&gt;For any business that handles personal information online, both are needed.&lt;/p&gt;
&lt;h2&gt;The edge is where privacy risk often appears first&lt;/h2&gt;
&lt;p&gt;Most attacks against websites do not start with malware on an employee laptop. They start with HTTP requests.&lt;/p&gt;
&lt;p&gt;Attackers test login forms with leaked credentials. They scrape customer portals. They abuse APIs. They enumerate accounts. They probe CMS plugins. They bypass exposed origins. They overload search, checkout or booking endpoints. They automate password reset flows. They use residential proxies and headless browsers to make malicious traffic look like normal customer activity.&lt;/p&gt;
&lt;p&gt;From a privacy perspective, this matters because these attacks can lead directly to unauthorised access, disclosure, misuse or loss of personal information.&lt;/p&gt;
&lt;p&gt;That is exactly the risk APP 11 is concerned with.&lt;/p&gt;
&lt;p&gt;If a website exposes customer names, addresses, order history, invoices, loyalty balances, support tickets, identity documents, health information, student records or account data, the edge is part of the control environment. It is the place where malicious traffic can be blocked, challenged, rate limited, logged or allowed through to the origin.&lt;/p&gt;
&lt;h2&gt;Government guidance points beyond basic IT hygiene&lt;/h2&gt;
&lt;p&gt;The ACSC’s guidance on &lt;a href="https://www.cyber.gov.au/business-government/small-business-cyber-security/securing-customer-personal-data"&gt;securing customer personal data&lt;/a&gt; recommends practical controls such as creating a register of personal data, limiting what is collected, deleting unused data, controlling access, encrypting data, backing it up, and logging and monitoring access.&lt;/p&gt;
&lt;p&gt;For a website, those recommendations have direct edge and application-layer implications.&lt;/p&gt;
&lt;p&gt;A register of personal data should include not only databases, but also web forms, APIs, CDN logs, application logs, analytics tools, third-party scripts, support systems and staging environments. Limiting collection should mean removing unnecessary fields from forms, avoiding personal information in URLs, and not sending sensitive data into analytics or debugging tools without a clear reason. Logging and monitoring should include requests to sensitive endpoints, not just server health metrics.&lt;/p&gt;
&lt;p&gt;In other words, practical privacy protection has to reach the web stack.&lt;/p&gt;
&lt;h2&gt;WAF, rate limiting and bot management are privacy controls&lt;/h2&gt;
&lt;p&gt;A web application firewall is often seen as a security control. Rate limiting is often seen as an availability control. Bot management is often seen as a cost or performance control.&lt;/p&gt;
&lt;p&gt;For websites handling personal information, all three are also privacy controls.&lt;/p&gt;
&lt;p&gt;A WAF helps block common exploit attempts before they reach the application. Rate limiting helps reduce brute force attacks, account enumeration, password reset abuse, checkout abuse and application-layer denial of service. Bot management helps identify credential stuffing tools, scrapers, automation frameworks, fake browsers and proxy-based abuse.&lt;/p&gt;
&lt;p&gt;These controls do not replace secure application development, access control or data minimisation. But they reduce the chance that personal information can be accessed or harvested through normal-looking web requests.&lt;/p&gt;
&lt;p&gt;That matters because many privacy incidents are not sophisticated intrusions. They are automated abuse at scale.&lt;/p&gt;
&lt;p&gt;A login form without bot protection can become a credential stuffing endpoint. A search API without rate limits can become a scraping interface. A customer portal without behavioural monitoring can become a data extraction tool. An exposed origin can bypass the very controls the business thought were protecting the site.&lt;/p&gt;
&lt;h2&gt;Edge logging supports breach assessment&lt;/h2&gt;
&lt;p&gt;Privacy compliance is not only about preventing incidents. It is also about understanding them.&lt;/p&gt;
&lt;p&gt;When something goes wrong, a business needs to answer practical questions. Which accounts, IPs, sessions or API keys accessed the affected records? Which endpoints were used? Was the traffic automated? Did it come through the CDN or bypass it? Was the data viewed, modified or exported? What personal information may have been exposed?&lt;/p&gt;
&lt;p&gt;Without edge and application-layer logs, those questions are hard to answer.&lt;/p&gt;
&lt;p&gt;That creates a second-order privacy problem. If a business cannot determine what happened, it may struggle to assess the seriousness of an incident, notify accurately, or explain what remedial action was taken.&lt;/p&gt;
&lt;p&gt;Good logging does not mean storing personal information in logs forever. It means capturing enough security metadata to reconstruct access patterns while avoiding unnecessary personal information in the logs themselves.&lt;/p&gt;
&lt;h2&gt;Data minimisation also applies at the edge&lt;/h2&gt;
&lt;p&gt;Privacy risk increases when personal information spreads through systems that were never designed to store it.&lt;/p&gt;
&lt;p&gt;Websites often leak personal information into places businesses forget to review: query strings, CDN logs, analytics events, error traces, session replay tools, marketing pixels, staging databases, CSV exports and support tickets.&lt;/p&gt;
&lt;p&gt;That is why data minimisation should apply to the whole request path, not only the production database.&lt;/p&gt;
&lt;p&gt;Do not put personal information in URLs if it will be logged by browsers, proxies, CDNs and analytics tools. Do not send unnecessary personal information to third-party scripts. Do not retain verbose request logs longer than needed. Do not copy production customer data into staging unless there is a controlled and documented reason. Do not collect fields “just in case”.&lt;/p&gt;
&lt;p&gt;The less personal information that passes through the edge, the less there is to expose, protect, delete and explain.&lt;/p&gt;
&lt;h2&gt;What this means in practice&lt;/h2&gt;
&lt;p&gt;For Australian websites handling personal information, edge security should now be treated as part of the privacy control set. That usually means:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;placing the site behind a CDN or edge security layer&lt;/li&gt;
&lt;li&gt;enabling WAF protection for common application attacks&lt;/li&gt;
&lt;li&gt;applying rate limits to login, registration, password reset, checkout, search and API endpoints&lt;/li&gt;
&lt;li&gt;using bot management to detect scraping, credential stuffing and automated abuse&lt;/li&gt;
&lt;li&gt;locking down the origin so attackers cannot bypass edge controls&lt;/li&gt;
&lt;li&gt;logging enough request metadata to support investigation and breach assessment&lt;/li&gt;
&lt;li&gt;reviewing what personal information appears in URLs, headers, cookies, logs and analytics&lt;/li&gt;
&lt;li&gt;applying retention and deletion rules to CDN logs, application logs and third-party tools&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The important point is not that every website needs the same controls. A simple contact form does not create the same risk as an ecommerce account portal or health booking system. The point is that the controls should match the risk created by the personal information being handled.&lt;/p&gt;
&lt;p&gt;That is the practical meaning of “reasonable steps”.&lt;/p&gt;
&lt;h2&gt;The takeaway&lt;/h2&gt;
&lt;p&gt;Edge security has moved from being a performance and availability issue to being a privacy compliance issue.&lt;/p&gt;
&lt;p&gt;For Australian businesses, Essential Eight remains a sensible baseline. But it does not prove that a public-facing website, API or customer portal is protected against the most common ways personal information is abused online.&lt;/p&gt;
&lt;p&gt;If personal information is collected, accessed or processed through the web application, then WAF, bot management, rate limiting, origin protection, API controls, logging and data minimisation all become part of the privacy compliance conversation.&lt;/p&gt;
&lt;p&gt;The question is no longer just whether the business has implemented Essential Eight.&lt;/p&gt;
&lt;p&gt;The better question is: if an attacker came through the front door of the website, could the business show it had taken reasonable technical steps to protect the personal information behind it?&lt;/p&gt;</content><category term="Security"></category><category term="Security"></category><category term="Compliance"></category></entry><entry><title>An Operating Model for API and Account Protection</title><link href="https://www.peakhour.io/blog/api-account-protection-operating-model/" rel="alternate"></link><published>2026-06-19T00:00:00+10:00</published><updated>2026-06-19T00:00:00+10:00</updated><author><name>AC</name></author><id>tag:www.peakhour.io,2026-06-19:/blog/api-account-protection-operating-model/</id><summary type="html">&lt;p&gt;API and account protection works best as an operating model: map routes, classify signals, choose proportionate actions, preserve evidence, and tune controls from monitor to enforce.&lt;/p&gt;</summary><content type="html">&lt;p&gt;API and account protection is often discussed as a stack of controls: authentication, MFA, bot detection, rate limiting, WAF rules, logging, fraud checks, and incident response. Those controls matter, but the missing piece is usually the operating model.&lt;/p&gt;
&lt;p&gt;Who owns the route? Which signals are trusted? What action should happen before origin? What evidence is preserved? When does a rule move from monitor to enforce? How does the team know whether it helped or hurt?&lt;/p&gt;
&lt;p&gt;Without those answers, account protection becomes a set of disconnected gates. The login page has one policy. The mobile API has another. Password reset is reviewed only after support tickets appear. Rate limits are tuned during incidents, then left in place because nobody wants to touch them.&lt;/p&gt;
&lt;p&gt;A better model is route first, signal second, action third, evidence always.&lt;/p&gt;
&lt;h2&gt;1. Map the Routes That Matter&lt;/h2&gt;
&lt;p&gt;Start with the account and API routes that change trust, money, access, or user state. Do not begin with every endpoint in the estate. Begin with the flows where abuse has a clear consequence.&lt;/p&gt;
&lt;p&gt;Typical routes include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Login and token issue.&lt;/li&gt;
&lt;li&gt;Token refresh.&lt;/li&gt;
&lt;li&gt;Password reset start and completion.&lt;/li&gt;
&lt;li&gt;MFA enrolment and recovery.&lt;/li&gt;
&lt;li&gt;New account registration.&lt;/li&gt;
&lt;li&gt;Email, phone, address, and password changes.&lt;/li&gt;
&lt;li&gt;Stored payment, wallet, loyalty, or checkout actions.&lt;/li&gt;
&lt;li&gt;High-volume read APIs.&lt;/li&gt;
&lt;li&gt;Partner or machine-to-machine API access.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For each route, record the owner, normal traffic shape, expected clients, authentication method, downstream cost, and likely abuse case. A login endpoint and a product search endpoint can both be APIs, but they should not have the same policy.&lt;/p&gt;
&lt;p&gt;This is where &lt;a href="/solutions/use-case/traffic-control/"&gt;traffic control&lt;/a&gt; becomes part of account security. The route tells the edge what kind of decision is being made: allow, challenge, throttle, block, route, cache, or log.&lt;/p&gt;
&lt;h2&gt;2. Classify the Signals Before Choosing the Action&lt;/h2&gt;
&lt;p&gt;A useful account decision combines several signal families:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Identity and token state.&lt;/li&gt;
&lt;li&gt;Credential exposure or failed-login history.&lt;/li&gt;
&lt;li&gt;Residential proxy, VPN, hosting, mobile, or office network context.&lt;/li&gt;
&lt;li&gt;IP reputation and ASN behaviour.&lt;/li&gt;
&lt;li&gt;Client, browser, TLS, or HTTP fingerprint.&lt;/li&gt;
&lt;li&gt;Request rate and response codes.&lt;/li&gt;
&lt;li&gt;Route sequence and session behaviour.&lt;/li&gt;
&lt;li&gt;Account event context, such as reset, recovery, or profile change.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The mistake is treating any one signal as the whole answer. A residential proxy signal on a low-risk route may only need monitoring. The same signal on a password reset route, with repeated failures and a first-seen client, should be handled differently.&lt;/p&gt;
&lt;p&gt;This is the job of &lt;a href="/solutions/use-case/contextual-security/"&gt;contextual security&lt;/a&gt;: apply friction where the request context justifies it, while keeping trusted users on the shortest path.&lt;/p&gt;
&lt;h2&gt;3. Choose Actions That Match Route Risk&lt;/h2&gt;
&lt;p&gt;Not every suspicious request should be blocked. Blocking is one action, and it should be available, but account protection needs a wider set of responses.&lt;/p&gt;
&lt;p&gt;Common actions include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Allow and record.&lt;/li&gt;
&lt;li&gt;Log only.&lt;/li&gt;
&lt;li&gt;Add to a rate-limit zone.&lt;/li&gt;
&lt;li&gt;Throttle or return a 429.&lt;/li&gt;
&lt;li&gt;Require a challenge.&lt;/li&gt;
&lt;li&gt;Require step-up authentication.&lt;/li&gt;
&lt;li&gt;Deny the request.&lt;/li&gt;
&lt;li&gt;Route to a safer path.&lt;/li&gt;
&lt;li&gt;Alert security or support.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="/products/advanced-rate-limiting/"&gt;Advanced rate limiting&lt;/a&gt; is useful here because the counter does not have to be the source IP. For API traffic, a policy may key on an Authorization header, token, fingerprint, route, cookie, response code, or a combination of fields. For account flows, response-aware limits can count failed logins or suspicious reset attempts, then apply a stricter rule on the next request.&lt;/p&gt;
&lt;p&gt;This matters for distributed abuse. If attackers rotate through residential proxies, a simple IP counter sees fragments. A route-aware, signal-aware policy can still recognise the behaviour that matters.&lt;/p&gt;
&lt;h2&gt;4. Preserve Evidence While the Control Runs&lt;/h2&gt;
&lt;p&gt;A security decision that cannot be explained will be difficult to tune and harder to defend internally. Teams need to know why a request was allowed, challenged, throttled, or blocked.&lt;/p&gt;
&lt;p&gt;The evidence should keep the request, route, signal, policy, action, and outcome together. That includes useful fields such as the matched route, rate-limit zone, proxy or IP classification, fingerprint, response code, decision reason, and timestamp.&lt;/p&gt;
&lt;p&gt;&lt;a href="/products/log-forwarding/"&gt;Log forwarding&lt;/a&gt; is part of the operating model, not an afterthought. If the evidence only exists in a dashboard screenshot or a short-lived edge event, support, fraud, platform, and security teams will end up reconstructing incidents by hand. Forwarded logs should carry enough context into the SIEM, object store, or observability pipeline for investigation and tuning.&lt;/p&gt;
&lt;p&gt;This also protects the rollout. When a control is in monitor mode, evidence shows who would have been affected. When it is enforced, evidence shows who was affected and why.&lt;/p&gt;
&lt;h2&gt;5. Tune From Monitor to Enforce&lt;/h2&gt;
&lt;p&gt;The safest way to deploy account and API controls is usually staged:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Monitor the route and collect baseline evidence.&lt;/li&gt;
&lt;li&gt;Add low-friction actions, such as logging or soft thresholds.&lt;/li&gt;
&lt;li&gt;Review false positives, support impact, and route ownership.&lt;/li&gt;
&lt;li&gt;Enforce on the clearest abuse patterns.&lt;/li&gt;
&lt;li&gt;Expand enforcement only where evidence supports it.&lt;/li&gt;
&lt;li&gt;Keep rollback and emergency tightening paths documented.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This avoids two common failures. The first is leaving controls in monitor mode forever because nobody owns the decision to enforce. The second is enforcing too broadly and creating customer friction that causes the business to bypass the control.&lt;/p&gt;
&lt;p&gt;A staged model gives security, platform, product, and support teams a shared language. The rule is not "on" or "off". It has a route, a risk case, an action, evidence, and a review cycle.&lt;/p&gt;
&lt;h2&gt;6. Fit the Model to the Edge You Already Run&lt;/h2&gt;
&lt;p&gt;Some teams want Peakhour as the active application edge. Others need to keep Cloudflare, Fastly, CloudFront, another CDN, or an existing hosting edge in place. That deployment choice should not change the operating principle.&lt;/p&gt;
&lt;p&gt;The goal is still to classify request context before origin, apply the right action, and preserve evidence. &lt;a href="/solutions/bring-your-own-edge/"&gt;Bring Your Own Edge&lt;/a&gt; matters because many organisations cannot redesign delivery just to improve account protection. They need a control path that fits the architecture they already operate.&lt;/p&gt;
&lt;p&gt;The practical test is straightforward: can the team explain what happened to a sensitive account or API request without guessing?&lt;/p&gt;
&lt;p&gt;If the answer is no, the next step is not another generic control. It is an operating model: map the route, classify the signals, choose the action, preserve the evidence, and tune the policy from observed behaviour.&lt;/p&gt;
&lt;p&gt;That is how API and account protection becomes something the organisation can run, not just something it bought.&lt;/p&gt;</content><category term="API Security"></category><category term="API Security"></category><category term="Account Protection"></category><category term="Log Forwarding"></category><category term="Rate Limiting"></category><category term="Contextual Security"></category><category term="Traffic Control"></category></entry><entry><title>API Bot Abuse Does Not Stay in One Endpoint</title><link href="https://www.peakhour.io/blog/api-bot-abuse-login-checkout-account-journeys/" rel="alternate"></link><published>2026-06-19T00:00:00+10:00</published><updated>2026-06-19T00:00:00+10:00</updated><author><name>AC</name></author><id>tag:www.peakhour.io,2026-06-19:/blog/api-bot-abuse-login-checkout-account-journeys/</id><summary type="html">&lt;p&gt;API bot abuse moves across login, checkout, and account journeys. Defenders need route-aware bot, rate, and account controls that follow the campaign rather than treating each endpoint as a separate incident.&lt;/p&gt;</summary><content type="html">&lt;p&gt;API bot abuse rarely stays politely inside one endpoint.&lt;/p&gt;
&lt;p&gt;A campaign may start at login, move through token refresh, test account recovery, check saved addresses, probe checkout, abuse coupons, scrape product availability, and then return to account actions once a working session is found. Looking at each route alone makes the activity seem smaller than it is.&lt;/p&gt;
&lt;p&gt;The pattern matters more than the individual request.&lt;/p&gt;
&lt;p&gt;That is why &lt;a href="/solutions/use-case/api-bot-protection/"&gt;API bot protection&lt;/a&gt; has to follow journeys, not just endpoints.&lt;/p&gt;
&lt;h2&gt;Login Is the First Measurement Point&lt;/h2&gt;
&lt;p&gt;Login endpoints are the obvious place to look for bot abuse. Credential stuffing, password spraying, brute force attempts, and token abuse all show up there.&lt;/p&gt;
&lt;p&gt;But the login endpoint is only the first measurement point. Attackers are not trying to create a failed-login graph. They are trying to find usable accounts and move to the next action.&lt;/p&gt;
&lt;p&gt;A bot campaign may keep failed attempts low per IP address. It may rotate through residential proxies. It may slow down to avoid simple thresholds. It may mimic the browser request shape closely enough to get past a basic check. It may use an API route that exists for the mobile app rather than the public login form.&lt;/p&gt;
&lt;p&gt;So the useful question is not just "how many login attempts did we see?" It is "which client, route, network, fingerprint, account, and response pattern suggests automation?"&lt;/p&gt;
&lt;p&gt;That is where &lt;a href="/products/bot-management/"&gt;bot management&lt;/a&gt; belongs in the account journey. It should not be an isolated "human or bot" label. It should become part of the request evidence used for login, recovery, checkout, and account-change decisions.&lt;/p&gt;
&lt;h2&gt;Checkout Abuse Is Often API Abuse&lt;/h2&gt;
&lt;p&gt;Checkout abuse is not always a stolen-card problem. It can be a request-path problem.&lt;/p&gt;
&lt;p&gt;Bots can test coupon codes, reserve inventory, create carts, check delivery combinations, retry payment flows, and exploit business logic at machine speed. Some of this happens through visible browser journeys. Much of it happens through APIs used by the front end or mobile app.&lt;/p&gt;
&lt;p&gt;The damage is not always dramatic in a single request. A few extra cart creations may look normal. A small number of coupon checks may be expected. A payment retry can be legitimate. The problem is the campaign shape across routes.&lt;/p&gt;
&lt;p&gt;If the same automation profile moves through login, cart, promo, shipping, and payment APIs with abnormal timing or sequencing, the response should not depend on one endpoint crossing a crude global limit.&lt;/p&gt;
&lt;p&gt;It should be route-aware.&lt;/p&gt;
&lt;p&gt;A checkout API can tolerate different behaviour from a catalogue API. A payment route deserves different thresholds from a product search route. A coupon route may need controls around account age, session state, rate, and client evidence. A cart route may be harmless in one context and abusive in another.&lt;/p&gt;
&lt;h2&gt;Account Journeys Need Sensitive-Action Controls&lt;/h2&gt;
&lt;p&gt;Account abuse becomes most damaging when a session moves into sensitive actions.&lt;/p&gt;
&lt;p&gt;Changing an email address, resetting a password, adding a new delivery address, viewing stored payment details, redeeming loyalty value, or placing an order are different from normal browsing. They deserve stronger context.&lt;/p&gt;
&lt;p&gt;The request may be technically valid. The token may pass validation. The password may be correct. The API schema may be satisfied. That does not mean the action is safe.&lt;/p&gt;
&lt;p&gt;A strong control model looks at the full path into that action. Did the session begin with credential stuffing signals? Is the client first seen? Did the network change? Is there proxy or fingerprint drift? Has the account recently failed login attempts? Is the request cadence consistent with a human journey? Is the action unusually soon after authentication?&lt;/p&gt;
&lt;p&gt;These are not abstract "zero trust" slogans. They are practical checks on the account request path.&lt;/p&gt;
&lt;h2&gt;Rate Limits Need Better Keys&lt;/h2&gt;
&lt;p&gt;API abuse prevention often starts with rate limiting, but IP-only limits struggle with distributed automation and shared networks. The hard part is deciding what to count.&lt;/p&gt;
&lt;p&gt;For API bot abuse, useful rate keys can include route, method, account, token, API key, response code, ASN, country, TLS or HTTP fingerprint, verified bot state, and combinations of headers. The right key depends on the journey.&lt;/p&gt;
&lt;p&gt;A login endpoint might count failed attempts by account and fingerprint. A token endpoint might count refresh patterns by client and session. A checkout route might count attempts by account, payment state, and client fingerprint. A partner API might count by API key and route.&lt;/p&gt;
&lt;p&gt;&lt;a href="/products/advanced-rate-limiting/"&gt;Advanced rate limiting&lt;/a&gt; is valuable because it can model the abusive actor more precisely than a single IP address. It also gives teams response options short of blanket blocking: log, challenge, throttle, or deny depending on the route and risk.&lt;/p&gt;
&lt;p&gt;That matters because real API traffic includes customers, mobile apps, partners, service clients, good bots, bad bots, and increasingly AI-driven agents.&lt;/p&gt;
&lt;h2&gt;Agents Will Make the Journey Problem Harder&lt;/h2&gt;
&lt;p&gt;The next wave of automated API use will not all look like simple scripts. As discussed in &lt;a href="/blog/agentic-ai-vs-your-api/"&gt;Agentic AI vs. Your API&lt;/a&gt;, reasoning agents can explore, adapt, and change their behaviour based on responses.&lt;/p&gt;
&lt;p&gt;That does not mean every AI agent is malicious. It does mean endpoint-by-endpoint rules will age quickly.&lt;/p&gt;
&lt;p&gt;A reasoning agent can try one path, observe the result, and adjust. It can move from documentation to browser-backed APIs to mobile-shaped requests. It can test which routes are protected, which errors reveal state, and which actions trigger stronger checks.&lt;/p&gt;
&lt;p&gt;Defence needs the same journey view. The campaign should be visible as it moves, even when the exact request pattern changes.&lt;/p&gt;
&lt;h2&gt;Keep Evidence Attached to the Campaign&lt;/h2&gt;
&lt;p&gt;API bot abuse is easier to manage when the evidence stays attached.&lt;/p&gt;
&lt;p&gt;The useful record is not just "blocked by rule 42". It is the route, account state, token or key context, fingerprint, proxy signal, rate key, response pattern, action taken, and protected business step. That evidence lets teams tune controls without guessing and investigate incidents without reconstructing the whole path from raw logs.&lt;/p&gt;
&lt;p&gt;For broader background, &lt;a href="/learning/api-protection/what-is-api-abuse-prevention/"&gt;API abuse prevention&lt;/a&gt; covers the categories. The operational point is narrower: login, checkout, and account APIs should not be defended as separate islands.&lt;/p&gt;
&lt;p&gt;Attackers use the journey.&lt;/p&gt;
&lt;p&gt;The defence should too.&lt;/p&gt;</content><category term="API Security"></category><category term="API Bot Protection"></category><category term="Bot Management"></category><category term="Account Protection"></category><category term="Rate Limiting"></category><category term="API Security"></category><category term="Threat Detection"></category></entry><entry><title>API Protection and Account Protection Are One Request-Path Problem</title><link href="https://www.peakhour.io/blog/api-protection-account-protection-request-path/" rel="alternate"></link><published>2026-06-19T00:00:00+10:00</published><updated>2026-06-19T00:00:00+10:00</updated><author><name>AC</name></author><id>tag:www.peakhour.io,2026-06-19:/blog/api-protection-account-protection-request-path/</id><summary type="html">&lt;p&gt;Account protection does not stop at the login form. The same request path carries API, bot, rate, token, and account-risk evidence, and that is where the decision needs to happen.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Account protection is often discussed as if it belongs to the login page. That made sense when most account abuse looked like someone submitting a username and password into a web form.&lt;/p&gt;
&lt;p&gt;That is not how modern account journeys work.&lt;/p&gt;
&lt;p&gt;A customer signs in through a browser, a mobile app, a partner integration, a password reset flow, a token refresh endpoint, a profile update request, a checkout API, and sometimes a service-to-service call that exists nowhere in the visible front end. The account is not protected by one screen. It is protected, or exposed, by the whole request path.&lt;/p&gt;
&lt;p&gt;That is why &lt;a href="/products/api-security/"&gt;API security&lt;/a&gt; and account protection should not be treated as separate operating problems. The API route, the identity context, the client evidence, the rate pattern, the token behaviour, the bot signal, and the account action all arrive together. Splitting those signals across disconnected tools makes the final decision weaker.&lt;/p&gt;
&lt;h2&gt;The Login Is Only the Start&lt;/h2&gt;
&lt;p&gt;Credential stuffing is the obvious example. Attackers test leaked credentials against login endpoints, but the useful outcome is rarely the login itself. The value comes after the session opens.&lt;/p&gt;
&lt;p&gt;They try to change the email address. They add a shipping address. They reset a password. They check stored cards. They redeem loyalty value. They place an order. They call account APIs that were built for the real customer journey and then abuse them in a different sequence.&lt;/p&gt;
&lt;p&gt;If the login defence is separate from the API defence, the organisation may see only fragments:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A spike in failed logins in one dashboard.&lt;/li&gt;
&lt;li&gt;A suspicious token refresh pattern somewhere else.&lt;/li&gt;
&lt;li&gt;A burst of profile-change requests in application logs.&lt;/li&gt;
&lt;li&gt;A fraud case after checkout.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Each of those is useful. None is the full story.&lt;/p&gt;
&lt;p&gt;The better model is to keep the decision close to the request. A request to &lt;code&gt;/login&lt;/code&gt; is different from a request to &lt;code&gt;/account/email&lt;/code&gt;, &lt;code&gt;/checkout/payment&lt;/code&gt;, or &lt;code&gt;/api/token/refresh&lt;/code&gt;. The route matters. So does the method, the session state, the previous failures, the network, the client evidence, and the account action being attempted.&lt;/p&gt;
&lt;h2&gt;APIs Carry Account Risk&lt;/h2&gt;
&lt;p&gt;APIs are not just developer plumbing. They are where many account journeys now happen.&lt;/p&gt;
&lt;p&gt;Mobile apps use APIs for login, registration, password reset, saved addresses, payment methods, and checkout. Single-page applications call APIs behind browser journeys. Partner systems may call account or order APIs directly. Internal services may use API keys or service credentials that function like non-human accounts.&lt;/p&gt;
&lt;p&gt;That creates a practical issue: account protection must cover both human and non-human identity paths.&lt;/p&gt;
&lt;p&gt;OAuth, JWTs, API keys, refresh tokens, and service credentials all need lifecycle control, least-privilege access, rotation, validation, and monitoring. But those controls are still not enough if the protected API cannot see whether the request is behaving like abuse.&lt;/p&gt;
&lt;p&gt;A valid token can be stolen. A valid API key can be overused. A real session can be driven by automation. A known customer can suddenly perform a high-risk action from a first-seen client through proxy infrastructure.&lt;/p&gt;
&lt;p&gt;The request has to be judged in context.&lt;/p&gt;
&lt;h2&gt;Rate Limiting Has to Follow Business Logic&lt;/h2&gt;
&lt;p&gt;Basic rate limiting often starts with an IP address. That is an understandable first step, but it is not enough for account protection. Attackers rotate through proxy networks. Legitimate users may share a carrier or office IP. Some attacks are low and slow enough that no single IP looks exceptional.&lt;/p&gt;
&lt;p&gt;For account journeys, rate limiting needs to be tied to the thing being protected.&lt;/p&gt;
&lt;p&gt;Login attempts can be counted differently from password resets. Token refreshes can be counted differently from product searches. A failed authentication response can be treated differently from a normal read request. A route hit by a first-seen client can be treated differently from one used by a known browser session.&lt;/p&gt;
&lt;p&gt;That is the point of &lt;a href="/solutions/api-protection/"&gt;API protection&lt;/a&gt; as an operating layer, not just an API inventory exercise. The route, schema, authentication state, bot signal, and rate key should be available to the same decision. Otherwise teams end up writing compensating rules in several systems and hoping the gaps line up.&lt;/p&gt;
&lt;h2&gt;The Edge Decision Needs Options&lt;/h2&gt;
&lt;p&gt;Not every suspicious request should be blocked. Some should be logged. Some should be rate limited. Some should be challenged. Some should be allowed because the business impact of a false positive is worse than the risk presented by that specific request.&lt;/p&gt;
&lt;p&gt;Account protection is strongest when the action matches the journey.&lt;/p&gt;
&lt;p&gt;A login request with weak risk signals might be allowed but watched. A password reset request with stronger signals might require step-up. A checkout attempt from a newly compromised session might be blocked or reviewed. A partner API key exceeding expected usage might be throttled without affecting normal customers.&lt;/p&gt;
&lt;p&gt;Peakhour's position here is simple: API, bot, WAF, rate, and account controls work better when they share request evidence. That can run on Peakhour Edge, or it can sit beside the CDN and cloud edge already in place through &lt;a href="/solutions/bring-your-own-edge/"&gt;bring your own edge&lt;/a&gt;. The important part is not the label on the component. It is whether the request path has enough context to make the right decision.&lt;/p&gt;
&lt;h2&gt;Account Protection Is a Journey Control&lt;/h2&gt;
&lt;p&gt;A useful account protection programme should be able to answer operational questions.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Which routes are involved in account takeover attempts?&lt;/li&gt;
&lt;li&gt;Which sessions moved from suspicious login behaviour into account changes?&lt;/li&gt;
&lt;li&gt;Which tokens or API keys are behaving outside their expected pattern?&lt;/li&gt;
&lt;li&gt;Which controls created friction, and where?&lt;/li&gt;
&lt;li&gt;Which blocked requests actually protected account, checkout, or recovery actions?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Those questions cannot be answered from a login form alone. They require API visibility, account-event context, rate data, bot signals, and reviewable evidence.&lt;/p&gt;
&lt;p&gt;That is the thesis of this series: API protection and account protection are one request-path problem. The account is compromised through a sequence of requests. The defence needs to see that sequence early enough to act.&lt;/p&gt;
&lt;p&gt;For teams already working on &lt;a href="/solutions/use-case/prevent-account-takeovers/"&gt;account takeover prevention&lt;/a&gt;, the next step is not simply adding another login prompt. It is connecting the account journey to the API routes that now carry it.&lt;/p&gt;</content><category term="API Security"></category><category term="API Security"></category><category term="Account Protection"></category><category term="Bot Management"></category><category term="Rate Limiting"></category><category term="Threat Detection"></category><category term="Fraud Prevention"></category></entry><entry><title>The Real Cost of Breached Credentials</title><link href="https://www.peakhour.io/blog/cost-of-breached-credentials/" rel="alternate"></link><published>2026-06-19T00:00:00+10:00</published><updated>2026-06-19T00:00:00+10:00</updated><author><name>AC</name></author><id>tag:www.peakhour.io,2026-06-19:/blog/cost-of-breached-credentials/</id><summary type="html">&lt;p&gt;Breached credentials keep creating cost after the original breach. They feed credential stuffing, account takeover, fraud, support, and reputation costs across login, recovery, checkout, and API flows.&lt;/p&gt;</summary><content type="html">&lt;p&gt;The cost of breached credentials is usually counted in the wrong place.&lt;/p&gt;
&lt;p&gt;When an organisation suffers a data breach, the obvious costs are incident response, legal work, notification, customer support, remediation, and regulatory attention. Those costs matter. IBM's &lt;a href="https://www.ibm.com/reports/data-breach"&gt;2025 Cost of a Data Breach Report&lt;/a&gt; puts the global average breach cost at about USD 4.4 million. IBM's &lt;a href="https://www.ibm.com/think/topics/data-breach"&gt;data breach explainer&lt;/a&gt; also says stolen or compromised credentials were one of the top five initial attack vectors in the 2025 report, accounting for 10% of breaches and taking up to 186 days to identify.&lt;/p&gt;
&lt;p&gt;But that is only the first bill.&lt;/p&gt;
&lt;p&gt;Once usernames and passwords leave the original system, they do not stay attached to the original incident. They are copied, sorted, bundled, tested, resold, and mixed with other personal data. Another company's breach becomes your login problem. A password reused somewhere else becomes your fraud queue, your support call, your chargeback, your locked account, your angry customer, and your next security review.&lt;/p&gt;
&lt;p&gt;That is the real cost of breached credentials: not just the breach, but the long tail of account abuse that follows.&lt;/p&gt;
&lt;h2&gt;The Roundup: Breaches Are Feeding Account Abuse&lt;/h2&gt;
&lt;p&gt;The numbers are not subtle.&lt;/p&gt;
&lt;p&gt;The Identity Theft Resource Center's &lt;a href="https://www.idtheftcenter.org/post/2025-annual-data-breach-report-record-number-compromises/"&gt;2025 Annual Data Breach Report&lt;/a&gt; tracked 3,322 data compromises in 2025, a record high and a 79% increase over five years. The same report found that 70% of breach notices did not include attack information, making it harder for consumers and downstream businesses to understand what risk they now carry.&lt;/p&gt;
&lt;p&gt;The ITRC also introduced a category it calls Previously Compromised Data: old stolen data that is repackaged and recirculated. In the &lt;a href="https://www.idtheftcenter.org/wp-content/uploads/2026/01/2025-ITRC-Annual-Data-Breach-Report.pdf"&gt;full report&lt;/a&gt;, the ITRC says there were four major PCD releases in 2025, including two incidents involving roughly 16 billion records with no known notices. Its warning is the important part: while this may not be "new" stolen data, aggregation makes it highly effective for credential stuffing and account takeover attacks.&lt;/p&gt;
&lt;p&gt;That matches the operational pattern security teams see on login endpoints. &lt;a href="https://owasp.org/www-community/attacks/Credential_stuffing"&gt;OWASP describes credential stuffing&lt;/a&gt; as automated testing of stolen username and password pairs against login forms. The reason it works is boring and persistent: people reuse passwords. Attackers do not need to breach your site if a customer has already reused a working credential somewhere else.&lt;/p&gt;
&lt;p&gt;For Australian organisations, the local signals are just as relevant. The OAIC received &lt;a href="https://www.oaic.gov.au/news/blog/latest-notifiable-data-breach-statistics-for-january-to-june-2025"&gt;532 Notifiable Data Breach notifications&lt;/a&gt; between January and June 2025, with malicious or criminal attacks remaining the largest source of notifications. ASD's &lt;a href="https://www.cyber.gov.au/about-us/view-all-content/reports-and-statistics/annual-cyber-threat-report-2024-2025"&gt;Annual Cyber Threat Report 2024-25&lt;/a&gt; notes that its credential exposure notification process proactively sent 9,587 credential exposure events to about 220 organisations between 19 November 2024 and 30 June 2025.&lt;/p&gt;
&lt;p&gt;None of that means every fraud loss starts with a reused password. It does mean credential exposure is part of the operating environment. Attackers have supply, tooling, proxy infrastructure, and plenty of places to turn account access into money.&lt;/p&gt;
&lt;p&gt;The FBI's &lt;a href="https://www.ic3.gov/AnnualReport/Reports/2025_IC3Report.pdf"&gt;2025 IC3 report&lt;/a&gt; gives useful context for that monetisation path. Cyber-enabled fraud accounted for 452,868 complaints and USD 17.697 billion in reported losses. Those losses include many crime types, not just credential stuffing, but the transaction paths are familiar to anyone dealing with account abuse: wire and ACH transfers, cards, peer-to-peer transfers, prepaid and gift cards, and cryptocurrency.&lt;/p&gt;
&lt;h2&gt;Where the Cost Actually Lands&lt;/h2&gt;
&lt;p&gt;A breached credential is cheap for the attacker and expensive for everyone else.&lt;/p&gt;
&lt;p&gt;The first cost is detection. A login using the right username and password does not automatically look malicious. If the attacker spreads attempts across residential proxy infrastructure, uses one attempt per account, or targets mobile API endpoints directly, simple IP-based rate limits may not see the pattern. Peakhour has written about this in &lt;a href="/blog/credential-stuffing-threat-australian-businesses/"&gt;The Australian epidemic of Account Takeover attacks&lt;/a&gt; and in &lt;a href="/blog/credential-stuffing-after-the-login/"&gt;Credential Stuffing Does Not Stop at the Login Form&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The second cost is fraud. Once a credential works, the attacker looks for value: stored cards, gift cards, loyalty points, refunds, store credit, subscription changes, delivery addresses, and saved payment flows. This is why account takeover is not just an authentication problem. The expensive moment may be checkout, not login.&lt;/p&gt;
&lt;p&gt;The third cost is support. Customers do not usually know whether the original password leak happened somewhere else. They know their account was used, their card was charged, their loyalty balance disappeared, or their email address changed. The business still has to handle the support ticket, freeze the account, unwind the transaction, review the evidence, and explain what happened.&lt;/p&gt;
&lt;p&gt;The fourth cost is trust. We have covered this before in &lt;a href="/blog/credential-stuffing-business-impact/"&gt;The Cost of Credential Stuffing&lt;/a&gt;: the reputational damage is practical. Customers see refunds, account locks, suspicious messages, and public complaints. Even if the business was not the source of the original breach, it becomes the place where the harm is felt.&lt;/p&gt;
&lt;p&gt;The fifth cost is friction. If the only response is to challenge everyone, the business pays through abandonment and customer frustration. If the response is too soft, the business pays through fraud. The work is to apply friction where the evidence justifies it.&lt;/p&gt;
&lt;h2&gt;You Do Not Need Surveillance to Secure Accounts&lt;/h2&gt;
&lt;p&gt;There is a bad version of account protection that tries to identify people everywhere they go. That is not necessary, and it is not the right model for this problem.&lt;/p&gt;
&lt;p&gt;Credential abuse defence should be scoped to the account security decision in front of you. Is this login using a known exposed credential pair? Is the session coming from suspicious infrastructure? Is it a first-seen device for the account? Is it trying to change email, reset the password, add a payout method, redeem stored value, or check out with saved payment details? Did the same client pattern just test many accounts?&lt;/p&gt;
&lt;p&gt;Those questions can be answered with security-specific signals, not advertising-style tracking. Hash the credential check. Treat &lt;a href="/blog/fingerprints-are-evidence-not-identity/"&gt;fingerprints as evidence, not identity&lt;/a&gt;. Keep the evidence tied to the protected account and request path. Use network, device, route, behaviour, and credential-risk context to decide whether to allow, step up, throttle, block, or review. Do not build a cross-site identity graph when the job is to stop account abuse on your own service.&lt;/p&gt;
&lt;p&gt;That distinction matters. Users should not have to trade privacy for basic account security. Businesses also do not need to choose between doing nothing and adding blanket friction. &lt;a href="/solutions/use-case/contextual-security/"&gt;Contextual security&lt;/a&gt; is useful because it lets the response match the risk.&lt;/p&gt;
&lt;h2&gt;What Teams Should Measure&lt;/h2&gt;
&lt;p&gt;If breached credentials are a business cost, measure them like one.&lt;/p&gt;
&lt;p&gt;Useful measures include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;How many login attempts match known breached credential pairs.&lt;/li&gt;
&lt;li&gt;How many breached-credential attempts result in a successful login.&lt;/li&gt;
&lt;li&gt;Which routes see the risk: login, password reset, email change, stored-card checkout, gift card redemption, account recovery, mobile API, partner API, or admin access.&lt;/li&gt;
&lt;li&gt;How often high-risk sessions move from login into sensitive account actions.&lt;/li&gt;
&lt;li&gt;Which signals appear together: breached credential, residential proxy, first-seen device, unusual geography, repeated failure, rapid checkout, or recovery-flow pressure.&lt;/li&gt;
&lt;li&gt;How many support tickets, refunds, chargebacks, account locks, and fraud reviews are linked to account takeover.&lt;/li&gt;
&lt;li&gt;How many controls create customer friction, and whether that friction is landing on risky sessions or ordinary customers.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This does not need to be perfect on day one. The important step is to stop treating credential stuffing as a vague security category and start treating it as an observable account-risk workflow.&lt;/p&gt;
&lt;h2&gt;The Control Pattern&lt;/h2&gt;
&lt;p&gt;The control pattern is layered.&lt;/p&gt;
&lt;p&gt;Start with &lt;a href="/products/breached-credentials/"&gt;breached credential scanning&lt;/a&gt; so reused or exposed credentials are visible at login. Feed that signal into &lt;a href="/solutions/use-case/prevent-account-takeovers/"&gt;account takeover prevention&lt;/a&gt; rather than treating it as a standalone report. Add &lt;a href="/products/bot-management/"&gt;bot management&lt;/a&gt; and &lt;a href="/products/advanced-rate-limiting/"&gt;advanced rate limiting&lt;/a&gt; so automation and distributed testing are harder to run at scale. Use &lt;a href="/products/residential-proxy-detection/"&gt;residential proxy detection&lt;/a&gt; as a risk signal, especially where attackers are trying to make automated traffic look like normal customer traffic.&lt;/p&gt;
&lt;p&gt;Then carry the risk forward after login.&lt;/p&gt;
&lt;p&gt;A low-risk page view and a saved-card checkout should not inherit the same level of trust just because the password worked. A session that begins with a breached credential match, comes through suspicious infrastructure, and immediately changes the email address or redeems stored value deserves a different response from a known customer browsing order history.&lt;/p&gt;
&lt;p&gt;The response can be graduated:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Log low-risk activity for visibility.&lt;/li&gt;
&lt;li&gt;Tighten rate limits on suspicious automation.&lt;/li&gt;
&lt;li&gt;Require step-up verification before sensitive account changes.&lt;/li&gt;
&lt;li&gt;Hold or review risky transactions.&lt;/li&gt;
&lt;li&gt;Notify the customer when high-risk account changes are attempted.&lt;/li&gt;
&lt;li&gt;Block sessions when the evidence is strong enough.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That is how breached credential data becomes useful. It is not a panic button. It is a signal that helps decide when trust should be earned again.&lt;/p&gt;
&lt;h2&gt;The Practical Takeaway&lt;/h2&gt;
&lt;p&gt;Breached credentials are not only a breach-response issue. They are an account protection issue, a fraud issue, a support issue, and a customer trust issue.&lt;/p&gt;
&lt;p&gt;The original breach may have happened somewhere else. The cost can still land on your login form, your checkout, your API, and your support team.&lt;/p&gt;
&lt;p&gt;The goal is not to make every login difficult. The goal is to make stolen credentials harder to turn into account control, money movement, stored-value abuse, or customer harm.&lt;/p&gt;
&lt;p&gt;That starts by making credential risk visible, connecting it to session and route context, and applying proportionate controls where the cost would otherwise show up.&lt;/p&gt;</content><category term="Account Protection"></category><category term="Account Protection"></category><category term="Credential Stuffing"></category><category term="Breached Credentials"></category><category term="Fraud Prevention"></category><category term="Bot Management"></category><category term="API Security"></category><category term="Residential Proxies"></category></entry><entry><title>Credential Stuffing Does Not Stop at the Login Form</title><link href="https://www.peakhour.io/blog/credential-stuffing-after-the-login/" rel="alternate"></link><published>2026-06-19T00:00:00+10:00</published><updated>2026-06-19T00:00:00+10:00</updated><author><name>AC</name></author><id>tag:www.peakhour.io,2026-06-19:/blog/credential-stuffing-after-the-login/</id><summary type="html">&lt;p&gt;Credential stuffing risk continues after a password works. Account protection needs to watch password reset, email change, stored payment, gift card, and checkout flows.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Credential stuffing is usually described as a login problem. An attacker takes breached username and password pairs, tests them against a site, and tries to find accounts where people reused passwords.&lt;/p&gt;
&lt;p&gt;That description is accurate, but incomplete. The login is only the first gate. The real damage often happens in the flows that follow a successful login: password reset, email change, saved cards, loyalty balances, gift cards, account recovery, address changes, and checkout.&lt;/p&gt;
&lt;p&gt;If account protection only watches the login form, it can miss the part of the attack that matters most to the business.&lt;/p&gt;
&lt;p&gt;A successful credential stuffing attempt does not always look dramatic. The attacker may have valid credentials. They may come through residential proxy infrastructure. They may spread attempts across many IP addresses. They may slow the attack down to stay below simple thresholds. If the site treats a valid username and password as the end of the risk decision, the attacker inherits whatever the account can do.&lt;/p&gt;
&lt;p&gt;That is why &lt;a href="/solutions/use-case/prevent-account-takeovers/"&gt;account takeover prevention&lt;/a&gt; needs to cover account actions, not just authentication.&lt;/p&gt;
&lt;h2&gt;The Attack Continues After the Password Works&lt;/h2&gt;
&lt;p&gt;Once an attacker is inside an account, they usually want persistence, value, or both.&lt;/p&gt;
&lt;p&gt;A password reset or password change can lock the real customer out. An email change can move alerts, receipts, and recovery messages away from the owner. A phone number change can weaken later verification. A new shipping address can redirect physical goods. Stored payment methods can turn account access into immediate fraud. Gift cards, store credits, loyalty points, and refunds can be easier to monetise than a card transaction.&lt;/p&gt;
&lt;p&gt;Checkout is often where the compromise becomes visible, but the risk builds earlier. A login from unfamiliar infrastructure followed by a profile change, then a saved-card purchase, is different from a returning customer browsing previous orders. A dormant account that suddenly redeems gift cards, changes email, and ships to a new address deserves more scrutiny than an ordinary login.&lt;/p&gt;
&lt;p&gt;These flows are also common in APIs. Mobile apps, single-page applications, partner integrations, and checkout backends expose account actions through endpoints that may not share the same controls as the web login page. Attackers do not care whether the valuable step is behind &lt;code&gt;/login&lt;/code&gt;, &lt;code&gt;/api/account/email&lt;/code&gt;, or &lt;code&gt;/checkout/payment&lt;/code&gt;. They follow the path that works.&lt;/p&gt;
&lt;h2&gt;Breached Credentials Are a Risk Signal&lt;/h2&gt;
&lt;p&gt;&lt;a href="/products/breached-credentials/"&gt;Breached credential&lt;/a&gt; checks are useful because they add context before the account is fully trusted. If a credential pair is known to have appeared in a breach, the site can treat the session differently from the start.&lt;/p&gt;
&lt;p&gt;That does not mean every breached credential attempt should be handled the same way. A user may be genuinely logging in with a reused password. An attacker may be testing a combo list. A customer may be returning after a long period away. The point is to make the risk visible and carry it through the session.&lt;/p&gt;
&lt;p&gt;Peakhour has written before about &lt;a href="/blog/breached-credentials-protection-application-security-platform/"&gt;managing breached credential usage&lt;/a&gt;. The practical lesson is that credential risk should feed the wider account protection decision. A breached credential signal should be considered alongside client evidence, network context, request rate, route sensitivity, behaviour, and the action being attempted.&lt;/p&gt;
&lt;p&gt;A low-risk page view and a stored-card checkout should not inherit the same confidence just because both follow a successful login.&lt;/p&gt;
&lt;h2&gt;MFA Helps, But It Does Not Close Every Path&lt;/h2&gt;
&lt;p&gt;Multi-factor authentication remains useful. It can stop many direct account takeover attempts and raise the cost of abuse. But &lt;a href="/blog/why-mfa-is-an-incomplete-defence/"&gt;MFA is not a complete defence&lt;/a&gt; when attackers use social engineering, session theft, weak recovery flows, trusted devices, or post-login actions that do not require step-up verification.&lt;/p&gt;
&lt;p&gt;The better pattern is adaptive control. Let the login succeed when the evidence is low risk. Step up when the action matters. Ask for stronger verification before changing the email address, adding a new payout method, redeeming a stored balance, or checking out with saved payment details from an unfamiliar context.&lt;/p&gt;
&lt;p&gt;This is not about adding friction everywhere. It is about reserving friction for the points where compromise turns into loss.&lt;/p&gt;
&lt;h2&gt;What to Monitor After Login&lt;/h2&gt;
&lt;p&gt;The useful signals are operational and specific:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Credential risk at login, including known breached username and password pairs.&lt;/li&gt;
&lt;li&gt;New client, browser, or network evidence on an existing account.&lt;/li&gt;
&lt;li&gt;Password reset, password change, email change, and phone change attempts.&lt;/li&gt;
&lt;li&gt;New shipping addresses, payment method changes, stored-card use, gift card redemption, and loyalty balance activity.&lt;/li&gt;
&lt;li&gt;Sudden changes in behaviour, such as rapid checkout after login or repeated account recovery attempts.&lt;/li&gt;
&lt;li&gt;API routes that perform sensitive account actions without the same scrutiny as browser flows.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The response should match the confidence and consequence. Some events only need logging. Some need tighter rate limits. Some need a browser challenge, MFA step-up, temporary hold, customer notification, or review.&lt;/p&gt;
&lt;p&gt;Credential stuffing defence is not finished when a password works or fails. The more useful question is: what does this session try to do next, and does the evidence justify trusting it?&lt;/p&gt;
&lt;p&gt;For account protection, that is the line that matters.&lt;/p&gt;</content><category term="API Security"></category><category term="API Security"></category><category term="Account Protection"></category><category term="Credential Stuffing"></category><category term="Bot Management"></category><category term="Breached Credentials"></category><category term="Fraud Prevention"></category></entry><entry><title>Fingerprints Are Evidence, Not Identity</title><link href="https://www.peakhour.io/blog/fingerprints-are-evidence-not-identity/" rel="alternate"></link><published>2026-06-19T00:00:00+10:00</published><updated>2026-06-19T00:00:00+10:00</updated><author><name>AC</name></author><id>tag:www.peakhour.io,2026-06-19:/blog/fingerprints-are-evidence-not-identity/</id><summary type="html">&lt;p&gt;Browser and network fingerprints are useful security evidence, but they should not be treated as proof of a person's identity.&lt;/p&gt;</summary><content type="html">&lt;p&gt;The word "fingerprint" can create the wrong expectation.&lt;/p&gt;
&lt;p&gt;In security, a browser or network fingerprint is not the same as a human fingerprint. It does not prove who a person is. It does not remove uncertainty. It should not be treated as a permanent identity for a customer.&lt;/p&gt;
&lt;p&gt;A fingerprint is evidence. Sometimes it is strong evidence. Sometimes it is weak, common, stale, or deliberately manipulated. Its value comes from how it is combined with route, behaviour, account state, network context, credential risk, and the action being requested.&lt;/p&gt;
&lt;p&gt;That distinction is more than wording. It affects how security teams design controls, explain decisions, and avoid overblocking legitimate users.&lt;/p&gt;
&lt;h2&gt;What Network Fingerprints Can Tell You&lt;/h2&gt;
&lt;p&gt;&lt;a href="/learning/fingerprinting/what-is-network-fingerprinting/"&gt;Network fingerprinting&lt;/a&gt; compares connection and protocol evidence. TCP behaviour, TLS handshakes, JA3 or JA4-style representations, HTTP/2 settings, header shape, MTU, proxy indicators, ASN, and path characteristics can all help classify the client or infrastructure behind a request.&lt;/p&gt;
&lt;p&gt;That can be useful during credential stuffing, scraping, scanning, API abuse, or Layer 7 attack pressure. Attackers may rotate IP addresses, but parts of the client stack or automation framework can remain consistent. Grouping requests by network evidence can make rate limiting, bot detection, and investigation more precise than IP-only rules.&lt;/p&gt;
&lt;p&gt;But the fingerprint is still not identity.&lt;/p&gt;
&lt;p&gt;Common browsers can share similar network shapes. Mobile networks and carrier-grade NAT can make unrelated users appear close together. VPNs and residential proxies can distort source context. Browser and library updates can change fingerprints overnight. Hashing can make signals portable while hiding useful detail. Attack tools can also try to imitate normal clients.&lt;/p&gt;
&lt;p&gt;The right conclusion from a suspicious network fingerprint is not "we know who this is". It is "this request deserves a different level of confidence".&lt;/p&gt;
&lt;h2&gt;What Browser Fingerprints Can Add&lt;/h2&gt;
&lt;p&gt;&lt;a href="/learning/fingerprinting/what-is-browser-fingerprinting/"&gt;Browser fingerprinting&lt;/a&gt; adds evidence from the application layer and, where appropriate, browser-side checks. Headers, client hints, JavaScript-visible properties, rendering behaviour, storage behaviour, timezone, language, permissions, and API availability can help decide whether a request looks like the browser it claims to be.&lt;/p&gt;
&lt;p&gt;This matters because many attacks try to borrow the appearance of ordinary browser traffic. Automation frameworks, emulators, headless browsers, anti-detect browsers, and scripted API clients can all present a user-agent string that looks plausible. Browser evidence helps compare the claim with the rest of the request.&lt;/p&gt;
&lt;p&gt;Again, the useful output is confidence, not identity. A browser fingerprint might support a challenge. It might support a lower rate limit. It might explain why a session changing an email address needs step-up verification. It might help &lt;a href="/products/bot-management/"&gt;bot management&lt;/a&gt; separate obvious automation from normal traffic.&lt;/p&gt;
&lt;p&gt;It should not become a claim that one technical pattern equals one person.&lt;/p&gt;
&lt;h2&gt;The Comparison Matters&lt;/h2&gt;
&lt;p&gt;Peakhour's page on &lt;a href="/learning/fingerprinting/browser-fingerprinting-vs-network-fingerprinting/"&gt;browser fingerprinting vs network fingerprinting&lt;/a&gt; makes the operational split clear. Network fingerprints usually come from passive connection and protocol evidence. Browser fingerprints often involve request and browser-side evidence. They answer related but different questions.&lt;/p&gt;
&lt;p&gt;A strong decision often needs both.&lt;/p&gt;
&lt;p&gt;A request claiming to be a normal browser should look broadly consistent across TLS, HTTP/2, headers, JavaScript-visible browser properties, proxy context, route behaviour, and account history. If the browser looks normal but the network path resembles a known automation cluster, that is useful. If the network path looks ordinary but the browser evidence is inconsistent or missing on a sensitive route, that is useful too.&lt;/p&gt;
&lt;p&gt;The mismatch is the signal. The response still depends on consequence.&lt;/p&gt;
&lt;p&gt;A suspicious request to a public asset route might only need logging. The same evidence on login, password reset, stored-card checkout, account email change, admin access, or an expensive API route may justify a challenge, tighter limit, temporary hold, or review.&lt;/p&gt;
&lt;h2&gt;How to Use Fingerprints Responsibly&lt;/h2&gt;
&lt;p&gt;Fingerprints work best when they are attached to an explainable decision. A security event should show the route, account or token context where relevant, source network evidence, browser evidence, policy action, response code, and review outcome. That gives operators a way to understand and correct decisions.&lt;/p&gt;
&lt;p&gt;Peakhour's guide to &lt;a href="/learning/fingerprinting/network-fingerprint-signals-and-security-decisions/"&gt;network fingerprint signals and security decisions&lt;/a&gt; frames the choices properly: allow, log, challenge, rate limit, block, or review. A fingerprint should help choose among those actions. It should not replace judgement.&lt;/p&gt;
&lt;p&gt;Responsible use also means accepting uncertainty. Fingerprints collide. They drift. They can be spoofed. Some privacy tools intentionally reduce or alter browser signals. Some legitimate users have unusual configurations. Some high-risk requests have only partial evidence.&lt;/p&gt;
&lt;p&gt;That uncertainty does not make fingerprints useless. It means they should be one layer in a wider control set.&lt;/p&gt;
&lt;p&gt;For account and API security, the practical question is not "can this fingerprint identify a person?" It is "does this evidence change the confidence we should place in this request?"&lt;/p&gt;
&lt;p&gt;If the answer is yes, use it carefully. Increase scrutiny on sensitive actions. Reduce friction where evidence is clean. Preserve enough context for review. Avoid pretending that a technical fingerprint is a human identity.&lt;/p&gt;
&lt;p&gt;That is the more accurate model, and it leads to better security decisions.&lt;/p&gt;
&lt;p&gt;For a protocol-level example, see &lt;a href="/blog/fingerprint-is-a-cohort-not-a-client/"&gt;A network fingerprint is a cohort, not a client&lt;/a&gt;. It compares the information retained by JA3, JA4 and Cisco Mercury and explains why a matching TLS value can still cover many applications and users.&lt;/p&gt;</content><category term="API Security"></category><category term="API Security"></category><category term="Fingerprinting"></category><category term="Bot Management"></category><category term="Account Protection"></category><category term="Network Fingerprinting"></category><category term="Browser Fingerprinting"></category></entry><entry><title>Account Security Without Tracking People</title><link href="https://www.peakhour.io/blog/privacy-respecting-account-security-risk-signals/" rel="alternate"></link><published>2026-06-19T00:00:00+10:00</published><updated>2026-06-19T00:00:00+10:00</updated><author><name>AC</name></author><id>tag:www.peakhour.io,2026-06-19:/blog/privacy-respecting-account-security-risk-signals/</id><summary type="html">&lt;p&gt;Safer logins do not require treating people as products. Account defence should use minimised, purpose-bound risk signals and proportionate decisions.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Account security needs evidence. A login request is not just a username and password; it has a route, client context, browser behaviour, network path, timing, session history, credential risk, and follow-on actions. Without some of that context, defenders are left with blunt controls: block too much, challenge everyone, or trust too easily.&lt;/p&gt;
&lt;p&gt;The privacy problem starts when security teams confuse evidence with identity.&lt;/p&gt;
&lt;p&gt;A risk signal should help answer a narrow operational question: should this login, password reset, email change, API call, or checkout step be allowed, challenged, rate limited, blocked, logged, or reviewed? It should not become a general-purpose profile of a person.&lt;/p&gt;
&lt;p&gt;That distinction matters. Good &lt;a href="/solutions/use-case/contextual-security/"&gt;contextual security&lt;/a&gt; is not surveillance dressed up as account protection. It is purpose-bound telemetry used to make proportionate security decisions.&lt;/p&gt;
&lt;h2&gt;Minimise the Signal Set&lt;/h2&gt;
&lt;p&gt;Security teams should start with the action they are protecting.&lt;/p&gt;
&lt;p&gt;A login attempt may need credential risk, source network context, browser consistency, known client status, failed-attempt history, and session age. A password reset may need different evidence. A checkout using stored payment details may need another set again. There is rarely a good reason to collect every possible signal for every route.&lt;/p&gt;
&lt;p&gt;This is especially important with browser and device evidence. &lt;a href="/learning/fingerprinting/what-is-browser-fingerprinting/"&gt;Browser fingerprinting&lt;/a&gt; can include headers, client hints, JavaScript-visible properties, rendering behaviour, storage behaviour, timezone, language, and other consistency checks. Those signals can be useful for detecting automation, anti-detect browsers, session abuse, and high-risk account changes. They can also be privacy-sensitive if collected broadly or retained without a clear purpose.&lt;/p&gt;
&lt;p&gt;The practical standard should be simple: collect what is needed for the account defence decision, attach it to that decision, and avoid turning uniqueness into the goal.&lt;/p&gt;
&lt;h2&gt;Use Evidence Over Identity&lt;/h2&gt;
&lt;p&gt;A security system does not need to know who a person "really" is to make a better login decision. It often only needs to know whether the request looks consistent with the account, route, browser, network path, and recent behaviour.&lt;/p&gt;
&lt;p&gt;That is where &lt;a href="/solutions/use-case/verified-browser-trust/"&gt;verified browser trust&lt;/a&gt; fits. The point is not to label a human being. The point is to decide whether a browser-like request has returned enough trustworthy evidence to proceed on a sensitive path. If the evidence is weak, the system can choose a proportionate response: log, challenge, rate limit, step up authentication, or send the event for review.&lt;/p&gt;
&lt;p&gt;Network evidence should be handled the same way. &lt;a href="/learning/fingerprinting/network-fingerprint-signals-and-security-decisions/"&gt;Network fingerprint signals&lt;/a&gt; can help distinguish ordinary browser traffic from automation, proxy paths, unusual client stacks, or inconsistent request shapes. But a network signal is not a person. It is one piece of evidence attached to a request.&lt;/p&gt;
&lt;p&gt;That framing reduces overreach. It also improves operations because decisions remain reviewable. If a customer is challenged, support and security teams should be able to see the route, risk signals, and policy reason without needing a vague black-box identity claim.&lt;/p&gt;
&lt;h2&gt;Be Careful With Behavioural Analytics&lt;/h2&gt;
&lt;p&gt;Behavioural analytics can help detect account compromise, especially when a session changes sharply from normal account usage. A customer who normally logs in from one region and browses slowly may deserve extra scrutiny if the same account suddenly logs in from unfamiliar infrastructure, changes email, redeems stored value, and checks out quickly.&lt;/p&gt;
&lt;p&gt;But behavioural systems have limits.&lt;/p&gt;
&lt;p&gt;Some users are sporadic. Some travel. Some use privacy tools. Some share devices. Some change browsers or phones. Some only visit when there is a problem. If there is not enough history, the system should admit that uncertainty rather than pretending the baseline is stronger than it is.&lt;/p&gt;
&lt;p&gt;That is where adaptive security is useful. Low-confidence evidence does not always justify a hard block. It might justify logging, a lower rate limit, a step-up challenge on a sensitive action, or a temporary hold on a risky change.&lt;/p&gt;
&lt;p&gt;The aim is not perfect recognition. It is better decision-making under uncertainty.&lt;/p&gt;
&lt;h2&gt;Make Retention and Purpose Part of the Design&lt;/h2&gt;
&lt;p&gt;Privacy-respecting account security is not only about which signals are collected. It is also about how long they are kept, where they are used, and who can inspect them.&lt;/p&gt;
&lt;p&gt;Useful practices include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Tie telemetry to account defence purposes such as login risk, bot detection, account recovery, checkout abuse, and API misuse.&lt;/li&gt;
&lt;li&gt;Prefer route-specific evidence over broad user profiling.&lt;/li&gt;
&lt;li&gt;Keep raw signals only where they are needed for detection, audit, or investigation.&lt;/li&gt;
&lt;li&gt;Store decision evidence in a way operators can review.&lt;/li&gt;
&lt;li&gt;Avoid using security telemetry for unrelated marketing or behavioural targeting.&lt;/li&gt;
&lt;li&gt;Tune controls so low-risk users are not repeatedly challenged without cause.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Peakhour should not pretend that account security can happen with no fingerprints, no telemetry, and no judgement. Modern attacks abuse valid credentials, residential proxy paths, automation frameworks, API routes, and post-login workflows. Defenders need evidence.&lt;/p&gt;
&lt;p&gt;The privacy-respecting position is narrower and stronger: collect the right evidence for the security decision, minimise it, keep it purpose-bound, and treat fingerprints as confidence signals rather than personal identity.&lt;/p&gt;
&lt;p&gt;That is how account security can become safer without turning every login into tracking for its own sake.&lt;/p&gt;</content><category term="API Security"></category><category term="API Security"></category><category term="Account Protection"></category><category term="Contextual Security"></category><category term="Privacy"></category><category term="Fingerprinting"></category><category term="Risk-Based Authentication"></category></entry><entry><title>How Residential Proxies Changed API and Account Abuse</title><link href="https://www.peakhour.io/blog/residential-proxies-api-account-abuse/" rel="alternate"></link><published>2026-06-19T00:00:00+10:00</published><updated>2026-06-19T00:00:00+10:00</updated><author><name>AC</name></author><id>tag:www.peakhour.io,2026-06-19:/blog/residential-proxies-api-account-abuse/</id><summary type="html">&lt;p&gt;Residential proxies have changed account abuse from obvious bursts into distributed, low-noise workflows across login, account, and API routes. Treat proxy use as a risk signal, not a blunt block rule.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Residential proxies have changed the shape of API and account abuse. The old picture was easier to reason about: too many failed logins from one IP, a known hosting provider range, an obvious bot user agent, or a burst that crossed a threshold quickly enough to trip a rule.&lt;/p&gt;
&lt;p&gt;That still happens, but it is not the harder problem.&lt;/p&gt;
&lt;p&gt;The harder problem is the attempt that arrives through ordinary consumer networks, spreads itself across many addresses, and behaves just slowly enough to avoid looking like an incident. One login attempt here. A password reset probe there. A token refresh pattern that is unusual only when it is seen beside the route, the client, the ASN, the credential history, and the account event.&lt;/p&gt;
&lt;p&gt;That is why &lt;a href="/products/residential-proxy-detection/"&gt;residential proxy detection&lt;/a&gt; should be treated as part of the account and API decision path, not as a standalone allow/block list.&lt;/p&gt;
&lt;h2&gt;The Account Workflow Is Now a Distributed Target&lt;/h2&gt;
&lt;p&gt;Attackers do not need to break the whole application at once. They can work through the account surface in pieces:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Login attempts against known usernames.&lt;/li&gt;
&lt;li&gt;Password reset initiation and verification.&lt;/li&gt;
&lt;li&gt;New account registration.&lt;/li&gt;
&lt;li&gt;Token issue and refresh routes.&lt;/li&gt;
&lt;li&gt;Payment, address, profile, and email changes.&lt;/li&gt;
&lt;li&gt;Loyalty, wallet, checkout, or stored-value workflows.&lt;/li&gt;
&lt;li&gt;API calls that reveal whether an account or credential is valid.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Each route may look acceptable in isolation. The risk appears when the pattern is joined together.&lt;/p&gt;
&lt;p&gt;A residential proxy network helps the attacker keep that pattern quiet. Requests rotate through many residential-looking exits. IP-based rate limits see different sources. A reputation feed may not have labelled a fresh or private proxy network yet. Geo checks can look plausible enough. The traffic does not necessarily arrive as a clean burst.&lt;/p&gt;
&lt;p&gt;This is where static thinking breaks down. If the only question is "is this IP bad?", the answer will often arrive too late or be too blunt to use safely.&lt;/p&gt;
&lt;h2&gt;Fresh and Private Proxy Networks Create a Timing Problem&lt;/h2&gt;
&lt;p&gt;Many teams think about proxy detection as a database problem: look up the IP, see whether it is a proxy, then block it. That works for some traffic, especially known data centre proxies and commodity infrastructure.&lt;/p&gt;
&lt;p&gt;Residential proxy abuse is less tidy. Fresh networks can appear before public datasets have a confident label. Private networks may not show up in broad feeds at all. Some exit points are shared with legitimate users. Some sit behind carrier-grade NAT or normal household connections. Blocking the address outright can create customer pain, while allowing it without context leaves the account flow exposed.&lt;/p&gt;
&lt;p&gt;This is the practical reason Peakhour talks about residential proxy use as a signal. The signal matters, but it has to sit beside &lt;a href="/products/ip-intelligence/"&gt;IP intelligence&lt;/a&gt;, connection characteristics, client history, request behaviour, account state, and route sensitivity.&lt;/p&gt;
&lt;p&gt;A residential proxy on a marketing page may only need logging. The same proxy signal on a login route with recent failures may justify a challenge. On a password reset or high-value account change, it may justify step-up authentication, throttling, or blocking depending on the rest of the evidence.&lt;/p&gt;
&lt;p&gt;The control should match the risk of the action.&lt;/p&gt;
&lt;h2&gt;Low-and-Slow Behaviour Is Still Automation&lt;/h2&gt;
&lt;p&gt;Low-and-slow abuse is uncomfortable because it avoids the easy operational story. There is no dramatic spike. There may be no single IP worth banning. The application may not be overloaded. Support may only see a few confused users, a few locked accounts, or a gradual rise in reset attempts.&lt;/p&gt;
&lt;p&gt;For API and account workflows, this is still automation. It just looks less like a flood and more like a background process.&lt;/p&gt;
&lt;p&gt;Useful signals include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Repeated failed authentication across a shared fingerprint or client pattern.&lt;/li&gt;
&lt;li&gt;Many accounts touched by similar request timing.&lt;/li&gt;
&lt;li&gt;Token or reset routes used out of sequence.&lt;/li&gt;
&lt;li&gt;Browser characteristics that do not match the claimed client.&lt;/li&gt;
&lt;li&gt;Residential proxy use on sensitive account routes.&lt;/li&gt;
&lt;li&gt;Fresh IP or ASN patterns appearing around account events.&lt;/li&gt;
&lt;li&gt;Similar request shapes distributed across unrelated accounts.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;None of these signals has to prove abuse by itself. The point is to combine them early enough that the application does not have to make the decision alone.&lt;/p&gt;
&lt;p&gt;Peakhour's view is that proxy detection belongs in the same operating model as bot management, rate limiting, account risk scoring, and event evidence. The useful question is not "can we block every residential proxy?" It is "what should this route do when proxy use appears with this account, this client, this credential pattern, and this recent behaviour?"&lt;/p&gt;
&lt;h2&gt;API Routes Need the Same Treatment as Browser Flows&lt;/h2&gt;
&lt;p&gt;A common gap is protecting the visible login page while leaving API routes with weaker controls. Browser-side checks can help on web flows, but many account actions now happen through mobile apps, single-page applications, partner integrations, and backend APIs.&lt;/p&gt;
&lt;p&gt;Those routes still need context. They need request-level validation, route-aware thresholds, proxy and IP signals, token checks, and evidence that can be reviewed later. A login API, a reset API, and a profile-change API should not all receive the same action just because the source address has the same reputation.&lt;/p&gt;
&lt;p&gt;This is also why rate limiting has to move beyond source IP. A rule can key on a token, header, fingerprint, account identifier, route, response code, or a combination of signals. That makes it possible to slow failed login behaviour without punishing every legitimate user behind the same network.&lt;/p&gt;
&lt;p&gt;The background reading on &lt;a href="/blog/proxy-detection-challenges-existing-solutions/"&gt;proxy detection challenges&lt;/a&gt; and &lt;a href="/blog/residential-proxy-detection-quantifying-hidden-threat/"&gt;quantifying residential proxy risk&lt;/a&gt; covers the broader detection problem. For API and account teams, the immediate step is more operational: find the routes where a residential proxy signal should change the action.&lt;/p&gt;
&lt;h2&gt;The Right Outcome Is Controlled Friction&lt;/h2&gt;
&lt;p&gt;Residential proxy detection is not a magic verdict. It is a way to make the account decision more honest.&lt;/p&gt;
&lt;p&gt;Some traffic should pass. Some should be logged. Some should be rate limited. Some should be challenged. Some should be blocked. The difference should come from route sensitivity, request context, and observed behaviour, not from a single IP label.&lt;/p&gt;
&lt;p&gt;A practical policy might look like this:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Monitor proxy use across all account and API routes.&lt;/li&gt;
&lt;li&gt;Apply tighter thresholds on login, reset, token, and account-change routes.&lt;/li&gt;
&lt;li&gt;Combine proxy use with credential, client, rate, and behaviour signals.&lt;/li&gt;
&lt;li&gt;Preserve decision records so security and support can explain what happened.&lt;/li&gt;
&lt;li&gt;Move from monitor to enforce only after reviewing false positives and customer impact.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That model gives teams a way to respond to residential proxy abuse without turning every shared residential network into a casualty.&lt;/p&gt;
&lt;p&gt;For a grounding definition, see &lt;a href="/learning/threat-detection/what-is-residential-proxy-detection/"&gt;What is Residential Proxy Detection?&lt;/a&gt;. For the product control, see &lt;a href="/products/residential-proxy-detection/"&gt;Residential Proxy Detection&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The important shift is simple: residential proxies are not just a network category. In account and API protection, they are context for deciding how much trust a request deserves.&lt;/p&gt;</content><category term="API Security"></category><category term="API Security"></category><category term="Account Protection"></category><category term="Residential Proxies"></category><category term="Bot Management"></category><category term="Rate Limiting"></category><category term="Threat Detection"></category></entry><entry><title>Shadow APIs Are Account-Abuse Paths</title><link href="https://www.peakhour.io/blog/shadow-apis-account-abuse/" rel="alternate"></link><published>2026-06-19T00:00:00+10:00</published><updated>2026-06-19T00:00:00+10:00</updated><author><name>AC</name></author><id>tag:www.peakhour.io,2026-06-19:/blog/shadow-apis-account-abuse/</id><summary type="html">&lt;p&gt;Shadow APIs matter because attackers do not care whether a route is documented. Mobile, partner, browser-backed, and legacy APIs can all become account-abuse paths when they remain outside normal controls.&lt;/p&gt;</summary><content type="html">&lt;p&gt;A shadow API is not dangerous because it has a mysterious name. It is dangerous because it still accepts requests.&lt;/p&gt;
&lt;p&gt;If an endpoint can reset a password, refresh a token, check an account, change a delivery address, apply a discount, validate a stored payment method, or expose customer data, it is part of the account-abuse surface. Whether it appears in the current OpenAPI file is secondary.&lt;/p&gt;
&lt;p&gt;Attackers do not need your API catalogue to be tidy. They need one working route that your normal controls do not understand.&lt;/p&gt;
&lt;h2&gt;The Forgotten Paths Are Often Real Paths&lt;/h2&gt;
&lt;p&gt;Most organisations have more API surface than they think.&lt;/p&gt;
&lt;p&gt;Mobile apps leave behind old versions. Partner integrations get built for a campaign and then stay online. Browser-backed APIs are treated as internal because they are called by the front end, even though anyone can inspect and replay the requests. Legacy account endpoints remain active because turning them off might break an unknown client.&lt;/p&gt;
&lt;p&gt;None of this is unusual. It is how real systems evolve.&lt;/p&gt;
&lt;p&gt;The risk appears when those routes keep accepting production traffic without the same security treatment as the visible application. A current login page may have bot detection, adaptive prompts, and tuned rate limits. An older mobile endpoint may only check whether the credentials are valid. A partner route may trust an API key that has not been rotated. A browser API may return more account state than the front end displays.&lt;/p&gt;
&lt;p&gt;That gap is where account abuse gets practical.&lt;/p&gt;
&lt;h2&gt;Unknown Does Not Mean Unused&lt;/h2&gt;
&lt;p&gt;Security teams sometimes talk about discovery as if the main outcome is a cleaner inventory. Inventory matters, but the more useful question is: what can this route do?&lt;/p&gt;
&lt;p&gt;A shadow API that serves public catalogue data has one risk profile. A shadow API that changes account details has another. A forgotten token endpoint is different again. A mobile route that accepts username and password combinations is a credential stuffing target, even if the public login page has already been hardened.&lt;/p&gt;
&lt;p&gt;This is why &lt;a href="/products/api-security/"&gt;API security&lt;/a&gt; has to stay connected to account context. Route discovery is only the start. The protection model needs to know method, schema, authentication state, response pattern, user journey, and business sensitivity.&lt;/p&gt;
&lt;p&gt;A &lt;code&gt;POST&lt;/code&gt; request to an account recovery endpoint deserves different treatment from a &lt;code&gt;GET&lt;/code&gt; request to a static content API. A password reset route used by a first-seen client through rotating proxy infrastructure is not the same as the same route used by a known customer session.&lt;/p&gt;
&lt;p&gt;The route matters because the account outcome matters.&lt;/p&gt;
&lt;h2&gt;Browser-Backed APIs Are Still APIs&lt;/h2&gt;
&lt;p&gt;A common blind spot is the API behind the web application.&lt;/p&gt;
&lt;p&gt;The front end might make a neat request to &lt;code&gt;/api/account/profile&lt;/code&gt;, &lt;code&gt;/api/cart/apply-coupon&lt;/code&gt;, or &lt;code&gt;/api/session/refresh&lt;/code&gt;. Because the route was designed for the browser, teams may assume the browser is the control. It is not.&lt;/p&gt;
&lt;p&gt;Requests can be replayed outside the page. Headers can be copied. Tokens can be stolen. User agents can be faked. Automation can follow the same sequence as the application, only faster and at scale.&lt;/p&gt;
&lt;p&gt;The right response is not to treat every browser-backed API as hostile. The right response is to attach evidence. Is this a known browser session? Is the TLS and HTTP behaviour consistent? Is the request sequence normal for the journey? Is the session suddenly moving from login to sensitive account changes? Does the schema match what the route expects?&lt;/p&gt;
&lt;p&gt;Those questions sit between basic definitions of &lt;a href="/learning/application-security/what-is-api-security/"&gt;what API security is&lt;/a&gt; and the operational work of stopping abuse.&lt;/p&gt;
&lt;h2&gt;Mobile and Partner APIs Need Ownership&lt;/h2&gt;
&lt;p&gt;Mobile and partner APIs create a slightly different problem. They often have legitimate non-browser clients, so crude controls can break real use.&lt;/p&gt;
&lt;p&gt;A mobile app may have older versions in the field. A partner may send traffic from fixed infrastructure, or from changing cloud infrastructure. A service client may authenticate with an API key rather than an interactive user session. Some requests will look less browser-like because they are not meant to be browsers.&lt;/p&gt;
&lt;p&gt;That makes ownership important.&lt;/p&gt;
&lt;p&gt;Each route should have an owner, expected clients, authentication model, rate expectation, schema expectation, and deprecation plan. API keys should be treated as credentials, not configuration strings. OAuth and JWT use should include short-lived access, appropriate scopes, and validation at the endpoint. Legacy flows should not survive indefinitely just because nobody is sure what they support.&lt;/p&gt;
&lt;p&gt;For REST services, that discipline includes the basics covered in &lt;a href="/learning/api-protection/what-is-rest-api-security/"&gt;REST API security&lt;/a&gt;: method control, status-code handling, input validation, token handling, rate limiting, and useful logging. The account-abuse angle is narrower and more operational: which of these controls tells us whether this request can harm a customer account?&lt;/p&gt;
&lt;h2&gt;Discovery Has to Feed Enforcement&lt;/h2&gt;
&lt;p&gt;A report listing unknown endpoints is useful for a week. A discovery process that feeds policy is useful every day.&lt;/p&gt;
&lt;p&gt;When a new route appears, the security question should be concrete:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Who owns it?&lt;/li&gt;
&lt;li&gt;Is it authenticated?&lt;/li&gt;
&lt;li&gt;Does it match a known schema?&lt;/li&gt;
&lt;li&gt;Does it touch account state?&lt;/li&gt;
&lt;li&gt;Can it reset trust, change value, or expose customer data?&lt;/li&gt;
&lt;li&gt;What rate and behaviour patterns are normal?&lt;/li&gt;
&lt;li&gt;Which action should apply when it is abused?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That is where &lt;a href="/solutions/use-case/api-security/"&gt;API protection use cases&lt;/a&gt; become more than documentation. The goal is not to produce a perfect catalogue for its own sake. The goal is to reduce the number of unknown request paths that can be used for account abuse.&lt;/p&gt;
&lt;p&gt;Shadow APIs are not a separate class of attack. They are normal APIs without enough operational visibility.&lt;/p&gt;
&lt;p&gt;And when they sit on account journeys, they become a direct path from unknown surface to customer harm.&lt;/p&gt;</content><category term="API Security"></category><category term="API Security"></category><category term="Shadow APIs"></category><category term="Account Protection"></category><category term="Bot Management"></category><category term="Threat Detection"></category><category term="DevSecOps"></category></entry><entry><title>Price Transparency Is Now a Data Access Problem</title><link href="https://www.peakhour.io/blog/price-transparency-apis-grey-zone-automation/" rel="alternate"></link><published>2026-05-18T00:00:00+10:00</published><updated>2026-05-18T00:00:00+10:00</updated><author><name>AC</name></author><id>tag:www.peakhour.io,2026-05-18:/blog/price-transparency-apis-grey-zone-automation/</id><summary type="html">&lt;p&gt;Price comparison increasingly depends on current web and API data. Retailers need bot and API controls that can distinguish intended automated access from uncontrolled extraction.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Australia's supermarket pricing debate can look like a consumer pricing story.&lt;/p&gt;
&lt;p&gt;For digital teams, it is also a bot and API protection story.&lt;/p&gt;
&lt;p&gt;The &lt;a href="https://www.accc.gov.au/media-release/accc-recommends-supermarket-reforms-to-provide-better-outcomes-for-consumers-and-suppliers"&gt;ACCC's final supermarket inquiry&lt;/a&gt; recommended that ALDI, Coles, and Woolworths publish prices on their websites. It also recommended that Coles and Woolworths make dynamic price APIs available for third-party comparison tools.&lt;/p&gt;
&lt;p&gt;Then, on 18 May 2026, &lt;a href="https://www.theguardian.com/business/2026/may/18/toothbrushes-ice-cream-and-frozen-pizza-data-reveals-how-coles-and-woolworths-switch-promotions-in-sync"&gt;Guardian Australia reported&lt;/a&gt; on CW Scanner data about Coles and Woolworths promotion patterns. For digital teams, the operational detail is this: the report said CW Scanner's operator stated the service was not scraping, and instead used the supermarkets' website application programming interfaces.&lt;/p&gt;
&lt;p&gt;That does not settle questions about permission, terms of use, supermarket approval, or the status of any specific API. It does make the practical problem sharper.&lt;/p&gt;
&lt;p&gt;Price transparency increasingly depends on automated access to current data.&lt;/p&gt;
&lt;p&gt;Every automated request still needs a decision.&lt;/p&gt;
&lt;h2&gt;APIs do not remove the bot problem&lt;/h2&gt;
&lt;p&gt;It is tempting to treat an API as the clean alternative to scraping. Sometimes it is cleaner. A documented API can make access more predictable, auditable, and easier to govern than repeated extraction from product pages.&lt;/p&gt;
&lt;p&gt;But an API is still an automation surface.&lt;/p&gt;
&lt;p&gt;The same retailer or marketplace may need to support:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;public product pages;&lt;/li&gt;
&lt;li&gt;price, promotion, search, listing, catalogue, and inventory routes;&lt;/li&gt;
&lt;li&gt;browser-backed application calls;&lt;/li&gt;
&lt;li&gt;documented APIs and partner feeds;&lt;/li&gt;
&lt;li&gt;comparison tools and public-interest services;&lt;/li&gt;
&lt;li&gt;search engines, monitoring systems, and accessibility tooling;&lt;/li&gt;
&lt;li&gt;unknown collectors rebuilding price, inventory, availability, or ticketing datasets outside the intended access model.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Some of that traffic is useful. Some is commercially necessary. Some is abusive. Much of it will not identify itself honestly.&lt;/p&gt;
&lt;p&gt;So the question is not "should bots be blocked?"&lt;/p&gt;
&lt;p&gt;The question is: can you tell intended automated access from uncontrolled extraction?&lt;/p&gt;
&lt;h2&gt;The decision needs evidence&lt;/h2&gt;
&lt;p&gt;A blanket "block all automation" position can break comparison services, partner integrations, search visibility, monitoring, accessibility tooling, and APIs that were built to be automated.&lt;/p&gt;
&lt;p&gt;A blanket "allow everything" position can expose pricing, product, inventory, account, checkout, ticketing, and API paths to extraction and abuse.&lt;/p&gt;
&lt;p&gt;The practical middle ground is governed automation:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;publish the access you want to support;&lt;/li&gt;
&lt;li&gt;recognise the clients and behaviours you expect;&lt;/li&gt;
&lt;li&gt;validate API route, schema, method, authentication, and client context;&lt;/li&gt;
&lt;li&gt;detect traffic that has drifted from the intended use;&lt;/li&gt;
&lt;li&gt;keep decision logs so security, legal, product, and commercial teams can review what happened;&lt;/li&gt;
&lt;li&gt;respond proportionately with allow, log, rate-limit, challenge, block, or review decisions.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That is where bot protection becomes more than a yes-or-no control.&lt;/p&gt;
&lt;p&gt;It supplies the evidence behind each access decision.&lt;/p&gt;
&lt;h2&gt;Where Peakhour fits&lt;/h2&gt;
&lt;p&gt;&lt;a href="/solutions/use-case/prevent-site-scraping/"&gt;Scraping protection&lt;/a&gt; should identify repeated extraction across product, price, search, listing, catalogue, article, inventory, and availability routes. The goal is not to stop every non-human request. It is to separate expected access from collectors rebuilding data outside the site's control.&lt;/p&gt;
&lt;p&gt;&lt;a href="/solutions/use-case/api-bot-protection/"&gt;API bot protection&lt;/a&gt; applies the same discipline to automated API clients. APIs exist to be automated. The risk comes from unknown clients, unexpected route combinations, credential abuse, endpoint enumeration, excessive request volume, and business-logic abuse that generic perimeter controls cannot explain.&lt;/p&gt;
&lt;p&gt;&lt;a href="/products/bot-management/"&gt;Bot management&lt;/a&gt; turns request evidence into a decision: allow trusted traffic, log expected automated access, rate-limit noisy collectors, challenge uncertain sessions, block confirmed abuse, or send edge cases to review.&lt;/p&gt;
&lt;p&gt;&lt;a href="/solutions/use-case/verified-browser-trust/"&gt;Verified browser trust&lt;/a&gt; adds a useful signal when browser-backed journeys are being automated or replayed. Headers and cookies can be copied, proxy networks can rotate, and automation can mimic ordinary navigation. Peakhour can challenge the browser path, verify that the expected evidence came back, and attach that witness to the wider decision record.&lt;/p&gt;
&lt;p&gt;That browser signal does not, by itself, prove the user, device, or account is trustworthy. It helps the risk engine decide what to do alongside route, proxy, device, behaviour, credential, and API context.&lt;/p&gt;
&lt;h2&gt;Why this matters beyond supermarkets&lt;/h2&gt;
&lt;p&gt;The ACCC's 2024 proceedings against Coles and Woolworths were about alleged false or misleading price statements, not supermarket price regulation, collusion, or anti-competitive conduct. The &lt;a href="https://www.accc.gov.au/media-release/court-finds-that-coles-misled-customers-over-down-down-claims"&gt;ACCC announced on 14 May 2026&lt;/a&gt; that the Federal Court found Coles made false or misleading representations in 13 of 14 agreed sample "Down Down" tickets, with penalties and other orders still to be determined. For Woolworths, the separate "Prices Dropped" proceeding was awaiting judgment at publication.&lt;/p&gt;
&lt;p&gt;Those legal details matter, but they are not the Peakhour point.&lt;/p&gt;
&lt;p&gt;The Peakhour point is operational: when transparency, comparison, availability, or fairness depends on current digital data, organisations need a control plane that can support the access they intend and limit the extraction they do not.&lt;/p&gt;
&lt;p&gt;That pattern shows up in retail, marketplaces, ticketing, travel, financial services, media, and any platform where public pages, browser-backed calls, and APIs expose commercially valuable data. It also shows up in adjacent problems like account abuse, checkout abuse, ticket scalping, product scraping, distorted analytics, and inventory harvesting.&lt;/p&gt;
&lt;p&gt;The organisations that handle this well will not treat every automated request as the same.&lt;/p&gt;
&lt;p&gt;They will be the ones that know what access they intend to allow, what behaviour they intend to stop, and why.&lt;/p&gt;</content><category term="API Security"></category><category term="API Security"></category><category term="Bot Management"></category><category term="Scraping Protection"></category><category term="Price Transparency"></category><category term="Automation"></category><category term="E-commerce"></category></entry><entry><title>Cloudflare outage proves Plan B depends on controlling DNS</title><link href="https://www.peakhour.io/blog/cloudflare-outage-dns-plan-b/" rel="alternate"></link><published>2025-11-18T21:00:00+11:00</published><updated>2025-11-18T21:00:00+11:00</updated><author><name>Dan</name></author><id>tag:www.peakhour.io,2025-11-18:/blog/cloudflare-outage-dns-plan-b/</id><summary type="html">&lt;p&gt;Tuesday’s Cloudflare incident reminded everyone that you can’t execute a Plan B if your DNS knobs are trapped behind the provider that’s failing. Here’s how Peakhour runs a detect-decide-divert playbook without touching your existing third-party DNS vendors.&lt;/p&gt;</summary><content type="html">&lt;p&gt;On Tuesday, 18 November 2025, Cloudflare’s own status page marked every major service—CDN, Firewall, WARP, Workers, and the dashboard—as degraded for most of the day while engineers worked through an internal control-plane failure. The timeline moved from “Investigating” at 11:48 UTC to “Monitoring” after 14:42 UTC, and the incident wasn’t officially resolved until 19:28 UTC. During the worst of it, Cloudflare disabled WARP in London, bot scores seesawed, and customers were told to wait while remediation continued.&lt;/p&gt;
&lt;p&gt;Waiting was the only option for many teams because their Plan B lived behind the same dashboard that was timing out. The top comment on the Hacker News thread was a set of &lt;code&gt;curl&lt;/code&gt; commands for moving domains off Cloudflare’s proxy edge. Admins were stuck in 2FA flows trying to fetch an API token, or searching for Terraform credentials so they could toggle a proxied flag. That is not a resilience strategy.&lt;/p&gt;
&lt;p&gt;We learned this lesson the hard way—and wrote about it after the 2021 Fastly outage in &lt;a href="/blog/fastly-outage-how-to-have-a-plan-b"&gt;How to have a Plan B&lt;/a&gt;. The rule still stands: the platform you are trying to leave cannot be the only place that can change where your DNS points.&lt;/p&gt;
&lt;h2&gt;Detect: understand what’s actually broken&lt;/h2&gt;
&lt;p&gt;Incidents like Tuesday’s change shape quickly. Cloudflare’s own feed showed different failure domains every 30 minutes: bot management, dashboard auth, Access, WARP. The first mile is impartial telemetry that tells you what your users feel, not what the provider thinks. At Peakhour we stream real user monitoring, synthetic checks, and control-plane health from multiple CDNs and DNS partners. That lets us distinguish “cache errors in Hong Kong” from “global auth outage” and choose the right lever.&lt;/p&gt;
&lt;h2&gt;Decide: keep DNS authority in neutral territory&lt;/h2&gt;
&lt;p&gt;When your domain delegation lives with agnostic providers—Route 53, NS1, Azure DNS, or the enterprise registrar your legal team already approved—you can make failover decisions without pleading with a failing control plane. Peakhour doesn’t replace those vendors; we orchestrate them. We set short-but-safe TTLs, keep secondary answers staged, and continuously audit API access so we can flip traffic with one signed request. The minute you outsource DNS authority to a proxy CDN, you have given up the control that makes Plan B possible.&lt;/p&gt;
&lt;h2&gt;Divert: run the playbook in minutes, not hours&lt;/h2&gt;
&lt;p&gt;A workable Plan B has three moves:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Pre-stage alternate edges.&lt;/strong&gt; Your secondary CDN, origin, or transit provider must be in sync with the active one—certificates, cache rules, WAF policies, everything. We keep them hot by replaying production configs across vendors.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Wire DNS automation.&lt;/strong&gt; We integrate with multiple third-party DNS APIs at once so we can update apex A/AAAA, flattened CNAMEs, and geo/latency rules in a single workflow. Because the automation lives off the impacted platform, we can execute even while Cloudflare’s dashboard is returning 500s.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Drill humans on the handoff.&lt;/strong&gt; Our SOC sits in Sydney and Melbourne, but we cover global hours. During an incident we line up Slack/Teams bridges with your SREs, confirm business impact, and keep execs in the loop while traffic drains to the healthy provider.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;With that in place we routinely hit sub-five-minute diversion times, including DNS propagation, because the decision, the tooling, and the people are ready before the outage hits.&lt;/p&gt;
&lt;h2&gt;What Peakhour brings to your Plan B&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Independent authority, familiar vendors.&lt;/strong&gt; We leverage multiple established DNS providers instead of locking you into ours. You keep your contracts; we bring the automation and guardrails.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Unified multi-CDN config.&lt;/strong&gt; Cache rules, image optimisation, WAF, and routing policies stay aligned across providers so you don’t lose capabilities when you switch.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Real drills, not just runbooks.&lt;/strong&gt; Quarterly failover exercises prove that certificates, APIs, and humans are ready. We share the post-mortems so your execs see clear RTO/RPO numbers.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;People you can phone.&lt;/strong&gt; 24×7 Australian-based engineers who know your stack and can execute the play while your own team communicates with customers.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Book a resilience review&lt;/h2&gt;
&lt;p&gt;If Tuesday exposed that your failover path still depends on your primary provider’s dashboard, book a 30-minute Resilience Review with Peakhour and we’ll:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Map who really controls your DNS today.&lt;/li&gt;
&lt;li&gt;Identify the gaps between your primary and standby CDNs.&lt;/li&gt;
&lt;li&gt;Outline the automations we can layer on top of your existing DNS and hosting vendors.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The output is a concrete Plan B, a drill schedule, and a team that can execute it the next time a global provider blinks.&lt;/p&gt;</content><category term="Interest"></category><category term="CDN"></category><category term="DNS"></category><category term="Multi CDN"></category><category term="Incident Response"></category></entry><entry><title>The BOTS Act and the War on Ticket Scalping</title><link href="https://www.peakhour.io/blog/bots-act-ticketmaster-scalping/" rel="alternate"></link><published>2025-09-17T00:00:00+10:00</published><updated>2025-09-17T00:00:00+10:00</updated><author><name>AC</name></author><id>tag:www.peakhour.io,2025-09-17:/blog/bots-act-ticketmaster-scalping/</id><summary type="html">&lt;p&gt;A deep dive into the BOTS Act, how it's being used to investigate Ticketmaster, and the ongoing battle against ticket scalping bots.&lt;/p&gt;</summary><content type="html">&lt;p&gt;For popular concerts and events, tickets can disappear in seconds. Often the competition is not just other fans, but ticket scalping bots built to buy faster than a human can, then push those tickets into secondary markets at heavily inflated prices. The United States introduced the Better Online Ticket Sales (BOTS) Act to address that conduct. Whether it is working is less clear. Recent investigations into Ticketmaster suggest enforcement is still catching up.&lt;/p&gt;
&lt;h2&gt;Understanding the BOTS Act&lt;/h2&gt;
&lt;p&gt;Enacted in 2016, the Better Online Ticket Sales (BOTS) Act is a U.S. federal law aimed at giving consumers a fairer chance when buying tickets online. The law makes it illegal to use software, or "bots," to bypass security measures on ticket-selling websites.&lt;/p&gt;
&lt;p&gt;Specifically, the BOTS Act prohibits:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Circumventing a security measure, access control system, or other technological control used by a ticket issuer to enforce purchasing limits.&lt;/li&gt;
&lt;li&gt;Using a bot to purchase tickets in excess of posted limits.&lt;/li&gt;
&lt;li&gt;Selling tickets that were acquired in violation of these rules, if the seller knew or should have known they were obtained illegally.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The aim was to stop scalpers using automated tools to buy tickets in bulk, so fans had a fairer chance of purchasing tickets at face value.&lt;/p&gt;
&lt;h2&gt;Australia's Approach&lt;/h2&gt;
&lt;p&gt;Ticket scalping bots are not only a U.S. problem. Other countries have also used legislation to protect consumers. In Australia, the state of New South Wales (NSW) became the first to outlaw ticket bots in 2017.&lt;/p&gt;
&lt;p&gt;The legislation introduced heavy penalties, with fines up to $110,000 for corporations using bots to snap up tickets. The law also went further than the US BOTS Act by capping ticket resale prices at no more than 10% above the original price. At the time, a representative from TEG, the owner of Australia's largest ticket seller Ticketek, stated that bots accounted for up to 70% of activity on their website, showing how widespread the problem had become.&lt;/p&gt;
&lt;h2&gt;Ticketmaster Under the Microscope&lt;/h2&gt;
&lt;p&gt;Despite the BOTS Act being in place for years, ticket scalping persists. U.S. regulators have now turned their attention to the platforms themselves. In September 2025, &lt;a href="https://www.bloomberg.com/news/articles/2025-09-15/ftc-probes-whether-ticketmaster-does-enough-to-stop-resale-bots"&gt;reports emerged&lt;/a&gt; that the U.S. Federal Trade Commission (FTC) was investigating whether Ticketmaster, a subsidiary of Live Nation, was doing enough to comply with the BOTS Act.&lt;/p&gt;
&lt;p&gt;The probe is reportedly examining whether the ticket seller has a financial incentive to allow resellers to circumvent its own rules. Ticketmaster denies wrongdoing and claims to block hundreds of millions of bots daily, but the investigation raises a direct question: are ticket platforms motivated to eliminate a secondary market from which they can also profit?&lt;/p&gt;
&lt;p&gt;If the FTC pursues a case and finds Ticketmaster in violation, the penalties could be substantial. The law allows for fines of up to $53,000 per violation, which could translate to &lt;a href="https://www.investing.com/news/stock-market-news/live-nation-falls-after-report-says-ftc-probes-ticketmaster-over-ticket-bot-controls-93CH-4239502"&gt;billions of dollars in penalties&lt;/a&gt; and put the rest of the industry on notice.&lt;/p&gt;
&lt;h2&gt;Renewed Political Pressure&lt;/h2&gt;
&lt;p&gt;Ticket scalping has also drawn direct political attention. In March 2025, &lt;a href="https://www.ftc.gov/business-guidance/blog/2025/04/bots-act-compliance-time-refresher"&gt;President Donald Trump signed an executive order&lt;/a&gt; aimed at cracking down on ticket scalpers and price-gouging practices. The order specifically calls on the FTC to increase its enforcement of the BOTS Act, a piece of legislation that, despite being law since 2016, has been used to prosecute offenders only once.&lt;/p&gt;
&lt;p&gt;The executive order also pushes for greater price transparency throughout the ticket-buying process and calls for investigations into unfair and anti-competitive practices in the secondary market. This follows similar efforts from the Biden administration, which had focused on eliminating "junk fees" and promoting all-in pricing. The bipartisan pressure points to a growing consensus that the current state of the ticketing industry is failing consumers.&lt;/p&gt;
&lt;p&gt;The order received broad support from across the industry, with &lt;a href="https://www.axios.com/local/new-orleans/2025/04/10/scalper-bot-crackdown-ticketmaster"&gt;Live Nation, StubHub, and the National Independent Venue Association (NIVA)&lt;/a&gt; all voicing their approval. That support reflects a clear industry position: stronger enforcement of existing laws like the BOTS Act is a necessary step in protecting fans from scalpers.&lt;/p&gt;
&lt;h2&gt;Fighting on Two Fronts&lt;/h2&gt;
&lt;p&gt;While regulators are questioning Ticketmaster's efforts, the company has also used legal channels to fight bot operators. A notable case involved Prestige Entertainment, a ticket broker that Ticketmaster accused of using sophisticated bots to buy large quantities of tickets for resale.&lt;/p&gt;
&lt;p&gt;In that lawsuit, Ticketmaster alleged that Prestige used bots and dummy accounts to bypass security measures like CAPTCHAs and purchase limits. The case produced some interesting legal arguments, including a novel copyright claim. Ticketmaster argued that in order to develop the bots, the software creators must have illegally copied code from Ticketmaster's website and app.&lt;/p&gt;
&lt;p&gt;The legal battle ended in a settlement in 2019, with Prestige Entertainment permanently banned from using bots on Ticketmaster's platforms. The case shows that while Ticketmaster is under scrutiny itself, it has also pursued those who exploit its system. That leaves Ticketmaster fighting on two fronts: against bot operators, and now against regulators questioning whether its own enforcement is strong enough.&lt;/p&gt;
&lt;h2&gt;An Endless Cat and Mouse Game&lt;/h2&gt;
&lt;p&gt;The ticketing industry is locked in a constant technical arms race. As platforms like Ticketmaster develop more sophisticated security measures, bot creators find new ways to circumvent them. They use tools like &lt;a href="/blog/bots-residential-proxies-anti-detect-browsers/"&gt;residential proxies&lt;/a&gt; to mimic human users and distribute their attacks across thousands of IP addresses, making them difficult to detect.&lt;/p&gt;
&lt;p&gt;Ticketmaster states it &lt;a href="https://completemusicupdate.com/is-ticketmaster-doing-enough-to-stop-touts-a-new-ftc-investigation-looks-at-ticketing-giants-bots-act-compliance/"&gt;blocks 200 million bots a day&lt;/a&gt;, a fivefold increase from 2019. That figure shows the scale of the problem. The financial incentive for scalpers is large, and they are willing to invest heavily in technology to stay ahead.&lt;/p&gt;
&lt;p&gt;For consumers, this means sold-out events and high resale prices are likely to continue. The BOTS Act provides a legal framework to punish offenders, but its effectiveness depends on enforcement and cooperation from major players like Ticketmaster. The current FTC investigation may show how much practical force the law has.&lt;/p&gt;</content><category term="Bots"></category><category term="Bot Management"></category><category term="Ticket Scalping"></category><category term="BOTS Act"></category><category term="Legal"></category></entry><entry><title>Agentic AI vs. Your API</title><link href="https://www.peakhour.io/blog/agentic-ai-vs-your-api/" rel="alternate"></link><published>2025-09-01T00:00:00+10:00</published><updated>2025-09-01T00:00:00+10:00</updated><author><name>AC</name></author><id>tag:www.peakhour.io,2025-09-01:/blog/agentic-ai-vs-your-api/</id><summary type="html">&lt;p&gt;Understand the shift from scripted bots to reasoning AI agents and how to adapt your security strategy for this new reality.&lt;/p&gt;</summary><content type="html">&lt;p&gt;For years, "bots" mostly meant simple, scripted programs. They followed rigid, predefined rules: if you see X, do Y. They were predictable. They could still do damage in attacks like credential stuffing, but their lack of intelligence made them relatively easy to detect. Their patterns were repetitive and clearly different from the complex, often messy, behaviour of human users.&lt;/p&gt;
&lt;p&gt;That model is no longer reliable. The emergence of open and powerful reasoning models like &lt;a href="/blog/agentic-ai-deepseek-changes-everything/"&gt;DeepSeek&lt;/a&gt; has given rise to a new class of automation: &lt;strong&gt;agentic AI&lt;/strong&gt;. These are not just scripts. They are autonomous agents that can reason, plan, and adapt their behaviour in real time. They don't need a human to write a script for every possibility. Give them a goal and they can work out the steps themselves. That changes the nature of automated threats, and security controls need to change with it.&lt;/p&gt;
&lt;h2&gt;The New API Consumer&lt;/h2&gt;
&lt;p&gt;Historically, APIs were consumed by two main groups: human users via a front-end application, and scripted bots following predictable patterns. Agentic AI introduces a third consumer, and one likely to become dominant. These AI agents are becoming primary users of web APIs, and they interact with them in materially different ways.&lt;/p&gt;
&lt;p&gt;An AI agent can analyse an entire API surface in seconds, understand the relationships between different endpoints, and generate complex interaction patterns that a human developer would rarely attempt. They don't just follow a linear path; they can explore, learn, and optimise their interactions to achieve their goals, whether that's finding the best price on a product, gathering data, or probing for security weaknesses.&lt;/p&gt;
&lt;h2&gt;New Security Challenges: The Self-Hacking AI&lt;/h2&gt;
&lt;p&gt;The reasoning capabilities of these agents introduce security challenges that static, rule-based systems are poorly equipped to handle. An agentic AI doesn't just throw known exploits at a system; it can probe its defences and invent new attacks as it goes.&lt;/p&gt;
&lt;p&gt;Consider a traditional Web Application Firewall (WAF) that relies on pattern-matching rules to block threats like SQL injection. An AI agent can send a series of carefully crafted requests, observe the WAF's responses, and systematically learn the structure of its rules. Once it understands the patterns the WAF is looking for, it can &lt;a href="/blog/ai-agents-custom-exploits/"&gt;generate a custom exploit&lt;/a&gt; designed to bypass those rules while still achieving its malicious objective.&lt;/p&gt;
&lt;p&gt;This isn't theoretical. Security teams are already reporting sophisticated attacks that adapt in real time, adjusting their tactics based on the system's defensive responses. These aren't simply pre-programmed behaviours; they are reasoning models at work.&lt;/p&gt;
&lt;h2&gt;A New Security Paradigm: From "Block Bots" to "Manage Agents"&lt;/h2&gt;
&lt;p&gt;The rise of agentic AI changes the security question. The old goal of "blocking all bots" is no longer viable or even desirable. AI agents will be used for both benign and malicious purposes. A customer's personal AI assistant booking a flight is useful automation; an attacker's AI agent trying to find vulnerabilities is not.&lt;/p&gt;
&lt;p&gt;Bot management cannot stop at trying to keep automation out. It needs the intelligence to &lt;strong&gt;safely identify and manage AI agents&lt;/strong&gt;. This requires moving away from static, signature-based detection and toward a more contextual, behavioural approach.&lt;/p&gt;
&lt;p&gt;The key questions will no longer be "Is this a human or a bot?" but rather:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;"What is the &lt;strong&gt;intent&lt;/strong&gt; of this automated agent?"&lt;/li&gt;
&lt;li&gt;"Is its behaviour consistent with a legitimate use case?"&lt;/li&gt;
&lt;li&gt;"Can we trust this agent?"&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This requires a new generation of security tools that can understand and adapt to agent behaviour, distinguishing between the legitimate AI assistants that will soon be a core part of our digital lives and the malicious ones that seek to exploit our systems. Organisations that fail to prepare for this shift risk having their defences systematically tested, mapped, and bypassed by the next wave of intelligent, automated threats.&lt;/p&gt;</content><category term="AI"></category><category term="Bot Management"></category><category term="API Security"></category><category term="Threat Detection"></category><category term="DevSecOps"></category><category term="Machine Learning"></category><category term="Credential Stuffing"></category></entry><entry><title>Anatomy of a Credential Stuffing Attack</title><link href="https://www.peakhour.io/blog/anatomy-of-a-credential-stuffing-attack/" rel="alternate"></link><published>2025-09-01T00:00:00+10:00</published><updated>2025-09-01T00:00:00+10:00</updated><author><name>AC</name></author><id>tag:www.peakhour.io,2025-09-01:/blog/anatomy-of-a-credential-stuffing-attack/</id><summary type="html">&lt;p&gt;A deep dive into how credential stuffing attacks work, the tools used, and how to build a multi-layered defense.&lt;/p&gt;</summary><content type="html">&lt;p&gt;In early 2024, major Australian retailer &lt;a href="/blog/account-takeover-fraud-theiconic/"&gt;The Iconic&lt;/a&gt; was hit by a widespread account takeover attack. Fraudsters used stolen credentials to log into customer accounts, place orders with stored credit cards, and ship goods to different locations. The incident caused significant reputational damage and financial loss, forcing the company to issue refunds and publicly address the security breach.&lt;/p&gt;
&lt;p&gt;This attack wasn't the result of a direct hack on The Iconic's systems. It was a classic case of &lt;strong&gt;&lt;a href="/blog/credential-stuffing-business-impact/"&gt;credential stuffing&lt;/a&gt;&lt;/strong&gt;: an automated attack that works because people reuse passwords across services. This article breaks down how credential stuffing works, the attacker's toolkit, the business impact, and the controls that make it harder to run at scale.&lt;/p&gt;
&lt;h2&gt;What is Credential Stuffing?&lt;/h2&gt;
&lt;p&gt;Credential stuffing is an automated attack where malicious actors use lists of stolen usernames and passwords—often obtained from third-party data breaches—to gain unauthorised access to user accounts on other websites. The attack works because many users recycle the same password across multiple online services. If a password for a user's social media account is leaked, attackers will "stuff" that same email and password combination into the login forms of e-commerce sites, banking portals, and other high-value targets.&lt;/p&gt;
&lt;p&gt;Because attackers submit valid credentials, even though they are stolen, these login attempts can be difficult to distinguish from genuine user activity. That makes credential stuffing harder for traditional security controls to spot.&lt;/p&gt;
&lt;h2&gt;The Attacker's Toolkit&lt;/h2&gt;
&lt;p&gt;Modern credential stuffing is not a manual process. Attackers use a mature set of tools and resources to automate and scale their campaigns:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Automation Software&lt;/strong&gt;: Tools like &lt;a href="/blog/the-rise-of-openbullet/"&gt;OpenBullet&lt;/a&gt; are central to these attacks. OpenBullet is a powerful, open-source web testing suite that allows even non-programmers to create complex attack scripts. Attackers can find or create "configs" that tell the software exactly how to interact with a target website's login form.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Breached Credential Lists&lt;/strong&gt;: Dark web markets carry massive databases of usernames and passwords harvested from data breaches. These "combo lists" are the raw material for credential stuffing attacks and can be purchased for very little cost.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Proxy Networks&lt;/strong&gt;: To avoid being blocked, attackers distribute their login attempts across thousands or even millions of IP addresses. They often use residential proxy networks, which route traffic through the internet connections of real home users. This can make malicious traffic appear to come from legitimate customers, weakening IP-based blocking and rate limiting.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;The Business Impact&lt;/h2&gt;
&lt;p&gt;The consequences of a successful credential &lt;a href="/learning/bots/anatomy-of-credential-stuffing-attack/"&gt;stuffing attack&lt;/a&gt; extend beyond the login event:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Direct Financial Loss&lt;/strong&gt;: As seen with The Iconic, attackers can make fraudulent purchases, drain loyalty points, or transfer funds, leading to direct financial losses and the cost of refunding customers.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Damage to Brand Reputation&lt;/strong&gt;: Publicly reported breaches erode customer trust. Users who have been defrauded may share their negative experiences on social media, leading to lasting reputational harm.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Loss of Customer Trust&lt;/strong&gt;: When customers believe their accounts are not secure, they may abandon the platform altogether, leading to customer churn and a decline in lifetime value.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Operational Costs&lt;/strong&gt;: Responding to an attack involves significant operational overhead, including customer support time, fraud investigation, and new security measures.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Building a Multi-Layered Defense&lt;/h2&gt;
&lt;p&gt;Stopping automated attacks requires a defence strategy that goes beyond simple password policies. A modern, multi-layered approach should include:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Advanced Bot Protection&lt;/strong&gt;: The first step is to distinguish bots from humans. Modern &lt;a href="/products/bot-management/"&gt;bot management&lt;/a&gt; uses techniques like network and browser fingerprinting, proxy context, route behaviour, and behavioural analysis to detect automated login attempts, even when they mimic human behaviour.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Check Credentials Against Breach Databases&lt;/strong&gt;: Proactively check usernames and passwords used in login attempts against comprehensive databases of known breached credentials. If a credential pair is known to be compromised, you can flag the login for additional verification or alert the user to change their password.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Advanced Rate Limiting&lt;/strong&gt;: Traditional IP-based rate limiting struggles against distributed attacks. Advanced rate limiting groups requests by more stable identifiers, such as a TLS fingerprint, which can remain consistent even as an attacker rotates through thousands of IP addresses. This helps track and block a single malicious actor launching a distributed attack.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Enforce Multi-Factor Authentication (MFA)&lt;/strong&gt;: MFA is not a silver bullet, but it provides a critical layer of security by requiring a second form of verification. Websites should strongly encourage or enforce MFA, especially for sensitive actions like changing account details or making purchases.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;For production teams, the useful bot-management view ties those controls together on the login path. Credential exposure, residential proxy evidence, fingerprints, request rate, response codes, and session changes should feed one decision about whether to allow, challenge, rate limit, block, or review the attempt.&lt;/p&gt;
&lt;p&gt;By combining these controls, organisations can make credential stuffing harder to scale, protect user accounts, and reduce the business risk when attackers test stolen credentials.&lt;/p&gt;</content><category term="Security"></category><category term="Credential Stuffing"></category><category term="Account Protection"></category><category term="Fraud Prevention"></category><category term="Residential Proxies"></category><category term="DNS"></category><category term="Threat Detection"></category></entry><entry><title>Beyond the IP Address</title><link href="https://www.peakhour.io/blog/beyond-the-ip-address-advanced-rate-limiting/" rel="alternate"></link><published>2025-09-01T00:00:00+10:00</published><updated>2025-09-01T00:00:00+10:00</updated><author><name>AC</name></author><id>tag:www.peakhour.io,2025-09-01:/blog/beyond-the-ip-address-advanced-rate-limiting/</id><summary type="html">&lt;p&gt;Discover why traditional IP-based rate limiting is obsolete and how advanced techniques provide robust protection against modern distributed attacks.&lt;/p&gt;</summary><content type="html">&lt;p&gt;For years, &lt;a href="/learning/api-protection/what-is-api-rate-limiting/"&gt;rate limiting&lt;/a&gt; has been a standard control for protecting websites and APIs from abuse. The basic model is simple: limit the number of requests a single "user" can make in a given period. If a user exceeds the limit (e.g., 10 login attempts in a minute), they are temporarily blocked.&lt;/p&gt;
&lt;p&gt;The hard part has always been identifying that "user". Traditionally, the answer was the IP address. The assumption was that one IP address equaled one user. In the early days of the internet, this was a reasonable approximation. Today, that assumption no longer holds, and it leaves systems exposed to modern attacks.&lt;/p&gt;
&lt;p&gt;The IP address is no longer a reliable identifier for a single user or device. There are three common reasons:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Proxy Networks&lt;/strong&gt;: Attackers don't use a single IP address. They use large residential proxy networks to rotate requests through thousands or even millions of different IP addresses, making each request look like it comes from a new user.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Shared IPs (CGNAT)&lt;/strong&gt;: At the same time, a single IP address can represent thousands of legitimate users. Mobile carriers use Carrier-Grade NAT (CGNAT) to make many mobile devices share the same public IP. Similarly, an entire office building or university campus might appear to the internet as a single IP.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Distributed Attacks&lt;/strong&gt;: Modern automated attacks, like Layer 7 DDoS or credential stuffing, are inherently distributed. Attackers use botnets or proxy networks to spread their attack across a large number of IPs, so no single IP ever exceeds a traditional rate limit.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Blocking a shared IP because of one bad actor can cause collateral damage, denying access to thousands of legitimate users. On the other side, failing to see that thousands of IPs are part of a single coordinated attack means the attack succeeds. Traditional IP-based rate limiting is no longer enough.&lt;/p&gt;
&lt;h2&gt;The New Way: Advanced Rate Limiting&lt;/h2&gt;
&lt;p&gt;Advanced Rate Limiting addresses this by moving beyond the IP address. Instead of grouping requests by a single, unreliable identifier, it lets you count requests using more stable and meaningful characteristics of the connection or the software making it.&lt;/p&gt;
&lt;p&gt;This approach groups requests using identifiers like:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;TLS/HTTP2 Fingerprints&lt;/strong&gt;: Every client application (like a browser or a script) has a unique "fingerprint" based on how it initiates a secure connection (&lt;a href="/blog/tls-fingerprinting/"&gt;TLS&lt;/a&gt;) or communicates over HTTP/2. This fingerprint remains consistent even as an attacker rotates through thousands of IP addresses. By rate limiting based on the TLS fingerprint, you can track and block the underlying automation tool itself, not just the IPs it uses.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Device Characteristics&lt;/strong&gt;: A fingerprint can be constructed from a range of attributes, including the device's operating system, browser version, and more. This allows for the detection of repeated requests coming from the same class of device.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;A Combination of Headers&lt;/strong&gt;: For authenticated APIs, you can group requests by an Authorization header or API key, enforcing fair usage and preventing abuse by a single authenticated client.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Practical Use Cases&lt;/h2&gt;
&lt;p&gt;The value of advanced rate limiting is clearest when it is applied to real-world threats:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Mitigating Distributed Credential Stuffing&lt;/strong&gt;: An attacker using a tool like &lt;a href="/blog/the-rise-of-openbullet/"&gt;OpenBullet&lt;/a&gt; launches a credential stuffing attack against your login page, rotating through thousands of residential proxy IPs. Traditional rate limiting is ineffective here. However, the OpenBullet software has a consistent TLS fingerprint. By setting a rule to limit failed login attempts per TLS fingerprint, you can detect and block the entire distributed attack, regardless of how many IPs are involved.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Protecting APIs from Abuse&lt;/strong&gt;: A partner is abusing their API key, sending far too many requests and degrading service for other users. By rate limiting based on the &lt;code&gt;Authorization&lt;/code&gt; header, you can enforce usage limits on a per-client basis, keeping access fair without affecting other users.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Stopping Content Scrapers&lt;/strong&gt;: A scraper is hammering your e-commerce site to steal pricing data. They are using a botnet to distribute the requests across hundreds of IPs. However, the scraping script has a unique combination of a user-agent and a TLS fingerprint. Advanced rate limiting can count requests based on this combined signature and block the scraper, protecting your intellectual property.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;When attackers are distributed, your defences need to see the single actor behind the many IPs. Advanced rate limiting provides that visibility and should be part of a modern application security strategy.&lt;/p&gt;</content><category term="Rate Limiting"></category><category term="Rate Limiting"></category><category term="DDoS"></category><category term="API Security"></category><category term="Residential Proxies"></category><category term="Bot Management"></category><category term="Account Protection"></category></entry><entry><title>The Invisibility Cloak</title><link href="https://www.peakhour.io/blog/bots-residential-proxies-anti-detect-browsers/" rel="alternate"></link><published>2025-09-01T00:00:00+10:00</published><updated>2026-08-03T10:30:00+10:00</updated><author><name>AC</name></author><id>tag:www.peakhour.io,2025-09-01:/blog/bots-residential-proxies-anti-detect-browsers/</id><summary type="html">&lt;p&gt;Residential proxies change the network path while anti-detect browsers change the client presentation. Detection works by finding inconsistencies across the request, not by treating either signal as identity.&lt;/p&gt;</summary><content type="html">&lt;p&gt;A bot can change its IP address without changing the browser behind the request. It can also change its reported browser profile while continuing the same account attack.&lt;/p&gt;
&lt;p&gt;Residential proxies and anti-detect browsers cover those two surfaces. The proxy moves traffic through consumer connectivity. The anti-detect browser manages the client properties exposed to the website. Used together, they make simple IP and browser rules less reliable.&lt;/p&gt;
&lt;p&gt;They do not make the operator invisible.&lt;/p&gt;
&lt;h2&gt;The Proxy Changes the Network Path&lt;/h2&gt;
&lt;p&gt;A &lt;a href="/learning/security/residential-proxy/"&gt;residential proxy&lt;/a&gt; sends a third party's traffic through a consumer or ISP connection. The destination sees the exit address rather than the operator's original network.&lt;/p&gt;
&lt;p&gt;That supply may come from an informed participant, an embedded monetisation SDK or a compromised device. The destination usually cannot see that enrolment history. It sees a request from an address that may also carry legitimate household traffic.&lt;/p&gt;
&lt;p&gt;This is why a clean IP reputation result is not enough to establish trust. A fresh exit may not yet appear in a database, while a stale label can remain after the address has returned to ordinary use.&lt;/p&gt;
&lt;h2&gt;The Browser Changes the Client Presentation&lt;/h2&gt;
&lt;p&gt;An anti-detect browser lets an operator manage browser profiles at scale. Profiles can vary user agent, operating system claims, screen properties, language, time zone, storage and rendering inputs. The aim is to make separate sessions look plausible and prevent a site grouping them as one client.&lt;/p&gt;
&lt;p&gt;That control is not absolute. Some properties can be spoofed cleanly. Others interact with the network stack, rendering environment, request sequence and account history. A profile can look plausible in isolation while disagreeing with evidence elsewhere in the session.&lt;/p&gt;
&lt;p&gt;The stable explainer is &lt;a href="/learning/residential-proxies/residential-proxies-and-anti-detect-browsers/"&gt;Residential Proxies and Anti-Detect Browsers&lt;/a&gt;. This article focuses on what their combination changes for a live application.&lt;/p&gt;
&lt;h2&gt;Look for Agreement, Not a Magic Fingerprint&lt;/h2&gt;
&lt;p&gt;No fingerprint proves that two requests came from one person or one machine. Common browsers create large cohorts, privacy controls remove information, and legitimate devices change across software updates and networks.&lt;/p&gt;
&lt;p&gt;The useful question is whether independent observations agree:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Does the TLS and HTTP behaviour fit the claimed browser family?&lt;/li&gt;
&lt;li&gt;Does the browser profile remain internally consistent across the journey?&lt;/li&gt;
&lt;li&gt;Does the same request sequence continue as the IP rotates?&lt;/li&gt;
&lt;li&gt;Are credentials, accounts, carts or API objects reused across supposedly unrelated clients?&lt;/li&gt;
&lt;li&gt;Do timing, retries and outcomes match normal use of the protected route?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Each observation has legitimate explanations. Agreement across several layers raises confidence without pretending a fingerprint is identity.&lt;/p&gt;
&lt;h2&gt;Protect the Work Being Attempted&lt;/h2&gt;
&lt;p&gt;Credential stuffing, fake registration, scraping and inventory abuse have different failure modes. Their controls should differ too.&lt;/p&gt;
&lt;p&gt;On login, correlate failures across account, credential and client cohorts instead of resetting history with every IP change. On signup, measure creation velocity and the quality of later activity. On checkout, carry session risk into promotion, payment and inventory decisions. On APIs, use credentials, operations, protocol evidence and cost; JavaScript is not required.&lt;/p&gt;
&lt;p&gt;Residential proxy detection contributes current network evidence. Browser and network fingerprinting contribute cohort and consistency evidence. Behaviour and route context decide whether the application should allow, log, challenge, rate limit, step up or block.&lt;/p&gt;
&lt;p&gt;That is the important limitation of the “invisibility cloak” metaphor. These tools can hide one surface at a time. They still have to complete work against an application that can observe the whole request sequence.&lt;/p&gt;
&lt;p&gt;Continue with &lt;a href="/learning/residential-proxies/proxy-signals-and-security-decisions/"&gt;Proxy Signals and Security Decisions&lt;/a&gt; or the route-specific guide &lt;a href="/blog/route-specific-residential-proxy-controls/"&gt;Five Routes, Five Residential Proxy Decisions&lt;/a&gt;.&lt;/p&gt;</content><category term="Security"></category><category term="Browser Fingerprinting"></category><category term="Fingerprinting"></category><category term="Residential Proxies"></category><category term="Bot Management"></category><category term="TLS Fingerprinting"></category><category term="Credential Stuffing"></category></entry><entry><title>The CAPTCHA Conundrum</title><link href="https://www.peakhour.io/blog/captcha-conundrum-frustrating-humans-easy-for-bots/" rel="alternate"></link><published>2025-09-01T00:00:00+10:00</published><updated>2025-09-01T00:00:00+10:00</updated><author><name>AC</name></author><id>tag:www.peakhour.io,2025-09-01:/blog/captcha-conundrum-frustrating-humans-easy-for-bots/</id><summary type="html">&lt;p&gt;Explore why traditional CAPTCHAs are failing both users and security, and discover modern, invisible alternatives.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Remember the distorted, wavy letters you had to decipher to prove you were not a robot? That was CAPTCHA, which stands for "Completely Automated Public Turing test to tell Computers and Humans Apart." First developed in the early 2000s, its purpose was simple: create a challenge that humans could solve, but automated scripts, or bots, would struggle with.&lt;/p&gt;
&lt;p&gt;For years, CAPTCHA was used across common web actions, from creating an account to posting a comment. But bots have improved faster than the test, while users have become less tolerant of friction. CAPTCHA now often fails in both directions: it interrupts legitimate users and can still be solved by automated campaigns.&lt;/p&gt;
&lt;h2&gt;The User Experience Problem: Killing Conversions&lt;/h2&gt;
&lt;p&gt;The biggest issue with &lt;a href="/blog/the-negative-impact-of-captchas-on-ecommerce-conversions/"&gt;visible CAPTCHAs&lt;/a&gt; is the friction they add to the user journey. Customers expect checkout, login, and form flows to be quick. Asking them to stop and solve a puzzle creates a clear point for abandonment.&lt;/p&gt;
&lt;p&gt;The data is hard to ignore:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A landmark &lt;a href="https://cs.stanford.edu/people/eroberts/cs181/projects/2010-11/CAPTCHAUsability/index.html"&gt;Stanford University study&lt;/a&gt; found that adding a CAPTCHA can &lt;strong&gt;reduce form conversions by up to 40%&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Research from bot management firm HUMAN Security revealed that &lt;strong&gt;40% of real shoppers have abandoned a purchase&lt;/strong&gt; because of CAPTCHA frustration.&lt;/li&gt;
&lt;li&gt;Other analyses have shown that simply adding a CAPTCHA can lead to a &lt;strong&gt;3.2% higher bounce rate&lt;/strong&gt; and an overall &lt;strong&gt;3-5% drop in conversions&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For an e-commerce business, losing up to 40% of potential sales at the final checkout step is not a marginal UX issue. These numbers map directly to revenue from legitimate customers who were annoyed, delayed, or unable to solve the puzzle. The impact is even worse for users with disabilities, for whom many visual CAPTCHAs are nearly impossible to complete.&lt;/p&gt;
&lt;h2&gt;The Security Problem: A Speed Bump for Bots&lt;/h2&gt;
&lt;p&gt;While CAPTCHAs frustrate legitimate users, they are often only a small obstacle for modern bots. A market exists for bypassing them at scale.&lt;/p&gt;
&lt;p&gt;Attackers now use &lt;strong&gt;automated CAPTCHA-solving services&lt;/strong&gt;, often called "CAPTCHA farms." These services use a combination of machine learning algorithms and low-wage human workers to solve CAPTCHAs in real time for a fraction of a cent per puzzle.&lt;/p&gt;
&lt;p&gt;An attacker using an automation tool like &lt;a href="/blog/the-rise-of-openbullet/"&gt;OpenBullet&lt;/a&gt; can integrate with these services via a simple API call. When the bot encounters a CAPTCHA, it sends the puzzle to the solving service and receives the solution seconds later. In many cases, these services have a &lt;strong&gt;higher success rate at solving CAPTCHAs than actual humans&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;That breaks the original CAPTCHA model. The test designed to block bots can now create a false sense of security while actively harming the experience for real users.&lt;/p&gt;
&lt;h2&gt;The Modern Alternative: Invisible Challenges&lt;/h2&gt;
&lt;p&gt;If visible CAPTCHAs are broken, what's the alternative? Modern bot management uses &lt;strong&gt;invisible challenges&lt;/strong&gt; to verify users without causing friction. Instead of actively testing the user, these systems analyse background data to distinguish humans from bots.&lt;/p&gt;
&lt;p&gt;This is achieved through a multi-layered approach:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Behavioural Analysis&lt;/strong&gt;: These systems track subtle indicators of human behaviour, like mouse movements, typing cadence, and touchscreen interactions. Bots, even sophisticated ones, struggle to mimic these patterns consistently.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Network and Browser Fingerprinting&lt;/strong&gt;: By analysing hundreds of data points from the browser and network connection, these systems can identify the tell-tale signs of automation, such as the use of data centre IPs, proxy networks, or inconsistencies in the browser fingerprint.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Machine Learning&lt;/strong&gt;: Machine learning models are trained on vast datasets of human and bot traffic. They can identify complex patterns and adapt in real time to new and evolving bot techniques.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;With this approach, most legitimate users never see a challenge at all. Their journey remains uninterrupted. Only when the system detects highly suspicious activity is a challenge presented, so security controls are applied where the risk justifies the friction. For sites that depend on checkout completion, account protection, or lead capture, that is a better trade-off than showing every user another puzzle.&lt;/p&gt;</content><category term="Bots"></category><category term="Bot Management"></category><category term="Credential Stuffing"></category><category term="Account Protection"></category></entry><entry><title>Key Considerations for Effective Bot Management</title><link href="https://www.peakhour.io/blog/key-considerations-effective-bot-management/" rel="alternate"></link><published>2025-09-01T00:00:00+10:00</published><updated>2025-09-01T00:00:00+10:00</updated><author><name>AC</name></author><id>tag:www.peakhour.io,2025-09-01:/blog/key-considerations-effective-bot-management/</id><summary type="html">&lt;p&gt;With nearly half of all internet traffic being automated, a robust bot management strategy is essential. This article explores the key considerations for effective bot detection, classification, and response in the face of evolving threats.&lt;/p&gt;</summary><content type="html">&lt;h2&gt;Introduction&lt;/h2&gt;
&lt;p&gt;Bots account for a large share of web traffic. Recent studies estimate that nearly 50% of all internet traffic is generated by automated programs. Some bots are necessary for the web to function, such as search engine crawlers, but a significant portion are malicious. These "bad bots" are used for content scraping, credential stuffing, spam, and &lt;a href="/products/ddos-protection/"&gt;DDoS attacks&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;As bot operators become more sophisticated, &lt;a href="/learning/bots/bot-management/"&gt;bot management&lt;/a&gt; needs to cover detection, classification, and response. This article outlines the main considerations for security teams protecting intellectual property, online revenue, and user accounts.&lt;/p&gt;
&lt;h2&gt;The Goal: Accurate Bot Detection and Classification&lt;/h2&gt;
&lt;p&gt;The first step in effective bot management is separating legitimate users from automated threats. Identification is not enough on its own. Security teams also need accurate classification across good, bad, and "grey" bots.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Good Bots&lt;/strong&gt;: Support normal internet operations, such as search engine crawlers (Googlebot, Bingbot) and performance monitoring bots.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="/blog/malicious-bot-threats-enterprise-application-security/"&gt;Bad Bots&lt;/a&gt;&lt;/strong&gt;: Carry out malicious activity such as content scraping, account takeover, and spamming.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Grey Bots&lt;/strong&gt;: Serve a legitimate purpose but can cause problems when they crawl too aggressively, such as SEO and marketing bots (Ahrefs, SEMrush).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Effective detection usually needs more than basic signatures. A layered approach commonly includes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Basic Protection&lt;/strong&gt;: Targets simple bots using user agent checks and IP reputation databases.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Intermediate Protection&lt;/strong&gt;: Uses JavaScript-based challenges and basic network fingerprinting, such as JA3/JA4, to detect less sophisticated bots.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Advanced Protection&lt;/strong&gt;: Combines comprehensive network fingerprinting, behavioural analysis, and machine learning to identify sophisticated bots that mimic human behaviour, use residential proxies, or rely on anti-detect browsers.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="/learning/threat-detection/what-is-ml-security/"&gt;Machine learning&lt;/a&gt; models help in this context because they can learn from changing bot strategies and inspect incoming traffic for subtle signs of automation.&lt;/p&gt;
&lt;h2&gt;The Method: Continuously Adaptive Detection and Response&lt;/h2&gt;
&lt;p&gt;Bot behaviour changes quickly. Threat actors modify tooling, traffic patterns, and infrastructure to avoid detection, so static defence rules degrade over time. Organisations need detection and response that can adapt as the attack changes.&lt;/p&gt;
&lt;p&gt;That means correlating metadata with behavioural factors in real time, then applying the right response for the risk. When a bot attempts account takeover or data scraping, an adaptive response can act immediately to reduce the impact.&lt;/p&gt;
&lt;p&gt;Effective adaptive responses include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Advanced Rate Limiting&lt;/strong&gt;: Goes beyond simple IP-based limits by grouping requests with more stable identifiers, such as TLS/HTTP2 fingerprints or device characteristics. This helps stop distributed attacks from tools like &lt;a href="/blog/the-rise-of-openbullet/"&gt;OpenBullet&lt;/a&gt; that rotate through thousands of IP addresses.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Web Application Firewalls (WAF)&lt;/strong&gt;: Provide an important first line of defence by filtering harmful &lt;a href="/learning/security/layer-7-ddos"&gt;Layer 7&lt;/a&gt; traffic based on predefined rules.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tarpitting&lt;/strong&gt;: Slows malicious connections to increase cost and resource consumption for attackers.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Challenges&lt;/strong&gt;: Traditional visible CAPTCHAs can harm user experience and are often solvable by modern bots. Invisible challenges can verify a legitimate browser environment with less friction.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Alternate Content Serving&lt;/strong&gt;: Misleads scraping bots by serving alternate or cached content with incorrect information (e.g., higher prices), making their scraped data useless.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The same response process should also feed learning loops, building a repository of bot attack patterns that can train machine learning models and improve accuracy over time.&lt;/p&gt;
&lt;h2&gt;The Expected Outcomes: A Resilient Security Posture&lt;/h2&gt;
&lt;p&gt;An adaptive bot management strategy should support several practical outcomes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Risk Mitigation&lt;/strong&gt;: Reduce potential financial losses, service disruption, and data breaches associated with malicious bot activity such as credential stuffing, ad fraud, and inventory hoarding.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Improved User Experience&lt;/strong&gt;: Keep disruption low for genuine users by using invisible challenges and behavioural analysis instead of frustrating &lt;a href="/blog/the-negative-impact-of-captchas-on-ecommerce-conversions"&gt;CAPTCHAs, which can reduce conversions by up to 40%&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Intellectual Property Protection&lt;/strong&gt;: Protect valuable content, pricing data, and other intellectual property from unauthorised scraping.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Online Revenue Security&lt;/strong&gt;: Protect online revenue streams by preventing fraud, inventory scalping, and other malicious activity that targets e-commerce platforms.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Regulatory Compliance&lt;/strong&gt;: Help organisations meet data protection and privacy regulations with a proactive bot management approach.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Conclusion: Fortifying Against Sophisticated Bots&lt;/h2&gt;
&lt;p&gt;Modern bot defence depends on accurate detection, precise classification, and adaptive response. Machine learning, comprehensive network fingerprinting, and behavioural analysis all contribute, but they work best as part of a layered control set.&lt;/p&gt;
&lt;p&gt;With that approach, security teams can better protect intellectual property, online revenue, and user accounts from sophisticated bot activity.&lt;/p&gt;</content><category term="Bots"></category><category term="Bot Management"></category><category term="Threat Detection"></category><category term="API Security"></category><category term="Residential Proxies"></category><category term="Credential Stuffing"></category><category term="Account Protection"></category></entry><entry><title>The Bot Spectrum</title><link href="https://www.peakhour.io/blog/the-bot-spectrum-good-bad-grey-bots/" rel="alternate"></link><published>2025-09-01T00:00:00+10:00</published><updated>2025-09-01T00:00:00+10:00</updated><author><name>AC</name></author><id>tag:www.peakhour.io,2025-09-01:/blog/the-bot-spectrum-good-bad-grey-bots/</id><summary type="html">&lt;p&gt;Learn to classify bots into good, bad, and grey categories and apply the right management strategy for each.&lt;/p&gt;</summary><content type="html">&lt;p&gt;The word "bot" is often used as shorthand for unwanted automation: scripts trying to break into accounts, scrape content, or overwhelm websites. A large share of internet traffic does come from &lt;a href="/learning/bots/bot-management/"&gt;bad bots&lt;/a&gt;, but automated traffic is not automatically harmful. Some bots are part of how the web is discovered, monitored, and kept usable.&lt;/p&gt;
&lt;p&gt;Effective &lt;a href="/blog/key-considerations-effective-bot-management/"&gt;bot management&lt;/a&gt; is not about blocking every automated request. It depends on accurate classification: separating good bots from bad bots, and recognising the "grey" bots that sit between them. That classification lets you apply controls that reduce risk without cutting off traffic that helps your site operate.&lt;/p&gt;
&lt;h2&gt;Good Bots: The Essential Workers of the Web&lt;/h2&gt;
&lt;p&gt;Good bots are automated programs that perform useful or necessary tasks. They are usually clear about who they are and respect the rules you set in your &lt;code&gt;robots.txt&lt;/code&gt; file. Blocking them can damage search visibility, monitoring, or other business workflows.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Examples of Good Bots:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Search Engine Crawlers&lt;/strong&gt;: Bots like Googlebot and Bingbot are the best-known good bots. They crawl and index your website's content, which is how your pages appear in search engine results. Blocking them would make your site invisible on Google.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Performance Monitoring Bots&lt;/strong&gt;: These bots are used by services to check your website's uptime and performance from different locations around the world, and to alert you if your site goes down.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Copyright Bots&lt;/strong&gt;: These bots scan the web for plagiarised content, helping to protect your intellectual property.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Management Strategy&lt;/strong&gt;: Good bots should be identified and &lt;strong&gt;allowed&lt;/strong&gt; to access your site freely. Verification techniques, such as reverse DNS lookups, can be used to confirm that a bot claiming to be Googlebot is actually coming from Google.&lt;/p&gt;
&lt;h2&gt;Bad Bots: The Malicious Actors&lt;/h2&gt;
&lt;p&gt;Bad bots are designed for malicious activity. They are a major reason bot management exists as a security function. These bots are deceptive, often hiding their identity and purpose, and they can be responsible for a wide range of costly and damaging activity.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Examples of Bad Bots:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Credential Stuffers&lt;/strong&gt;: These bots use stolen usernames and passwords to carry out account takeover attacks.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Content and Price Scrapers&lt;/strong&gt;: These bots steal your valuable content, product listings, and pricing data, often for use by competitors.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Spam Bots&lt;/strong&gt;: These bots flood comment sections, forums, and contact forms with unwanted ads or malicious links.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Denial of Service (DDoS) Bots&lt;/strong&gt;: These bots are part of a botnet used to overwhelm a website with traffic, causing it to slow down or crash.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Inventory Hoarding Bots&lt;/strong&gt;: Common in e-commerce, these bots automatically add limited-edition products to shopping carts to prevent legitimate customers from buying them, often for resale at a higher price (scalping).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Management Strategy&lt;/strong&gt;: Bad bots need to be accurately identified and &lt;strong&gt;blocked&lt;/strong&gt; as quickly as possible, ideally at the network edge before they consume your server resources.&lt;/p&gt;
&lt;h2&gt;Grey Bots: The Nuanced Category&lt;/h2&gt;
&lt;p&gt;Grey bots are not inherently malicious, but their behaviour can still cause problems. They often serve a legitimate purpose, but become an issue when they crawl too aggressively, consume excessive bandwidth or server resources, and slow the site down for real users.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Examples of Grey Bots:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Aggressive SEO Tools&lt;/strong&gt;: Bots from marketing tools like Ahrefs, SEMrush, and Majestic crawl websites to gather data for backlink analysis and competitive research. They can be useful, but their crawling can also be heavy.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Partner and Aggregator Bots&lt;/strong&gt;: These could be bots from partner companies or price comparison websites that need to access your data. The activity may be legitimate, but it still needs to be managed.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Feed Fetchers&lt;/strong&gt;: Bots that collect data for news aggregators or other applications fall into this category.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Management Strategy&lt;/strong&gt;: Grey bots require more than a simple allow or block rule. The best strategy is often to &lt;strong&gt;rate-limit&lt;/strong&gt; or &lt;strong&gt;tarpit&lt;/strong&gt; them.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Rate-Limiting&lt;/strong&gt;: This allows the bot to continue accessing your site, but slows it to a manageable level so it does not overwhelm your servers.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tarpitting&lt;/strong&gt;: This intentionally slows the connection for a specific bot, increasing the cost and time required to crawl your site and discouraging overly aggressive behaviour.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;By classifying incoming bot traffic and applying the right control for each category, organisations can block threats, manage resource consumption, and allow the useful automation the modern web depends on.&lt;/p&gt;</content><category term="Bots"></category><category term="Bot Management"></category><category term="API Security"></category><category term="Threat Detection"></category><category term="DDoS"></category><category term="Residential Proxies"></category><category term="Rate Limiting"></category></entry><entry><title>How to Use Bot Management for IAM Use Cases</title><link href="https://www.peakhour.io/blog/bot-management-for-iam-use-cases/" rel="alternate"></link><published>2025-08-20T00:00:00+10:00</published><updated>2025-08-20T00:00:00+10:00</updated><author><name>AC</name></author><id>tag:www.peakhour.io,2025-08-20:/blog/bot-management-for-iam-use-cases/</id><summary type="html">&lt;p&gt;Bots are part of account takeover, fraud, scraping, and other abuse. Identity and access management leaders need a clear business case for bot management, or their organisations face avoidable account takeover losses and will be less prepared for the risks introduced when customers use AI agents.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Automated attacks against identity and access management (IAM) systems are now a routine account protection problem. Malicious bots drive account takeovers (ATO), credential stuffing, brute-force login attempts, and fake account creation. As these attacks adapt, traditional IAM controls such as password policies and even multi-factor authentication (MFA) are not enough on their own.&lt;/p&gt;
&lt;p&gt;Identity and access management leaders should treat &lt;a href="/products/bot-management/"&gt;bot management&lt;/a&gt; as part of the IAM control set, not a separate website security add-on. A dedicated capability helps reduce avoidable financial and reputational losses from account compromise. It also gives organisations a way to manage the risks created as AI agents become regular users of web applications and APIs.&lt;/p&gt;
&lt;h2&gt;Introduction&lt;/h2&gt;
&lt;p&gt;Some estimates suggest &lt;a href="/learning/bots/bot-traffic/"&gt;nearly half of all traffic is automated&lt;/a&gt;. That mix matters: useful crawlers and monitoring tools are part of normal internet traffic, but malicious automation is built to test web applications at scale. IAM systems, which control access to sensitive user accounts and data, are a primary target.&lt;/p&gt;
&lt;p&gt;The most common &lt;a href="/learning/bots/bot-attacks/"&gt;bot attacks&lt;/a&gt; targeting IAM include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="/learning/bots/anatomy-of-credential-stuffing-attack/"&gt;Credential Stuffing&lt;/a&gt;&lt;/strong&gt;: Attackers use lists of stolen usernames and passwords from third-party data breaches to gain unauthorised access to user accounts. This attack vector is effective because password reuse is still common.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Brute-Force Attacks&lt;/strong&gt;: Automated scripts guess passwords for known usernames, often targeting login endpoints for platforms like WordPress and Magento.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fake Account Creation&lt;/strong&gt;: Bots create fraudulent accounts at scale, which can be used for spam, malware distribution, or to abuse promotional offers.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Recent attacks on major Australian retailers like &lt;a href="/blog/account-takeover-fraud-theiconic/"&gt;The Iconic&lt;/a&gt; and Dan Murphy's show the practical impact. These incidents, driven by credential stuffing, resulted in reputational damage and financial loss, forcing the companies to issue refunds and publicly address security concerns.&lt;/p&gt;
&lt;h2&gt;Analysis&lt;/h2&gt;
&lt;p&gt;Defending IAM systems starts with why common controls fall short and where bot management adds useful signal.&lt;/p&gt;
&lt;h3&gt;Why Traditional IAM Defences Fail&lt;/h3&gt;
&lt;p&gt;Attackers have adapted their techniques to bypass legacy security controls. Simple IP-based rate limiting and reputation lists struggle against the combination of &lt;a href="/blog/bots-residential-proxies-anti-detect-browsers/"&gt;residential proxies and anti-detect browsers&lt;/a&gt;:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Residential Proxies&lt;/strong&gt;: Attackers route their traffic through large networks of IP addresses belonging to real residential internet connections. This makes malicious traffic appear legitimate and allows attackers to bypass IP-based blocking and geolocation restrictions. Our own tests show that even leading IP intelligence services &lt;a href="/blog/anti-fraud-residential-proxy-detection/"&gt;fail to detect the vast majority of residential proxy traffic&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Anti-Detect Browsers&lt;/strong&gt;: These specialised browsers allow attackers to spoof their digital fingerprints, mimicking legitimate user devices and browser configurations. This weakens many JavaScript-based challenges and fingerprinting techniques.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Used with automation suites like OpenBullet, these tools let attackers run "low and slow" distributed attacks that blend into normal traffic. For more information on these tools, see our guide to &lt;a href="/blog/enterprise-bot-management-application-security/"&gt;enterprise bot management&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;The Flawed Logic of CAPTCHA&lt;/h3&gt;
&lt;p&gt;For years, &lt;a href="/learning/bots/captcha/"&gt;CAPTCHA&lt;/a&gt; has been the default way to distinguish humans from bots. It is now a weak control when used on its own. Our research shows that visible CAPTCHAs have a &lt;a href="/blog/the-negative-impact-of-captchas-on-ecommerce-conversions"&gt;severe negative impact on user experience and conversions&lt;/a&gt;. Studies have found that CAPTCHAs can reduce form conversions by up to 40%, as frustrated users abandon purchases or sign-ups.&lt;/p&gt;
&lt;p&gt;Modern bots can also &lt;a href="/blog/captcha-conundrum-frustrating-humans-easy-for-bots/"&gt;solve CAPTCHAs with high accuracy&lt;/a&gt;, often more effectively than humans, by using CAPTCHA-solving farm services. Relying on CAPTCHA alone creates friction for legitimate users while providing a false sense of security. Modern bot management uses invisible challenges and behavioural analysis to validate users without disrupting their session.&lt;/p&gt;
&lt;h3&gt;Modern Bot Management Capabilities for IAM&lt;/h3&gt;
&lt;p&gt;An &lt;a href="/blog/key-considerations-effective-bot-management/"&gt;effective bot management&lt;/a&gt; solution provides a multi-layered defence that goes beyond simple signatures. Key capabilities include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Advanced Rate Limiting&lt;/strong&gt;: Instead of relying on IP addresses, modern solutions group requests using more stable identifiers like TLS/HTTP2 fingerprints, device characteristics, or a combination of headers. This helps detect distributed attacks from a single malicious tool, even as it rotates through thousands of IPs.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="/blog/mtu-fingerprinting-vpn-mobile-detection/"&gt;Network and Device Fingerprinting&lt;/a&gt;&lt;/strong&gt;: By analysing the unique characteristics of a client's TCP and TLS implementation, it is possible to identify the underlying software making the request, regardless of the user-agent header. This helps distinguish between real browsers and automated scripts.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Behavioural Analysis&lt;/strong&gt;: Systems can model normal user behaviour—such as mouse movements, typing speed, and page navigation—to identify anomalies that indicate automation.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="/learning/threat-detection/what-is-residential-proxy-detection/"&gt;Residential Proxy Detection&lt;/a&gt;&lt;/strong&gt;: Specialised techniques are required to identify traffic coming from residential proxy networks, which is a strong indicator of malicious intent.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Breached Credential Integration&lt;/strong&gt;: By checking login attempts against databases of known breached credentials, security teams can apply additional scrutiny to high-risk authentication events.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Together, these controls give IAM teams more useful decision points than an IP address, a password check, or a CAPTCHA challenge alone.&lt;/p&gt;
&lt;h2&gt;The Next Frontier&lt;/h2&gt;
&lt;p&gt;The next major change in automated traffic is agentic AI. As reasoning models like &lt;a href="/blog/residential-proxies-deepseek/"&gt;DeepSeek become more accessible&lt;/a&gt;, we are entering an era where &lt;a href="/learning/bots/llm-web-scrapers/"&gt;AI agents are becoming primary consumers&lt;/a&gt; of APIs and web applications.&lt;/p&gt;
&lt;p&gt;These are not just the rigid scripts of the past. AI agents can reason, plan, and adapt their behaviour in real-time based on a system's responses. They can analyse an entire API surface in seconds and generate complex interaction patterns that human developers would be unlikely to try manually.&lt;/p&gt;
&lt;p&gt;This creates a harder IAM problem. Bot management has usually looked for patterns that differ from normal human behaviour. AI agents can make those patterns less reliable by imitating user behaviour while still operating at machine speed. The line between human and &lt;a href="/learning/bots/bot-management/"&gt;automated traffic&lt;/a&gt; blurs.&lt;/p&gt;
&lt;p&gt;IAM leaders need bot management solutions that can adapt to this shift. The future of bot management will not only be about blocking bots; it will also be about deciding which automated agents are acceptable, under what conditions, and with which controls. This requires a shift from static, rule-based security to contextual analysis that understands and adapts to agent behaviour, distinguishing between legitimate AI assistants and malicious ones. Organisations that wait until agent traffic is common will have less time to distinguish useful automation from AI-driven attacks.&lt;/p&gt;</content><category term="Security"></category><category term="Bot Management"></category><category term="Account Protection"></category><category term="Credential Stuffing"></category><category term="API Security"></category><category term="Threat Detection"></category><category term="Fraud Prevention"></category></entry><entry><title>The Negative Impact of Visible CAPTCHAs on Bounce Rates and Conversions</title><link href="https://www.peakhour.io/blog/the-negative-impact-of-captchas-on-ecommerce-conversions/" rel="alternate"></link><published>2025-08-06T13:00:00+10:00</published><updated>2025-08-06T13:00:00+10:00</updated><author><name>Dan</name></author><id>tag:www.peakhour.io,2025-08-06:/blog/the-negative-impact-of-captchas-on-ecommerce-conversions/</id><summary type="html">&lt;p&gt;CAPTCHAs have long been a mainstay of bot management solutions, but the tradeoffs are lower conversions, find out just how bad it is.&lt;/p&gt;</summary><content type="html">&lt;p&gt;A client of Peakhour's recently migrated their site to us from a bot management vendor that used visible CAPTCHAs.
After the migration they noticed double-digit year-on-year growth in revenue and conversions. We'd like to take the credit,
but there is a simpler explanation: our bot management works differently. We use targeted invisible challenges to verify
browser environments rather than visible CAPTCHAs. Could that account for such a large difference? I decided to check
what the research says.&lt;/p&gt;
&lt;p&gt;Visible CAPTCHAs (like image-selection or text puzzles) are still a common way to separate humans from automated traffic. They can block some bots,
but they also add friction for legitimate users. Recent analyses across providers, including Human (formerly PerimeterX),
Google’s reCAPTCHA, Arkose Labs, and others, point to measurable impacts on ecommerce performance and customer behaviour.&lt;/p&gt;
&lt;h2&gt;Conversion Rate Impacts of Visible CAPTCHAs&lt;/h2&gt;
&lt;p&gt;Multiple studies and vendor reports show that visible CAPTCHAs can substantially &lt;strong&gt;reduce conversion rates&lt;/strong&gt;.
A &lt;a href="https://cs.stanford.edu/~jurafsky/burszstein_2010_captcha.pdf"&gt;Stanford University study&lt;/a&gt;
found that a CAPTCHA challenge can &lt;strong&gt;reduce form conversions by up to 40%&lt;/strong&gt;. In practical terms, many users
abandon signup or checkout forms when they hit a CAPTCHA. HUMAN Security researchers similarly found that &lt;strong&gt;40%
of real human shoppers have given up on a purchase due to CAPTCHA frustration&lt;/strong&gt;. For an online retailer, losing up to
40% of potential sales at the final hurdle is a direct revenue problem.
&lt;a href="https://www.forrester.com/blogs/turn-away-the-bots-not-your-customers/"&gt;Forrester Research&lt;/a&gt; reported &lt;strong&gt;19% of consumers have abandoned a
website entirely because of encountering a CAPTCHA&lt;/strong&gt; – showing how these challenges can drive users away before conversion.&lt;/p&gt;
&lt;p&gt;Even smaller conversion drops matter. One bot mitigation firm (Datadome) observed that adding a CAPTCHA to a site
led to a &lt;strong&gt;3.2% higher bounce rate&lt;/strong&gt; and an overall &lt;strong&gt;3–5% drop in conversion&lt;/strong&gt;. Given that average e-commerce conversion
rates are often just 2–3%, losing even a few more percent of customers can materially affect revenue. In industries with
thin margins and high customer acquisition costs, no business wants to sacrifice those would-be buyers.&lt;/p&gt;
&lt;h2&gt;Bounce Rates and User Abandonment&lt;/h2&gt;
&lt;p&gt;Every extra step in the user journey increases the risk of &lt;strong&gt;bounce (users leaving after a single page)&lt;/strong&gt;. CAPTCHAs
are a common cause. Studies show about &lt;strong&gt;30% of users will leave a site if a CAPTCHA is too complex or cumbersome&lt;/strong&gt;.
Long or indecipherable challenges cause users to give up, raising bounce rates. In one example, shoppers who faced
repeated CAPTCHA puzzles during checkout simply exited, contributing to higher cart abandonment and bounce metrics.
Even users who &lt;em&gt;intend&lt;/em&gt; to buy may get frustrated by being treated like “bots” and decide the purchase is not worth the hassle.&lt;/p&gt;
&lt;p&gt;Online patience is thin. Customers expect quick transactions, especially on mobile
devices. CAPTCHAs slow things down: one analysis noted completing actions on mobile takes &lt;strong&gt;30–40% more time with a
CAPTCHA&lt;/strong&gt; than without. That delay is enough to hurt conversion, as hurried mobile users are quick to drop off. As a
result, visible CAPTCHAs often correlate with higher bounce rates and shorter time-on-site, indicating that challenged users
are abandoning sessions. Some reports estimate &lt;strong&gt;20% of users will leave&lt;/strong&gt; if they encounter
difficulties solving a CAPTCHA. This
abandonment directly translates to lost sales or sign-ups.&lt;/p&gt;
&lt;h2&gt;User Experience Friction and Qualitative Insights&lt;/h2&gt;
&lt;p&gt;Qualitatively, visible CAPTCHAs introduce real &lt;strong&gt;user experience (UX) friction&lt;/strong&gt;. Usability
experts note that CAPTCHAs are often hard to read, carry no real meaning for the user, and feel like an unnecessary test,
all of which irritate customers and &lt;a href="https://baymard.com/blog/captcha-conversion-rate"&gt;“kill” conversions&lt;/a&gt;. They can be especially
off-putting to certain user segments, such as older users or those with disabilities. For example, visually impaired
users may find image CAPTCHAs nearly impossible to complete, leading to exclusion and site abandonment
(&lt;a href="https://www.w3.org/WAI/standards-guidelines/aria/"&gt;W3C Accessibility Guidelines&lt;/a&gt;). Legitimate customers often feel
inconvenienced or even insulted by being forced to “prove” they are human. As one industry commentator quipped,
&lt;em&gt;“Every CAPTCHA is a time tariff imposed on your customers”&lt;/em&gt; – it is a tax on their time and patience, which
&lt;strong&gt;benefits nobody in terms of sales&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;False positives (human users being mistaken for bots) make this worse. If a security system is too
sensitive and throws frequent CAPTCHAs at real shoppers, it creates friction without benefit. Users confronted with
multiple challenges may think twice about continuing. DataDome’s research notes that excessive CAPTCHA usage causes a
&lt;strong&gt;suboptimal experience&lt;/strong&gt;, and customers have &lt;em&gt;“little patience”&lt;/em&gt; &lt;a href="https://www.cyberdefensemagazine.com/how-false-positive-rates-impact-e-commerce-conversion-rates-balancing-security-ux/"&gt;for such delays&lt;/a&gt;. The result can be reputational
damage as well – annoyed users might complain publicly, hurting the brand. In short, traditional CAPTCHAs tend
to &lt;strong&gt;“treat customers like criminals”&lt;/strong&gt;, which pushes people away.&lt;/p&gt;
&lt;h2&gt;Industry-Specific Observations&lt;/h2&gt;
&lt;p&gt;The negative effects of visible CAPTCHAs show up across industries, with different tolerance for security friction:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Retail &amp;amp; E-Commerce:&lt;/strong&gt; Online retail (from fashion to electronics) is highly sensitive to checkout friction. Shoppers have many alternatives, so a challenging CAPTCHA can send them to a competitor’s site in seconds. Even one extra step can hurt sales conversion. E-commerce case studies consistently show that removing CAPTCHAs boosts conversions. Bot solution vendors note that losses from CAPTCHA friction are &lt;strong&gt;“especially noticeable in areas such as e-commerce”&lt;/strong&gt; where even a 3–5% conversion dip means thousands of customers lost.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Travel &amp;amp; Ticketing:&lt;/strong&gt; Travel sites (flights, hotels) and ticketing platforms often deploy CAPTCHAs to thwart scalpers and bots (e.g. for popular concert tickets or holiday bookings). That can protect inventory, but it can also turn away real customers. Travellers shopping around for deals won’t hesitate to bounce if a booking site throws up hurdles – they’ll try another site. Travel bookings are often time-sensitive (flash sales, limited seats), so any slowdown from a puzzle challenge can cause users to miss out and blame the site. The challenge for this sector is to weed out bot traffic (which can be a huge share of ticketing traffic) &lt;strong&gt;without derailing genuine user transactions&lt;/strong&gt;. Some travel companies use alternatives like virtual waiting rooms or invisible challenges to reduce user-facing friction. A smooth booking path matters: industry observers emphasise that travel and hospitality businesses that &lt;strong&gt;“remove booking friction”&lt;/strong&gt; are rewarded with higher conversion and direct revenue, whereas those using blunt CAPTCHA challenges risk higher bounce rates and lost bookings.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Finance &amp;amp; Banking:&lt;/strong&gt; Financial services websites (online banking, fintech apps, etc.) deal with sensitive transactions and may introduce verification steps (CAPTCHAs or multi-factor authentication) for security. Users in this sector can be slightly more tolerant of friction if it clearly signals security. However, if a bank’s CAPTCHA fails normal users or frequently interrupts login, customers will get frustrated or call support. Financial institutions must balance fraud prevention with a smooth experience – if there is too much friction, users may abandon opening an account or using the service. In fact, the &lt;strong&gt;same 40% conversion drop&lt;/strong&gt; risk applies here: lost applications or completed transactions if security measures are overbearing. So even in finance, the trend is toward smarter, invisible verification methods to minimise extra steps.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Other Industries:&lt;/strong&gt; Nearly any consumer-facing online service – from gaming and streaming to government portals – faces the CAPTCHA UX dilemma. Users expect minimal friction. In some niches (e.g. gaming), users are extremely averse to any interruptions in sign-up or sign-in. In others (like online voting or government forms), a CAPTCHA might be more accepted, but if it fails or confuses users, it can prevent task completion. The pattern is consistent: &lt;strong&gt;user expectations for convenience are high across the board&lt;/strong&gt;, and visible CAPTCHAs risk alienating users in any vertical if not handled carefully.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Death of the CAPTCHA&lt;/h2&gt;
&lt;p&gt;Visible CAPTCHAs are still widely used, and they still add friction at critical moments. The research above shows users often abandon
sites or carts rather than struggle with puzzles – a loss of sales that can range from a few percent to double digits.
This effect is seen broadly, from fashion retail to travel bookings to financial services.&lt;/p&gt;
&lt;p&gt;That is before we consider the actual effectiveness of visible CAPTCHAs. Other studies have shown bots can be
&lt;strong&gt;MORE&lt;/strong&gt; effective than humans at solving them.&lt;/p&gt;
&lt;p&gt;That is why Peakhour uses invisible challenges: verify the browser environment without making legitimate customers solve a puzzle.&lt;/p&gt;</content><category term="Security"></category><category term="Bot Management"></category><category term="Account Protection"></category></entry><entry><title>Protecting Against a Share Point Zero Day Vulnerability with Network Fingerprinting</title><link href="https://www.peakhour.io/blog/protecting-against-share-point-zero-day/" rel="alternate"></link><published>2025-07-23T13:00:00+10:00</published><updated>2025-07-23T13:00:00+10:00</updated><author><name>Dan</name></author><id>tag:www.peakhour.io,2025-07-23:/blog/protecting-against-share-point-zero-day/</id><summary type="html">&lt;p&gt;Analysis of attempts to exploit a recent Share Point zero day vulnerability reveal network fingerprinting and classification is a robust defense.&lt;/p&gt;</summary><content type="html">&lt;h2&gt;Why Network Fingerprinting is Your Strongest First Defense&lt;/h2&gt;
&lt;p&gt;A critical new remote code execution (RCE) vulnerability in on-premises Microsoft SharePoint Server, identified as
&lt;a href="https://msrc.microsoft.com/blog/2025/07/customer-guidance-for-sharepoint-vulnerability-cve-2025-53770/"&gt;CVE-2025-53770&lt;/a&gt;,
is being actively exploited and presents a serious risk to organisations. This flaw allows an
unauthenticated attacker to take complete control of a server over the network, so immediate and effective
defence is a priority. Microsoft disclosed the flaw on 19 July.&lt;/p&gt;
&lt;p&gt;Vendor patches are essential, but zero-day activity often starts before most organisations can patch.
That gap is where proactive controls matter.&lt;/p&gt;
&lt;p&gt;This post looks at the technical nature of this threat and how a strategy centred on network fingerprinting can
block zero-day exploit activity before a formal patch is deployed.&lt;/p&gt;
&lt;h2&gt;Understanding the Threat: CVE-2025-53770&lt;/h2&gt;
&lt;p&gt;The SharePoint vulnerability is particularly dangerous as it allows for the deserialization of untrusted data,
leading to remote code execution without any need for attacker authentication. This makes any unpatched, internet-facing
on-premises SharePoint server a potential target. The U.S. Cybersecurity and Infrastructure Security Agency (CISA)
has underlined the severity of this threat by adding it to its Known Exploited Vulnerabilities Catalog.&lt;/p&gt;
&lt;p&gt;Exploitation can lead to a complete compromise of the SharePoint server, allowing attackers to steal data,
execute arbitrary code, and potentially move laterally across the internal network.&lt;/p&gt;
&lt;h2&gt;The Race Against Scanners&lt;/h2&gt;
&lt;p&gt;When a zero-day vulnerability like this is discovered, a global, automated race begins. Malicious actors immediately
deploy scanners to canvass the internet for vulnerable systems.&lt;/p&gt;
&lt;p&gt;Our own analysis shows that the majority of malicious requests targeting our clients came from the DigitalOcean and
Scaleway ASNs, with Amazon Web Services (AWS) EC2 and Microsoft Azure also being a prominent source. These networks are well-known for
being used by malicious actors to launch scanning and attack campaigns quickly. Notably, scans were happening
on 16 and 17 July, before the vulnerability was disclosed by Microsoft.&lt;/p&gt;
&lt;p&gt;This initial scanning phase, however, creates an opportunity for defence. Instead of waiting to analyse the
specific attack payload, we can identify and block the very tools the attackers are using.&lt;/p&gt;
&lt;div class="text-center" style="padding: 20px 0px"&gt;
&lt;img src="/static/images/blog/sharepoint-exploit-attempts.png" width="100%" alt="Sharepoint exploit attempts"/&gt;
&lt;em&gt;Exploits attempts in the wild. Note attempts days before disclosure.&lt;/em&gt;
&lt;/div&gt;

&lt;h2&gt;Why IP Reputation Isn't Enough&lt;/h2&gt;
&lt;p&gt;For years, a primary method of defence has been IP reputation—blocking traffic from IP addresses known to be malicious.
While simple and somewhat effective against basic attacks, this approach is increasingly unreliable in the face
of modern threats.&lt;/p&gt;
&lt;p&gt;The rise of sophisticated proxy services has changed the model. Attackers now have easy access to vast
networks of residential, mobile, and rotating data centre proxies. These services allow them to distribute their
attack traffic across thousands or even millions of seemingly legitimate IP addresses, making it impossible to maintain
an effective blocklist. An IP that sends a malicious request one moment could be used by a legitimate customer the next.&lt;/p&gt;
&lt;p&gt;Furthermore, attackers leveraging cloud infrastructure use ephemeral IPs that exist for only a short time,
rendering IP-based blocking a constant and losing game of cat and mouse. This approach also carries a high risk of
"collateral damage", where legitimate users are blocked simply because they share an IP address with a bad actor,
a common scenario with Carrier-Grade NAT (CGNAT) or public Wi-Fi. Relying solely on where a request comes from
is no longer a viable strategy.&lt;/p&gt;
&lt;h2&gt;Unmasking the Attacker's Tools with Network Fingerprinting&lt;/h2&gt;
&lt;p&gt;This is where network fingerprinting becomes useful as a zero-day defence. Fingerprinting in
cybersecurity refers to methods used to identify
the unique characteristics of devices, software, or users.
It allows for the identification and categorisation of operating systems and software based on their distinct
signatures in network communications.&lt;/p&gt;
&lt;p&gt;When attackers rush to exploit a new vulnerability, they don't use standard web browsers. They quickly code scanners
using programming languages and libraries like Python, Go, or Java. These tools and libraries create network
connections with distinct, non-browser-like fingerprints. By analysing these, we can block the scanner before
it ever delivers its malicious payload.&lt;/p&gt;
&lt;p&gt;Peakhour uses several passive fingerprinting techniques to do this:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;TCP Fingerprinting&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This method identifies a device's operating system by analysing how it implements the TCP
protocol. By examining nuances in TCP packets—like window size, Time to Live (TTL), and how the device
responds to non-standard packets—we can identify the underlying system that created the request.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;TLS Fingerprinting&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This technique analyses the "ClientHello" message sent by the client during the
initial TLS handshake to establish a secure connection. The combination of TLS version, supported cipher suites,
and extensions creates a unique fingerprint. This is a highly effective way of identifying the classes of
connecting clients, such as those made by Go, Python, or Java libraries, which are commonly used for attack tooling.
JA4 and JA3 are popular TLS fingerprint formats.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;HTTP/2 Fingerprinting&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This involves analysing how clients use the HTTP/2 protocol, including their patterns in
sending HTTP/2 frames and negotiating connections. This makes it easier to differentiate between legitimate
browsers, bots, and the custom applications used in an attack campaign.&lt;/p&gt;
&lt;p&gt;After identifying these fingerprints, Peakhour's bot management service uses machine learning to classify them as
either a legitimate browser or a bot. This provides a strong layer of defence against zero-day exploits.
The scanners are identified and blocked based on their fundamental network characteristics, irrespective of the specific
vulnerability or payload they carry.&lt;/p&gt;
&lt;h2&gt;Defense in Depth&lt;/h2&gt;
&lt;p&gt;No single security measure is a silver bullet. While network fingerprinting provides a powerful first line of defence
against automated scanners, a multi-layered, defence-in-depth strategy matters.&lt;/p&gt;
&lt;p&gt;Any request that manages to bypass the initial fingerprinting checks must face the next layer: our standard Web
Application Firewall (&lt;a href="/products/waf/"&gt;WAF&lt;/a&gt;) with post-body scanning. A WAF inspects every request before
it reaches the application. By enabling the inspection of the full request body, the WAF can identify and block
malicious payloads, such as the specific code used in an exploit attempt, that may be hidden within the data sent
to the server. Our WAF was updated with a virtual patch on 22 July at 5am AEST to add protection against this
vulnerability.&lt;/p&gt;
&lt;h2&gt;Staying Ahead in a Zero-Day World&lt;/h2&gt;
&lt;p&gt;The SharePoint CVE-2025-53770 vulnerability shows why a reactive security posture is not enough. While
patching is essential, the reality is that attackers move first.&lt;/p&gt;
&lt;p&gt;By using proactive techniques like network fingerprinting, organisations can identify and neutralise
the automated tools attackers rely on during the critical opening hours of a zero-day exploit's life. This approach,
when combined with payload inspection from a WAF, gives critical assets another layer of practical protection.&lt;/p&gt;</content><category term="Security"></category><category term="Threat Detection"></category><category term="Credential Stuffing"></category><category term="Account Protection"></category><category term="DevSecOps"></category><category term="DDoS"></category><category term="Application Security"></category></entry><entry><title>Why Don't We Have an AI UI Yet?</title><link href="https://www.peakhour.io/blog/why-no-ai-interface-yet/" rel="alternate"></link><published>2025-07-20T00:00:00+10:00</published><updated>2025-07-20T00:00:00+10:00</updated><author><name>AC</name></author><id>tag:www.peakhour.io,2025-07-20:/blog/why-no-ai-interface-yet/</id><summary type="html">&lt;p&gt;If AI is the next great computer interface, why are we still clicking on icons and navigating menus? Exploring the major hurdles standing between us and a true AI-native operating system.&lt;/p&gt;</summary><content type="html">&lt;p&gt;In my last post, I made the case that Artificial Intelligence is the next great computer interface: a way to translate our intentions directly into actions. It is a powerful idea, but it immediately raises the practical question. If this is the future, where is it? Why am I still clicking icons and navigating menus on my computer instead of just talking to it?&lt;/p&gt;
&lt;p&gt;The concept is much cleaner than the implementation. We are still a fair way from having a true AI-native interface, and there are some hard problems to solve before it becomes the main way we use a computer.&lt;/p&gt;
&lt;h3&gt;The Understanding Problem&lt;/h3&gt;
&lt;p&gt;The first challenge is that current AIs don't truly &lt;em&gt;understand&lt;/em&gt; things in the way humans do. When you ask an AI to "write a summary of last quarter's sales," it doesn't know what a "sale" is or what a "quarter" means to the business. It is an extremely capable pattern-matching machine that knows which words and concepts are statistically likely to follow your request.&lt;/p&gt;
&lt;p&gt;That is useful for generating text or code, but it can also lead to "hallucinations"—where the AI confidently makes things up. For a chatbot, that might be annoying. For a computer's operating system, it is a critical failure. You can't have an interface that might invent a file that doesn't exist or misinterpret a crucial command.&lt;/p&gt;
&lt;h3&gt;The Action and Safety Problem&lt;/h3&gt;
&lt;p&gt;An AI interface needs to do more than just talk; it needs to &lt;em&gt;act&lt;/em&gt;. It must be able to open programs, manage files, change settings, and send emails. That requires giving the AI deep access to the core functions of the operating system, which is where the idea stops feeling neat and starts feeling risky.&lt;/p&gt;
&lt;p&gt;How do you give an AI the power to delete files based on a verbal command without creating a massive security hole? How do you ensure it can't be tricked by a cleverly worded prompt (or an external attacker) into causing chaos on your system? Creating a safe and reliable bridge between the AI's language processing and the computer's functions is a hard engineering problem.&lt;/p&gt;
&lt;h3&gt;The Trust and Reliability Problem&lt;/h3&gt;
&lt;p&gt;For an AI interface to be useful, we have to trust it completely. If you tell it to "delete my old holiday photos from 2018," you need to be certain it won't misunderstand and delete your wedding photos or important work documents.&lt;/p&gt;
&lt;p&gt;This need for absolute reliability runs counter to the probabilistic nature of today's AI models. We can't have an interface that is "mostly right." It needs to be right every single time. The hard part is adding the necessary safeguards and confirmation steps without turning the whole thing into a slower version of the menus we were trying to escape.&lt;/p&gt;
&lt;h3&gt;The Speed and Cost Problem&lt;/h3&gt;
&lt;p&gt;Finally, there is a practical issue. Running the massive language models that would power such an interface is slow and computationally expensive. A good user interface needs to feel instant and responsive. If it takes ten seconds for an AI to process your request to open a web browser, it is not a better experience than just clicking the icon yourself. The hardware and software infrastructure isn't quite ready to deliver the seamless, real-time experience we would expect from a primary computer interface.&lt;/p&gt;
&lt;p&gt;These challenges aren't insurmountable, but they are significant. That is why I think AI will keep showing up first as powerful features within our existing apps and operating systems. Those narrower uses give it clearer jobs, tighter permissions, and more places for humans to confirm what is about to happen. The full AI interface may arrive eventually, but I don't think it appears all at once. It will earn trust in smaller pieces first.&lt;/p&gt;</content><category term="Interest"></category><category term="Machine Learning"></category></entry><entry><title>AI as the Translator Between Human and Machine</title><link href="https://www.peakhour.io/blog/ai-the-next-interface/" rel="alternate"></link><published>2025-07-19T00:00:00+10:00</published><updated>2025-07-19T00:00:00+10:00</updated><author><name>AC</name></author><id>tag:www.peakhour.io,2025-07-19:/blog/ai-the-next-interface/</id><summary type="html">&lt;p&gt;We've gone from command lines to graphical interfaces. The next great leap in how we interact with computers won't be seen, it will be understood. AI is poised to become the ultimate translator between human intent and machine execution.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Think about how we've talked to computers over the years. At first, it was rigid and unforgiving. The command line expected the exact words, in the exact order. One typo, and you were met with an error. It was powerful, but only once you learned to speak the computer's language.&lt;/p&gt;
&lt;p&gt;Then came the graphical user interface, or GUI—the familiar world of windows, icons, and mouse pointers. That changed the relationship. You no longer had to memorise commands before you could do something useful. You could see your options, click on them, and drag things around. It made computers accessible to hundreds of millions of people because it was more intuitive. It was a visual conversation.&lt;/p&gt;
&lt;p&gt;But both of these interfaces, the command line and the GUI, share the same basic bargain: we adapt ourselves to the computer. We still have to navigate menus, find the right button, or remember a specific command. We take a goal in our head and break it into steps the computer understands.&lt;/p&gt;
&lt;p&gt;What if that translation was no longer mainly our job? What if the computer could understand our goal well enough to work out the steps?&lt;/p&gt;
&lt;p&gt;This is the next shift I find interesting, and it is powered by Artificial Intelligence. AI is starting to look less like another application and more like the next major interface. It's not a visual one with buttons and menus, but an intelligent one built on understanding.&lt;/p&gt;
&lt;p&gt;The idea is simple, even if the implementation is not: we state our intent, and the AI figures out the steps. Instead of clicking through five different menus to create a sales report, you could just say, "Show me last quarter's sales figures for the eastern region, and visualise it as a bar chart." The AI's job is to understand that request and then do the work: query the database, aggregate the data, select the right chart type, and present it to you. It acts as a translator between human language and the computer's machine language.&lt;/p&gt;
&lt;p&gt;We're already seeing the early stages of this. When you ask a smart assistant to play a song, or when an AI co-pilot writes code for you, you're using an intent-driven interface. You're not telling it &lt;em&gt;how&lt;/em&gt; to do the task; you're just telling it &lt;em&gt;what&lt;/em&gt; you want done.&lt;/p&gt;
&lt;p&gt;That shift matters because it moves some of the cognitive load from us to the machine. We no longer need to be experts in using a particular piece of software; we just need to be clear about what we want to achieve. This has the potential to democratise technology on a scale we've never seen before, making complex digital tools feel closer to a conversation than a training course.&lt;/p&gt;
&lt;p&gt;The future of computing isn't about learning more complex systems. It's about building systems that can learn from us. The interface of tomorrow won't be something we click on, but something we talk to, correct, and steer. That is the real change: technology that doesn't just follow instructions, but understands our goals.&lt;/p&gt;</content><category term="Interest"></category><category term="Bot Management"></category><category term="Machine Learning"></category><category term="DevSecOps"></category><category term="Technical"></category></entry><entry><title>From Research Paper to Running Code</title><link href="https://www.peakhour.io/blog/from-paper-to-code-with-ai/" rel="alternate"></link><published>2025-07-18T00:00:00+10:00</published><updated>2025-07-18T00:00:00+10:00</updated><author><name>AC</name></author><id>tag:www.peakhour.io,2025-07-18:/blog/from-paper-to-code-with-ai/</id><summary type="html">&lt;p&gt;Exploring how AI can dramatically accelerate the process of turning complex academic research into functional code, with examples from anomaly detection to small LLMs.&lt;/p&gt;</summary><content type="html">&lt;p&gt;In my last post, I talked about my journey from typing &lt;code&gt;format c:&lt;/code&gt; on an old DOS machine to collaborating with AI. The part I keep coming back to still feels slightly unreal: turning academic research papers directly into working code.&lt;/p&gt;
&lt;p&gt;For years, the hard part was the distance between academia and industry. A good idea could be locked inside a dense, equation-heavy paper, and turning it into a practical tool could take a team of specialists weeks or months. You had to understand the mathematics, translate it into logic, write the code, and then debug all the places where the theory met the real world.&lt;/p&gt;
&lt;p&gt;Now my process looks completely different. I'll find an interesting paper, give it to an AI like Gemini, and say, "code this for me". It is a conversation, not just a command. We go back and forth, clarifying ambiguities in the paper and refining the implementation. What used to take weeks of painstaking effort can now be prototyped in an afternoon.&lt;/p&gt;
&lt;p&gt;Here are a few examples from my own experiments.&lt;/p&gt;
&lt;h3&gt;Anomaly Detection&lt;/h3&gt;
&lt;p&gt;I recently came across a paper detailing a new statistical method for detecting anomalies in time-series data. In the past, I would have spent days just trying to get comfortable with the mathematical models before writing a single line of code. This time, I fed the PDF to the AI. Within minutes, it had parsed the document and produced a Python implementation of the core algorithm. It was not perfect on the first go, but it was a solid, working foundation that we could test and refine together. The AI handled the heavy lifting of translation, leaving me to focus on validating and applying the model.&lt;/p&gt;
&lt;h3&gt;Customer Journey Mapping&lt;/h3&gt;
&lt;p&gt;Another area I have been looking at is using data to understand customer behaviour. There are academic papers that model how users interact with a website or product, mapping out their journey from discovery to purchase. Implementing these models used to be a serious undertaking. Now, I can give the AI a paper on a new journey mapping technique, and it can generate the code to analyse server logs or user event data and produce the kind of insights the paper describes. That makes it much easier to experiment with new ways of understanding our customers.&lt;/p&gt;
&lt;h3&gt;Building Small Language Models&lt;/h3&gt;
&lt;p&gt;This is where it gets really interesting. We can use large language models (LLMs) to help build smaller, more specialised ones. I've been experimenting with research papers that propose new, efficient LLM architectures. I can give one of these papers to a large AI and have it help me write the code for the smaller architecture. There is a beautiful irony in using a massive AI to help create its smaller, more nimble cousins. It speeds up the cycle of innovation inside the AI field itself.&lt;/p&gt;
&lt;p&gt;For me, the important change is the shorter loop between reading an idea, testing it, and getting it into use. The friction between a theoretical concept and a working prototype has been reduced almost to zero. That means I can explore more ideas, take more risks, and bring those research ideas into real use much faster than before.&lt;/p&gt;</content><category term="Interest"></category><category term="DevSecOps"></category><category term="Technical"></category><category term="Machine Learning"></category></entry><entry><title>My Programming Journey</title><link href="https://www.peakhour.io/blog/my-programming-journey-from-dos-to-ai/" rel="alternate"></link><published>2025-07-17T00:00:00+10:00</published><updated>2025-07-17T00:00:00+10:00</updated><author><name>AC</name></author><id>tag:www.peakhour.io,2025-07-17:/blog/my-programming-journey-from-dos-to-ai/</id><summary type="html">&lt;p&gt;A personal journey through the evolution of programming, from the early days of DOS and BASIC to the current age of AI-assisted coding.&lt;/p&gt;</summary><content type="html">&lt;p&gt;My path into technology started with a beige box and no plan beyond seeing what it would do.&lt;/p&gt;
&lt;p&gt;When I was a kid, I got an old 8086 computer. The only thing it came with was a thick manual for 'DOS', its operating system. For a child trying to make sense of it, the blinking &lt;code&gt;C:\&amp;gt;&lt;/code&gt; prompt was not exactly welcoming. What was I meant to do with it?&lt;/p&gt;
&lt;p&gt;I tried typing whatever came to mind, but most of it ended in errors. Then I stumbled on a command that actually did something interesting: &lt;code&gt;format c:&lt;/code&gt;. After I typed 'Y' to confirm, the screen would fill with text, showing me its progress. I didn't realise I was wiping the computer's entire memory. I only knew the machine was finally responding.&lt;/p&gt;
&lt;p&gt;Things properly opened up when I found a book filled with GW-BASIC programs. I wasn't just using a computer anymore; I was telling it what to do. I spent ages carefully typing out code, one line at a time. &lt;code&gt;10 PRINT "HELLO THERE"&lt;/code&gt;, &lt;code&gt;20 GOTO 10&lt;/code&gt;. It was slow work, but there was something hard to beat about bringing a program to life with my own hands.&lt;/p&gt;
&lt;p&gt;My skills moved along when QuickBasic started coming with MS-DOS. The tools were better, the language was more powerful, and I started building my own little games and applications, learning how to organise my ideas into code.&lt;/p&gt;
&lt;p&gt;Every programmer eventually hits a wall. For me, it was a 64-kilobyte limit on a single variable. It sounds tiny now, but it blocked a project I cared about. The only way forward was to learn C, a much more complex language. It was a hard jump, but it was the way to build bigger and more powerful software.&lt;/p&gt;
&lt;p&gt;That arc is why today's tools feel so strange to me.&lt;/p&gt;
&lt;p&gt;For most of my career, my job was to translate human ideas into instructions a computer could follow. I had to think like a machine, breaking everything down into small, logical steps.&lt;/p&gt;
&lt;p&gt;Now the process feels very different. I still solve problems, but I spend less time spelling out every instruction. I have a conversation with my computer. I can describe a goal, or show it a research paper, and an AI partner helps me write the code. My role has shifted from writing each line by hand to setting direction, checking the work, and deciding what is actually worth building.&lt;/p&gt;
&lt;p&gt;Looking back, the path from blindly typing &lt;code&gt;format c:&lt;/code&gt; to working alongside an AI still feels odd in the best way. We've moved from telling the machine exactly &lt;em&gt;how&lt;/em&gt; to do something to describing &lt;em&gt;what&lt;/em&gt; we want to achieve and then judging the result. That is a big change. I am still getting used to it.&lt;/p&gt;</content><category term="Interest"></category><category term="DevSecOps"></category></entry><entry><title>SMS Pumping Fraud: How Verification Traffic Inflates the Bill</title><link href="https://www.peakhour.io/blog/sms-pumping-fraud-business-impact-protection/" rel="alternate"></link><published>2025-03-13T14:00:00+11:00</published><updated>2026-07-29T00:00:00+10:00</updated><author><name>AC</name></author><id>tag:www.peakhour.io,2025-03-13:/blog/sms-pumping-fraud-business-impact-protection/</id><summary type="html">&lt;p&gt;SMS pumping turns verification endpoints into billable traffic. Trace the delivery chain, measure abnormal sends and stop expensive requests before the provider charge lands.&lt;/p&gt;</summary><content type="html">&lt;h2&gt;The Growth of SMS Fraud&lt;/h2&gt;
&lt;p&gt;SMS pumping fraud is a costly online abuse pattern, with global losses reaching an estimated $6.7 billion in 2021 alone. It targets companies that rely on SMS for verification or customer communications, leaving them to pay for traffic they did not request.&lt;/p&gt;
&lt;p&gt;The scheme relies on malicious actors and dishonest telecom operators working together to generate and monetise large volumes of fraudulent text messages. For businesses caught in these schemes, the financial impact can be severe. Twitter (now X) reportedly lost $60 million to this type of fraud.&lt;/p&gt;
&lt;p&gt;This guide explains how SMS pumping works, which businesses face the highest risk, and the controls your organisation can use to reduce exposure.&lt;/p&gt;
&lt;h2&gt;&lt;strong&gt;Understanding SMS Pumping Fraud&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;SMS pumping (also called SMS toll fraud, SMS spamming, or Artificially Inflated Traffic) involves manipulating mobile networks to inflate charges for text messages. The term "pumping" describes fraudsters forcing high SMS volume through a target's systems.&lt;/p&gt;
&lt;p&gt;This fraud exploits how SMS messages travel and get billed across phone networks. Attackers target companies that use SMS codes to verify users. Each time a business sends a verification code, it pays a fee. Fraudsters trigger these systems to send thousands of messages to numbers they control.&lt;/p&gt;
&lt;p&gt;These attacks create direct costs for businesses and revenue for the attackers. The fraud works through coordination between criminals and corrupt telecom operators, who charge premium rates for message delivery and share the proceeds.&lt;/p&gt;
&lt;p&gt;The fraud has changed as more businesses have adopted SMS verification. Attackers keep developing new methods, and the phone industry has not removed the risk. Many companies still carry the financial exposure.&lt;/p&gt;
&lt;h2&gt;&lt;strong&gt;How SMS Pumping Works&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;SMS pumping attacks usually exploit message systems through these steps:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Finding Targets&lt;/strong&gt;: Attackers look for websites or apps that send SMS codes for account verification or password resets.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Creating Fake Requests&lt;/strong&gt;: Fraudsters use automation to send thousands of code requests to phone numbers they own or control.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hiding Their Tracks&lt;/strong&gt;: Attackers change their IP addresses and device information so requests appear to come from real users.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sharing Profits&lt;/strong&gt;: Fraudsters work with dishonest phone companies that charge high fees when messages pass through their networks. These companies then share the money with the attackers.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Using Complex Routes&lt;/strong&gt;: Messages travel through many networks before reaching their destination, making the source of the fraud harder to trace.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Targeting Expensive Routes&lt;/strong&gt;: Attackers focus on international numbers where sending messages costs more or where rules are weaker.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;These attacks look legitimate because each message contains a real code sent to what appears to be a normal phone number. Companies like &lt;a href="https://twilio.com"&gt;Twilio&lt;/a&gt; or &lt;a href="https://bird.com"&gt;Bird&lt;/a&gt; must pay fees to deliver these messages. Most businesses only find out about the fraud when a large bill arrives from their SMS service.&lt;/p&gt;
&lt;p&gt;SMS pumping differs from basic spam because the profit-sharing between attackers and phone companies creates a direct cost for the target business.&lt;/p&gt;
&lt;h2&gt;&lt;strong&gt;Businesses at Risk&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;SMS pumping is most likely to affect these types of businesses:&lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;Financial Institutions&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Banks, investment platforms, and cryptocurrency exchanges use SMS codes to protect accounts. These firms send thousands of codes each day, which makes it hard to spot fake requests mixed with real ones.&lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;E-commerce Platforms&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Online shops use SMS messages when users create accounts, reset passwords, or make purchases. These businesses often run on small profit margins, so extra SMS costs can hurt their earnings. High volumes of new users make it easier for attackers to hide their activity.&lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;Social Media Companies&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Social networks use text messages to check user identity and stop fake accounts. These companies send millions of codes each day to users around the world. Twitter lost $60 million from this type of fraud, showing the scale these bills can reach.&lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;Software-as-a-Service (SaaS) Providers&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;These companies often offer free trials that require SMS verification. They plan for a set cost to acquire each new user, but fraud can push these costs much higher than expected.&lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;Telecommunications Companies&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Phone companies face two problems: their own systems can be attacked, and parts of their network might help fraudsters. They need strong monitoring tools to find unusual patterns in message traffic.&lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;Small Businesses and Startups&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;While smaller firms send fewer messages, they often lack security teams and fraud detection tools. This makes them easier targets. The cost of an attack can put these businesses at risk of closing down because they have less money in reserve.&lt;/p&gt;
&lt;h2&gt;Advanced Attack Methods&lt;/h2&gt;
&lt;p&gt;Attackers now combine SMS pumping with other techniques to avoid detection.&lt;/p&gt;
&lt;h3&gt;Credential Stuffing&lt;/h3&gt;
&lt;p&gt;Fraudsters use passwords stolen in data breaches to break into accounts. Once inside, they change phone numbers to ones they control and trigger verification messages. This makes fraud appear to come from real users.&lt;/p&gt;
&lt;p&gt;Peakhour's breach database detection identifies when stolen credentials are used to access accounts. The system flags these attempts before phone numbers can be changed, stopping the attack chain.&lt;/p&gt;
&lt;h3&gt;Residential Proxy Networks&lt;/h3&gt;
&lt;p&gt;Unlike data centre proxies that security systems can often spot, &lt;a href="/products/residential-proxy-detection/"&gt;residential proxies&lt;/a&gt; hide attack traffic behind home internet connections. This makes fraud look like it comes from regular users in different locations.&lt;/p&gt;
&lt;p&gt;Peakhour specialises in residential proxy detection. Its technology identifies these masked connections and blocks them before verification requests can pass through. The system maps known proxy networks and detects signs of traffic passing through residential IPs.&lt;/p&gt;
&lt;p&gt;When combined with device fingerprinting, these protections create a stronger defence. Fingerprinting tracks device characteristics that remain consistent even when attackers change IP addresses or accounts. Peakhour's fingerprinting technology works without cookies, making it effective against attackers who clear browser data.&lt;/p&gt;
&lt;p&gt;These methods focus on the techniques fraudsters use to hide their identity. With Peakhour's protection, businesses can detect and block these attacks before they trigger costly SMS verification messages.&lt;/p&gt;
&lt;h2&gt;&lt;strong&gt;Historical Incidents&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;Reported SMS pumping incidents show how quickly costs can build:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Twitter's $60 Million Loss&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;In January 2023, Twitter owner Elon Musk said the platform lost more than $60 million to SMS pumping fraud. He named over 390 phone companies that took part in the scheme. While Twitter later questioned some claims, the case brought public attention to this type of fraud.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Industry-Wide Financial Impact&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The Communications Fraud Control Association reports that SMS pumping caused global losses of $6.7 billion in 2021. Many companies do not share their fraud losses with the public.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Costs to Individual Businesses&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Companies hit by these attacks pay between tens of thousands and millions of dollars each month in fake charges. These costs grow fast because each fake message costs much more than normal text rates.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Verification Policy Changes&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Because of these threats, many large platforms have moved away from SMS codes. Twitter removed SMS verification for most users in March 2023, stating fraud as the reason.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Operational Disruptions&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Beyond the cost of messages, businesses can face service problems during attacks. Real users may not get their codes on time. This can cause users to abandon transactions, contact support more often, and lose confidence in the company.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Rules and Enforcement&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Rules to stop these attacks differ around the world. Some telecoms authorities have strict rules and fines for networks that allow fraud, but enforcement remains hard. Fraudsters use complex message routes that cross many countries to avoid getting caught.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Understanding the Stakeholders&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;SMS pumping involves these key groups:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Businesses&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Companies use SMS to check user identity and send updates. They hire SMS gateway providers to handle their messages. When fraud happens, these businesses pay for the fake messages. Most find out about the attack only when they receive an unexpected bill.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;SMS Gateway Providers&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Companies like Twilio and MessageBird connect businesses to phone carriers. They give businesses tools to send text messages without working with phone networks directly. When fraud passes through their systems, these providers may try to stop it, but still charge businesses for the messages sent.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Mobile Network Operators (MNOs)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;These companies run the networks that deliver messages to phones. Most work honestly, but SMS pumping schemes often include corrupt operators who charge extra fees for messages to numbers they control. These operators then split the money with the attackers who started the fraud.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Content Aggregators&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;These middlemen combine message traffic and work with many carriers to find the best routes. Most run honest operations, but their position in the message chain creates routing and oversight gaps that attackers can use.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Regulatory Bodies&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Groups like the GSM Association create rules and standards for the industry. These rules are hard to enforce because phone networks cross many countries with different laws.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Financial Flow&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The payment flow starts when businesses pay gateway providers to send messages. The gateway providers then pay fees to network operators based on where messages go. In fraud schemes, inflated fees go to corrupt operators who share the money with attackers. This creates a system where sending more fake messages makes more money for criminals while costing honest businesses more.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Effective Protection Strategies&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Protecting your organisation usually requires several controls:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Basic Protections&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Rate Limits&lt;/strong&gt;: Restrict how many verification attempts a user can make in a set time period.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Traffic Pattern Checks&lt;/strong&gt;: Track normal SMS message patterns and watch for changes that might indicate attacks.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Provider Protection&lt;/strong&gt;: Services like &lt;a href="https://prelude.so/"&gt;Prelude's SMS Pumping Protection&lt;/a&gt; find and block messages to fake numbers.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Other Ways to Verify Users&lt;/strong&gt;: Use app-based verification or push alerts instead of SMS codes.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Control by Country&lt;/strong&gt;: Limit SMS verification to countries where you do business and add more checks for countries with higher fraud risk.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Work with Trusted Partners&lt;/strong&gt;: Choose SMS service providers that focus on security and can help stop fraud quickly.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Advanced Protection Methods&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Residential Proxy Detection&lt;/strong&gt;: Find and block users who hide their true location behind home networks used as proxies.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Device Fingerprinting&lt;/strong&gt;: Collect device signals to track users across sessions and spot when many verification requests come from the same device.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;User Behaviour Tracking&lt;/strong&gt;: Learn how real users act on your site and flag unusual actions that might be bots.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Machine Learning Systems&lt;/strong&gt;: Use systems that learn from data to find hidden fraud patterns and adapt to new attack types.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Phone Number Checks&lt;/strong&gt;: Use lists of known bad numbers to decide which phone numbers need more verification steps.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Verify in Multiple Ways&lt;/strong&gt;: Ask users to prove who they are in different ways, such as email plus SMS, to make attacks harder.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Work with Other Companies&lt;/strong&gt;: Share information about new attack methods and bad phone numbers with other businesses.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Watch Transactions as They Happen&lt;/strong&gt;: Use systems that can pause message sending when they spot unusual patterns and learn from both legitimate and abusive traffic.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Measure the request before the message&lt;/h2&gt;
&lt;p&gt;The 2021 estimate establishes scale, not your current exposure. Start with your own send records: verification route,
country and carrier, account or session, messages per destination, completion rate, provider cost and the time between
requests. Join that with the edge decision that allowed the request to reach the SMS provider.&lt;/p&gt;
&lt;p&gt;Rate limits should follow the business action, not only the source IP. A practical policy can count by route, destination
prefix, account, device or network cohort, then step from logging to delay, challenge or block as confidence increases.
Residential proxy and fingerprint signals can add context, but neither proves fraud on its own.&lt;/p&gt;
&lt;p&gt;The messaging provider sees another part of the chain. &lt;a href="https://docs.prelude.so/guides/prevent-fraud"&gt;Prelude's fraud controls&lt;/a&gt;
can evaluate number and route risk while Peakhour controls the web request that initiated the send. Keep both outcomes in
the same incident record so the team can tell whether it stopped a fraudulent request, suppressed a legitimate customer
or merely moved the cost to another route.&lt;/p&gt;
&lt;p&gt;Set a spending alert and an emergency send limit before the first incident. During an attack, preserve the requests,
destinations, provider decisions and charges. Afterward, replay legitimate verification journeys and remove temporary
blocks that no longer have a defined job.&lt;/p&gt;</content><category term="Fraud"></category><category term="Fraud Prevention"></category><category term="Account Protection"></category><category term="Residential Proxies"></category><category term="Credential Stuffing"></category><category term="Bot Management"></category><category term="DDoS"></category></entry><entry><title>Why We Can't Trust IP Addresses</title><link href="https://www.peakhour.io/blog/residential-proxies-trust-issues/" rel="alternate"></link><published>2025-03-11T14:00:00+11:00</published><updated>2026-08-03T10:30:00+10:00</updated><author><name>AC</name></author><id>tag:www.peakhour.io,2025-03-11:/blog/residential-proxies-trust-issues/</id><summary type="html">&lt;p&gt;The proliferation of residential proxy networks has undermined traditional IP-based security, enabling attackers to bypass protection measures while appearing as legitimate users.&lt;/p&gt;</summary><content type="html">&lt;p&gt;This article is a dated market snapshot. Product prices, package sizes and vendor quotations reflect what was publicly advertised in March 2025. The enduring security point is that consumer and mobile connectivity can be packaged cheaply enough to weaken IP-only trust.&lt;/p&gt;
&lt;p&gt;Blocking bad traffic by checking an IP address used to be a reasonable starting point. It is not enough anymore. The rise of &lt;a href="/blog/residential-proxy-ad-fraud/"&gt;residential proxies&lt;/a&gt;, especially mobile proxies like those from Proxidize, has weakened one of the simpler assumptions in web security: that an IP address tells you much about who is behind a request.&lt;/p&gt;
&lt;h2&gt;Why is this a problem now?&lt;/h2&gt;
&lt;p&gt;Residential proxies route traffic through real household IP addresses, so requests look as if they come from normal homes rather than data centres. Companies like Proxidize have made mobile proxy setups accessible using Android phones or USB modems.&lt;/p&gt;
&lt;p&gt;In my presentations at AISA and other security conferences, I've described these proxies as systems that "masquerade internet usage as originating from residential and office networks," because they sit outside the assumptions used by many security controls.&lt;/p&gt;
&lt;p&gt;What has changed recently is access. Proxidize offers kits that let anyone set up a proxy farm - from 5-modem kits at $499 to 80-modem setups for around $6,000. They have turned proxy farming into a plug-and-play system where you can be up and running "in less than 60 seconds."&lt;/p&gt;
&lt;p&gt;The scale is large. Proxidize users process an estimated 80 billion records combined every single day: 80B+ Records Scraped Daily.&lt;/p&gt;
&lt;p&gt;The model is also being sold as a "passive income opportunity," where people can earn money by setting up proxy farms and selling access to others. In their recent webinar, they announced plans for a "Proxidize Grid" marketplace where users can sell their proxies with "a single click through an automated Marketplace."&lt;/p&gt;
&lt;h2&gt;The BYOD mobile proxy revolution&lt;/h2&gt;
&lt;p&gt;Companies like iProxy.online have taken this further with a Bring Your Own Device (BYOD) approach. Rather than requiring specialised hardware, they let customers turn any Android device into a mobile proxy.&lt;/p&gt;
&lt;p&gt;As Sabir, the cofounder of iProxy.online, explained in a recent interview, "You can install iProxy app here and in the dashboard you have proxy access like Socks5, HTTP accesses, and traffic goes through your device."&lt;/p&gt;
&lt;p&gt;This means anyone with an old Android phone and a SIM card can create their own mobile proxy, lowering the barrier to entry. For around $59 per month (based on Proxidize's pricing), users get access to what Sabir calls "precious" mobile IP addresses.&lt;/p&gt;
&lt;p&gt;Why are mobile IPs so valuable? As Sabir explains: "If you have Barcelona, we are here in Barcelona and you have like 2 million people living there and you have like several thousands of IP addresses from your mobile providers. And one IP address is shared by many. By thousands of people... And if you have mobile IP address, this cannot be blocked by Facebook or Instagram or any other services because in this case, like innocent people, like thousands of them will be blocked."&lt;/p&gt;
&lt;p&gt;This carrier-grade NAT (CGNAT) technology means mobile IP addresses are shared across thousands of users, making broad IP blocks difficult without affecting legitimate users.&lt;/p&gt;
&lt;h2&gt;What this enables attackers to do&lt;/h2&gt;
&lt;p&gt;With residential proxies, attackers can:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Hide behind legitimate IP addresses that security systems trust&lt;/li&gt;
&lt;li&gt;Bypass geo-restrictions to attack from what appears to be a local source&lt;/li&gt;
&lt;li&gt;Distribute attacks across thousands of residential IPs to avoid detection&lt;/li&gt;
&lt;li&gt;Make malicious traffic look like it comes from normal users&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;In my work at Peakhour.IO, we've seen a rise in attacks originating from these residential proxies. The Chinese state-sponsored group Camaro Dragon showed the potential of the model when they developed custom firmware for TP-Link routers, turning them into residential proxies for their operations. This method let them bypass traditional defences like GeoIP blocking because the traffic appeared to come from normal homes.&lt;/p&gt;
&lt;p&gt;The broader trend is commoditisation. You no longer need to be a nation-state actor to use them. Anyone with a few hundred dollars can set up a &lt;a href="/products/residential-proxy-detection/"&gt;residential proxy&lt;/a&gt; farm or use services like iProxy.online to route their traffic through mobile networks.&lt;/p&gt;
&lt;h2&gt;How it obscures an operator's infrastructure&lt;/h2&gt;
&lt;p&gt;State-sponsored actors such as Volt Typhoon have used compromised small-office and home-office network devices to proxy command-and-control traffic. That use maps to MITRE ATT&amp;amp;CK's proxy technique, T1090: the relay conceals the infrastructure behind the operation.&lt;/p&gt;
&lt;p&gt;It does not follow that every stage of an intrusion, including data collection or exfiltration, travelled through residential proxies. Keep the claim attached to the observed behaviour: compromised edge devices carried or concealed operational traffic.&lt;/p&gt;
&lt;p&gt;For a precise explanation of the mapping, read &lt;a href="/blog/residential-proxies-mitre-framework/"&gt;Where Residential Proxies Fit in MITRE ATT&amp;amp;CK&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;How it enables credential stuffing and other attacks&lt;/h2&gt;
&lt;p&gt;Credential stuffing attacks have hit Australian businesses hard, with companies like The Iconic, Guzman y Gomez, Dan Murphy's, and others falling victim. Residential proxies help these attacks work because attackers can distribute their login attempts across thousands of residential IP addresses.&lt;/p&gt;
&lt;p&gt;When an attack comes through residential proxies, each login attempt appears to come from a different legitimate user. IP-based rate limiting fails because no single IP shows suspicious volume. Even when security teams try to block suspicious regions, proxies let attackers appear to be local customers.&lt;/p&gt;
&lt;p&gt;According to our research at Peakhour.IO, traditional &lt;a href="/products/ip-intelligence/"&gt;IP intelligence&lt;/a&gt; services are failing to detect these proxies. Tests we conducted showed that top providers like Maxmind detected 0% of residential proxies, while even the best performer, IP Quality Score, only identified 24%.&lt;/p&gt;
&lt;p&gt;The traffic share can be significant. We've seen cases where up to 40% of traffic to Australian e-commerce sites consists of bots using residential proxies for credential stuffing, price scraping, and inventory checking. This puts customer accounts at risk, distorts analytics, and wastes marketing budgets on fake traffic.&lt;/p&gt;
&lt;h2&gt;The TCP/IP fingerprinting challenge&lt;/h2&gt;
&lt;p&gt;One aspect of mobile proxies that makes them even more effective is the ability to match TCP/IP fingerprints with the purported device. As Sabir from iProxy.online explains:&lt;/p&gt;
&lt;p&gt;"In some cases, your fingerprint, TCP fingerprint should match to your user agent. For example, if you like pretending to be a Mac user or iOS user or Windows user, your TCP fingerprint should be matched with your browser fingerprint."&lt;/p&gt;
&lt;p&gt;This means detection mechanisms that look for mismatches between TCP/IP fingerprints and browser types can also be bypassed.&lt;/p&gt;
&lt;h2&gt;Anybody can now set them up&lt;/h2&gt;
&lt;p&gt;The barrier to entry for setting up residential proxies has fallen sharply. Companies like Proxidize market their products as simple to use, with statements like "Start using Proxidize in less than 60 seconds."&lt;/p&gt;
&lt;p&gt;There are YouTube videos showing how to earn "passive income" by setting up proxy farms. One video explains how hosts can earn "$200 a month minimum" by hosting Proxidize hardware in their homes.&lt;/p&gt;
&lt;p&gt;With iProxy.online, it's even simpler—just install an app on an Android phone, and you have a mobile proxy. As Sabir explains, "Actually your expenses are like you pay like for the SIM card, you pay a small subscription fee to the service and you just... That's it. It requires like one minute of work just to download an app."&lt;/p&gt;
&lt;p&gt;This accessibility means residential proxy use is no longer limited to nation-states and sophisticated cybercriminal organisations. It is now within reach of anyone with basic technical skills.&lt;/p&gt;
&lt;h2&gt;The solution: per-connection detection&lt;/h2&gt;
&lt;p&gt;The rise of residential proxies means IP reputation databases are not enough on their own. As I've been explaining in my talks, "Residential proxies pose a significant challenge to traditional defense mechanisms... making malicious traffic appear legitimate."&lt;/p&gt;
&lt;p&gt;The practical answer is per-connection detection that looks at network behaviour patterns rather than just IP addresses. At Peakhour.IO, we stack detections across layers to identify and mitigate proxy traffic.&lt;/p&gt;
&lt;p&gt;A useful technique is analysing protocol behaviour. When traffic passes through a residential proxy, there are often detectable differences between network signatures (which come from the proxy) and the application behaviour (which comes from the third-party application).&lt;/p&gt;
&lt;p&gt;These techniques can identify proxy connections even when they come from legitimate residential IP addresses, giving defenders a way to respond without blocking whole residential or mobile networks.&lt;/p&gt;
&lt;h2&gt;A call to action for businesses&lt;/h2&gt;
&lt;p&gt;If you're a business, especially in e-commerce, financial services, or any industry that relies on user accounts, residential proxy traffic needs to be part of your security model.&lt;/p&gt;
&lt;p&gt;Traditional security approaches based on IP reputation, geolocation, and rate limiting are no longer sufficient. You need to implement per-connection detection that can identify residential proxy usage regardless of the source IP address.&lt;/p&gt;
&lt;p&gt;At Peakhour.IO, we've seen organisations fall victim to attacks that could have been prevented with the right detection mechanisms. Waiting until credential stuffing or data exfiltration becomes visible is the expensive way to learn this lesson.&lt;/p&gt;
&lt;p&gt;IP addresses alone can no longer tell us who to trust. We need to look deeper at each connection to protect systems and data now that proxy networks are easy to rent or build.&lt;/p&gt;</content><category term="Residential Proxies"></category><category term="Residential Proxies"></category><category term="DDoS"></category><category term="Credential Stuffing"></category><category term="DNS"></category><category term="Threat Detection"></category><category term="Account Protection"></category></entry><entry><title>How AI Agents Are Writing Custom Exploits</title><link href="https://www.peakhour.io/blog/ai-agents-custom-exploits/" rel="alternate"></link><published>2025-02-17T14:00:00+11:00</published><updated>2025-02-17T14:00:00+11:00</updated><author><name>AC</name></author><id>tag:www.peakhour.io,2025-02-17:/blog/ai-agents-custom-exploits/</id><summary type="html">&lt;p&gt;AI agents with reasoning capabilities like DeepSeek are revolutionizing exploit development, marking the end of traditional security approaches based on static rules and patterns.&lt;/p&gt;</summary><content type="html">&lt;p&gt;The trend is clear enough: AI agents can now craft exploits by analysing security responses in real time. That puts static security rules and traditional Web Application Firewalls (WAFs) under direct pressure. Here is why.&lt;/p&gt;
&lt;p&gt;Last week I examined an AI agent probing a test environment. It sent requests, observed the responses, then built bypasses for each security control in sequence. The agent identified pattern-based rules, learned their structure, and generated variations until it found gaps. It did this without human intervention.&lt;/p&gt;
&lt;p&gt;This kind of automated exploit development changes the operating conditions for defenders. Traditional defences rely on known patterns: regex rules, signature matching, IP reputation. Those approaches assume threats follow recognisable templates. That assumption is becoming much weaker.&lt;/p&gt;
&lt;p&gt;Consider a standard WAF rule blocking &lt;a href="/products/waf/"&gt;SQL injection&lt;/a&gt; through pattern matching. An AI agent examines the responses, determines the matching patterns, then generates unique variants designed to bypass those rules while maintaining the exploit's functionality. The variants evolve as the agent learns which approaches succeed.&lt;/p&gt;
&lt;p&gt;The same pattern applies beyond SQL injection. AI agents can probe XSS filters, access controls, and input validation in the same systematic way. Each static rule becomes something the agent can test, infer, and work around.&lt;/p&gt;
&lt;p&gt;By 2026, I estimate AI agents will drive over 50% of exploit attempts. The speed of this shift stems from three factors:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;AI agents operate continuously, testing and learning 24/7&lt;/li&gt;
&lt;li&gt;Successful exploits feed back into training data, improving future attempts&lt;/li&gt;
&lt;li&gt;Agents share knowledge, building collective intelligence about bypass techniques&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This is the practical limit of static security. Traditional WAFs that rely on fixed rules and signatures struggle to keep pace with AI-generated exploits. Each rule loses value as agents discover new bypasses.&lt;/p&gt;
&lt;p&gt;The path forward requires a different security architecture. Organisations need context-aware systems that analyse intent, not just patterns. These systems use behavioural AI to distinguish between legitimate requests and exploit attempts, even when the request structure changes.&lt;/p&gt;
&lt;p&gt;Key elements of this new approach include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Intent analysis through deep inspection of request sequences&lt;/li&gt;
&lt;li&gt;Behavioural modelling of normal vs malicious patterns&lt;/li&gt;
&lt;li&gt;Real-time adaptation as new exploit techniques emerge&lt;/li&gt;
&lt;li&gt;Proactive identification of potential vulnerabilities&lt;/li&gt;
&lt;li&gt;Integration of threat intelligence across systems&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The challenge intensifies when AI agents leverage &lt;a href="/products/residential-proxy-detection/"&gt;residential proxies&lt;/a&gt;. These proxies route traffic through real consumer IP addresses, bypassing location-based blocks. An AI agent operating through residential proxies can probe defences while appearing to come from legitimate users worldwide.&lt;/p&gt;
&lt;p&gt;This combination of AI-driven exploit generation and residential proxy networks makes traditional controls much less reliable. Organisations that continue to rely on static rules face a growing risk of compromise.&lt;/p&gt;
&lt;p&gt;Security teams should respond now:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Audit existing WAF rules to identify pattern-based weaknesses&lt;/li&gt;
&lt;li&gt;Deploy behavioural analysis capabilities to detect malicious intent&lt;/li&gt;
&lt;li&gt;Implement adaptive security controls that evolve with threats&lt;/li&gt;
&lt;li&gt;Monitor for AI-driven probing attempts&lt;/li&gt;
&lt;li&gt;Build detection for residential proxy traffic&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Teams that wait risk watching their defences get mapped and bypassed by automated agents. Static rules alone are not enough for this level of probing.&lt;/p&gt;
&lt;p&gt;This also requires a shift in how we approach security. Rather than only blocking specific patterns, we need to understand and control the broader context of system interactions. The goal moves from "preventing known attacks" to "identifying and blocking malicious behaviour, regardless of its specific form."&lt;/p&gt;
&lt;p&gt;Adaptive security systems need to reason about traffic in the same context-aware way as the agents probing them. Static rules still have a role, but they cannot be the centre of the defence.&lt;/p&gt;
&lt;p&gt;Security strategy needs to account for this now, because AI-driven probing is no longer hypothetical.&lt;/p&gt;
&lt;h2&gt;The Reasoning Model Revolution&lt;/h2&gt;
&lt;p&gt;The emergence of open &lt;a href="/blog/agentic-ai-deepseek-changes-everything/"&gt;reasoning models&lt;/a&gt; like DeepSeek pushes this further. Unlike traditional AI that follows programmed patterns, reasoning models understand context and adapt strategies dynamically. That creates harder security problems.&lt;/p&gt;
&lt;p&gt;Consider how a reasoning model approaches security testing. Rather than simply probing for weaknesses, it builds a conceptual model of the system's defences. It understands the purpose of security controls and reasons about potential bypasses. That allows it to generate novel attack strategies that were not present in training data.&lt;/p&gt;
&lt;p&gt;DeepSeek demonstrates this shift. Within months of release, it showed capabilities matching established players at a fraction of the cost. This rapid progress comes from reasoning models' ability to understand and adapt, not just pattern match.&lt;/p&gt;
&lt;p&gt;For security teams, that is a material challenge. Reasoning models do not just find gaps in rules. They infer why rules exist, deduce the logic behind security controls, and generate attacks that exploit underlying assumptions.&lt;/p&gt;
&lt;p&gt;By 2027, I expect reasoning models to handle most security testing and exploit development. Their advantages prove too compelling:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;They understand system architecture and security principles&lt;/li&gt;
&lt;li&gt;They generate novel attack strategies through reasoning&lt;/li&gt;
&lt;li&gt;They adapt in real-time based on system responses&lt;/li&gt;
&lt;li&gt;They share and build upon successful approaches&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This shift pushes traditional security approaches past their useful boundary faster than many teams expect. Pattern matching and rule-based systems cannot reliably counter an opponent that understands and reasons about their operating logic.&lt;/p&gt;
&lt;p&gt;The combination of reasoning models with residential proxies is especially difficult to defend against. Reasoning models devise sophisticated attacks while proxies mask their origin. Each successful breach feeds back into the model's understanding, improving future attempts.&lt;/p&gt;
&lt;p&gt;Security teams must embrace a new paradigm focused on:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Understanding attack narratives rather than patterns&lt;/li&gt;
&lt;li&gt;Detecting anomalous reasoning rather than known signatures&lt;/li&gt;
&lt;li&gt;Building systems that adapt to novel attack strategies&lt;/li&gt;
&lt;li&gt;Implementing security that reasons about intent&lt;/li&gt;
&lt;li&gt;Developing defences that evolve through adversarial learning&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Security systems need to reason about threats as effectively as the AI agents probing them. Traditional approaches will fail against opponents that understand the logic behind security controls and devise creative bypasses.&lt;/p&gt;
&lt;p&gt;The age of reasoning security has begun. Static rules and pattern matching are no longer enough on their own.&lt;/p&gt;
&lt;p&gt;The question is how quickly security teams can move from fixed patterns to adaptive, intent-aware defence.&lt;/p&gt;</content><category term="Security"></category><category term="Application Security"></category><category term="Threat Detection"></category><category term="DevSecOps"></category><category term="Bot Management"></category><category term="API Security"></category><category term="DDoS"></category></entry><entry><title>A/B Testing, Bots, and the New Normal</title><link href="https://www.peakhour.io/blog/marketing-ai-agents-ab-testing/" rel="alternate"></link><published>2025-02-13T14:00:00+11:00</published><updated>2025-02-13T14:00:00+11:00</updated><author><name>AC</name></author><id>tag:www.peakhour.io,2025-02-13:/blog/marketing-ai-agents-ab-testing/</id><summary type="html">&lt;p&gt;How AI agents are skewing marketing metrics and why traditional A/B testing needs to evolve for the age of autonomous digital interactions.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Marketing traffic is no longer just human traffic. We spent months analysing how AI agents interact with websites, and the findings put pressure on a core assumption behind digital marketing: that campaign data mostly reflects human behaviour.&lt;/p&gt;
&lt;p&gt;Consider a simple A/B test on a landing page. The data shows a clear winner, with conversion rates 30% higher than the control. You ship the change, then the live result misses the forecast. One possible cause is that AI agents were counted in the test population.&lt;/p&gt;
&lt;p&gt;This is not speculation. We have observed AI agents, from shopping bots to research tools, interacting with marketing campaigns in ways that weaken traditional metrics. These agents do not behave like people. They optimise for efficiency, not experience. They follow patterns, not preferences.&lt;/p&gt;
&lt;p&gt;The consequence is straightforward. A/B test results may reflect what works best for AI agents rather than human users. Conversion metrics may combine human decisions with automated actions. A marketing funnel can end up optimising for the wrong audience.&lt;/p&gt;
&lt;p&gt;The scale became clear when we analysed traffic patterns across various sectors. In ecommerce, AI agents now account for up to 40% of product page views. For content sites, the figure rises to 60% for certain categories. These are not simple scraper bots. They interact with content, follow links, and even complete transactions.&lt;/p&gt;
&lt;p&gt;Blocking all of this traffic is not a practical answer. Many agents serve legitimate purposes, from price comparison to content aggregation. Marketing teams now need to recognise and measure a dual audience: human and AI.&lt;/p&gt;
&lt;p&gt;Through our research, we have identified three shifts in marketing strategy:&lt;/p&gt;
&lt;p&gt;First, marketing funnels need to bifurcate. One path should be optimised for human users, with emphasis on engagement and experience. Another should serve AI agents, with structured data and efficient access to information.&lt;/p&gt;
&lt;p&gt;Second, A/B testing needs new frameworks. Analysis should separate AI and human interactions. That requires stronger detection methods and separate datasets for each audience type.&lt;/p&gt;
&lt;p&gt;Third, attribution models need to evolve. When an AI agent researches products before recommending them to a human user, who gets credit for the conversion? The traditional last-click model does not capture that sequence well.&lt;/p&gt;
&lt;p&gt;The problem is not limited to metrics. AI agents use residential proxies to mask their nature, making detection difficult. They learn and adapt, which means identification methods need regular updates. They also operate at scale, potentially overwhelming analytics systems.&lt;/p&gt;
&lt;p&gt;There are useful opportunities here, but they need to be treated with discipline. Organisations that adapt their marketing strategies can optimise content delivery for both audiences. They can use AI agents as a marketing channel where that makes sense. They can also build campaigns that are less exposed to polluted measurement.&lt;/p&gt;
&lt;p&gt;The path forward starts with a clearer operating model. Marketing teams need to treat AI agents as a distinct audience segment, with different behaviours and requirements. They also need tools and metrics that measure performance across both audiences without mixing them together.&lt;/p&gt;
&lt;p&gt;Our research suggests several practical steps:&lt;/p&gt;
&lt;p&gt;Implement robust bot detection systems to identify AI agent traffic. This gives teams the basis for separate analysis of human and AI interactions.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Develop structured data formats that serve AI agents efficiently while maintaining rich experiences for human users.&lt;/li&gt;
&lt;li&gt;Create attribution models that account for the role of AI agents in the customer journey.&lt;/li&gt;
&lt;li&gt;Monitor residential proxy usage to understand the true nature of website traffic.&lt;/li&gt;
&lt;li&gt;Build marketing strategies that balance the needs of both audience segments.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Marketing data will keep changing as AI agents become more sophisticated. The line between human and automated interactions may blur further. Teams that recognise the split can make better decisions about testing, attribution, and campaign design.&lt;/p&gt;
&lt;p&gt;Organisations that continue to treat all traffic as human risk optimising for the wrong audience. Organisations that separate the signal can make better use of both human and AI traffic.&lt;/p&gt;
&lt;p&gt;Our next challenge is understanding how AI agents influence human decision-making. That is a separate question.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;The views expressed in this article reflect our research and analysis of AI agent behaviour in marketing environments. We encourage organisations to conduct their own analysis and develop strategies suited to their specific circumstances.&lt;/em&gt;&lt;/p&gt;</content><category term="Fraud"></category><category term="Bot Management"></category></entry><entry><title>When Bots Are Your Primary Users</title><link href="https://www.peakhour.io/blog/future-of-apis-bot-primary-users/" rel="alternate"></link><published>2025-02-12T14:00:00+11:00</published><updated>2025-02-12T14:00:00+11:00</updated><author><name>AC</name></author><id>tag:www.peakhour.io,2025-02-12:/blog/future-of-apis-bot-primary-users/</id><summary type="html">&lt;p&gt;An exploration of how AI agents are reshaping API design principles and why we must evolve our approach to serve both machine and human consumers.&lt;/p&gt;</summary><content type="html">&lt;p&gt;APIs have mostly been designed for human developers first. Reasoning models like DeepSeek make that assumption weaker. If an agent can inspect an API, plan a sequence of calls, and adapt as it goes, it becomes a different kind of consumer.&lt;/p&gt;
&lt;p&gt;That is the part worth paying attention to. Many APIs still assume a human-first model while AI agents become regular, and in some cases primary, users. These are not simple scraping bots or automation scripts. Modern AI agents can plan, reason, and change their behaviour. They interact with APIs in ways many teams did not account for when they wrote their OpenAPI specifications and documentation.&lt;/p&gt;
&lt;p&gt;A human developer reads documentation, tries a few calls, and works through errors. An AI agent can process the whole API surface in seconds, generate thousands of possible interaction patterns, and test them systematically. That difference changes both API design and API security.&lt;/p&gt;
&lt;p&gt;The issue is not limited to technical specifications. API logs already show traffic patterns that challenge older assumptions. AI agents do not follow typical "business hours" usage. They do not slow down because a workflow becomes cognitively heavy. They process responses at machine speed and chain API calls in ways human developers rarely attempt.&lt;/p&gt;
&lt;p&gt;This shift forces us to rethink several core aspects of API design:&lt;/p&gt;
&lt;h3&gt;Structure and Format&lt;/h3&gt;
&lt;p&gt;Human-readable formats still matter, but they are not the only target. JSON and REST endpoints work well for developers who need to read and understand responses. For AI agents, there may be room for more efficient formats that optimise for machine processing rather than human comprehension.&lt;/p&gt;
&lt;h3&gt;Rate Limiting and Quotas&lt;/h3&gt;
&lt;p&gt;Most rate limiting models still assume human consumption patterns. AI agents operate at machine speed and scale. New models need to account for that processing capacity while still preventing abuse. That may mean moving from simple request counts to complexity-based quotas.&lt;/p&gt;
&lt;h3&gt;Authentication and Security&lt;/h3&gt;
&lt;p&gt;Traditional API keys and OAuth flows centre on human developers. AI agents need security models that account for how they operate. The hard problem is verifying the identity and intentions of an AI agent without weakening the security controls around the API.&lt;/p&gt;
&lt;h3&gt;Documentation and Discovery&lt;/h3&gt;
&lt;p&gt;API documentation still focuses on human understanding. For AI agents, machine-readable specifications need to go beyond OpenAPI. They should describe what endpoints do, not just how to call them.&lt;/p&gt;
&lt;p&gt;This also changes how we monitor and maintain APIs. Traditional metrics like response time and error rates remain useful, but they do not explain AI agent behaviour on their own. How do we measure the "success" of an API when its primary users are machines that can adapt to problems and work around them?&lt;/p&gt;
&lt;p&gt;Performance optimisation changes as well. A human developer might tolerate occasional latency. An AI agent can make thousands of calls per second, which puts more pressure on caching, edge computing, and response optimisation.&lt;/p&gt;
&lt;p&gt;APIs are likely to split into two parallel tracks: human-oriented interfaces that prioritise developer experience, and machine-oriented interfaces optimised for AI consumption. This is not a choice between one audience and the other. It is recognition that they have different needs.&lt;/p&gt;
&lt;p&gt;The challenge extends to business models. How do we price APIs when consumers are AI agents that can process information at machine scale? Traditional per-request pricing may not make sense when an AI can make millions of optimised calls that would take a human developer years to replicate.&lt;/p&gt;
&lt;p&gt;Residential proxies add another layer of complexity. They allow AI agents to appear as regular users, making it harder to distinguish between human and machine traffic. That pushes API access control beyond IP-based rate limiting.&lt;/p&gt;
&lt;p&gt;The ethical questions also matter. As APIs become primarily consumed by AI agents, teams need frameworks for responsible use. That includes asking how an API might be used inside AI systems, and what guardrails should sit around that access.&lt;/p&gt;
&lt;p&gt;This is not about replacing human developers. It is about recognising AI agents as a new class of API consumer, with their own needs and capabilities. API design, security, and management all need to account for that.&lt;/p&gt;
&lt;p&gt;The APIs we build today will sit under tomorrow's AI-driven systems. They need to be designed for both human and AI consumers, with clear decisions about discovery, access, rate limits, authentication, monitoring, and abuse controls.&lt;/p&gt;
&lt;p&gt;The shift to AI-first API design is already under way. The practical question is how quickly API practices can catch up.&lt;/p&gt;
&lt;p&gt;Our APIs have to evolve with their users.&lt;/p&gt;</content><category term="Security"></category><category term="Bot Management"></category><category term="API Security"></category><category term="Machine Learning"></category></entry><entry><title>Data-Driven Risk Management</title><link href="https://www.peakhour.io/blog/data-driven-risk-management-contextual-security/" rel="alternate"></link><published>2025-02-07T00:00:00+11:00</published><updated>2025-02-07T00:00:00+11:00</updated><author><name>AC</name></author><id>tag:www.peakhour.io,2025-02-07:/blog/data-driven-risk-management-contextual-security/</id><summary type="html">&lt;p&gt;How Peakhour's contextual security aligns with Visa's data-driven risk management approach in the 2025-2028 Security Roadmap.&lt;/p&gt;</summary><content type="html">&lt;p&gt;After our examination of &lt;a href="/blog/visa-security-roadmap-2025-overview/"&gt;Visa's Security Roadmap&lt;/a&gt;, this article looks at how Peakhour's contextual
security approach supports Visa's third key focus area: shifting to a data-driven, risk-based approach.&lt;/p&gt;
&lt;h2&gt;The Evolution of Risk Management&lt;/h2&gt;
&lt;p&gt;Traditional security controls often rely on static rules and fixed thresholds. Visa's Security Roadmap 2025-2028 emphasises the need for dynamic, data-driven risk management that adapts to emerging threats while keeping operations efficient. That shift is important for attacks like &lt;a href="/blog/credential-stuffing-threat-australian-businesses/"&gt;credential stuffing&lt;/a&gt; and &lt;a href="/blog/preventing-enumeration-attacks-visa-roadmap/"&gt;enumeration
attacks&lt;/a&gt;, which exploit weak points in static defences.&lt;/p&gt;
&lt;h2&gt;Understanding Contextual Security&lt;/h2&gt;
&lt;p&gt;Contextual security moves beyond fixed rules by using real-time data analysis to assess risk and choose a proportionate response. It starts by collecting a broad set of signals for each interaction, including user behaviour patterns, device characteristics, network indicators like &lt;a href="/blog/tls-fingerprinting/"&gt;TLS fingerprints&lt;/a&gt;, geographic patterns, and historical trends.&lt;/p&gt;
&lt;p&gt;Those signals feed a dynamic risk assessment engine with continuous monitoring and adaptive thresholds. Using techniques such as behavioural analysis and &lt;a href="/blog/advanced-anomaly-detection-rrcf-application-security/"&gt;anomaly detection&lt;/a&gt;, the system can identify subtle deviations from normal activity that may signal a threat. The result is a response matched to the risk: triggering risk-based authentication, applying adaptive security measures, or initiating an automated threat response with customised rules.&lt;/p&gt;
&lt;h2&gt;How Peakhour Aligns with Visa's Vision&lt;/h2&gt;
&lt;p&gt;Our &lt;a href="/solutions/use-case/contextual-security/"&gt;Contextual Security&lt;/a&gt; platform supports Visa's data-driven approach by combining multiple layers of defence. At the core is edge intelligence, which uses a global network to process data in real time, close to the user. This supports rapid identification of emerging threats, sharing threat intelligence across the network, and responding to attacks as they happen.&lt;/p&gt;
&lt;p&gt;This is backed by advanced analytics that use machine learning models, behavioural analysis, pattern recognition, and anomaly detection. These tools are essential for identifying sophisticated threats, such as bots using residential proxies or &lt;a href="/blog/anti-detect-browsers-application-security-threat/"&gt;anti-detect browsers&lt;/a&gt;. By analysing connection-level data, we can distinguish malicious automation from legitimate user traffic, a task traditional IP-based methods often fail.&lt;/p&gt;
&lt;p&gt;This analysis supports risk-based decision-making. Instead of applying one-size-fits-all rules, our platform implements dynamic security measures. This includes adaptive authentication, contextual access controls, risk-based policies, and automated responses like advanced rate limiting, which can help stop distributed attacks.&lt;/p&gt;
&lt;h2&gt;Key Benefits of a Data-Driven Approach&lt;/h2&gt;
&lt;p&gt;Adopting a data-driven, contextual security model gives organisations practical advantages. It improves security through earlier threat detection and a reduction in false positives. The broader coverage protects against a wider range of attacks, from automated bots to manual fraud attempts.&lt;/p&gt;
&lt;p&gt;At the same time, it can improve the user experience. By assessing risk more accurately, the system can reduce friction for legitimate users, support faster transactions, and make authentication less intrusive. This personalised security approach strengthens trust without sacrificing usability, a necessary balance for modern businesses.&lt;/p&gt;
&lt;p&gt;Finally, this strategy improves operational efficiency. Automated responses reduce the need for manual review and intervention, optimising resource allocation. The scalable nature of the platform ensures that security can keep pace with business growth, providing a more sustainable way to manage risk.&lt;/p&gt;
&lt;h2&gt;Implementing Contextual Security&lt;/h2&gt;
&lt;p&gt;Organisations can implement contextual security by assessing their current state: reviewing existing controls, identifying data sources, and evaluating current capabilities. A planning phase then defines objectives, selects appropriate solutions, and establishes key performance metrics. Deployment follows, with systems installed, rules configured, staff trained, and performance monitored continuously.&lt;/p&gt;
&lt;p&gt;To maximise effectiveness, teams need high-quality, real-time data collection while maintaining user privacy. They also need a robust analysis framework: well-defined risk models, adaptive thresholds, and clear policies for automation. Finally, response mechanisms should be practical to operate, with automated workflows and controls that can be monitored and refined over time.&lt;/p&gt;
&lt;h2&gt;Real-World Applications and Future Considerations&lt;/h2&gt;
&lt;p&gt;In practice, contextual security applies across several security workflows. For authentication, it enables risk-based multi-factor authentication and adaptive policies. In transaction monitoring, it allows for real-time analysis and fraud prevention. For access control, it supports dynamic permissions based on context-aware rules.&lt;/p&gt;
&lt;p&gt;Looking ahead, organisations should prepare for the increasing role of advanced analytics, including AI and predictive analytics. Integration with other systems through APIs will be important, as will adapting to evolving regulatory requirements and new threat vectors.&lt;/p&gt;
&lt;h2&gt;Final Thoughts&lt;/h2&gt;
&lt;p&gt;The shift to data-driven risk management is an important change in security strategy. Peakhour's contextual security solutions help organisations align with Visa's vision while improving security, efficiency, and user experience. Moving beyond static rules to an adaptive defence gives businesses a better way to protect themselves and their customers in a more complex digital environment.&lt;/p&gt;
&lt;p&gt;--&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Learn how Peakhour's contextual security solutions can help your organisation implement data-driven risk management aligned with Visa's Security Roadmap 2025-2028. &lt;a href="/contact-sales/"&gt;Contact our team&lt;/a&gt; to improve your security posture.&lt;/em&gt;&lt;/p&gt;</content><category term="Account Protection"></category><category term="Account Protection"></category><category term="Application Security"></category><category term="Credential Stuffing"></category><category term="API Security"></category><category term="Threat Detection"></category><category term="PCI DSS"></category></entry><entry><title>Why Reasoning Models Like DeepSeek Change Everything</title><link href="https://www.peakhour.io/blog/agentic-ai-deepseek-changes-everything/" rel="alternate"></link><published>2025-02-03T08:13:00+11:00</published><updated>2025-02-03T08:13:00+11:00</updated><author><name>AC</name></author><id>tag:www.peakhour.io,2025-02-03:/blog/agentic-ai-deepseek-changes-everything/</id><summary type="html">&lt;p&gt;How open reasoning models transform automation from rigid scripts to autonomous agents, fundamentally changing our approach to security and digital interactions.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Open reasoning models change how we need to think about automation and security. Looking at models like DeepSeek, the important shift is not another small gain in AI capability. It is the move towards autonomous agents that can plan, reason, and adapt without human guidance.&lt;/p&gt;
&lt;p&gt;This became clear while analysing recent credential stuffing attacks. The patterns showed attackers using AI agents to probe systems, identify vulnerabilities, and craft custom exploits. These were not pre-programmed scripts following rigid rules. They were agents making decisions based on the system's responses.&lt;/p&gt;
&lt;p&gt;The implications go beyond security. Consider how marketing teams usually approach A/B testing and campaign optimisation. Most tools and frameworks assume automation follows fixed paths: if this happens, do that. Reasoning models do not fit that model. They can work without predefined decision trees or explicit step-by-step instructions. They observe, learn, and create their own strategies.&lt;/p&gt;
&lt;p&gt;This forces us to rethink basic assumptions about digital interactions. When an API call could come from an AI agent rather than a script, how do we distinguish friend from foe? Traditional markers such as request patterns, user agents, and IP addresses carry less weight when an agent can analyse and adapt to detection methods.&lt;/p&gt;
&lt;p&gt;The same problem applies to customer engagement. Marketing funnels designed for human decision-making now face AI agents that can evaluate options systematically, compare alternatives across multiple sources, and make optimised choices. The customer journey stops being a neat linear path and becomes a space where AI agents operate alongside human users.&lt;/p&gt;
&lt;p&gt;Reasoning models also challenge the way we approach bot management. Traditional methods focus on identifying automated behaviour: patterns that deviate from human norms. But what happens when AI agents can mimic human behaviour while operating at machine speed? The line between human and automated traffic becomes harder to draw.&lt;/p&gt;
&lt;p&gt;Through conversations with security teams, I have seen this pattern emerge. They report sophisticated attacks that adapt in real-time, probing defences and adjusting tactics based on system responses. These are not pre-programmed behaviours. They are reasoning models understanding and responding to defensive measures.&lt;/p&gt;
&lt;p&gt;The business impact extends beyond security. Companies need to adapt digital infrastructure for a world where AI agents become primary users. That means rethinking API design, service architecture, and customer interaction models. The question is not whether to support AI agents, but how to do it safely and effectively.&lt;/p&gt;
&lt;p&gt;Authentication is a good example. Traditional systems often rely on proving human presence through CAPTCHAs, behaviour analysis, and device fingerprinting. In a world of reasoning models, we need approaches that focus on intent and trust rather than a simple human versus machine test.&lt;/p&gt;
&lt;p&gt;The path forward is a shift in perspective. Rather than only trying to block or restrict AI agents, we need systems that can interact with them safely. That means moving from static rule-based security to contextual analysis that understands and adapts to agent behaviour.&lt;/p&gt;
&lt;p&gt;The strategic implications for businesses are significant. Success in this environment requires a clear understanding of how reasoning models operate. Companies must redesign digital interfaces to support both human and AI interactions while maintaining security and control.&lt;/p&gt;
&lt;p&gt;From my analysis of current trends, this change is accelerating. Each advance in reasoning models expands their capability and autonomy. Organisations that adapt their strategies now will be better positioned as this digital environment changes.&lt;/p&gt;
&lt;p&gt;The rise of reasoning models is more than another technology upgrade. It changes how we approach automation, security, and digital interaction. Organisations need systems capable of engaging safely and effectively with autonomous AI agents.&lt;/p&gt;
&lt;p&gt;The question is not whether reasoning models will change business operations. They already are. The practical question is how quickly organisations can adapt their strategies and infrastructure, and whether they can do it without losing control of trust, security, and user experience.&lt;/p&gt;</content><category term="Security"></category><category term="DevSecOps"></category><category term="Bot Management"></category><category term="Credential Stuffing"></category><category term="Machine Learning"></category></entry><entry><title>Did Residential Proxies enable a $600 Billion loss?</title><link href="https://www.peakhour.io/blog/residential-proxies-deepseek/" rel="alternate"></link><published>2025-01-31T00:00:00+11:00</published><updated>2025-01-31T00:00:00+11:00</updated><author><name>AC</name></author><id>tag:www.peakhour.io,2025-01-31:/blog/residential-proxies-deepseek/</id><summary type="html">&lt;p&gt;How residential proxy networks may have enabled DeepSeek to bypass AI platform protections, leading to Nvidia's historic market value loss&lt;/p&gt;</summary><content type="html">&lt;p&gt;The DeepSeek story puts &lt;a href="/learning/threat-detection/what-is-residential-proxy-detection/"&gt;residential proxy&lt;/a&gt; networks under scrutiny as a possible factor in
AI's latest market disruption. In January 2025, the Chinese startup's emergence erased $600 billion from Nvidia's market
value by demonstrating AI capabilities that match industry leaders at a fraction of the cost.&lt;/p&gt;
&lt;p&gt;The path to this capability raises a practical security question for AI platforms. Leading platforms protect their APIs with multiple security layers -
rate limiting to prevent mass data extraction, bot detection
to block automated requests, and geoblocking to restrict access from certain regions. These measures are meant to prevent the systematic collection of training data.&lt;/p&gt;
&lt;p&gt;Residential &lt;a href="/products/residential-proxy-detection/"&gt;proxy networks&lt;/a&gt; create a route around those protections. These networks route traffic through
household IP addresses, so requests appear to originate from homes in permitted regions.
A request from a restricted location could look like legitimate traffic from Sydney, Melbourne, or Perth.&lt;/p&gt;
&lt;p&gt;The circumstances suggest this approach is plausible. By distributing requests across millions of residential IPs worldwide,
each IP could maintain human-like patterns while staying below rate limits. The aggregate data could form a substantial
training set without triggering security alerts.&lt;/p&gt;
&lt;p&gt;Meta's lawsuit against Bright Data strengthens this possibility. The case exposed how proxy providers monetise residential
IPs, often without homeowners' knowledge. That model creates a global network capable of bypassing traditional security
measures - exactly the type of infrastructure needed for large-scale data collection.&lt;/p&gt;
&lt;p&gt;The residential proxy industry threatens $600 billion in business value through data theft and security bypasses.
DeepSeek's impact on Nvidia's market capitalisation highlights the real-world impact of residential proxies.&lt;/p&gt;
&lt;p&gt;For AI platforms, the question is operational. How can platforms distinguish between legitimate users and well-crafted
requests through residential proxies? When geographical restrictions lose meaning, what security measures remain effective?
Traditional &lt;a href="/blog/anti-fraud-residential-proxy-detection/"&gt;IP Intelligence based proxy detection&lt;/a&gt; based on historical
usage is no longer effective; per-connection proxy detection is essential.&lt;/p&gt;
&lt;p&gt;DeepSeek's emergence suggests AI security teams need to revisit their assumptions. The potential use of residential proxy networks
to dissolve digital borders challenges current approaches to platform protection.&lt;/p&gt;</content><category term="Residential Proxies"></category><category term="Residential Proxies"></category><category term="CDN"></category><category term="Bot Management"></category><category term="Machine Learning"></category><category term="API Security"></category><category term="Threat Detection"></category></entry><entry><title>Preventing Enumeration Attacks</title><link href="https://www.peakhour.io/blog/preventing-enumeration-attacks-visa-roadmap/" rel="alternate"></link><published>2025-01-24T00:00:00+11:00</published><updated>2025-01-24T00:00:00+11:00</updated><author><name>AC</name></author><id>tag:www.peakhour.io,2025-01-24:/blog/preventing-enumeration-attacks-visa-roadmap/</id><summary type="html">&lt;p&gt;An analysis of how Peakhour's solutions help prevent enumeration attacks, aligning with Visa's Security Roadmap 2025-2028 priorities.&lt;/p&gt;</summary><content type="html">&lt;p&gt;After our &lt;a href="/blog/visa-security-roadmap-2025-overview/"&gt;overview of Visa's Security Roadmap 2025-2028&lt;/a&gt;, this article looks at the first focus area: preventing enumeration attacks. Visa reports a 40% increase in enumeration attacks in the first six months of 2023 compared with the previous period, and more than US$1.1 billion in global fraud losses from these attacks over the year to 30 September 2023.&lt;/p&gt;
&lt;p&gt;Visa defines enumeration and account testing as criminal practices where fraudsters use automation to test and guess payment credentials, which can then be used for fraudulent transactions. In card-testing campaigns, attackers send large numbers of low-value authorisation attempts to validate a primary account number, expiry date, or CVV2. They tend to target online merchants with weaker fraud controls because the merchant site becomes the testing ground while issuers, acquirers, and cardholders absorb the downstream damage.&lt;/p&gt;
&lt;p&gt;The volume share can look small. Visa notes that these attacks contribute to less than 1% of global card-not-present volume. That can make the risk easy to underweight until the business sees the operating cost: processor scrutiny, chargeback pressure, support load, infrastructure spikes, blocked genuine customers, and fraud teams trying to reconstruct what happened after the card data has already been validated somewhere else.&lt;/p&gt;
&lt;h2&gt;The Risk Is Operational Before It Is Regulatory&lt;/h2&gt;
&lt;p&gt;Enumeration is not only a payment fraud pattern. It is a production traffic problem. The attack arrives as normal-looking checkout or payment API requests, often distributed across many IPs, accounts, devices, cards, and merchants. If the only defence is a fixed IP threshold, the attacker can slow down, rotate infrastructure, or push attempts through residential proxy networks that look closer to consumer traffic.&lt;/p&gt;
&lt;p&gt;That is why Visa's roadmap points to authentication controls, anomaly detection, real-time monitoring, velocity thresholds, CVV2 for unsecure transactions, and retries with different values as indicators of account testing behaviour. The common thread is evidence. Teams need to see the pattern across attempts, not just one failed authorisation at a time.&lt;/p&gt;
&lt;p&gt;For merchants and acquirers, the first decision is scope. Which routes can submit payment credentials? Which APIs can create checkout sessions, payment intents, or tokenisation requests? Which responses tell an attacker whether the credential is likely valid? Which logs show retries with changed values? Which controls can act before the traffic reaches the processor?&lt;/p&gt;
&lt;h2&gt;VAMP Raises the Need for Cleaner Evidence&lt;/h2&gt;
&lt;p&gt;Visa's updated Visa Acquirer Monitoring Program (VAMP) is effective 1 April 2025. In the roadmap, Visa says VAMP brings more aligned fraud thresholds for domestic and cross-border card-not-present transactions and incorporates new enumeration criteria based on the number of enumerated authorisation transactions and the enumeration rate identified by the VAAI Score.&lt;/p&gt;
&lt;p&gt;That does not mean every merchant needs the same control design. It does mean acquirers and merchants need better visibility into whether a burst of payment activity is genuine demand, a broken integration, friendly fraud, or enumeration. When traffic is distributed, the evidence needs to include more than source IP. Useful signals include route, account state, card-attempt cadence, response codes, device or browser consistency, proxy likelihood, country and ASN changes, header and TLS patterns, and whether retries are changing only the values an attacker is trying to validate.&lt;/p&gt;
&lt;p&gt;Peakhour's role is at the web and API edge. &lt;a href="/products/bot-management/"&gt;Bot Management&lt;/a&gt;, &lt;a href="/products/advanced-rate-limiting/"&gt;Advanced Rate Limiting&lt;/a&gt;, &lt;a href="/products/residential-proxy-detection/"&gt;Residential Proxy Detection&lt;/a&gt;, WAF, and log forwarding can help teams detect automated payment attempts, slow or block abusive routes, identify proxy-backed traffic, and retain decision evidence. Those controls support a payment security program; they do not determine VAMP standing, replace acquirer guidance, or provide legal advice.&lt;/p&gt;
&lt;h2&gt;Rate Limits Need to Follow the Attack Shape&lt;/h2&gt;
&lt;p&gt;Simple rate limits still help, but card testing rarely follows one neat source. A useful rate limit strategy looks at multiple keys: route, payment action, account, session, token, card fingerprint where appropriate, device signal, IP, ASN, country, response result, and time window. The limits should also distinguish between customer actions. A checkout page, card add route, refund path, gift card purchase, and payment authorisation API should not all share one generic threshold.&lt;/p&gt;
&lt;p&gt;Teams also need to decide what the control does. Some traffic should be blocked. Some should be slowed. Some should be challenged before payment. Some should be logged and reviewed because false positives would create more harm than the risk being reduced. The right action depends on business context, fraud exposure, customer value, and the confidence of the signals.&lt;/p&gt;
&lt;p&gt;Residential proxy abuse is a good example. A residential IP does not prove fraud. Many genuine users sit behind shared or mobile networks. But residential proxy use combined with high-cardinality card attempts, changed CVV2 values, first-seen devices, failed authorisations, and unusual checkout cadence is a stronger signal. The value is correlation, not a single magic indicator.&lt;/p&gt;
&lt;h2&gt;A Practical Review Path&lt;/h2&gt;
&lt;p&gt;Teams preparing for enumeration risk should start with the payment routes rather than with a vendor checklist.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Map every route that can create, submit, modify, or retry a payment attempt.&lt;/li&gt;
&lt;li&gt;Review response messages and status codes for accidental validation clues.&lt;/li&gt;
&lt;li&gt;Check whether logs can show velocity, retries with changed values, and route-level concentration without storing sensitive card data.&lt;/li&gt;
&lt;li&gt;Apply route-aware rate limits and bot controls before processor calls where possible.&lt;/li&gt;
&lt;li&gt;Add proxy, device, session, and behaviour signals to separate normal checkout friction from testing behaviour.&lt;/li&gt;
&lt;li&gt;Keep evidence of policy version, action, route, and signal set so fraud and compliance teams can review outcomes.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The caution is important: do not turn payment logging into a second store of cardholder data. Enumeration defence needs enough evidence to detect and investigate abuse, but PCI DSS and privacy expectations still require careful handling of cardholder data, tokens, logs, and support exports.&lt;/p&gt;
&lt;h2&gt;What This Means for Peakhour Customers&lt;/h2&gt;
&lt;p&gt;Enumeration prevention is not a single feature. It is a control path around payment routes: classify the request, evaluate the signals, act proportionately, and keep evidence. Peakhour can help by applying those decisions at the edge before abusive traffic reaches the origin or payment integration.&lt;/p&gt;
&lt;p&gt;The business value is not only fewer bad requests. It is cleaner payment telemetry, faster fraud review, fewer avoidable processor calls, and a better basis for conversations with acquirers when suspicious activity appears. Visa's roadmap makes that direction clear: payment security is moving toward data-driven, evidence-backed controls that can recognise automation abuse without blocking genuine customers by default.&lt;/p&gt;</content><category term="Security"></category><category term="Account Protection"></category><category term="Credential Stuffing"></category><category term="PCI DSS"></category><category term="API Security"></category><category term="Fraud Prevention"></category><category term="Threat Detection"></category></entry><entry><title>Visa's Security Roadmap 2025-2028</title><link href="https://www.peakhour.io/blog/visa-security-roadmap-2025-overview/" rel="alternate"></link><published>2025-01-21T00:00:00+11:00</published><updated>2025-01-21T00:00:00+11:00</updated><author><name>AC</name></author><id>tag:www.peakhour.io,2025-01-21:/blog/visa-security-roadmap-2025-overview/</id><summary type="html">&lt;p&gt;An analysis of Visa's Security Roadmap 2025-2028 and how Peakhour's solutions help Australian businesses meet these security objectives.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Visa's Security Roadmap 2025-2028 for Australia is not just a payments strategy document. It is a signal about where fraud, application security, authentication, and compliance work are converging for merchants, acquirers, issuers, gateways, and service providers.&lt;/p&gt;
&lt;p&gt;The timing matters. Visa's roadmap cites Australian card fraud rising 32% to A$762 million in 2023, with unauthorised card-not-present fraud increasing 33% to A$688 million. Scam losses reached A$2.7 billion in 2023, and reported data breaches increased 19% in the second half of 2023 compared with the first half. The pressure is not coming from one direction. Payment teams are dealing with automation abuse, social engineering, compromised credentials, weak merchant onboarding, third-party exposure, and new payment experiences at the same time.&lt;/p&gt;
&lt;p&gt;Visa groups its roadmap into six focus areas: preventing enumeration attacks, continued investment in secure technologies, data-driven risk, resilience against fraud and scams in the era of AI, stronger cyber security posture, and secure digital payment experiences. For Australian businesses, the more useful way to read it is as a set of operational themes.&lt;/p&gt;
&lt;h2&gt;Automation Abuse Has Become a Payment Control Issue&lt;/h2&gt;
&lt;p&gt;Enumeration attacks sit first in the roadmap for a reason. Visa defines enumeration and account testing as automation used to test and guess payment credentials that can later be used in fraudulent transactions. The attacks often appear as high-speed card testing against online merchants, with low-value attempts used to validate PAN, expiry, or CVV2 combinations.&lt;/p&gt;
&lt;p&gt;Visa reports a 40% increase in enumeration attacks in the first six months of 2023 compared with the previous period, and more than US$1.1 billion in global fraud losses from enumeration attacks over the year to 30 September 2023. The updated Visa Acquirer Monitoring Program (VAMP), effective 1 April 2025, adds enumeration criteria alongside broader fraud and dispute monitoring.&lt;/p&gt;
&lt;p&gt;The implication is practical: merchants and acquirers need route-level evidence, anomaly monitoring, velocity controls, and a way to identify distributed automation before it becomes payment fraud. IP-only controls are weak when attacks use residential proxies, first-seen devices, and slow distributed attempts. Peakhour's bot management, residential proxy detection, advanced rate limiting, and edge logging can help support that evidence path, but the business still needs payment-flow ownership and acquirer alignment.&lt;/p&gt;
&lt;h2&gt;Authentication and Tokenisation Are Moving Together&lt;/h2&gt;
&lt;p&gt;Visa's secure technology theme is not simply "add more authentication." The roadmap ties tokenisation, EMV 3DS, biometric or in-app authentication, passkeys, and Click to Pay into the same customer and fraud problem: protect credentials while reducing unnecessary friction.&lt;/p&gt;
&lt;p&gt;Tokenisation reduces the value of exposed card data by replacing a card number with a token. Visa notes that the Visa Token Service has passed one billion tokens in Asia Pacific and that merchants adopting VTS for digital payments saw payment fraud rates reduced by more than half in the cited Asia Pacific analysis. But the roadmap also flags token provisioning fraud, where bad actors illegitimately provision tokens and then monetise them quickly.&lt;/p&gt;
&lt;p&gt;That is why authentication quality matters. Visa says issuers are being mandated to move away from SMS OTP as the sole authentication factor by 2026, toward methods such as biometric, in-app, app-to-app, or passkey-based authentication. For merchants, updated Visa Secure minimum data requirements push more complete authentication data into the decision process.&lt;/p&gt;
&lt;p&gt;For application teams, the lesson is that checkout security is not a single login prompt. It includes account creation, saved-card use, card add, token provisioning, checkout, refund, and support paths. A risk-based challenge should appear where the action justifies it, not everywhere by default.&lt;/p&gt;
&lt;h2&gt;Risk Decisions Need Better Data, Not Just More Data&lt;/h2&gt;
&lt;p&gt;The roadmap's data-driven risk theme is about using available payment and authentication data to reduce fraud and false positives. Visa points to EMV 3DS data elements, Visa Secure requirements, risk-based authentication, and issuer decisioning as examples of how better data quality can change outcomes.&lt;/p&gt;
&lt;p&gt;More data is not automatically better. It has to be accurate, relevant, protected, and available at the moment of decision. A fraud team may need account history, device consistency, proxy likelihood, card-attempt cadence, transaction context, and previous response outcomes. A compliance team may need to know why that data is collected, where it is retained, and who can query it.&lt;/p&gt;
&lt;p&gt;This is where contextual security becomes useful. Peakhour's &lt;a href="/solutions/use-case/contextual-security/"&gt;Contextual Security&lt;/a&gt; approach combines request, route, account, network, device, and behaviour signals so teams can allow, challenge, rate limit, block, or log based on risk. The control is strongest when the decision record stays attached to the event: signal set, policy version, action, and outcome.&lt;/p&gt;
&lt;h2&gt;AI Raises Scam and Fraud Pressure, But It Is Also Part of Detection&lt;/h2&gt;
&lt;p&gt;Visa frames AI in both directions. Generative AI lowers the barrier for phishing, social engineering, deepfakes, and personalised scam content. At the same time, Visa points to its long history using AI and machine learning in payment fraud detection, including around 150 AI and machine learning models in production.&lt;/p&gt;
&lt;p&gt;For businesses outside the payment network, the message is not "buy AI." It is to prepare for more scalable deception and faster abuse cycles. Fraud controls need to watch for account creation abuse, credential stuffing, payment testing, suspicious onboarding, transaction anomalies, and customer manipulation signals. Human review still matters because authorised scams can look different from unauthorised account compromise.&lt;/p&gt;
&lt;p&gt;Peakhour's role is strongest around the request and account edge: identifying automation, proxy-backed traffic, route abuse, credential risk, and abnormal behaviour before fraud reaches sensitive application paths. Those signals can feed fraud review and incident response, but they should be used with privacy, false-positive, and customer-impact controls.&lt;/p&gt;
&lt;h2&gt;Cyber Posture Is Now Part of Payment Ecosystem Resilience&lt;/h2&gt;
&lt;p&gt;Visa's fifth theme connects payment fraud to cyber security posture. PCI DSS remains mandatory for entities storing, processing, or transmitting Visa cardholder data. Visa also highlights third-party agent (TPA) registration, its Account Information Security program, third-party service provider risk, breach trends, and preparation for broader AES support by 2030.&lt;/p&gt;
&lt;p&gt;For Australian businesses, this is a reminder that payment risk is not limited to the payment processor. A breach of a CMS account, a third-party script, a weak checkout plugin, a vulnerable API, a compromised support tool, or an unmanaged service provider can affect the payment environment. PCI scope and third-party oversight need to include the systems that can change or observe checkout, not only systems that store card numbers.&lt;/p&gt;
&lt;p&gt;Peakhour can help with application-layer controls around WAF, API protection, bot management, rate limiting, DDoS mitigation, and log forwarding. Those controls can support evidence for payment security and cyber posture. They do not replace PCI DSS validation, TPA obligations, acquirer requirements, or legal review.&lt;/p&gt;
&lt;h2&gt;New Payment Experiences Need Security Built Into the Flow&lt;/h2&gt;
&lt;p&gt;Visa's final theme covers digital payment experiences such as Click to Pay, passkeys, Flex Credential, and Tap to Everything. These changes are about reducing manual card entry, password dependence, and fragmented checkout experiences while preserving cardholder verification and transaction security.&lt;/p&gt;
&lt;p&gt;The security work for merchants is to keep pace with those flows. New payment methods bring new integration paths, data elements, redirects, APIs, support workflows, and customer education needs. The right question is not only "does the new payment method work?" It is "which systems can affect it, what data is passed, how is the customer verified, what fraud signals are available, and what evidence remains after a dispute or incident?"&lt;/p&gt;
&lt;h2&gt;What Businesses Should Do Next&lt;/h2&gt;
&lt;p&gt;Read the roadmap as an operating agenda. Map payment and account routes. Identify where automation can test credentials or cards. Review SMS OTP dependence. Check whether tokenisation and 3DS data are being used well. Validate which vendors affect checkout and payment security. Confirm that logs can support fraud review without capturing sensitive card data. Tune rate limits and bot controls by route, not only by IP.&lt;/p&gt;
&lt;p&gt;The next few years of payment security will reward teams that can make proportionate, evidence-backed decisions. That is the thread running through Visa's roadmap and through Peakhour's edge security work: see the request in context, choose the right action, and keep enough evidence for fraud, security, and compliance teams to explain what happened.&lt;/p&gt;</content><category term="Fraud"></category><category term="PCI DSS"></category><category term="Account Protection"></category><category term="Credential Stuffing"></category><category term="Fraud Prevention"></category><category term="Magento"></category><category term="Application Security"></category></entry><entry><title>How Bots Are Corrupting Your A/B Testing Data</title><link href="https://www.peakhour.io/blog/bot-impact-ab-testing/" rel="alternate"></link><published>2025-01-20T00:00:00+11:00</published><updated>2025-01-20T00:00:00+11:00</updated><author><name>AC</name></author><id>tag:www.peakhour.io,2025-01-20:/blog/bot-impact-ab-testing/</id><summary type="html">&lt;p&gt;Understand the impact of bot traffic on A/B testing results and learn how to protect your optimization efforts&lt;/p&gt;</summary><content type="html">&lt;p&gt;Bot traffic contaminates A/B testing results and can undermine marketing strategy.
Your testing programme is exposed when &lt;a href="/learning/security/residential-proxy/"&gt;residential proxy&lt;/a&gt; networks generate fake
interactions (e.g. click fraud) that appear to come from your target market.&lt;/p&gt;
&lt;p&gt;These &lt;a href="/products/residential-proxy-detection/"&gt;residential proxies&lt;/a&gt; hide behind real household internet connections in the targeted geographic areas. When a
bot network routes traffic through Sydney IP addresses to masquerade as real Australians, your analytics
counts that traffic as legitimate local engagement. Because the traffic matches your demographic
and geographic targeting profile, traditional detection methods become less effective.&lt;/p&gt;
&lt;p&gt;This contamination affects the accuracy of the marketing strategy. Your A/B tests should show clear winners, but the
results are masked by bot behaviour rather than real user preferences. Marketing teams then optimise campaigns
from false signals, wasting budget and time on the wrong opportunities. The data starts driving decisions that harm conversion rates and revenue.&lt;/p&gt;
&lt;p&gt;The scale of the problem continues to grow. Residential proxy services now offer millions of local IPs in every market. They rotate these IPs automatically and match real browser characteristics. Without specialised detection such as Peakhour A/B Testing Protection, this traffic can appear identical to genuine users in your analytics.&lt;/p&gt;
&lt;p&gt;Each day without detection compounds the damage. Tests generate misleading data that guides strategic decisions. Marketing teams spend hours analysing invalid results and implementing changes that reduce performance. Budget allocated to testing delivers diluted ROI as optimisations based on bot data decrease conversion rates.&lt;/p&gt;
&lt;p&gt;Traditional bot protection fails against this distributed threat. IP-based detection cannot identify residential proxy traffic that matches your target geography. Rate limiting proves ineffective against attacks spread across thousands of residential IPs. These bots evade basic JavaScript challenges through sophisticated browser emulation.&lt;/p&gt;
&lt;p&gt;Peakhour's A/B Testing Protection uses network fingerprinting to detect residential proxy traffic. Our system analyses subtle patterns in how these proxies connect and behave, identifying bot networks that other solutions miss. We maintain a real-time database of residential proxy services to block new threats as they emerge.&lt;/p&gt;
&lt;p&gt;Our customers have discovered that 40% of their test traffic came from bots. After implementing protection, they achieved:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Valid test results reflecting real user preferences&lt;/li&gt;
&lt;li&gt;Increased conversion rates from accurate optimisation&lt;/li&gt;
&lt;li&gt;Reduced waste of marketing team time and resources&lt;/li&gt;
&lt;li&gt;Protection of testing budget from invalid traffic&lt;/li&gt;
&lt;li&gt;Confidence in strategic decisions based on clean data&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The rise of residential proxies has amplified bot threats to A/B testing. Traffic that appears to come from local users may mask sophisticated bot networks. Protecting your testing programme requires detection that goes beyond IP addresses and basic challenges. Contact us to learn how Peakhour can help secure your A/B testing data and keep optimisation decisions grounded in real users.&lt;/p&gt;</content><category term="Fraud"></category><category term="Bot Management"></category><category term="Residential Proxies"></category><category term="Fraud Prevention"></category><category term="Credential Stuffing"></category></entry><entry><title>How MTU Fingerprinting Identifies VPNs and Mobile Users</title><link href="https://www.peakhour.io/blog/mtu-fingerprinting-vpn-mobile-detection/" rel="alternate"></link><published>2025-01-15T14:00:00+11:00</published><updated>2026-07-29T00:00:00+10:00</updated><author><name>AC</name></author><id>tag:www.peakhour.io,2025-01-15:/blog/mtu-fingerprinting-vpn-mobile-detection/</id><summary type="html">&lt;p&gt;Infer an apparent path MTU from TCP handshake data, compare it with common tunnel overheads and use it as one bounded network-path signal.&lt;/p&gt;</summary><content type="html">&lt;p&gt;For traffic analysis, it helps to know how a user reached the service. Are they on a home network, a mobile connection, or a VPN? Deep packet inspection is invasive, but TCP handshake metadata can still carry useful context about the Maximum Transmission Unit (MTU) a connection appears to be using. By analysing those inferred MTU values, we can build "fingerprints" that point to the underlying network technology carrying the connection.&lt;/p&gt;
&lt;p&gt;This article looks at how common technologies affect MTU values and shows how a SQL query can turn that data into useful network labels.&lt;/p&gt;
&lt;h2&gt;What is MTU and Why Does it Change?&lt;/h2&gt;
&lt;p&gt;The Maximum Transmission Unit (MTU) is the largest data packet, or frame, that a network-connected device can transmit. On standard Ethernet networks, this value is typically 1500 bytes. Larger payloads have to be split into chunks that fit that limit.&lt;/p&gt;
&lt;h3&gt;Encapsulation and Tunneling&lt;/h3&gt;
&lt;p&gt;The value starts to shift when tunnelling protocols are involved, including those used by VPNs and mobile networks. These protocols wrap the original data packet inside another packet, a process called encapsulation. The outer packet has its own headers for routing and management.&lt;/p&gt;
&lt;p&gt;This encapsulation "steals" space from the original 1500 bytes available on the physical network. If a tunnelling protocol adds 60 bytes of headers, for example, the maximum size for the &lt;em&gt;original&lt;/em&gt; data packet is now 1440 bytes (&lt;code&gt;1500 - 60&lt;/code&gt;).&lt;/p&gt;
&lt;h3&gt;The Problem with Fragmentation&lt;/h3&gt;
&lt;p&gt;What happens if a device tries to send a 1500-byte packet through this 1440-byte tunnel? The packet has to be broken into smaller pieces, a process called fragmentation. It works, but it is inefficient. Fragmentation consumes CPU resources on the router performing it, adds header overhead to each fragment, and requires the receiving device to reassemble the pieces. The result is lower speed and higher latency.&lt;/p&gt;
&lt;p&gt;To avoid that penalty, operating systems and network devices reduce the MTU of the connection to account for the tunnel's overhead. The amount of the reduction follows from the tunnelling protocol in use. That predictable drop is the basis for MTU fingerprinting.&lt;/p&gt;
&lt;h2&gt;A Guide to Common MTU Values&lt;/h2&gt;
&lt;p&gt;Different technologies add different overheads, which produces distinct MTU values.&lt;/p&gt;
&lt;h3&gt;WireGuard&lt;/h3&gt;
&lt;p&gt;WireGuard is a modern VPN known for its efficiency, but it still adds overhead.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;IPv4 Overhead&lt;/strong&gt;: 60 bytes (20-byte IPv4 header + 8-byte UDP header + 32-byte WireGuard header).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;IPv6 Overhead&lt;/strong&gt;: 80 bytes (40-byte IPv6 header + 8-byte UDP header + 32-byte WireGuard header).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;On a standard 1500-byte network, that produces predictable MTU values:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;1500 - 60 = 1440 bytes&lt;/code&gt; (WireGuard over IPv4)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;1500 - 80 = 1420 bytes&lt;/code&gt; (WireGuard over IPv6)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;There is a special case with ISPs that use DS-Lite (Dual-Stack Lite) to carry IPv4 traffic over an IPv6 network. This adds another 40-byte IPv6 header, reducing the MTU further.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;1420 - 40 = 1380 bytes&lt;/code&gt; (WireGuard over DS-Lite)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;OpenVPN&lt;/h3&gt;
&lt;p&gt;OpenVPN is another common VPN solution, but its fingerprint is less tidy. Instead of setting a static interface MTU, OpenVPN often uses a feature called &lt;code&gt;mssfix&lt;/code&gt;. This dynamically adjusts the Maximum Segment Size (MSS) value within the TCP headers of encapsulated packets to prevent fragmentation.&lt;/p&gt;
&lt;p&gt;The MSS is the MTU minus the IP and TCP header sizes (typically 40 bytes for IPv4). The exact MSS value, and therefore the effective MTU, depends on OpenVPN's configuration, including the transport protocol (UDP or TCP), cipher, MAC algorithm, and compression. As noted by security researcher ValdikSS, these unique MSS values can be used to fingerprint a connection with high precision. For example, a common configuration might result in an MSS of 1369, which corresponds to an effective MTU of 1409 (&lt;code&gt;1369 + 40&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;For general analysis, connections with an MTU around &lt;strong&gt;1400&lt;/strong&gt; or &lt;strong&gt;1380&lt;/strong&gt; bytes often indicate OpenVPN or other VPN usage, especially when seen with other factors.&lt;/p&gt;
&lt;h3&gt;Mobile Networks (LTE &amp;amp; 5G)&lt;/h3&gt;
&lt;p&gt;Mobile networks also modify MTU values. When your phone connects to the internet, its data is tunnelled through the carrier's network using the GPRS Tunnelling Protocol (GTP). This encapsulation adds its own layer of headers.&lt;/p&gt;
&lt;p&gt;As detailed by Nick vs Networking, the typical overhead for GTP traffic over an Ethernet transport network is &lt;strong&gt;50 bytes&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;14 bytes for the Ethernet header&lt;/li&gt;
&lt;li&gt;20 bytes for the outer IPv4 header&lt;/li&gt;
&lt;li&gt;8 bytes for the UDP header&lt;/li&gt;
&lt;li&gt;8 bytes for the GTP header&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For a mobile carrier using a standard 1500-byte MTU on its transport network, the maximum MTU available to the user's device is &lt;strong&gt;1450 bytes&lt;/strong&gt; (&lt;code&gt;1500 - 50&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;Mobile devices don't guess this value; they are explicitly told what MTU to use by the network during the connection setup process (via Protocol Configuration Options). Mobile operators have two choices to avoid fragmentation:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Increase Transport MTU&lt;/strong&gt;: Enable jumbo frames (for example, 1600 bytes or more) on their internal network to accommodate the 50-byte overhead and still provide a full 1500-byte MTU to the user.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Lower Advertised MTU&lt;/strong&gt;: Advertise a lower MTU to the user's device. This is why values such as &lt;strong&gt;1450&lt;/strong&gt; are common. Some operators may configure a more conservative MTU, such as &lt;strong&gt;1300 bytes&lt;/strong&gt;, to maintain stability across all parts of their network.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Other Common Values&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Standard Ethernet&lt;/strong&gt;: The baseline is &lt;strong&gt;1500 bytes&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PPPoE&lt;/strong&gt;: Common for DSL connections, adds 8 bytes of overhead, resulting in an MTU of &lt;strong&gt;1492 bytes&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;IPv6 Minimum&lt;/strong&gt;: The IPv6 specification mandates a minimum MTU of &lt;strong&gt;1280 bytes&lt;/strong&gt;, so this value is also a significant marker.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Analysis with SQL&lt;/h2&gt;
&lt;p&gt;With this context, we can analyse network logs to classify user connections. The following SQL query buckets and attributes MTU values from a large dataset, turning raw numbers into meaningful labels.&lt;/p&gt;
&lt;p&gt;The query works in several stages:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Extract Data&lt;/strong&gt;: It parses the MTU from a fingerprint string in the logs.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bucket MTUs&lt;/strong&gt;: It uses a &lt;code&gt;CASE&lt;/code&gt; statement to group MTUs. Specific known values, such as 1500, 1440, 1420, and 1380, go into their own buckets. Jumbo frames (&amp;gt;1500) are grouped into 100-byte buckets, and everything else is grouped into 20-byte buckets.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Attribute Buckets&lt;/strong&gt;: In the final &lt;code&gt;SELECT&lt;/code&gt;, another &lt;code&gt;CASE&lt;/code&gt; statement translates those numeric buckets into human-readable descriptions based on the fingerprints we've identified.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;The Query&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;-- Bucketing logic and attribution informed by research from:&lt;/span&gt;
&lt;span class="c1"&gt;-- https://ripx80.de/posts/06-wg-mtu/ (WireGuard)&lt;/span&gt;
&lt;span class="c1"&gt;-- https://medium.com/@ValdikSS/detecting-vpn-and-its-configuration-and-proxy-users-on-the-server-side-1bcc59742413 (OpenVPN)&lt;/span&gt;
&lt;span class="c1"&gt;-- https://nickvsnetworking.com/mtu-in-lte-5g-transmission-networks-part-1/ (Mobile Networks)&lt;/span&gt;
&lt;span class="k"&gt;WITH&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;base_data&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;toInt32OrNull&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;splitByChar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;:&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;splitByChar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;,&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;synner_fingerprint&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;])[&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;mtu&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;toInt32OrNull&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;splitByChar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;:&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;splitByChar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;,&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;synner_fingerprint&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;])[&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;wsize&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;toInt32OrNull&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;splitByChar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;:&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;splitByChar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;,&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;synner_fingerprint&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;])[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;scale&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tls&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;handshake_rtt_us&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;tcp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;min_rtt_us&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;65000&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;is_high_latency&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;logs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;client_logs&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;WHERE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;time&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;2025-07-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AND&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;shielded&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;
&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="n"&gt;main_aggs&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="k"&gt;CASE&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="k"&gt;WHEN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;mtu&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1500&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;THEN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1500&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="k"&gt;WHEN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;mtu&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1440&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;THEN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1440&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="k"&gt;WHEN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;mtu&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1420&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;THEN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1420&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="k"&gt;WHEN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;mtu&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1380&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;THEN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1380&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="k"&gt;WHEN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;mtu&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1500&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;THEN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1501&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;intDiv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mtu&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1501&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="k"&gt;ELSE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;intDiv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mtu&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="k"&gt;END&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;mtu_bucket&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;countIf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;is_high_latency&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;high_latency_count&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;countIf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;not&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;is_high_latency&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;normal_latency_count&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;round&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;avg&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;wsize&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;pow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;scale&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;avg_real_wsize&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;base_data&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;WHERE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;mtu&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;IS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;NOT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AND&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;wsize&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;IS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;NOT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AND&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;scale&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;IS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;NOT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;NULL&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;GROUP&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;BY&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;mtu_bucket&lt;/span&gt;
&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="n"&gt;top_wsizes&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;mtu_bucket&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;groupArray&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;wsize&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;cnt&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;top_wsizes&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="k"&gt;CASE&lt;/span&gt;
&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="k"&gt;WHEN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;mtu&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1500&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;THEN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1500&lt;/span&gt;
&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="k"&gt;WHEN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;mtu&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1440&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;THEN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1440&lt;/span&gt;
&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="k"&gt;WHEN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;mtu&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1420&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;THEN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1420&lt;/span&gt;
&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="k"&gt;WHEN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;mtu&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1380&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;THEN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1380&lt;/span&gt;
&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="k"&gt;WHEN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;mtu&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1500&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;THEN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1501&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;intDiv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mtu&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1501&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;
&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="k"&gt;ELSE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;intDiv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mtu&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="k"&gt;END&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;mtu_bucket&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="n"&gt;wsize&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="k"&gt;count&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;cnt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="n"&gt;row_number&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;OVER&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;PARTITION&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;BY&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;mtu_bucket&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;ORDER&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;BY&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;cnt&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;DESC&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;rn&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;base_data&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="k"&gt;WHERE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;mtu&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;IS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;NOT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AND&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;wsize&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;IS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;NOT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AND&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;scale&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;IS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;NOT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;NULL&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="k"&gt;GROUP&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;BY&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;mtu_bucket&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;wsize&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;WHERE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;rn&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;GROUP&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;BY&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;mtu_bucket&lt;/span&gt;
&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="n"&gt;top_scales&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;mtu_bucket&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;groupArray&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="k"&gt;scale&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;cnt&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;top_scales&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="k"&gt;CASE&lt;/span&gt;
&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="k"&gt;WHEN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;mtu&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1500&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;THEN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1500&lt;/span&gt;
&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="k"&gt;WHEN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;mtu&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1440&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;THEN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1440&lt;/span&gt;
&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="k"&gt;WHEN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;mtu&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1420&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;THEN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1420&lt;/span&gt;
&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="k"&gt;WHEN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;mtu&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1380&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;THEN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1380&lt;/span&gt;
&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="k"&gt;WHEN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;mtu&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1500&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;THEN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1501&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;intDiv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mtu&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1501&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;
&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="k"&gt;ELSE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;intDiv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mtu&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="k"&gt;END&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;mtu_bucket&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="k"&gt;scale&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="k"&gt;count&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;cnt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="n"&gt;row_number&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;OVER&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;PARTITION&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;BY&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;mtu_bucket&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;ORDER&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;BY&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;cnt&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;DESC&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;rn&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;base_data&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="k"&gt;WHERE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;mtu&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;IS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;NOT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AND&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;wsize&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;IS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;NOT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AND&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;scale&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;IS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;NOT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;NULL&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="k"&gt;GROUP&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;BY&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;mtu_bucket&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;scale&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;WHERE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;rn&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;GROUP&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;BY&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;mtu_bucket&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;CASE&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="k"&gt;WHEN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;mtu_bucket&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;IN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1500&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1440&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1420&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1380&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;THEN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;toString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mtu_bucket&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="k"&gt;WHEN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;mtu_bucket&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1500&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;THEN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;concat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;toString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mtu_bucket&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;-&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;toString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mtu_bucket&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;99&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="k"&gt;ELSE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;concat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;toString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mtu_bucket&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;-&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;toString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mtu_bucket&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;19&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;END&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;mtu_range&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;CASE&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="k"&gt;WHEN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;mtu_bucket&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1500&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;THEN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Standard Ethernet&amp;#39;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="k"&gt;WHEN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;mtu_bucket&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1480&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;THEN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Likely PPPoE (e.g., 1492)&amp;#39;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="k"&gt;WHEN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;mtu_bucket&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1460&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;THEN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Likely DS-Lite/GRE Tunnel&amp;#39;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="k"&gt;WHEN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;mtu_bucket&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1440&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;THEN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Likely Mobile LTE/5G (e.g., 1450) / WireGuard over IPv4&amp;#39;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="k"&gt;WHEN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;mtu_bucket&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1420&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;THEN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;WireGuard over IPv6&amp;#39;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="k"&gt;WHEN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;mtu_bucket&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1400&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;THEN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Likely OpenVPN / Mobile&amp;#39;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="k"&gt;WHEN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;mtu_bucket&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1380&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;THEN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Likely OpenVPN / WireGuard over DS-Lite / Mobile&amp;#39;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="k"&gt;WHEN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;mtu_bucket&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1300&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;THEN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Likely Mobile LTE/5G configured&amp;#39;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="k"&gt;WHEN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;mtu_bucket&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1280&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;THEN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;IPv6 Minimum&amp;#39;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="k"&gt;WHEN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;mtu_bucket&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1500&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;THEN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Jumbo Frame&amp;#39;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="k"&gt;ELSE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Other&amp;#39;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;END&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;mtu_attribution&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;high_latency_count&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;normal_latency_count&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;round&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;high_latency_count&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;high_latency_count&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;normal_latency_count&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;high_latency_ratio&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;top_wsizes&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;top_scales&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;avg_real_wsize&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;main_aggs&lt;/span&gt;
&lt;span class="k"&gt;LEFT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;JOIN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;top_wsizes&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;USING&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mtu_bucket&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;LEFT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;JOIN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;top_scales&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;USING&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mtu_bucket&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;high_latency_count&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;normal_latency_count&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;10000&lt;/span&gt;
&lt;span class="k"&gt;ORDER&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;BY&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;mtu_bucket&lt;/span&gt;
&lt;span class="k"&gt;LIMIT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;FORMAT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Vertical&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Why Jumbo Frames Matter&lt;/h2&gt;
&lt;p&gt;Jumbo frames (MTU values greater than 1500 bytes) are a useful edge case in MTU fingerprinting. These frames, typically ranging from 9000-9216 bytes, are primarily used in high-performance computing environments, data centres, and enterprise networks where throughput optimisation is important.&lt;/p&gt;
&lt;p&gt;When we detect jumbo frame MTUs in our analysis, they often indicate:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Enterprise Users&lt;/strong&gt;: Corporate networks frequently enable jumbo frames for internal communications&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Data Centre Traffic&lt;/strong&gt;: Cloud services and CDNs often use jumbo frames between their infrastructure&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;High-Performance Applications&lt;/strong&gt;: Video streaming, large file transfers, and backup operations can benefit from larger frame sizes&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Network Misconfiguration&lt;/strong&gt;: Jumbo frames sometimes appear because of network equipment misconfiguration&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The presence of jumbo frames can help distinguish consumer and enterprise traffic, adding useful context for traffic classification and security analysis.&lt;/p&gt;
&lt;h2&gt;Practical Use Cases and Applications&lt;/h2&gt;
&lt;p&gt;MTU fingerprinting is useful across several security and operational domains:&lt;/p&gt;
&lt;h3&gt;Security Applications&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;VPN Detection for Compliance&lt;/strong&gt;: Organisations can identify employees bypassing corporate network policies with personal VPNs, supporting compliance with data governance requirements.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Bot Traffic Classification&lt;/strong&gt;: Automated traffic from residential proxy networks often shows consistent MTU patterns that differ from genuine residential users, improving bot detection.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Threat Intelligence Enhancement&lt;/strong&gt;: Correlating MTU patterns with other indicators helps build broader threat profiles and improves attack attribution.&lt;/p&gt;
&lt;h3&gt;Network Operations&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Performance Optimisation&lt;/strong&gt;: Understanding the MTU distribution of your user base helps optimise content delivery and reduce fragmentation-related performance issues.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Infrastructure Planning&lt;/strong&gt;: MTU analysis reveals the underlying network technologies your users employ, informing CDN placement and capacity planning decisions.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Quality of Service&lt;/strong&gt;: Different MTU patterns correlate with connection quality, enabling proactive support for users on constrained networks.&lt;/p&gt;
&lt;h3&gt;Business Intelligence&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Market Analysis&lt;/strong&gt;: Geographic and demographic patterns in MTU distribution reveal technology adoption trends and market characteristics.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;User Experience Optimisation&lt;/strong&gt;: Identifying users on mobile or constrained networks enables adaptive content delivery and interface optimisation.&lt;/p&gt;
&lt;h2&gt;Dynamic Analysis vs Static IP Databases&lt;/h2&gt;
&lt;p&gt;MTU fingerprinting is a dynamic signal, which makes it useful alongside static IP reputation databases. It has several practical advantages:&lt;/p&gt;
&lt;h3&gt;Real-Time Adaptation&lt;/h3&gt;
&lt;p&gt;Static IP databases go stale. A residential IP address might be flagged as malicious based on historical activity, but MTU fingerprinting analyses the current network configuration. This dynamic approach captures the infrastructure being used at the moment of connection, providing more accurate and timely intelligence.&lt;/p&gt;
&lt;h3&gt;Treat the value as path evidence&lt;/h3&gt;
&lt;p&gt;An inferred MTU can narrow the possible network paths behind a connection. It cannot prove that a user is on a particular
VPN, mobile carrier or proxy. Different tunnels can produce the same value, endpoints can set their own MTU, and the
capture point may not see the smallest link on the complete path.&lt;/p&gt;
&lt;p&gt;That makes MTU useful beside IP, ASN, TLS, HTTP and behavioural evidence. It can help explain why two requests that share
an IP look different, or why requests from rotating IPs still appear to use the same tunnel shape. Whether it improves a
decision—and whether it changes false positives—has to be measured on local traffic.&lt;/p&gt;
&lt;h2&gt;Where MTU fits&lt;/h2&gt;
&lt;p&gt;MTU fingerprinting turns TCP handshake metadata into a supporting signal, not a network identity. Record the observed TCP
value, inference method and capture point so an operator can see why a label was suggested.&lt;/p&gt;
&lt;p&gt;Start by logging the signal on one route. Compare it with known mobile, residential, corporate and VPN traffic before it
affects enforcement. If the cohorts overlap too heavily, keep the value for investigation rather than forcing it into a
block rule.&lt;/p&gt;</content><category term="Bots"></category><category term="Threat Detection"></category><category term="Fingerprinting"></category><category term="Networking"></category><category term="Residential Proxies"></category><category term="TLS Fingerprinting"></category><category term="DDoS"></category></entry><entry><title>How Bots Contaminate Your A/B Testing Results and Marketing Strategy</title><link href="https://www.peakhour.io/blog/protecting-ab-testing-from-bots/" rel="alternate"></link><published>2025-01-15T13:00:00+11:00</published><updated>2025-01-15T13:00:00+11:00</updated><author><name>Dan</name></author><id>tag:www.peakhour.io,2025-01-15:/blog/protecting-ab-testing-from-bots/</id><summary type="html">&lt;p&gt;Bot traffic corrupts A/B testing results, leading to flawed marketing decisions. Learn how to protect your tests and ensure accurate data for strategic planning.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Marketing teams invest heavily in A/B testing to optimise websites, campaigns and user experiences. These tests inform decisions about design, content and functionality. Bot traffic undermines the validity of those decisions.&lt;/p&gt;
&lt;h2&gt;The Scale of Bot Traffic&lt;/h2&gt;
&lt;p&gt;Our research shows that bots generate half of all internet traffic. This includes legitimate bots, such as search engines, and malicious bots conducting attacks. For marketing teams, this creates a direct problem: your A/B tests include manipulated responses.&lt;/p&gt;
&lt;p&gt;Bot traffic skews test results in multiple ways. Bots do not interact with different test variants the way real users do. They follow programmed patterns rather than genuine user preferences. This contaminates the data marketing teams use to make decisions about website changes, campaign optimisation and &lt;a href="/learning/crux-chrome-user-experience/"&gt;user experience&lt;/a&gt; improvements.&lt;/p&gt;
&lt;h2&gt;The Impact on Marketing Strategy&lt;/h2&gt;
&lt;p&gt;Contaminated A/B test results lead to flawed strategic decisions. Marketing teams might optimise for bot behaviour rather than real user preferences. This affects several areas of strategy:&lt;/p&gt;
&lt;p&gt;Website Design - Teams select layouts and features that perform well with bots rather than humans. Navigation flows optimise for automated traffic patterns instead of genuine user journeys. Content decisions target bot consumption rather than human engagement.&lt;/p&gt;
&lt;p&gt;Campaign Optimisation - Bot interactions corrupt conversion rate data. Teams allocate budgets based on manipulated performance metrics. Campaigns end up catering to bot behaviour instead of real customers.&lt;/p&gt;
&lt;p&gt;User Experience - Interface changes are skewed by bot behaviour patterns. Feature development prioritises elements that score well with automated traffic. Content strategy aligns with bot consumption rather than human needs.&lt;/p&gt;
&lt;h2&gt;The Residential Proxy Challenge&lt;/h2&gt;
&lt;p&gt;&lt;a href="/blog/residential-proxies-unseen-challenges/"&gt;Residential proxy networks&lt;/a&gt; create a specific challenge for A/B testing. These proxies route bot traffic through real consumer IP addresses, making automated traffic look legitimate. Traditional bot detection methods struggle to identify this traffic.&lt;/p&gt;
&lt;p&gt;Our research demonstrates that &lt;a href="/blog/anti-fraud-residential-proxy-detection/"&gt;standard IP intelligence services miss up to 96% of residential proxy traffic&lt;/a&gt;. This means marketing teams include large amounts of proxy-based bot traffic in their test results without realising it.&lt;/p&gt;
&lt;p&gt;Residential proxies mask sophisticated bot behaviour that mimics real users. The bots rotate through different residential IPs to avoid detection. They generate clicks, page views and conversions that appear genuine but represent automated rather than human interactions.&lt;/p&gt;
&lt;h2&gt;Protecting Your Tests&lt;/h2&gt;
&lt;p&gt;Marketing teams need protection measures that keep A/B test results valid. This requires a multi-layered approach to identifying and filtering bot traffic:&lt;/p&gt;
&lt;p&gt;Detection starts with continuous monitoring of traffic patterns. Teams track user behaviour to identify automated interactions. This includes analysing click patterns, page view sequences and conversion flows that indicate bot activity.&lt;/p&gt;
&lt;p&gt;Prevention requires sophisticated &lt;a href="/learning/bots/bot-management/"&gt;bot management&lt;/a&gt; capabilities. Our Bot Management solution blocks automated traffic while allowing real users to participate in tests. The system detects and filters residential proxy traffic so test data comes from genuine visitors.&lt;/p&gt;
&lt;p&gt;Protection extends to API endpoints that support A/B testing infrastructure. Our API Security capabilities prevent bots from manipulating test data through direct API access. This ensures the integrity of test results across all interaction channels.&lt;/p&gt;
&lt;h2&gt;Making Informed Decisions&lt;/h2&gt;
&lt;p&gt;Understanding bot traffic helps marketing teams protect their investment in A/B testing. Data analysis must start by filtering bot interactions from genuine test results. Teams measure genuine user engagement rather than combined human and bot behaviour. This enables accurate assessment of test variants based on real user preferences.&lt;/p&gt;
&lt;p&gt;Strategic planning improves once teams understand the impact of bots. Marketing decisions align with genuine user needs rather than artificial interactions. Campaign optimisation targets real customer segments instead of bot characteristics. Feature development prioritises elements that resonate with humans rather than automated traffic.&lt;/p&gt;
&lt;p&gt;Budget allocation becomes more effective when based on clean data. Teams invest in changes that improve real user experiences rather than bot interactions. Campaign spending targets channels with verified human traffic. Development resources focus on features that drive genuine engagement.&lt;/p&gt;
&lt;h2&gt;Taking Action&lt;/h2&gt;
&lt;p&gt;Marketing teams must implement three key measures to protect A/B testing:&lt;/p&gt;
&lt;p&gt;First, deploy comprehensive bot management to identify and block automated traffic. This forms the foundation for valid test results by ensuring participation from real users.&lt;/p&gt;
&lt;p&gt;Second, implement residential &lt;a href="/products/residential-proxy-detection/"&gt;proxy detection&lt;/a&gt; to prevent sophisticated bots from corrupting test data. This ensures traffic comes from genuine users rather than proxy networks.&lt;/p&gt;
&lt;p&gt;Third, protect API endpoints that support testing infrastructure. Our &lt;a href="/solutions/use-case/traffic-control/"&gt;Traffic Control solution&lt;/a&gt; provides protection across web and API interfaces.&lt;/p&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Bot traffic undermines A/B testing and can push marketing teams towards flawed decisions. Past results may already contain bot interactions. The priority is to detect and filter that traffic before it shapes the next test, campaign or product decision.&lt;/p&gt;</content><category term="Security"></category><category term="Bot Management"></category></entry><entry><title>Anti-Detect Browsers</title><link href="https://www.peakhour.io/blog/anti-detect-browsers-application-security-threat/" rel="alternate"></link><published>2025-01-15T10:00:00+11:00</published><updated>2025-01-15T10:00:00+11:00</updated><author><name>AC</name></author><id>tag:www.peakhour.io,2025-01-15:/blog/anti-detect-browsers-application-security-threat/</id><summary type="html">&lt;p&gt;Anti-detect browsers represent one of the most sophisticated threats facing modern web applications and APIs. Learn how these tools work, why they pose a significant threat to application security, and how modern security platforms can detect and mitigate their use.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Anti-detect browsers matter to defenders because they attack the assumptions behind browser trust. Many bot and fraud controls look for consistency between the browser, network, session, and behaviour. Anti-detect tooling is designed to make automated or repeated activity look more like separate ordinary browser sessions.&lt;/p&gt;
&lt;p&gt;This article is not a guide to using those tools. The defensive question is simpler: when a browser tries to look ordinary, what can still be observed safely, and how should that evidence affect a request decision?&lt;/p&gt;
&lt;h2&gt;Why They Create Risk&lt;/h2&gt;
&lt;p&gt;Anti-detect browsers are often discussed as a browser-fingerprinting problem, but the risk is wider than that. The same traffic may also involve residential proxies, credential lists, automation, and API requests that never run browser-side checks. A login attempt, account creation flow, product scrape, checkout request, or mobile API call may look valid at the protocol level while still being part of an automated campaign.&lt;/p&gt;
&lt;p&gt;The hard part is that some signals are genuinely ambiguous. A changed browser, a new device, a shared network, or a privacy tool does not prove abuse. A defensive system has to treat those observations as risk inputs, not as standalone verdicts.&lt;/p&gt;
&lt;h2&gt;Browser Consistency Is Evidence, Not Identity&lt;/h2&gt;
&lt;p&gt;Anti-detect tooling tries to make browser-reported attributes look internally consistent. That weakens simple checks that only ask whether the browser appears plausible. Defenders need a broader view: does the claimed browser line up with the network stack, TLS and HTTP behaviour, session history, cookie continuity, route sequence, response-code pattern, and recent account behaviour?&lt;/p&gt;
&lt;p&gt;That does not mean a fingerprint identifies a person. Fingerprints classify software, client behaviour, and connection characteristics. They can help separate likely automation from ordinary traffic, but they need to be combined with route, account, proxy, and behavioural context. The result should be a risk classification with evidence attached, not an unexplained block.&lt;/p&gt;
&lt;h2&gt;Residential Proxies Change the Decision&lt;/h2&gt;
&lt;p&gt;Residential proxies are a common companion signal because they make requests appear to come from consumer networks. That creates a false-positive problem. Real customers also use shared residential, mobile, office, carrier-grade NAT, and public Wi-Fi networks. Blocking every suspicious or shared source would damage legitimate traffic.&lt;/p&gt;
&lt;p&gt;The safer approach is to use &lt;a href="/products/residential-proxy-detection/"&gt;residential proxy detection&lt;/a&gt; as one input in the decision. A proxy signal on a public content page may be logged. The same signal on repeated login failures, account creation, checkout abuse, or sensitive APIs may justify a challenge, rate limit, or block. Context changes the action.&lt;/p&gt;
&lt;h2&gt;The API Gap&lt;/h2&gt;
&lt;p&gt;Browser-side checks are weakest where the browser is not present. Mobile apps, partner integrations, token routes, and direct API clients may not expose the same JavaScript or browser evidence that a web page does. Attackers do not need a convincing browser if the target workflow accepts valid-looking API requests.&lt;/p&gt;
&lt;p&gt;That is why anti-detect risk belongs in the wider &lt;a href="/solutions/application-security/"&gt;application security&lt;/a&gt; model. API routes need method, schema, authentication, token, request cadence, response-code, account, and bot context. If the only signal available is an IP address, the decision will be too blunt.&lt;/p&gt;
&lt;h2&gt;Observable Signals Defenders Can Use&lt;/h2&gt;
&lt;p&gt;The useful evidence is usually the mismatch between what the request claims to be and how it behaves over time. A browser may look plausible on one request, but the wider pattern can still show automation: repeated attempts across accounts, route sequences that normal users do not follow, cache-miss pressure on expensive pages, unusual response-code loops, or browser and network characteristics that drift in ways ordinary clients rarely do.&lt;/p&gt;
&lt;p&gt;&lt;a href="/products/bot-management/"&gt;Bot Management&lt;/a&gt; works best when it combines these signals rather than chasing a single magic detector. IP intelligence, proxy classification, network and browser fingerprints, route-aware rates, API state, WAF findings, and behaviour should all feed the same action vocabulary: allow, challenge, rate limit, block, log, or review.&lt;/p&gt;
&lt;h2&gt;Safer Defensive Response&lt;/h2&gt;
&lt;p&gt;The defensive response should be proportionate. High-confidence exploit traffic can be blocked quickly. Uncertain browser or proxy evidence may be better challenged, rate limited, or logged until the pattern is clearer. Sensitive routes should have tighter policy than public content. Account-impacting actions should preserve enough evidence for review.&lt;/p&gt;
&lt;p&gt;This is especially important for support teams. If a real customer is challenged or blocked, operators need to see which signal drove the action and which route was involved. Without that record, anti-bot policy becomes a black box.&lt;/p&gt;
&lt;h2&gt;Final Thoughts&lt;/h2&gt;
&lt;p&gt;Anti-detect browsers are a practical problem because they reduce the value of simple browser checks. They do not make traffic invisible. They leave request-path evidence in network behaviour, route sequences, account activity, API usage, proxy signals, and response patterns.&lt;/p&gt;
&lt;p&gt;The right goal is not to identify a person from a fingerprint or to block every unusual browser. The goal is to classify risk with enough context to choose a safe action at the edge, then keep the evidence available for tuning and review.&lt;/p&gt;</content><category term="Bots"></category><category term="Bot Management"></category><category term="Threat Detection"></category><category term="Application Security"></category><category term="Browser Fingerprinting"></category><category term="Fingerprinting"></category><category term="DevSecOps"></category></entry><entry><title>The Hidden Cost of Click Fraud</title><link href="https://www.peakhour.io/blog/protecting-against-click-fraud/" rel="alternate"></link><published>2025-01-14T13:00:00+11:00</published><updated>2025-01-14T13:00:00+11:00</updated><author><name>Dan</name></author><id>tag:www.peakhour.io,2025-01-14:/blog/protecting-against-click-fraud/</id><summary type="html">&lt;p&gt;Click fraud drains marketing budgets and corrupts campaign data. Learn how bots and residential proxies impact your ad spend and marketing strategy.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Marketing organisations are losing money to automated clicks and fake impressions. These attacks drain advertising budgets and corrupt the data CMOs rely on for strategic decisions. The lost money cannot be recovered, but understanding the scale and mechanics of &lt;a href="/learning/click-fraud/how-to-identify-click-fraud/"&gt;click fraud&lt;/a&gt; helps marketing teams protect future investment and optimise campaigns.&lt;/p&gt;
&lt;h2&gt;The Scale of Click Fraud&lt;/h2&gt;
&lt;p&gt;Click fraud now consumes 40% of digital advertising budgets through fake clicks and impressions that never reach real customers. It affects every digital marketing channel, from pay-per-click and display advertising to social media campaigns, retargeting, and video advertising. The damage goes beyond direct financial loss, because it also corrupts the metrics teams use for decision-making.&lt;/p&gt;
&lt;p&gt;Our research on bot traffic shows the percentage of fraudulent clicks continues to rise each quarter. Marketing teams that ignore this threat base their strategies on flawed data, which leads to misallocated resources and weaker campaign performance.&lt;/p&gt;
&lt;h2&gt;How Bots Generate Fake Clicks&lt;/h2&gt;
&lt;p&gt;Automated bots generate clicks and impressions at scale across digital advertising platforms. These programs target competitor advertisements to drain marketing budgets through fake clicks. They create artificial impressions that inflate metrics and send false engagement signals. Bots also manipulate bidding algorithms and skew attribution data, leading to misallocated advertising resources.&lt;/p&gt;
&lt;p&gt;Modern bots use more advanced techniques to evade standard security controls. They mimic human behaviour patterns and rotate through different IP addresses to avoid detection and blocking.&lt;/p&gt;
&lt;h2&gt;The Residential Proxy Challenge&lt;/h2&gt;
&lt;p&gt;&lt;a href="/blog/residential-proxies-unseen-challenges/"&gt;Residential proxies&lt;/a&gt; create a significant obstacle for click fraud detection systems. These proxy services route bot traffic through IP addresses assigned to real consumers' homes and devices, making fraudulent traffic look legitimate to traditional anti-bot tools.&lt;/p&gt;
&lt;p&gt;Residential &lt;a href="/products/residential-proxy-detection/"&gt;proxy networks&lt;/a&gt; build their IP pools through multiple channels. They partner with consumer VPN services, distribute browser extensions, embed code in mobile applications, and in some cases exploit compromised devices. This mix gives proxy operators access to millions of residential IP addresses.&lt;/p&gt;
&lt;p&gt;Traditional IP reputation services fail to identify this proxy traffic. Our research demonstrates these services &lt;a href="/blog/anti-fraud-residential-proxy-detection/"&gt;miss up to 96% of residential proxy traffic&lt;/a&gt;, leaving advertising campaigns exposed to fraud through these channels.&lt;/p&gt;
&lt;h2&gt;Impact on Marketing Strategy&lt;/h2&gt;
&lt;p&gt;Click fraud undermines three core areas of marketing decision-making. First, it distorts campaign performance metrics through false click-through rates and inflated impression counts. The fraud creates skewed conversion data and engagement metrics that mask true campaign performance.&lt;/p&gt;
&lt;p&gt;In budget allocation, click fraud wastes marketing spend on non-existent users while reducing campaign ROI. Artificially inflated acquisition costs lead marketing teams to misallocate resources across channels and campaigns.&lt;/p&gt;
&lt;p&gt;Strategic planning suffers when data is contaminated across multiple dimensions. A/B testing results become invalid when bots generate fake interactions. Geographic and demographic data lose accuracy due to proxy traffic. Competitive intelligence becomes unreliable as bot activity masks true market dynamics.&lt;/p&gt;
&lt;p&gt;Marketing teams that base decisions on corrupted data take on significant risk. Their optimisation efforts target bot behaviour instead of real users. Campaign budgets flow to channels dominated by fraud. Strategic initiatives fail because decisions are based on artificial metrics rather than genuine customer behaviour.&lt;/p&gt;
&lt;h2&gt;Protecting Your Marketing Investment&lt;/h2&gt;
&lt;p&gt;Lost money from click fraud cannot be recovered, so marketing teams need protection measures for future investment. Detection forms the first line of defence through continuous monitoring of traffic patterns and IP reputation analysis. Teams track user behaviour to identify suspicious patterns that indicate fraud.&lt;/p&gt;
&lt;p&gt;Prevention requires a multi-layered security approach. Marketing teams need systems that block known bot networks and detect residential proxies attempting to generate fake clicks. These controls validate real user traffic and filter out fraudulent clicks before they affect campaigns.&lt;/p&gt;
&lt;p&gt;Campaign optimisation becomes more useful once fraud protection is in place. Teams can adjust targeting parameters based on genuine user data and reallocate budgets to channels with verified traffic. This supports updates to bidding strategies and refinement of audience segments based on real engagement.&lt;/p&gt;
&lt;p&gt;Our Ad Fraud Protection solution protects marketing investment by blocking bot traffic, detecting residential proxies, and validating real users. This helps ensure ad spend reaches genuine customers rather than fraudulent clicks.&lt;/p&gt;
&lt;h2&gt;Making Informed Decisions&lt;/h2&gt;
&lt;p&gt;Understanding click fraud changes how marketing teams analyse data and plan campaigns. Data analysis starts with identifying corrupted metrics in campaign reports. Teams must filter bot traffic from their analytics to measure real user engagement. This enables tracking of true campaign performance based on human interactions.&lt;/p&gt;
&lt;p&gt;Budget planning improves once teams understand the scale of click fraud. Marketing teams can allocate resources to channels with verified human traffic. This focus on real users optimises campaign spend and improves return on investment across marketing initiatives.&lt;/p&gt;
&lt;p&gt;Strategy development depends on clean, accurate data. Teams make decisions based on genuine user behaviour rather than bot interactions. Campaign planning targets real audience segments with messages that resonate. Performance measurement reflects actual results rather than artificial engagement.&lt;/p&gt;
&lt;h2&gt;Taking Action&lt;/h2&gt;
&lt;p&gt;Marketing teams need protection measures across three key areas to secure their investments. First, bot protection forms the foundation through deployment of bot management systems. These systems block automated traffic while validating real users and monitoring for suspicious patterns.&lt;/p&gt;
&lt;p&gt;The second protection layer focuses on &lt;a href="/blog/residential-proxies-unseen-challenges/"&gt;residential proxy detection&lt;/a&gt;. Teams implement proxy detection to identify and block proxy networks. This helps ensure traffic comes from real IP addresses and prevents fraud through residential proxies.&lt;/p&gt;
&lt;p&gt;The third component centres on protecting ad spend through traffic monitoring. Teams implement systems to block fraudulent clicks and validate impressions. This enables tracking of real engagement from genuine users.&lt;/p&gt;
&lt;p&gt;Our &lt;a href="/solutions/use-case/traffic-control/"&gt;Traffic Control solution&lt;/a&gt; combines these protection measures to help marketing teams secure their investments and base decisions on real user data.&lt;/p&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Click fraud threatens marketing budgets and corrupts campaign data. Lost money cannot be recovered, but understanding and preventing fraud helps marketing teams protect future investment and make better decisions.&lt;/p&gt;</content><category term="Fraud"></category><category term="Fraud Prevention"></category><category term="Bot Management"></category><category term="Credential Stuffing"></category><category term="Residential Proxies"></category><category term="Analytics"></category><category term="Account Protection"></category></entry><entry><title>Residential Proxies - The Growing Threat to Ad Campaigns</title><link href="https://www.peakhour.io/blog/residential-proxy-ad-fraud/" rel="alternate"></link><published>2024-12-30T00:00:00+11:00</published><updated>2024-12-30T00:00:00+11:00</updated><author><name>AC</name></author><id>tag:www.peakhour.io,2024-12-30:/blog/residential-proxy-ad-fraud/</id><summary type="html">&lt;p&gt;Learn how distributed bot networks using residential IPs are evolving to evade traditional fraud detection&lt;/p&gt;</summary><content type="html">&lt;p&gt;Digital advertising fraud costs organisations &lt;strong&gt;$42 billion annually&lt;/strong&gt; through fake clicks
and fake impressions. The growth of &lt;a href="/products/residential-proxy-detection/"&gt;residential proxy&lt;/a&gt; networks has changed how this fraud reaches campaigns: bot traffic can now hide behind legitimate residential IP addresses, putting it outside the reach of many traditional checks.&lt;/p&gt;
&lt;h3&gt;Hiding in the crowd&lt;/h3&gt;
&lt;p&gt;Residential proxies make bad traffic harder to separate from real visitors. Unlike data centre IPs that traditional tools can often detect, residential proxies hide behind real households' internet connections. This means the traffic appears to come from genuine users in your target market. When a residential proxy network operates from Sydney suburbs to attack an Australian campaign, &lt;a href="/blog/anti-fraud-residential-proxy-detection/"&gt;existing protection systems&lt;/a&gt; can be fooled into treating it as authentic local traffic.&lt;/p&gt;
&lt;p&gt;The impact extends beyond direct financial losses. Your analytics may show engagement from what appears to be your target demographic, while the activity is bot traffic masquerading as potential customers. This contaminated data can push marketing strategy in the wrong direction and waste retargeting spend. Competitors can also use fake clicks to drain your budget while gathering intelligence on your campaigns.&lt;/p&gt;
&lt;p&gt;Bad data then compounds the spend problem. Once bots are counted as engaged prospects, reporting and optimisation start from the wrong signal. The result is not only wasted media spend, but poorer decisions built on traffic that should never have been treated as customer intent.&lt;/p&gt;
&lt;h3&gt;A growing threat&lt;/h3&gt;
&lt;p&gt;The residential proxy industry continues to expand. Services now offer millions of residential IPs with precise geographic
targeting capabilities. They rotate IPs automatically and match
real browser fingerprints. Without specialised detection methods, the traffic can become indistinguishable from genuine users.&lt;/p&gt;
&lt;p&gt;This is a budget problem, not just a technical one. Each day without protection means 30-40% of your ad budget feeds bot networks
instead of reaching customers. The corrupted analytics drive decisions that compound these losses. As residential
proxy services grow more sophisticated, basic controls fall further behind.&lt;/p&gt;
&lt;p&gt;Traditional IP reputation and rate limiting fail against this distributed threat because the IP addresses are not obviously suspicious. Protection requires advanced network
fingerprinting that looks beyond IP addresses. Peakhour's Ad &lt;a href="/solutions/use-case/protect-ad-spend/"&gt;Fraud Protection&lt;/a&gt; analyses subtle patterns in how
residential proxies connect and behave, and detects the signs of proxy traffic that other solutions miss.&lt;/p&gt;
&lt;h3&gt;Knowledge is power&lt;/h3&gt;
&lt;p&gt;Peakhour integrates this protection with your existing ad platforms to stop fraud before it affects your campaigns.
Our customers have reduced wasted ad spend by 35% while improving campaign performance through cleaner analytics.
The system adapts as threat techniques change, so detection keeps pace with new residential proxy methods.&lt;/p&gt;
&lt;p&gt;Residential proxies have changed ad fraud because traffic that appears local and legitimate may mask sophisticated
bot networks. Protecting your campaigns requires detection that goes beyond IP addresses and treats residential proxy behaviour as its own signal. &lt;a href="/contact-us/"&gt;Contact us&lt;/a&gt; to learn how we can help secure your ad spend against residential proxy networks.&lt;/p&gt;</content><category term="Residential Proxies"></category><category term="Residential Proxies"></category><category term="Bot Management"></category><category term="Threat Detection"></category><category term="Fraud Prevention"></category><category term="Credential Stuffing"></category><category term="DDoS"></category></entry><entry><title>Next-Generation Application Security Defence Strategies</title><link href="https://www.peakhour.io/blog/ai-powered-cyber-threats-application-security-defence/" rel="alternate"></link><published>2024-11-15T14:00:00+11:00</published><updated>2024-11-15T14:00:00+11:00</updated><author><name>AC</name></author><id>tag:www.peakhour.io,2024-11-15:/blog/ai-powered-cyber-threats-application-security-defence/</id><summary type="html">&lt;p&gt;Comprehensive analysis of AI-powered cyber threats and how modern application security platforms defend against machine learning-driven attacks. Learn advanced defence strategies for the AI cybersecurity arms race.&lt;/p&gt;</summary><content type="html">&lt;p&gt;As I look at recent cyber threat activity, the pattern is clear enough: AI is no longer only a defensive tool. Attackers are using it to probe, adapt, and automate application-layer attacks.&lt;/p&gt;
&lt;p&gt;One recent incident made that plain. Our threat detection systems identified a series of probes against a client's infrastructure. These were not the typical brute-force attempts we are used to blocking. The attack patterns changed in real time, adapted to our defences, and probed for weaknesses in a way that pointed to AI-driven automation.&lt;/p&gt;
&lt;p&gt;The individual attempts were not the main concern. What mattered was how the attack system learned and adjusted its approach. When we blocked one vector, it shifted to another. When we implemented rate limiting, it distributed its attempts through residential proxies. The attack showed a common trait of AI systems: rapid iteration and learning from failure.&lt;/p&gt;
&lt;p&gt;This change in attack methodology puts real pressure on the traditional security model. Static defences, including controls that looked strong only months ago, are easier to route around. They might stop obvious threats, but more capable AI-powered attacks can keep testing the edges until they find a path.&lt;/p&gt;
&lt;p&gt;The threat landscape has shifted in three practical ways. First, AI enables attacks to adapt and evolve in real time. Second, residential proxies give attackers a distributed network of IP addresses that appear legitimate, making traffic origin verification much harder. Third, AI can analyse and mimic legitimate user behaviour patterns closely enough to bypass traditional bot detection.&lt;/p&gt;
&lt;p&gt;These changes require a change in defence strategy. Identifying and blocking known attack patterns still matters, but it is no longer enough on its own. We need systems that can anticipate and adapt to new threats as quickly as they emerge.&lt;/p&gt;
&lt;p&gt;In our security operations, we've begun implementing what we call "contextual defence dynamics." The approach moves beyond simple pattern matching to analyse the intent and behaviour behind each request. We examine not just what a request does, but how it fits into broader patterns of behaviour and what it might indicate about the attacker's objectives.&lt;/p&gt;
&lt;p&gt;That approach has already proved useful. When we implemented contextual defence dynamics for a major e-commerce client, we identified and blocked an AI-powered credential stuffing attack that had evaded traditional detection methods for weeks. The attack used residential proxies to distribute its attempts and mimicked human behaviour patterns, but our system identified subtle anomalies in its timing and response patterns.&lt;/p&gt;
&lt;p&gt;That case highlighted a useful point: while AI-powered attacks grow more sophisticated, they still exhibit patterns. Those patterns may not appear in individual actions, but they do appear in broader behaviour and objectives. By shifting our focus from blocking specific actions to understanding and responding to these broader patterns, we can maintain effective defences even against evolving threats.&lt;/p&gt;
&lt;p&gt;This approach requires a different way of thinking about security. We must move from a model of static defences to one of dynamic response. Our security systems must learn and adapt as quickly as the threats they face. This means implementing machine learning systems that can identify new attack patterns, updating defence strategies in real time, and maintaining awareness of emerging threat vectors.&lt;/p&gt;
&lt;p&gt;The implications extend beyond technical implementation. Organisations need to treat security budgets and strategies as ongoing commitments, not one-off purchases. The era of "set and forget" security solutions has ended. Continuous adaptation and review now sit at the centre of effective defence.&lt;/p&gt;
&lt;p&gt;I expect this arms race to keep accelerating. AI will continue to enhance both attack and defence capabilities. The organisations that maintain strong security will be those that accept this dynamic and build their defences around continuous adaptation.&lt;/p&gt;
&lt;p&gt;For security professionals, this means developing new skills and approaches. We must understand not just the technical aspects of security, but the patterns of attack and defence that emerge in AI-driven systems. We must build systems that can learn and adapt, and we must be prepared to change strategy as the threat landscape evolves.&lt;/p&gt;
&lt;p&gt;The security arms race has entered a new phase. The advantage will not sit with the strongest static defences alone, but with teams that can adapt and evolve their protection strategies in real time. The focus must shift from building walls to creating intelligent, adaptive defence systems that can match the sophistication of AI-powered threats.&lt;/p&gt;
&lt;p&gt;This shift in security thinking is practical, not theoretical. The threats we face are becoming more capable, and defensive tooling is improving as well. The important step is recognising the change and adapting how we build, operate, and review application security controls.&lt;/p&gt;</content><category term="Security"></category><category term="Threat Detection"></category><category term="Machine Learning"></category><category term="DevSecOps"></category><category term="Bot Management"></category><category term="DDoS"></category><category term="Application Security"></category></entry><entry><title>Your Anti-Fraud Residential Proxy Detection Sucks</title><link href="https://www.peakhour.io/blog/anti-fraud-residential-proxy-detection/" rel="alternate"></link><published>2024-10-04T13:00:00+10:00</published><updated>2024-10-04T13:00:00+10:00</updated><author><name>Dan</name></author><id>tag:www.peakhour.io,2024-10-04:/blog/anti-fraud-residential-proxy-detection/</id><summary type="html">&lt;p&gt;Your anti fraud IP Intelligence service is no longer fit for purpose. Learn about the challenges in detecting residential proxies and why traditional methods don't work.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Online fraud is big business: account takeovers, chargebacks, scams, even romance scams. It costs businesses billions of
dollars every year.&lt;/p&gt;
&lt;p&gt;A common way websites fight it is to use an anti-fraud service to calculate the risk of
a transaction. Most teams get this intelligence from a third-party service, either through an API or a plugin.&lt;/p&gt;
&lt;p&gt;For online stores, &lt;a href="/industries/ecommerce/"&gt;ecommerce fraud prevention&lt;/a&gt; has to protect checkout and account flows without punishing real customers.&lt;/p&gt;
&lt;p&gt;One of the major signals these services use is &lt;a href="/products/ip-intelligence/"&gt;IP reputation&lt;/a&gt;. IP reputation tries to answer questions like:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Is the order coming from a datacentre?&lt;/li&gt;
&lt;li&gt;Is it coming from a country other than your target audience?&lt;/li&gt;
&lt;li&gt;Is the IP address a known VPN?&lt;/li&gt;
&lt;li&gt;Is it a known TOR exit node?&lt;/li&gt;
&lt;li&gt;Have lots of fraudulent orders come from this IP address in the past?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Until recently, these services gave teams a useful way to calculate fraud risk from an IP address.&lt;/p&gt;
&lt;p&gt;Not anymore.&lt;/p&gt;
&lt;p&gt;Fraud traffic has shifted in recent years, away from VPNs and TOR and toward &lt;a href="/learning/security/datacenter-vs-residential-proxies/"&gt;residential proxies&lt;/a&gt;. These same
anti-fraud services &lt;em&gt;claim&lt;/em&gt; they can detect residential proxies, but what if the services many businesses rely on
are falling well short?&lt;/p&gt;
&lt;p&gt;The results are bad enough that they deserve a blunt look.&lt;/p&gt;
&lt;h2&gt;The Shocking Truth: Our Results&lt;/h2&gt;
&lt;p&gt;We took 25 IP addresses that had just been used as residential proxies in an attack on one of our clients, and
within 5 minutes of detection ran them through some of the most popular IP intelligence services. The results are
not going into anyone's marketing deck.&lt;/p&gt;
&lt;p&gt;Here's a summary of our findings:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Service&lt;/th&gt;
&lt;th&gt;Detected Proxies&lt;/th&gt;
&lt;th&gt;Accuracy&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Maxmind&lt;/td&gt;
&lt;td&gt;0/25&lt;/td&gt;
&lt;td&gt;0%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IP Quality Score&lt;/td&gt;
&lt;td&gt;6/25&lt;/td&gt;
&lt;td&gt;24%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Seon&lt;/td&gt;
&lt;td&gt;1/25&lt;/td&gt;
&lt;td&gt;4%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ProxyCheck.io&lt;/td&gt;
&lt;td&gt;0/25&lt;/td&gt;
&lt;td&gt;0%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ip2proxy&lt;/td&gt;
&lt;td&gt;1/25&lt;/td&gt;
&lt;td&gt;4%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The best performer in our test, IP Quality Score, detected only 24% of the proxies. The others ranged from 0% to 4%.&lt;/p&gt;
&lt;h2&gt;Why Your Residential Proxy Detection Service is Failing You&lt;/h2&gt;
&lt;p&gt;So why are these services performing so poorly? To understand it, we need to look at how proxy usage and detection
have changed.&lt;/p&gt;
&lt;h3&gt;The Good Old Days of Proxy Detection&lt;/h3&gt;
&lt;p&gt;In the recent past, detecting proxies was much easier. Fraudsters primarily used:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;TOR networks&lt;/li&gt;
&lt;li&gt;VPN services&lt;/li&gt;
&lt;li&gt;Data center proxies&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;These were relatively static targets. They were tied to a single, stationary IP, or &lt;a href="/learning/ipaddress-subnets"&gt;IP ranges&lt;/a&gt;.
Listing them in IP block lists was straightforward.&lt;/p&gt;
&lt;h2&gt;The Rise of Residential Proxies: A New Breed of Threat&lt;/h2&gt;
&lt;p&gt;Now we need to talk about residential proxies,
the new go-to tool of fraudsters and scammers. These are not just a new label for old proxies. They behave differently.&lt;/p&gt;
&lt;h3&gt;What Are Residential Proxies?&lt;/h3&gt;
&lt;p&gt;Residential proxies come from IP addresses assigned to real residential services by Internet Service Providers
(ISPs). These can be:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Home computers&lt;/li&gt;
&lt;li&gt;Mobile phones&lt;/li&gt;
&lt;li&gt;Tablets&lt;/li&gt;
&lt;li&gt;IoT devices&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Unlike data center proxies, which use IP addresses from hosting companies, residential proxies use IPs that look just
like any other home or mobile user. They have become the tool for avoiding security controls on websites in the last
2-3 years, and they are causing all sorts of headaches for website owners.&lt;/p&gt;
&lt;h3&gt;How Are Residential Proxy Networks Formed?&lt;/h3&gt;
&lt;p&gt;This is where the problem starts:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Compromised Devices&lt;/strong&gt;: Malware can turn innocent devices into proxy endpoints without the owner's knowledge.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Incentivised Programs&lt;/strong&gt;: Some companies offer users benefits (like free VPN services) in exchange for using their
   device as a proxy endpoint. Hola VPN and Brightdata are prominent examples.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;APP SDKs&lt;/strong&gt; Quite often, proxy providers will
   incentivise app developers to include their proxy toolkit in their apps. The user is totally unaware that their
   device's internet connection is now being resold.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;So your personal device, be it a computer or phone, could have its internet connection used to carry out a
crime without you knowing. The police could come knocking on &lt;em&gt;YOUR&lt;/em&gt; door one day.&lt;/p&gt;
&lt;h3&gt;Why Are They So Dynamic?&lt;/h3&gt;
&lt;p&gt;Since the proxy is formed by reusing the internet connection of a device, it is inherently much more dynamic than a proxy
formed on a server.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Device Mobility&lt;/strong&gt;: A mobile phone can connect from home Wi-Fi, then a coffee shop, then a cellular network – all in one day.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;ISP IP Rotation&lt;/strong&gt;: Many ISPs dynamically assign IP addresses, changing them periodically.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Depending on the type of fraud being carried out, the attacker might also rotate the device being used, popping out of
a different location. Also, due to the way these proxies are formed, i.e. via an app on a computer or phone, that particular
exit point on the proxy network might depend on that app being open.&lt;/p&gt;
&lt;p&gt;This dynamic nature is what makes residential proxies so hard to detect using traditional methods.&lt;/p&gt;
&lt;h3&gt;Shared IPs: The Needle in the Haystack Problem&lt;/h3&gt;
&lt;p&gt;Residential proxy IPs are not just dynamic. They are typically shared. This means that a
single IP address could be used by both legitimate users and proxy traffic:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;ISP IP Pools&lt;/strong&gt;: Internet Service Providers often use large pools of IPs that are dynamically assigned to users.
   This means that an IP used by a proxy one minute could be assigned to your grandmother's iPad the next.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Carrier-Grade NAT (CGN)&lt;/strong&gt;: Mobile carriers frequently use CGN, which can make hundreds or thousands of users
   appear to come from the same IP address.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Compromised Routers&lt;/strong&gt;: A single compromised home router could serve both the legitimate traffic of the homeowner
   and proxy traffic from the attacker.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If you simply blocked any IP that shows proxy behavior, you would end up blocking legitimate users too.&lt;/p&gt;
&lt;h2&gt;Why Traditional Methods Are Failing (Revisited)&lt;/h2&gt;
&lt;p&gt;Now that we understand residential proxies better, let's revisit why old-school detection methods are not enough.&lt;/p&gt;
&lt;h3&gt;1. Port Scanning&lt;/h3&gt;
&lt;p&gt;Traditional proxy detection often relies on scanning for open proxy ports. Here's a simple port scanner:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;socket&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;port_scan&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ip&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;sock&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;socket&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;socket&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;socket&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AF_INET&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;socket&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SOCK_STREAM&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sock&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;connect_ex&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;ip&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="n"&gt;sock&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;close&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;

&lt;span class="c1"&gt;# Example usage&lt;/span&gt;
&lt;span class="n"&gt;ip&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;123.45.67.89&amp;quot;&lt;/span&gt;
&lt;span class="n"&gt;proxy_ports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;8080&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3128&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;  &lt;span class="c1"&gt;# Common proxy ports&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;port&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;proxy_ports&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;port_scan&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ip&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Port &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; is open - potential proxy detected&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Why it fails&lt;/strong&gt;: Residential proxies don't typically have these ports open. They route traffic through standard web
ports, making them indistinguishable from normal traffic.&lt;/p&gt;
&lt;h3&gt;2. Honeypots&lt;/h3&gt;
&lt;p&gt;Honeypots try to lure and identify proxy traffic.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Why it fails&lt;/strong&gt;: Sophisticated residential proxy networks can identify and avoid known honeypots. Plus, since they're
using real residential IPs, even if they do hit a honeypot, the IP itself isn't a reliable indicator of proxy usage.&lt;/p&gt;
&lt;h3&gt;3. Client-Side Detection&lt;/h3&gt;
&lt;p&gt;Detection services may also try to detect proxies by executing Javascript in the browser and checking the result
for inconsistencies. These are the common techniques.&lt;/p&gt;
&lt;h4&gt;3.1 WebRTC Leak&lt;/h4&gt;
&lt;p&gt;WebRTC can sometimes reveal a user's true IP address:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;detectRealIP&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;callback&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kd"&gt;var&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;RTCPeerConnection&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;RTCPeerConnection&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;||&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;mozRTCPeerConnection&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;||&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;webkitRTCPeerConnection&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kd"&gt;var&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;pc&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ow"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;RTCPeerConnection&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="nx"&gt;iceServers&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="p"&gt;[]}),&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;noop&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(){};&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nx"&gt;pc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;createDataChannel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nx"&gt;pc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;createOffer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;pc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;setLocalDescription&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;bind&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;pc&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;noop&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nx"&gt;pc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;onicecandidate&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ice&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;ice&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;||&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;ice&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;candidate&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;||&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;ice&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;candidate&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;candidate&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="kd"&gt;var&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;myIP&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="sr"&gt;/([0-9]{1,3}(\.[0-9]{1,3}){3}|[a-f0-9]{1,4}(:[a-f0-9]{1,4}){7})/&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exec&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ice&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;candidate&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;candidate&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="mf"&gt;1&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nx"&gt;pc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;onicecandidate&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;noop&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nx"&gt;callback&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;myIP&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;detectRealIP&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ip&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Your real IP address is: &amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;ip&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h4&gt;3.2 Geolocation Inconsistencies&lt;/h4&gt;
&lt;p&gt;Comparing IP-based geolocation with browser-reported location.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nx"&gt;navigator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;geolocation&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getCurrentPosition&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;position&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;browserLat&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;position&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;coords&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;latitude&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;browserLong&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;position&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;coords&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;longitude&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="c1"&gt;// Compare with IP-based geolocation from server&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h4&gt;3.3 DNS Leaks&lt;/h4&gt;
&lt;p&gt;Check whether DNS requests are routed through the proxy or are leaking:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;image&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ow"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Image&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;uniqueDomain&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="sb"&gt;`test-&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nb"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;now&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sb"&gt;.example.com`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nx"&gt;image&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;src&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="sb"&gt;`http://&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;uniqueDomain&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sb"&gt;/pixel.gif`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="c1"&gt;// Monitor DNS requests server-side to detect leaks&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h4&gt;3.4 Browser Fingerprinting&lt;/h4&gt;
&lt;p&gt;Check whether there are inconsistencies with the browser, e.g. timezone, and the geolocation of the IP address&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;fingerprint&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="nx"&gt;userAgent&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;navigator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;userAgent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="nx"&gt;screenResolution&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;screen&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;width&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sb"&gt;x&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;screen&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;height&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="nx"&gt;colorDepth&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;screen&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;colorDepth&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="nx"&gt;timezone&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;Intl&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;DateTimeFormat&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nx"&gt;resolvedOptions&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nx"&gt;timeZone&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="nx"&gt;plugins&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;Array&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="kr"&gt;from&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;navigator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;plugins&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="c1"&gt;// ... other characteristics&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="c1"&gt;// Analyze fingerprint for proxy indicators&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h4&gt;Why these techniques fail&lt;/h4&gt;
&lt;p&gt;Proxy services can work around all of these methods. Many browsers now allow users to disable WebRTC or use
extensions that prevent this leak. Some &lt;a href="/products/residential-proxy-detection/"&gt;residential proxy&lt;/a&gt; services are sophisticated enough to handle WebRTC
requests without leaking the real IP.&lt;/p&gt;
&lt;p&gt;Finally, relying on client-side detection means:
* Your detection can be reverse engineered and bypassed.
* You've already served the content the attacker wants.
* It requires Javascript execution, something that won't always be available, for instance on an API.&lt;/p&gt;
&lt;h3&gt;4. Threat Intelligence&lt;/h3&gt;
&lt;p&gt;Threat intelligence involves maintaining databases of known proxy IP addresses:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;requests&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;check_ip_threat_intel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ip&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;api_key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;your_api_key_here&amp;quot;&lt;/span&gt;
    &lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;https://api.threatintelligence.com/v1/ip/&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;ip&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;?key=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;
    &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status_code&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;is_proxy&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;False&lt;/span&gt;

&lt;span class="c1"&gt;# Example usage&lt;/span&gt;
&lt;span class="n"&gt;ip&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;123.45.67.89&amp;quot;&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;check_ip_threat_intel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ip&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;ip&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; is a known proxy according to threat intelligence&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Why it fails&lt;/strong&gt;: As our results show, threat intelligence databases are struggling to keep up with the dynamic nature
of residential proxies. By the time an IP is identified and added to a database, it may no longer be in use as a proxy.&lt;/p&gt;
&lt;h2&gt;Why IP-Based Blocking Is No Longer Enough&lt;/h2&gt;
&lt;p&gt;Given the shared nature of IPs in the age of residential proxies, simply identifying and blocking "bad" IPs is too blunt.
Here's why:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;False Positives&lt;/strong&gt;: Blocking an IP used by a proxy might also block legitimate users sharing that IP.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ineffectiveness&lt;/strong&gt;: Proxies can quickly switch to new IPs, so IP-based blocking turns into a chase.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Collateral Damage&lt;/strong&gt;: You might end up blocking entire ISPs or mobile carriers, cutting off large swaths of legitimate users.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The practical failure is customer friction. A checkout, login, or account recovery flow cannot treat every residential or mobile network as hostile. Teams need enough request context to choose a proportionate response: log the signal on a low-risk page, challenge a suspicious account change, rate limit repeated failures, or block only when proxy evidence lines up with stronger abuse indicators.&lt;/p&gt;
&lt;p&gt;The same problem shows up on APIs and partner integrations. A partner batch job, mobile carrier, or shared office network can look noisy without being hostile. A compromised key can look legitimate until it starts hitting expensive routes. Good review paths keep the route, account or API key, request rate, fingerprint, and recent outcomes together so the answer is not just "block the IP" or "allow everything."&lt;/p&gt;
&lt;p&gt;This is where proxy detection stops being a lookup problem and becomes an operating problem. The team needs to know which route was hit, what account or session was involved, whether the request matched normal behaviour, and what the enforcement cost would be if the signal was wrong. That is the difference between reducing abuse and quietly pushing good customers into support. For a deeper treatment of that tradeoff, see the guide to &lt;a href="/learning/account-protection/customer-friction-and-false-positives/"&gt;customer friction and false-positive measurement&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;The Need for Connection-Level Detection&lt;/h2&gt;
&lt;p&gt;Instead of focusing only on IPs, we need to look at the connections themselves. Here's what this means:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Deep packet inspection&lt;/strong&gt;: Analyses traffic patterns and characteristics beyond surface-level indicators.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Protocol behaviour analysis&lt;/strong&gt;: Identifies subtle anomalies in how network protocols are implemented across the proxy chain.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;TLS/TCP fingerprinting&lt;/strong&gt;: Examines characteristics of TLS handshakes to detect proxy usage.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Timing analysis&lt;/strong&gt;: Measures minute differences in network latency that can indicate the presence of a proxy.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Final Thoughts&lt;/h2&gt;
&lt;p&gt;Proxy usage has evolved, and detection methods need to keep up. Simple IP-based blocking and static lists of "bad" addresses are no longer enough. They still have a place, but they cannot be the whole answer.&lt;/p&gt;
&lt;p&gt;Modern residential proxy detection has to evaluate the live request: IP context, connection behaviour, fingerprints, route, account state, request rate, and recent outcomes. On a low-risk page that may only justify logging. On login, signup, checkout, password reset, API key creation, or account recovery, the same signal may justify a challenge, hold, rate limit, or block.&lt;/p&gt;
&lt;p&gt;Peakhour's &lt;a href="/products/residential-proxy-detection/"&gt;residential proxy detection&lt;/a&gt; is built for that request-path decision. The point is not to label every residential IP as bad. The point is to give operators enough evidence to act when proxy use lines up with account abuse, fraud, scraping, or automated traffic.&lt;/p&gt;
&lt;p&gt;If you're still treating IP reputation as the main answer, you're already behind. It's time to stop blocking IPs and start understanding the request.&lt;/p&gt;
&lt;p&gt;Want a demo of our residential proxy detection? &lt;a class="btn btn-large btn-secondary" href="/contact-sales/"&gt;Contact us&lt;/a&gt;
for a live demo of our service.&lt;/p&gt;</content><category term="Residential Proxies"></category><category term="Residential Proxies"></category><category term="Fraud Prevention"></category><category term="Threat Detection"></category><category term="Credential Stuffing"></category><category term="DNS"></category><category term="Account Protection"></category></entry><entry><title>Managing Bots For Application Security</title><link href="https://www.peakhour.io/blog/enterprise-bot-management-application-security/" rel="alternate"></link><published>2024-09-15T00:00:00+10:00</published><updated>2024-09-15T00:00:00+10:00</updated><author><name>AC</name></author><id>tag:www.peakhour.io,2024-09-15:/blog/enterprise-bot-management-application-security/</id><summary type="html">&lt;p&gt;Comprehensive guide to enterprise bot management for modern application security platforms. Learn how to protect applications and APIs from sophisticated bot threats including anti-detect browsers, credential stuffing, and automated attacks targeting DevOps environments.&lt;/p&gt;</summary><content type="html">&lt;p&gt;This guide separates &lt;a href="/products/bot-management/"&gt;bot management&lt;/a&gt; into three maturity levels: basic, intermediate, and advanced. The point is not to rank feature lists. It is to understand what kind of bot decision each level can safely make on the request path.&lt;/p&gt;
&lt;p&gt;Bots now target revenue, data, accounts, inventory, APIs, and origin capacity. Some are obvious crawlers. Others run credential stuffing, account creation, scraping, inventory hoarding, click fraud, or Layer 7 pressure through traffic that looks close to normal. A useful bot control has to decide whether to allow, challenge, rate limit, block, log, or review a request without punishing legitimate users who happen to share a network or device pattern.&lt;/p&gt;
&lt;p&gt;For more on account impact, read our article on the &lt;a href="/blog/credential-stuffing-business-impact/"&gt;Business Impact of Credential Stuffing&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Basic Protection&lt;/h2&gt;
&lt;p&gt;Basic bot management is built around visible signals: user-agent checks, simple IP reputation, known bot signatures, and broad rate limits. These controls still have a job. They can manage well-behaved crawlers, block obvious automation, and stop a single noisy source from hammering a site.&lt;/p&gt;
&lt;p&gt;The limitation is that basic controls assume the source or header tells most of the story. That breaks down when automation behaves like a browser, rotates infrastructure, or spreads requests across residential and shared networks. A flat IP limit may slow one scraper and still miss a credential attack distributed across many exits. It may also catch real users behind a busy office, mobile carrier, or public Wi-Fi network.&lt;/p&gt;
&lt;p&gt;Basic protection is suitable when the risk is low, the main concern is crawler hygiene, and the business can tolerate coarse controls. It is not enough for account protection, high-value scraping targets, or API workflows where abuse can arrive through valid requests.&lt;/p&gt;
&lt;h2&gt;Intermediate Protection&lt;/h2&gt;
&lt;p&gt;Intermediate bot management adds more request and client evidence. JavaScript signals, header consistency, cookie behaviour, basic network fingerprints such as &lt;a href="/blog/tls-fingerprinting/"&gt;TLS fingerprinting&lt;/a&gt;, and route-level observations make the decision less dependent on the IP address alone. This level can catch automation that fails to behave like a normal browser or that exposes inconsistencies across requests.&lt;/p&gt;
&lt;p&gt;It is a meaningful step up, but it still has limits. Anti-detect browsers and modern automation can keep browser signals plausible for long enough to run a campaign. Residential proxy networks can make source reputation noisy. API requests may not run browser-side checks at all. If the bot system treats browser, route, credential, and API context as separate problems, operators end up tuning several partial controls rather than one decision.&lt;/p&gt;
&lt;p&gt;Intermediate protection works for general scraping, noisy automation, and non-persistent abuse. It starts to struggle when attackers adapt, slow down, distribute requests, or target sensitive routes where a small number of requests can cause business harm.&lt;/p&gt;
&lt;h2&gt;Advanced Protection&lt;/h2&gt;
&lt;p&gt;Advanced bot management is combined signal decisioning. The difference is not "more techniques" in a checklist. The difference is that IP intelligence, residential proxy status, network and browser fingerprints, route-specific rates, behaviour, credential risk, API context, WAF/WAAP findings, DDoS pressure, and logs feed the same action model.&lt;/p&gt;
&lt;p&gt;That context changes the decision. A high request rate on a public image route is not the same as repeated failed logins. A suspicious proxy signal on a cached page is not the same as the same signal on account recovery. A browser fingerprint mismatch may be logged on a low-risk page but challenged when paired with exposed credentials and rapid account switching.&lt;/p&gt;
&lt;p&gt;Advanced protection is designed for persistent abuse: credential stuffing, account takeover attempts, scraping at scale, inventory hoarding, fake account creation, API bot traffic, and bot-driven Layer 7 floods. It should support web, mobile, and API traffic, and it should preserve evidence so security, platform, and support teams can see which signal drove an action.&lt;/p&gt;
&lt;h2&gt;Choosing the Right Level&lt;/h2&gt;
&lt;p&gt;The right level depends on what the bot can damage. A brochure site may only need crawler management and basic rate limits. An ecommerce site needs protection for search, product, checkout, promotion, and account routes. A marketplace, bank, gaming platform, ticketing site, or API-heavy business usually needs route-aware decisions that combine proxy, fingerprint, credential, account, and behaviour context.&lt;/p&gt;
&lt;p&gt;The false-positive risk matters just as much as the attack risk. Shared networks, carrier-grade NAT, privacy tools, corporate egress, and normal browser drift can all make a simple signal look suspicious. A mature bot programme does not block every unusual request. It uses uncertainty to pick safer actions: log, challenge, rate limit, or review before escalating to a block.&lt;/p&gt;
&lt;h2&gt;Peakhour's View&lt;/h2&gt;
&lt;p&gt;Peakhour's &lt;a href="/products/bot-management/"&gt;Bot Management&lt;/a&gt; connects bot decisions to the rest of the application security path. &lt;a href="/products/residential-proxy-detection/"&gt;Residential Proxy Detection&lt;/a&gt;, &lt;a href="/products/ip-intelligence/"&gt;IP Intelligence&lt;/a&gt;, &lt;a href="/products/advanced-rate-limiting/"&gt;Advanced Rate Limiting&lt;/a&gt;, &lt;a href="/products/api-security/"&gt;API Security&lt;/a&gt;, &lt;a href="/products/waf/"&gt;WAAP/WAF controls&lt;/a&gt;, and &lt;a href="/products/log-forwarding/"&gt;Log Forwarding&lt;/a&gt; all support the same request outcome: allow, challenge, rate limit, block, log, or review with evidence.&lt;/p&gt;
&lt;p&gt;That is the practical maturity model. Basic controls handle obvious bots. Intermediate controls add client and request evidence. Advanced controls combine signals into decisions that match the route, risk, and business impact.&lt;/p&gt;</content><category term="Bots"></category><category term="Bot Management"></category><category term="API Security"></category><category term="Credential Stuffing"></category><category term="Account Protection"></category><category term="DevSecOps"></category><category term="Application Security"></category></entry><entry><title>Application Security for Financial Services Under CPS 234</title><link href="https://www.peakhour.io/blog/credential-stuffing-defence-cps-234-compliance/" rel="alternate"></link><published>2024-07-29T10:00:00+10:00</published><updated>2024-07-29T10:00:00+10:00</updated><author><name>Dan</name></author><id>tag:www.peakhour.io,2024-07-29:/blog/credential-stuffing-defence-cps-234-compliance/</id><summary type="html">&lt;p&gt;Comprehensive analysis of credential stuffing threats against Australian financial institutions and how application security platforms help meet CPS 234 disclosure requirements whilst preventing account takeover attacks.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Recent credential stuffing attacks on prominent Australian retailers like &lt;a href="/blog/account-takeover-fraud-theiconic/"&gt;The Iconic&lt;/a&gt; and Dan Murphy's have brought this threat into sharper focus. For APRA-regulated entities, these incidents are a reminder that credential stuffing is not only an account takeover issue. It can also trigger assessment and disclosure obligations under Prudential Standard &lt;a href="https://www.apra.gov.au/sites/default/files/cps_234_july_2019_for_public_release.pdf"&gt;CPS 234&lt;/a&gt; Information Security.&lt;/p&gt;
&lt;h2&gt;The Rising Tide of Credential Stuffing&lt;/h2&gt;
&lt;p&gt;Credential stuffing is now common in Australia and globally. These attacks exploit password reuse across multiple sites. Cybercriminals use automated tools to test large volumes of stolen username and password combinations against websites, looking for accounts they can access without authorisation.&lt;/p&gt;
&lt;p&gt;The scale is large. According to recent studies, there are over 15 billion stolen credentials circulating on the internet. In 2020 alone, one large content delivery network reported more than 193 billion credential &lt;a href="/learning/security/credential-stuffing-defence/"&gt;stuffing attacks&lt;/a&gt; globally. For Australian businesses, the risk is significant and growing.&lt;/p&gt;
&lt;h2&gt;The Compounding Threat of Residential Proxies&lt;/h2&gt;
&lt;p&gt;The use of &lt;a href="/products/residential-proxy-detection/"&gt;residential proxies&lt;/a&gt; has increased the sophistication and effectiveness of &lt;a href="/learning/bots/anatomy-of-credential-stuffing-attack/"&gt;credential stuffing&lt;/a&gt; attacks. Residential proxies allow attackers to route their traffic through legitimate residential IP addresses, making automated activity look more like normal user behaviour.&lt;/p&gt;
&lt;p&gt;This technique poses several challenges:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Bypassing Traditional Defences&lt;/strong&gt;: Standard IP-based rate limiting and geo-blocking become ineffective when attacks come from diverse, legitimate-looking IP addresses.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Evading Detection&lt;/strong&gt;: Traffic from residential proxies is harder to distinguish from genuine user activity, complicating detection efforts.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Scalability&lt;/strong&gt;: Attackers can distribute their attempts across a large network of proxies, allowing for larger-scale attacks without triggering typical alarm thresholds.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Improved Success Rates&lt;/strong&gt;: By appearing to come from the same geographic area as legitimate users, these attacks are more likely to bypass location-based security measures.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;The Crabby Phenomenon&lt;/h2&gt;
&lt;p&gt;The emergence of sites like &lt;a href="/blog/credential-stuffing-threat-australian-businesses/"&gt;Crabby Cash&lt;/a&gt; shows how credential stuffing fits into a broader cybercrime market. These platforms serve as marketplaces for compromised accounts, making it easier for criminals to monetise successful credential stuffing attacks.&lt;/p&gt;
&lt;p&gt;Key points about Crabby Cash and similar sites:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Ease of Access&lt;/strong&gt;: These sites lower the barrier to entry for cybercriminals, providing ready access to compromised accounts.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Rapid Exploitation&lt;/strong&gt;: Once credentials are verified and listed on these sites, the window for detection and mitigation narrows significantly.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Diverse Targets&lt;/strong&gt;: The range of compromised accounts often spans multiple industries, including retail, financial services, and entertainment.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Ongoing Threat&lt;/strong&gt;: The existence of these marketplaces incentivises continuous credential stuffing attempts, creating a persistent threat landscape.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;The CPS 234 Disclosure Imperative&lt;/h2&gt;
&lt;p&gt;The prevalence of credential stuffing attacks, compounded by residential proxies and platforms like Crabby Cash, makes the disclosure requirements in CPS 234 directly relevant.&lt;/p&gt;
&lt;p&gt;Paragraph 35 of CPS 234 states:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;An APRA-regulated entity must notify APRA as soon as possible and, in any case, no later than 72 hours, after becoming aware of an information security incident that:&lt;/p&gt;
&lt;p&gt;(a) materially affected, or had the potential to materially affect, financially or non-financially, the entity or the interests of depositors, policyholders, beneficiaries or other customers; or&lt;/p&gt;
&lt;p&gt;(b) has been notified to other regulators, either in Australia or other jurisdictions.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The existence of sites like Crabby Cash can increase the potential impact of credential stuffing attacks, making them more likely to meet the materiality threshold for disclosure.&lt;/p&gt;
&lt;h2&gt;A Risk-Based Approach to Disclosure&lt;/h2&gt;
&lt;p&gt;To manage credential stuffing risk and meet CPS 234 obligations, organisations should take a risk-based approach to detection, mitigation, and disclosure. This involves:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Working with Specialised Providers&lt;/strong&gt;: Engage with cybersecurity providers who can offer insights into your organisation's exposure and risk levels based on:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Network fingerprinting&lt;/li&gt;
&lt;li&gt;Levels of breached credential login attempts&lt;/li&gt;
&lt;li&gt;Prevalence of residential proxy traffic as a high-correlating signal of attack&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Continuous Risk Assessment&lt;/strong&gt;: Regularly evaluate the risk posed by credential stuffing attacks, considering factors such as:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The volume and sophistication of attempts&lt;/li&gt;
&lt;li&gt;The success rate of attacks&lt;/li&gt;
&lt;li&gt;The potential impact on customers and the organisation&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Inadequate Defences as a Risk Signal&lt;/strong&gt;: Recognise that the absence of robust defences against credential stuffing is itself a risk signal. Organisations without advanced bot detection, multi-factor authentication, and behavioural analysis capabilities may face higher risk and should consider this in their disclosure decisions.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Adaptive Disclosure Thresholds&lt;/strong&gt;: Develop flexible, risk-based thresholds for APRA notification that take into account:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The current threat landscape&lt;/li&gt;
&lt;li&gt;The organisation's defensive capabilities&lt;/li&gt;
&lt;li&gt;The potential impact of a successful attack&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Assessing Materiality in Light of These Threats&lt;/h2&gt;
&lt;p&gt;When assessing whether a credential stuffing incident meets the materiality threshold for APRA notification, entities should consider:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Scale of the Attack&lt;/strong&gt;: The number of accounts targeted or compromised.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Success Rate&lt;/strong&gt;: Whether any accounts were actually breached.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Exposure on Dark Web Markets&lt;/strong&gt;: If compromised credentials appear on sites like Crabby Cash.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Potential Financial Impact&lt;/strong&gt;: Both immediate losses and potential future exploitation.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Non-Financial Impacts&lt;/strong&gt;: Including reputational damage and loss of customer trust.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Broader Systemic Risk&lt;/strong&gt;: Whether the attack could impact the wider financial system.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Defensive Posture&lt;/strong&gt;: The adequacy of existing controls and the organisation's ability to detect and mitigate attacks.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Proactive Measures and Controls&lt;/h2&gt;
&lt;p&gt;To mitigate the risks of credential stuffing attacks, particularly those leveraging residential proxies, APRA-regulated entities should implement robust controls as outlined in CPS 234 and &lt;a href="https://www.apra.gov.au/sites/default/files/cpg_234_information_security_june_2019_0.pdf"&gt;CPG 234&lt;/a&gt;:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Contextual Security Approach&lt;/strong&gt;: Implement a contextual security strategy that considers multiple factors to assess the risk of each login attempt, including device characteristics, user behaviour patterns, and network attributes.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Advanced Bot Detection&lt;/strong&gt;: Deploy bot management systems capable of identifying automated attempts, even when they come from diverse IP addresses.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Residential Proxy Detection&lt;/strong&gt;: Utilise specialised residential proxy detection tools to identify and mitigate threats from this increasingly common attack vector.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Multi-Factor Authentication&lt;/strong&gt;: As suggested in CPG 234, implement MFA for high-risk activities to provide an additional layer of security beyond passwords.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Behavioural Analysis&lt;/strong&gt;: Use analytics to detect anomalous login patterns that may indicate credential stuffing attempts.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Continuous Monitoring&lt;/strong&gt;: Implement real-time monitoring systems to quickly identify and respond to potential attacks.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Password Policies&lt;/strong&gt;: Encourage or enforce the use of unique, strong passwords to mitigate the impact of credential stuffing.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Customer Education&lt;/strong&gt;: Proactively inform customers about the risks of password reuse and the importance of strong, unique passwords.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Collaboration and Information Sharing&lt;/strong&gt;: Engage with industry peers and law enforcement to share threat intelligence and effective practices.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Adaptive Authentication&lt;/strong&gt;: Implement risk-based authentication that adjusts security requirements based on the perceived threat level of each login attempt.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;By adopting these measures, particularly a contextual security approach incorporating &lt;a href="/learning/threat-detection/what-is-residential-proxy-detection/"&gt;residential proxy&lt;/a&gt; detection, organisations can improve their resilience against credential stuffing attacks and better protect their customers' accounts.&lt;/p&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Credential stuffing, residential proxies, and platforms like Crabby Cash make account takeover risk harder to assess and harder to contain. APRA-regulated entities need a proactive, risk-based approach to information security and regulatory compliance.&lt;/p&gt;
&lt;p&gt;APRA-regulated entities should treat credential stuffing attacks as more than a technical control problem. They are business risks that may require Board-level attention and, depending on materiality, regulatory disclosure under CPS 234. By implementing preventative measures, maintaining effective incident response capabilities, and keeping clear processes for assessing and reporting incidents, organisations can better protect themselves and their customers from this growing threat.&lt;/p&gt;
&lt;p&gt;In this environment, CPS 234 compliance is not only a reporting exercise. It depends on information security controls that protect the organisation, its customers, and the broader financial system before credential stuffing becomes a material incident.&lt;/p&gt;</content><category term="Account Protection"></category><category term="Account Protection"></category><category term="Credential Stuffing"></category><category term="Fraud Prevention"></category><category term="Application Security"></category><category term="DevSecOps"></category><category term="PCI DSS"></category></entry><entry><title>The Australian epidemic of Account Takeover attacks</title><link href="https://www.peakhour.io/blog/credential-stuffing-threat-australian-businesses/" rel="alternate"></link><published>2024-07-29T10:00:00+10:00</published><updated>2024-07-29T10:00:00+10:00</updated><author><name>AC</name></author><id>tag:www.peakhour.io,2024-07-29:/blog/credential-stuffing-threat-australian-businesses/</id><summary type="html">&lt;p&gt;An in-depth look at the growing threat of credential stuffing attacks on Australian businesses, including recent case studies, defense challenges, and practical recommendations.&lt;/p&gt;</summary><content type="html">&lt;p&gt;In recent months, credential &lt;a href="/learning/security/credential-stuffing-defence/"&gt;stuffing attacks&lt;/a&gt; have hit a number of Australian businesses, leading to compromised accounts, fraudulent purchases, and customer complaints. The pattern is a reminder that account protection cannot stop at password policy or MFA alone.&lt;/p&gt;
&lt;h2&gt;A Case Study in Credential Stuffing&lt;/h2&gt;
&lt;p&gt;Security researcher Jacob Larsen has documented a credential stuffing operation targeting Australian businesses. Larsen's research, &lt;a href="https://larsencyber.com/blog/2024-05-20-crabby-credential-stuffing-australia-account-takeovers/"&gt;detailed in his blog post&lt;/a&gt;, describes the activity of a threat actor known as "Crabby," who has sold compromised Australian accounts since July 2023.&lt;/p&gt;
&lt;p&gt;Larsen's findings show:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The operation began with a threat actor called "Based" selling compromised accounts via Discord and dedicated websites.&lt;/li&gt;
&lt;li&gt;In November 2023, the operation was acquired by "Juicy," a notorious account vendor, and rebranded as "Crabby."&lt;/li&gt;
&lt;li&gt;As of May 2024, over 19,000 compromised accounts from various Australian brands were offered for sale.&lt;/li&gt;
&lt;li&gt;Low-level fraudsters purchasing these accounts have used them to make unauthorised purchases, often targeting high-value items for resale.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The Crabby operation shows how credential stuffing has moved beyond isolated login attempts. It now includes account marketplaces, low-level fraud buyers, and the &lt;a href="/blog/account-takeover-fraud-theiconic/"&gt;challenges&lt;/a&gt; businesses face once compromised accounts are monetised.&lt;/p&gt;
&lt;h2&gt;The Difficulty of Defense&lt;/h2&gt;
&lt;p&gt;Credential stuffing defence is harder when attacks are spread across &lt;a href="/blog/residential-proxies-unseen-challenges/"&gt;residential proxies&lt;/a&gt; and kept to single attempts per account.&lt;/p&gt;
&lt;h3&gt;Residential Proxies: The Invisible Threat&lt;/h3&gt;
&lt;p&gt;Residential proxies weaken traditional IP-based controls. These proxies use IP addresses assigned to real residential internet connections, so malicious traffic can look like normal customer traffic. That helps attackers bypass simple rate limiting and geolocation checks.&lt;/p&gt;
&lt;p&gt;That distribution makes login traffic harder to classify. Signals such as a high volume of attempts from one IP address become less useful when attackers can spread requests across a pool of residential IPs.&lt;/p&gt;
&lt;h3&gt;Single-Hit Attacks: Precision Strikes&lt;/h3&gt;
&lt;p&gt;Single-hit attacks are another way attackers avoid noisy patterns. In this approach, each stolen credential is used only once per target site, reducing the chance of detection by traditional rate-limiting or anomaly detection systems.&lt;/p&gt;
&lt;p&gt;By limiting each credential to one attempt, attackers avoid controls tuned to repeated login failures. A business can have rate limiting in place and still miss credential stuffing that never crosses those thresholds.&lt;/p&gt;
&lt;h2&gt;The Mobile API Conundrum&lt;/h2&gt;
&lt;p&gt;As mobile applications become a primary user interface, &lt;a href="/learning/bots/anatomy-of-credential-stuffing-attack/"&gt;credential stuffing&lt;/a&gt; also moves into mobile API traffic. Traditional bot protection often relies on JavaScript challenges or browser fingerprinting, which does not apply cleanly to attacks against mobile APIs.&lt;/p&gt;
&lt;p&gt;Mobile applications typically communicate with backend services via APIs, bypassing the browser environment where many bot detection techniques run. This creates several challenges:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Lack of JavaScript Execution&lt;/strong&gt;: Mobile APIs don't execute JavaScript, making it impossible to use browser-based bot detection techniques.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Limited Fingerprinting Capabilities&lt;/strong&gt;: Standardised mobile API requests make it difficult to distinguish between legitimate user activity and automated attacks based on request characteristics.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Increased Attack Surface&lt;/strong&gt;: More mobile apps means more potential entry points for attackers, making comprehensive protection more complex.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Authentication Simplification&lt;/strong&gt;: To improve user experience, mobile apps often use simplified authentication flows, which can create weaker controls against automation.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This gap needs API-centred controls that can assess mobile login behaviour without relying on browser-only signals.&lt;/p&gt;
&lt;h2&gt;Framing Credential Stuffing as a Business Risk&lt;/h2&gt;
&lt;p&gt;Credential stuffing should be treated as a business risk, not just an authentication issue. The impact can include refunds, chargebacks, customer support load, reputational damage, and regulatory disclosure work.&lt;/p&gt;
&lt;h3&gt;Risk Quantification and Disclosure&lt;/h3&gt;
&lt;p&gt;Risk quantification gives security teams a way to explain credential stuffing in business terms. By applying frameworks like &lt;a href="https://www.opengroup.org/open-fair"&gt;FAIR&lt;/a&gt; (Factor Analysis of Information Risk), businesses can:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Quantify the potential financial impact of credential stuffing attacks.&lt;/li&gt;
&lt;li&gt;Prioritise security investments based on risk reduction potential.&lt;/li&gt;
&lt;li&gt;Communicate the importance of cybersecurity measures to non-technical stakeholders.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;a href="https://www.apra.gov.au/information-security"&gt;CPS 234&lt;/a&gt; in Australia adds a disclosure dimension for regulated entities. Businesses need to protect against credential stuffing and be able to explain their exposure, controls, and mitigation strategy.&lt;/p&gt;
&lt;h2&gt;The State of Credential Stuffing Defense in Australia&lt;/h2&gt;
&lt;p&gt;Our recent &lt;a href="/blog/credential-stuffing-and-account-takeover-survey-2024/"&gt;survey&lt;/a&gt; of Australian businesses shows uneven adoption of credential stuffing defences:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;While 77% of respondents use Multi-Factor Authentication (MFA), only 40% have implemented bot protection measures.&lt;/li&gt;
&lt;li&gt;15% of companies chose not to respond to questions about their security measures, suggesting potential gaps in protection.&lt;/li&gt;
&lt;li&gt;Just 29% of businesses check credentials against known breaches, leaving a large window of opportunity for attackers using stolen credentials.&lt;/li&gt;
&lt;li&gt;Only 15% of organisations use residential proxy detection, a critical component in identifying and mitigating modern credential stuffing attacks.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These results suggest a gap between how credential stuffing is run now and the controls many Australian businesses have in place.&lt;/p&gt;
&lt;h2&gt;Recommendations for Enhanced Protection&lt;/h2&gt;
&lt;p&gt;Based on our analysis and survey results, businesses should review the following controls:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Implement Advanced Bot Protection&lt;/strong&gt;: Deploy controls that detect and mitigate bot attacks, including attacks using residential proxies.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Enhance Mobile API Security&lt;/strong&gt;: Use mobile API controls that focus on anomaly detection and behavioural analysis rather than browser-based techniques.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Adopt Risk-Based Authentication&lt;/strong&gt;: Implement dynamic authentication mechanisms that adjust based on the assessed risk of each session or transaction.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Utilise Breached Credential Databases&lt;/strong&gt;: Check user credentials against known breach databases and enforce password changes for compromised accounts.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Implement Residential Proxy Detection&lt;/strong&gt;: Use technology that identifies and mitigates traffic from residential proxy networks. This is a key control for modern credential stuffing attacks.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Apply Advanced Rate Limiting&lt;/strong&gt;: Utilise device fingerprinting and other identifiers beyond IP addresses to implement more effective rate limiting, particularly for single-hit attacks.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Employ Contextual Security&lt;/strong&gt;: Use signals such as user behaviour patterns, device characteristics, and historical usage to identify anomalies that may indicate credential stuffing attempts.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Quantify and Communicate Risk&lt;/strong&gt;: Use frameworks like FAIR to quantify the potential impact of credential stuffing attacks and communicate this risk to stakeholders.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Implement Continuous Monitoring&lt;/strong&gt;: Deploy real-time monitoring that detects patterns indicative of credential stuffing attacks, and update defences as attack methods change.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;These controls address the specific problems created by residential proxies, single-hit attempts, mobile API traffic, and weak credential hygiene. They also reflect the limits of IP-only rate limiting and browser-only bot detection.&lt;/p&gt;
&lt;p&gt;Credential stuffing defence works best as a layered programme: bot detection, residential proxy detection, breached credential checks, mobile API coverage, and risk reporting. The practical goal is to stop account takeover attempts earlier, reduce fraud exposure, and give security teams evidence they can act on.&lt;/p&gt;</content><category term="Account Protection"></category><category term="Account Protection"></category><category term="Credential Stuffing"></category><category term="Fraud Prevention"></category><category term="Residential Proxies"></category><category term="Threat Detection"></category><category term="DNS"></category></entry><entry><title>The Challenge of Proxy Detection</title><link href="https://www.peakhour.io/blog/proxy-detection-challenges-existing-solutions/" rel="alternate"></link><published>2024-07-19T10:00:00+10:00</published><updated>2024-07-19T10:00:00+10:00</updated><author><name>AC</name></author><id>tag:www.peakhour.io,2024-07-19:/blog/proxy-detection-challenges-existing-solutions/</id><summary type="html">&lt;p&gt;Examine why current security solutions fail to detect and mitigate threats from residential proxies, and the need for comprehensive protection strategies.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Our &lt;a href="/blog/credential-stuffing-and-account-takeover-survey-2024"&gt;recent survey&lt;/a&gt; found that only 15% of Australian organisations use residential proxy detection. That leaves many teams relying on controls that were not built for current proxy traffic, especially where CGNAT and NAT make IP-level decisions unreliable.&lt;/p&gt;
&lt;h2&gt;The Shortcomings of Traditional Methods&lt;/h2&gt;
&lt;p&gt;Legacy bot protection providers often combine &lt;a href="/products/ip-intelligence/"&gt;IP reputation&lt;/a&gt;, network characteristics, header analysis, and JavaScript-based checks to identify proxy usage. These methods struggle against well-run &lt;a href="/learning/security/datacenter-vs-residential-proxies/"&gt;residential proxies&lt;/a&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;IP and ASN categorisation: Ages quickly as new proxy networks emerge.&lt;/li&gt;
&lt;li&gt;Network-level checks: Well-configured proxies can work around them.&lt;/li&gt;
&lt;li&gt;Header analysis: Proxies can alter HTTP headers to mimic legitimate traffic.&lt;/li&gt;
&lt;li&gt;JavaScript-based detection: Struggles against headless browsers and leaves API endpoints vulnerable.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;The CGNAT and NAT Challenge&lt;/h2&gt;
&lt;p&gt;A practical limit of traditional methods is their inability to distinguish legitimate traffic from proxy traffic when both originate from the same IP address. Carrier-Grade NAT (CGNAT) and Network Address Translation (NAT) make this common:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CGNAT: Used by ISPs to conserve IPv4 addresses, resulting in multiple users sharing a single public IP.&lt;/li&gt;
&lt;li&gt;NAT: Commonly used in home and business networks, allowing multiple devices to use one public IP address.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;As a result, legitimate users and residential proxy traffic can appear to come from the same IP address. IP reputation and geolocation alone cannot separate these traffic types.&lt;/p&gt;
&lt;p&gt;This creates a difficult tradeoff:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Blocking suspicious IPs risks denying service to legitimate users.&lt;/li&gt;
&lt;li&gt;Allowing all traffic from these IPs opens the door to potential abuse via residential proxies.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Traditional methods cannot reliably pull apart these different types of traffic, so teams either block too much legitimate traffic or allow too much proxy traffic through.&lt;/p&gt;
&lt;h2&gt;The Need for Sophisticated Network Fingerprinting&lt;/h2&gt;
&lt;p&gt;To detect and mitigate residential proxy threats while allowing legitimate traffic from shared IPs, detection needs to move beyond IP identity. Network fingerprinting addresses the limits of traditional methods:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Deep packet inspection: Analyses traffic patterns and characteristics beyond basic IP or header indicators.&lt;/li&gt;
&lt;li&gt;Protocol behaviour analysis: Identifies subtle anomalies in how network protocols are implemented across the proxy chain.&lt;/li&gt;
&lt;li&gt;TLS fingerprinting: Examines unique characteristics of TLS handshakes to detect proxy usage.&lt;/li&gt;
&lt;li&gt;Timing analysis: Measures small differences in network latency that can indicate the presence of a proxy.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Used together, these techniques can detect proxy usage on a per-connection basis for both web traffic and API calls, even when traffic originates from shared IP addresses. This approach provides several advantages:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Improved accuracy: Significantly reduces false positives and negatives compared to traditional methods, including in CGNAT and NAT scenarios.&lt;/li&gt;
&lt;li&gt;API protection: Secures API endpoints, which are often overlooked by JavaScript-based solutions.&lt;/li&gt;
&lt;li&gt;Real-time detection: Allows for immediate action against detected proxy usage without impacting legitimate users.&lt;/li&gt;
&lt;li&gt;Adaptability: Can be updated to detect new proxy technologies as they emerge, regardless of IP sharing.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Implementing Effective Proxy Detection&lt;/h2&gt;
&lt;p&gt;To implement proxy detection that accounts for modern network complexity, organisations should consider the following:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Deploy solutions that use network fingerprinting techniques capable of distinguishing between different types of traffic from the same IP.&lt;/li&gt;
&lt;li&gt;Ensure protection covers both web applications and API endpoints, as both are vulnerable to proxy-based attacks.&lt;/li&gt;
&lt;li&gt;Implement real-time mitigation capabilities to respond swiftly to detected threats without impacting legitimate users.&lt;/li&gt;
&lt;li&gt;Regularly update and tune detection algorithms to keep pace with evolving proxy technologies and network architectures.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Together, these practices improve an organisation's ability to detect and mitigate residential proxy threats across credential stuffing, account takeover, and related activity, while keeping access available for legitimate users.&lt;/p&gt;
&lt;p&gt;Learn more about our &lt;a href="/products/residential-proxy-detection/"&gt;proxy detection&lt;/a&gt; solution, which uses network fingerprinting to address the challenges posed by CGNAT and NAT.&lt;/p&gt;
&lt;p&gt;For more detail, explore our learning resources:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Understanding Residential Proxies&lt;/li&gt;
&lt;li&gt;&lt;a href="/learning/fingerprinting/what-is-network-fingerprinting/"&gt;Network Fingerprinting Techniques&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/blog/tls-fingerprinting/"&gt;In-Depth Review: TLS Fingerprinting&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;As proxy technologies and network architectures change, detection and mitigation need to change with them. Network fingerprinting gives organisations a more reliable way to identify residential proxy abuse without treating every shared IP as suspicious.&lt;/p&gt;</content><category term="Residential Proxies"></category><category term="Residential Proxies"></category><category term="Bot Management"></category><category term="Credential Stuffing"></category><category term="Account Protection"></category><category term="API Security"></category><category term="Threat Detection"></category></entry><entry><title>Quantifying The Residential Proxy Threat</title><link href="https://www.peakhour.io/blog/residential-proxy-detection-quantifying-hidden-threat/" rel="alternate"></link><published>2024-07-18T10:00:00+10:00</published><updated>2024-07-18T10:00:00+10:00</updated><author><name>AC</name></author><id>tag:www.peakhour.io,2024-07-18:/blog/residential-proxy-detection-quantifying-hidden-threat/</id><summary type="html">&lt;p&gt;Explore the complexities of residential proxy detection and its impact on organisational risk, with a focus on quantifying the threat and reframing security approaches.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Our 2024 survey found that only 15% of Australian businesses use &lt;a href="/learning/security/residential-proxy/"&gt;residential proxy&lt;/a&gt; detection. That leaves a measurable blind spot in many security programmes: traffic routed through real consumer connections is harder to separate from legitimate users. This article looks at why residential proxy detection is difficult and how to quantify the risk before choosing controls.&lt;/p&gt;
&lt;h2&gt;Understanding the Residential Proxy Threat Landscape&lt;/h2&gt;
&lt;p&gt;&lt;a href="/products/residential-proxy-detection/"&gt;Residential proxies&lt;/a&gt; use IP addresses assigned to residential internet connections, so malicious traffic can look legitimate. This weakens controls built around IP reputation, GeoIP, and simple request thresholds, and creates a specific detection problem for security teams.&lt;/p&gt;
&lt;p&gt;The effectiveness of residential proxies stems from their ability to:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Use legitimate IP addresses, often from unsuspecting users&lt;/li&gt;
&lt;li&gt;Bypass IP-based rate limiting and traditional bot detection methods&lt;/li&gt;
&lt;li&gt;Evade geolocation restrictions, making GeoIP filtering less reliable&lt;/li&gt;
&lt;li&gt;Support large-scale attacks without triggering typical alarm thresholds&lt;/li&gt;
&lt;li&gt;Mimic legitimate user behaviour, which makes detection more difficult&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;These capabilities make residential proxies useful infrastructure for credential stuffing, data scraping, and attempts to bypass fraud detection systems. Because the traffic is distributed across many residential connections, attacks can stay below the thresholds that conventional controls rely on.&lt;/p&gt;
&lt;h2&gt;Limitations of Conventional Security Approaches&lt;/h2&gt;
&lt;p&gt;Conventional controls have clear gaps when they are applied to residential proxy traffic:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;IP-based detection misses constantly changing, legitimate-appearing IP addresses.&lt;/li&gt;
&lt;li&gt;GeoIP filtering becomes less useful against globally distributed residential IPs.&lt;/li&gt;
&lt;li&gt;User agent analysis struggles because proxies can mimic legitimate browsers.&lt;/li&gt;
&lt;li&gt;Standard rate limiting falters when attacks appear to originate from many unique IPs.&lt;/li&gt;
&lt;li&gt;Behavioural analysis based on known bot patterns may miss more careful proxy-based attacks.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;These limitations point to a practical requirement: security teams need controls that assess context, not just static request attributes. Residential proxies make simple rule-based decisions less reliable, especially when attacks are distributed and deliberately low-noise.&lt;/p&gt;
&lt;h2&gt;Quantifying the Risk&lt;/h2&gt;
&lt;p&gt;To make a sensible decision about residential proxy controls, organisations need to quantify the risk. This involves:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Assessing the potential financial impact of successful attacks via residential proxies&lt;/li&gt;
&lt;li&gt;Evaluating the likelihood of such attacks based on industry trends and organisational attractiveness to attackers&lt;/li&gt;
&lt;li&gt;Determining the effectiveness of current security measures against this specific threat&lt;/li&gt;
&lt;li&gt;Calculating the return on investment for implementing advanced detection and mitigation strategies&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Risk quantification gives businesses a clearer basis for investing in residential &lt;a href="/learning/threat-detection/what-is-residential-proxy-detection/"&gt;proxy detection&lt;/a&gt;. It aligns security spending with actual threat levels and potential impacts, rather than broad concern or industry pressure alone.&lt;/p&gt;
&lt;h2&gt;Reframing Security&lt;/h2&gt;
&lt;p&gt;The challenge of residential proxy detection is less about one new control and more about how signals are combined. A useful approach includes:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Contextual Analysis&lt;/strong&gt;: Analyse the full context of each request, not just its origin. This includes examining patterns of behaviour across multiple sessions and users.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Continuous Monitoring and Adaptation&lt;/strong&gt;: Use real-time monitoring systems that can detect subtle patterns indicative of proxy use. These systems should continuously adapt to new attack vectors.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Risk-Based Authentication&lt;/strong&gt;: Use dynamic authentication mechanisms that adjust based on the assessed risk of each session or transaction.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Holistic Data Analysis&lt;/strong&gt;: Correlate data from multiple sources - including login attempts, transaction patterns, and user behaviour - to identify anomalies that may indicate proxy use.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Proactive Threat Hunting&lt;/strong&gt;: Actively search for indicators of residential proxy use within your network and user base, rather than waiting for attacks to trigger alerts.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This approach moves beyond simple allow/block decisions and gives teams a better view of user and network behaviour.&lt;/p&gt;
&lt;h2&gt;Implementing Advanced Detection Strategies&lt;/h2&gt;
&lt;p&gt;Residential proxy threats need detection that looks beyond the source IP:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Machine Learning-Based Behavioural Analysis&lt;/strong&gt;: Use AI and machine learning to identify patterns consistent with proxy use, even when individual actions appear legitimate.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Device Fingerprinting Beyond IP&lt;/strong&gt;: Use advanced fingerprinting techniques that identify individual devices based on a combination of factors, making it harder for proxies to mimic legitimate users.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Network Traffic Analysis&lt;/strong&gt;: Analyse network behaviour at a granular level to identify patterns consistent with proxy network traffic.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Adaptive Challenge Mechanisms&lt;/strong&gt;: Deploy targeted challenges based on risk assessment, without disrupting legitimate user experiences.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Cross-Organisational Data Sharing&lt;/strong&gt;: Participate in threat intelligence sharing networks to gain broader insights into residential proxy activities and emerging attack patterns.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;When used as part of the broader security stack, these strategies improve defence against residential proxy threats.&lt;/p&gt;
&lt;h2&gt;Elevating Security Through Risk Quantification&lt;/h2&gt;
&lt;p&gt;Residential proxies are not only a technical detection problem. They change the risk model for web applications because attacker traffic can borrow the appearance of ordinary residential users. By adopting a risk quantification approach and implementing advanced detection strategies, organisations can:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Align security investments with actual threat levels&lt;/li&gt;
&lt;li&gt;Improve detection of sophisticated, proxy-based attacks&lt;/li&gt;
&lt;li&gt;Strengthen overall security posture against evolving threats&lt;/li&gt;
&lt;li&gt;Make data-driven decisions about security priorities and resource allocation&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Organisations that handle this well will be able to quantify their risk, adapt their security strategies, and implement intelligent detection mechanisms. The goal is practical: identify, analyse, and mitigate sophisticated threats before they cause material damage.&lt;/p&gt;
&lt;p&gt;Effective protection starts with understanding the risk well enough to measure it.&lt;/p&gt;</content><category term="Residential Proxies"></category><category term="Residential Proxies"></category><category term="Threat Detection"></category><category term="Credential Stuffing"></category><category term="Account Protection"></category><category term="DDoS"></category><category term="Bot Management"></category></entry><entry><title>Account Protection and User Experience in Web Applications</title><link href="https://www.peakhour.io/blog/frictionless-customer-experiences/" rel="alternate"></link><published>2024-07-17T10:00:00+10:00</published><updated>2024-07-17T10:00:00+10:00</updated><author><name>AC</name></author><id>tag:www.peakhour.io,2024-07-17:/blog/frictionless-customer-experiences/</id><summary type="html">&lt;p&gt;Explore strategies to enhance web application security without compromising user experience, focusing on contextual security and adaptive authentication measures.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Web applications face a wide range of security threats, but customer accounts are often the target. Our recent survey of
Australian businesses showed a need for stronger
&lt;a href="/solutions/use-case/contextual-security/"&gt;account protection&lt;/a&gt; measures. Those controls can add friction for users if they are applied too broadly. This article
looks at ways to balance security with &lt;a href="/learning/crux-chrome-user-experience/"&gt;user experience&lt;/a&gt; in web applications.&lt;/p&gt;
&lt;h2&gt;The Challenge: Compromised Credentials&lt;/h2&gt;
&lt;p&gt;Our survey found that 21% of organisations cited reputation loss as their main cybersecurity challenge. That
result points back to a practical security problem: compromised credentials.&lt;/p&gt;
&lt;p&gt;Causes of compromised logins include:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Phishing attacks&lt;/li&gt;
&lt;li&gt;Password reuse across multiple sites&lt;/li&gt;
&lt;li&gt;Data breaches exposing user credentials&lt;/li&gt;
&lt;li&gt;Credential stuffing attacks&lt;/li&gt;
&lt;li&gt;Keylogging malware&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;These risks make password-only authentication a weak control for customer account protection.&lt;/p&gt;
&lt;h2&gt;Moving Beyond Traditional Multi-Factor Authentication&lt;/h2&gt;
&lt;p&gt;Multi-Factor Authentication (MFA) adds a useful security layer, but it can also add friction. Our survey found that
only 40% of organisations implement bot protection, which leaves a clear gap around automated attacks.&lt;/p&gt;
&lt;p&gt;While 77% of surveyed businesses use MFA, that figure can hide other weaknesses. MFA alone doesn't
protect accounts from every attack path.&lt;/p&gt;
&lt;p&gt;&lt;a href="/blog/why-mfa-is-an-incomplete-defence/"&gt;Learn more about the limitations of traditional MFA&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Contextual Security: A User-Focused Approach&lt;/h2&gt;
&lt;p&gt;Contextual security helps reduce that tradeoff between protection and user experience. It assesses the risk of each
login attempt using factors including:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Location of the login attempt&lt;/li&gt;
&lt;li&gt;Time of day&lt;/li&gt;
&lt;li&gt;Device used&lt;/li&gt;
&lt;li&gt;User behaviour patterns&lt;/li&gt;
&lt;li&gt;IP address reputation&lt;/li&gt;
&lt;li&gt;Network characteristics&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;By analysing these contextual factors, web applications can apply adaptive authentication without
asking every user to complete an extra step every time.&lt;/p&gt;
&lt;!-- ![Contextual Security Factors](/api/placeholder/600/400) --&gt;

&lt;p&gt;&lt;em&gt;Figure 1: Key factors considered in contextual security&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;Implementing Contextual Security in Web Applications&lt;/h2&gt;
&lt;p&gt;To improve account protection without adding unnecessary friction, consider these controls:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Real-time monitoring&lt;/strong&gt;: Track user activity and detect anomalies.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Adaptive authentication&lt;/strong&gt;: Adjust security requirements based on the risk level of each login attempt.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Behavioural analysis&lt;/strong&gt;: Use machine learning to understand user behaviour and flag suspicious activity.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Transparent security measures&lt;/strong&gt;: Apply checks that don't require additional user actions for low-risk scenarios.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Risk-based access controls&lt;/strong&gt;: Apply stricter security measures for high-risk actions or sensitive data access.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bot protection&lt;/strong&gt;: Detect and mitigate automated attacks.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;API security&lt;/strong&gt;: Protect APIs from abuse and unauthorised access.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Residential proxy detection&lt;/strong&gt;: Identify and mitigate threats from residential proxy networks.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;For web applications, the goal is targeted control rather than blanket friction.&lt;/p&gt;
&lt;h2&gt;The Role of User Education&lt;/h2&gt;
&lt;p&gt;User education still has a place in a security strategy. Training and awareness programs can help users understand:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The importance of strong, unique passwords&lt;/li&gt;
&lt;li&gt;How to identify phishing attempts&lt;/li&gt;
&lt;li&gt;The risks of password reuse across multiple sites&lt;/li&gt;
&lt;li&gt;The importance of keeping software and devices updated&lt;/li&gt;
&lt;li&gt;How to recognise and report suspicious activities&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;User education works best when it supports technical controls rather than carrying the whole burden.&lt;/p&gt;
&lt;h2&gt;Addressing Mobile Application Security&lt;/h2&gt;
&lt;p&gt;Our survey indicates a potential gap in mobile security strategies. As mobile apps take on operations like banking and e-commerce, they become part of the application attack surface.&lt;/p&gt;
&lt;p&gt;Only 30% of respondents implement &lt;a href="/solutions/use-case/traffic-control/"&gt;Web Application&lt;/a&gt; and API Protection (WAAP), indicating many businesses may not be ready to protect their mobile assets. That gap leaves mobile applications exposed to attacks, including API abuse and data exfiltration.&lt;/p&gt;
&lt;!-- [Discover best practices for securing mobile applications](/mobile-application-security-best-practices/) --&gt;

&lt;h2&gt;The Threat of Residential Proxies&lt;/h2&gt;
&lt;p&gt;Our survey found that only 15% of organisations use residential proxy detection. That low adoption rate leaves a weakness in many businesses' security postures.&lt;/p&gt;
&lt;p&gt;Residential proxies can threaten account security by:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Bypassing traditional IP-based rate limiting&lt;/li&gt;
&lt;li&gt;Evading geolocation-based restrictions&lt;/li&gt;
&lt;li&gt;Facilitating large-scale credential stuffing attacks&lt;/li&gt;
&lt;li&gt;Enabling undetected data scraping&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Businesses should consider security providers that can detect and mitigate residential proxy threats.&lt;/p&gt;
&lt;p&gt;Learn more about &lt;a href="/products/residential-proxy-detection/"&gt;residential proxy&lt;/a&gt; detection&lt;/p&gt;
&lt;h2&gt;Finding the Balance&lt;/h2&gt;
&lt;p&gt;Balancing account protection and user experience in web applications requires more than a single control. By implementing contextual security measures, organisations can:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Improve security without unnecessary impact on user experience&lt;/li&gt;
&lt;li&gt;Adapt to threats in real-time&lt;/li&gt;
&lt;li&gt;Reduce the risk of compromised credentials and account takeovers&lt;/li&gt;
&lt;li&gt;Protect against threats like residential proxies and mobile application vulnerabilities&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;As threats change, account protection needs to change with them. Contextual security gives organisations a practical way to protect users and their reputation.&lt;/p&gt;</content><category term="Account Protection"></category><category term="Account Protection"></category><category term="Credential Stuffing"></category><category term="Application Security"></category><category term="Fraud Prevention"></category><category term="API Security"></category><category term="Magento"></category></entry><entry><title>The Cost of Credential Stuffing</title><link href="https://www.peakhour.io/blog/credential-stuffing-business-impact/" rel="alternate"></link><published>2024-07-17T00:00:00+10:00</published><updated>2024-07-17T00:00:00+10:00</updated><author><name>AC</name></author><id>tag:www.peakhour.io,2024-07-17:/blog/credential-stuffing-business-impact/</id><summary type="html">&lt;p&gt;Explore how credential stuffing attacks and account takeovers affect business reputation and customer trust.&lt;/p&gt;</summary><content type="html">&lt;p&gt;In recent months, &lt;a href="/blog/account-takeover-fraud-theiconic/"&gt;Australian businesses have faced a wave of credential stuffing attacks&lt;/a&gt;.
These attacks do not require the affected website itself to be breached. They target customer accounts, leading to
fraudulent transactions. The damage is practical as well as reputational: disputed purchases, refunds, locked accounts,
and customers asking how someone else was able to use their account.&lt;/p&gt;
&lt;h2&gt;What is Credential Stuffing?&lt;/h2&gt;
&lt;p&gt;Credential stuffing occurs when attackers use login details obtained from a
data breach to access accounts on other sites. Criminals test millions of credentials against a target
website to identify working combinations. This attack affects users who reuse passwords across multiple services [1].&lt;/p&gt;
&lt;h2&gt;The Scale of the Problem&lt;/h2&gt;
&lt;p&gt;Tens of thousands of Australian online accounts are reported to have been accessed since late November 2023 [2].
The attacks affected major retailers and service providers, including:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The Iconic&lt;/li&gt;
&lt;li&gt;Guzman y Gomez&lt;/li&gt;
&lt;li&gt;Dan Murphy's&lt;/li&gt;
&lt;li&gt;Event Cinemas&lt;/li&gt;
&lt;li&gt;Stan&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;The Impact&lt;/h2&gt;
&lt;p&gt;While reusing passwords between sites has long been considered poor security practice, users still do it. Blaming the customer,
as 23andMe did in its response to an attack, is not a serious account protection strategy. Over 70% of Americans believe that
websites have a responsibility to prevent account takeovers via stuffing attacks. Not doing so can negatively impact a
business in several ways.&lt;/p&gt;
&lt;h3&gt;Financial Impact&lt;/h3&gt;
&lt;p&gt;The cost can fall on either the affected business or the affected customer. Fraudsters made significant purchases using
compromised accounts. One scammer claimed to have spent over $800 on
high-end alcohol at Dan Murphy's [2]. Others bought iPhones and clothing. Either the customer will be out of pocket,
or the business when the customer issues a chargeback on the purchase.&lt;/p&gt;
&lt;h3&gt;Reputation Damage&lt;/h3&gt;
&lt;p&gt;The attacks leave businesses dealing with customer complaints, refunds, and visible questions about account security. The Iconic
pledged to refund affected customers [1]. Dan Murphy's confirmed that a "small number of user accounts were
subject to fraudulent transactions" [3].&lt;/p&gt;
&lt;h3&gt;Customer Trust&lt;/h3&gt;
&lt;p&gt;These incidents erode customer trust. Users expect businesses to make account abuse difficult, even when the original
password leak happened somewhere else. When accounts are taken over, customers question the security practices of the
affected companies.&lt;/p&gt;
&lt;h3&gt;Business Response&lt;/h3&gt;
&lt;p&gt;Companies responded by:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Locking compromised accounts&lt;/li&gt;
&lt;li&gt;Issuing refunds&lt;/li&gt;
&lt;li&gt;Encouraging customers to change passwords&lt;/li&gt;
&lt;li&gt;Implementing stronger security measures&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Dan Murphy's advised customers to "practise good password hygiene, using a strong password and changing it periodically" [3].&lt;/p&gt;
&lt;h2&gt;Prevention Strategies&lt;/h2&gt;
&lt;p&gt;To protect &lt;a href="/learning/security/credential-stuffing-defence/"&gt;against credential&lt;/a&gt; stuffing, businesses should:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Implement multi-factor authentication&lt;/li&gt;
&lt;li&gt;Educate customers about password security&lt;/li&gt;
&lt;li&gt;Monitor login behaviour on their website&lt;/li&gt;
&lt;li&gt;Implement, and regularly update, security measures, including bot management and advanced rate limiting.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Credential stuffing is not just a password reuse problem. It is an account protection problem, and businesses that sell
online need controls that make stolen credentials harder to turn into purchases.&lt;/p&gt;
&lt;p&gt;Sources:&lt;/p&gt;
&lt;p&gt;[^1^] ABC News: "The Iconic was hit by criminals taking money by 'credential stuffing'. How can you stay safe?"
[^2^] Cyber Daily: "Guzman y Gomez, Dan Murphy's customers affected in credential stuffing campaign"
[^3^] The Sydney Morning Herald: "Thousands of Australians hacked in 'credential stuffing' credit card scam"&lt;/p&gt;</content><category term="Account Protection"></category><category term="Credential Stuffing"></category><category term="Account Protection"></category><category term="Fraud Prevention"></category><category term="Residential Proxies"></category><category term="DNS"></category><category term="Magento"></category></entry><entry><title>2024 Survey Insights</title><link href="https://www.peakhour.io/blog/credential-stuffing-and-account-takeover-survey-2024/" rel="alternate"></link><published>2024-07-16T10:00:00+10:00</published><updated>2024-07-16T10:00:00+10:00</updated><author><name>AC</name></author><id>tag:www.peakhour.io,2024-07-16:/blog/credential-stuffing-and-account-takeover-survey-2024/</id><summary type="html">&lt;p&gt;Our 2024 survey of Australian CISOs and CTOs looks at how businesses are approaching account protection, particularly credential stuffing and residential proxies.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Our recent survey of Australian CISOs and CTOs looked at account protection controls, planned security measures, and how teams are responding to credential stuffing and residential proxies. Key findings:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Multi-Factor Authentication (MFA) Adoption&lt;/strong&gt;: 76.23% of Australian businesses use MFA, showing broad adoption of a baseline account security control.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Bot Protection&lt;/strong&gt;: Currently implemented by 39.34% of organisations, with an additional 34.65% planning to adopt it.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Bot Management Solutions&lt;/strong&gt;: Cloudflare is the most common bot management provider in the survey, used by 48.24% of respondents.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Residential Proxy (Resip) Detection&lt;/strong&gt;: Only 13.11% of organisations currently use this technology, although many plan to implement it to address residential proxy traffic.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Credential Stuffing Concerns&lt;/strong&gt;: Businesses are planning measures to reduce credential stuffing risk, including bot protection, MFA, and checking credentials against known breaches.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Mobile Security Gap&lt;/strong&gt;: Low adoption of Web Application and API Protection (WAAP) suggests gaps in mobile application security.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Executive vs. Engineer Priorities&lt;/strong&gt;: The survey showed different cybersecurity priorities between executives and engineers.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;These findings point to the need for &lt;a href="/solutions/use-case/prevent-account-takeovers/"&gt;account protection&lt;/a&gt; strategies that go beyond MFA and address automated traffic, breached credentials, and residential proxies.&lt;/p&gt;</content><category term="Account Protection"></category><category term="Account Protection"></category><category term="Credential Stuffing"></category><category term="Residential Proxies"></category><category term="API Security"></category><category term="Bot Management"></category><category term="DevSecOps"></category></entry><entry><title>2024 Survey Insights</title><link href="https://www.peakhour.io/blog/credential-stuffing-and-account-takeover-survey-2024-full/" rel="alternate"></link><published>2024-07-16T10:00:00+10:00</published><updated>2024-07-16T10:00:00+10:00</updated><author><name>AC</name></author><id>tag:www.peakhour.io,2024-07-16:/blog/credential-stuffing-and-account-takeover-survey-2024-full/</id><summary type="html">&lt;p&gt;Survey data from Australian CISOs and CTOs shows broad MFA adoption, lower bot protection uptake, and early attention on residential proxy detection for credential stuffing and account takeover risk.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Recent &lt;a href="/blog/account-takeover-fraud-theiconic/"&gt;customer account takeovers&lt;/a&gt; have put account protection back on the agenda for Australian businesses. Our 2024 survey of Australian CISOs and CTOs shows how respondents are using MFA, bot protection, WAAP and residential proxy detection to manage credential stuffing and account takeover risk.&lt;/p&gt;
&lt;h2&gt;Account Protection: Current State and Future Plans&lt;/h2&gt;
&lt;p&gt;Our survey found 76.23% of Australian businesses use Multi-Factor Authentication (MFA). MFA is widely adopted, but it is not a complete account protection strategy on its own.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Current Security Measures of Australian Businesses" src="/static/images/survey/current-security-measures.png"&gt;&lt;/p&gt;
&lt;p&gt;39.34% of organisations currently use bot protection. That matters because &lt;a href="/learning/bots/anatomy-of-credential-stuffing-attack/"&gt;credential stuffing&lt;/a&gt; is automated by design. Another 34.65% of businesses plan to implement bot protection in the future.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Planned security measures" src="/static/images/survey/planned-security-measures.png"&gt;&lt;/p&gt;
&lt;p&gt;The pattern is clear: many organisations are treating MFA as a baseline and looking at additional controls around it.&lt;/p&gt;
&lt;h2&gt;Current Bot Management Solutions&lt;/h2&gt;
&lt;p&gt;The survey also asked which bot management solutions Australian businesses currently use. Cloudflare was the clear leader, with nearly half of respondents using its services.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Current bot management solutions used by Australian businesses" src="/static/images/survey/bot-management-solutions-use.png"&gt;&lt;/p&gt;
&lt;p&gt;The breakdown of bot management solutions is as follows:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Cloudflare: 48.24%&lt;/li&gt;
&lt;li&gt;AWS WAF Bot Ruleset: 10.59%&lt;/li&gt;
&lt;li&gt;Other solutions make up the remaining percentage&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This distribution is concentrated around Cloudflare. Outside that, the remaining respondents are spread across other solutions rather than one clear alternative.&lt;/p&gt;
&lt;p&gt;Tooling matters here. Residential proxy traffic weakens IP reputation and simple rate limits, so detection capability, request grouping and response controls matter as much as vendor name. If residential proxies continue to feature in credential stuffing tooling, this mix may shift as teams look for more &lt;a href="/blog/proxy-detection-challenges-existing-solutions/"&gt;advanced protection measures&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;The Rising Threat of Residential Proxies&lt;/h2&gt;
&lt;p&gt;A key finding from our survey is the low adoption rate of &lt;a href="/products/residential-proxy-detection/"&gt;residential proxy&lt;/a&gt; (resip) detection, with only 13.11% of organisations currently using this technology. Planned adoption suggests teams are starting to account for the risk, but current coverage is still low.&lt;/p&gt;
&lt;p&gt;Resips are difficult for account security teams because malicious traffic can look like normal ISP traffic. They enable attackers to:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Bypass traditional IP-based rate limiting&lt;/li&gt;
&lt;li&gt;Evade geolocation-based restrictions&lt;/li&gt;
&lt;li&gt;Conduct large-scale credential stuffing attacks&lt;/li&gt;
&lt;li&gt;Scrape sensitive data undetected&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The planned adoption of resip detection points to a shift in security strategies, away from simple IP-based controls and towards more specific network signals.&lt;/p&gt;
&lt;p&gt;&lt;a href="/blog/residential-proxies-unseen-challenges/"&gt;Learn more about the threat of residential proxies and how to detect them&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Credential Stuffing: A Persistent and Growing Concern&lt;/h2&gt;
&lt;p&gt;Credential &lt;a href="/learning/security/credential-stuffing-defence/"&gt;stuffing attacks&lt;/a&gt; continue to be a major concern for businesses. These attacks exploit password reuse across multiple sites, allowing attackers to gain unauthorised access to user accounts.&lt;/p&gt;
&lt;p&gt;Respondents said they plan to implement several measures to reduce credential stuffing risk:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;34.65% plan to implement bot protection&lt;/li&gt;
&lt;li&gt;32.67% intend to add multi-factor authentication&lt;/li&gt;
&lt;li&gt;31.68% aim to check credentials against known breaches&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These plans point to layered account protection rather than reliance on one control.&lt;/p&gt;
&lt;h2&gt;Mobile Applications: An Emerging Attack Surface&lt;/h2&gt;
&lt;p&gt;While mobile applications were not directly addressed in our survey, the data suggests a possible gap in mobile security strategies. The low adoption rate of Web &lt;a href="/learning/application-security/what-is-waap/"&gt;Application and&lt;/a&gt; API Protection (WAAP) - implemented by only 27.87% of respondents - indicates many businesses may be underprepared to protect their mobile assets.&lt;/p&gt;
&lt;p&gt;As mobile apps become primary interfaces for critical operations, this gap leaves businesses exposed to attacks that use the same automation and resip infrastructure seen on web login flows.&lt;/p&gt;
&lt;h2&gt;Balancing Security and User Experience&lt;/h2&gt;
&lt;p&gt;The operational problem is familiar: increase assurance without making login unusable. Key considerations for enhancing account protection while preserving usability include:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Expanding beyond MFA&lt;/li&gt;
&lt;li&gt;Implementing bot protection&lt;/li&gt;
&lt;li&gt;Adopting WAAP solutions&lt;/li&gt;
&lt;li&gt;Monitoring credential leaks&lt;/li&gt;
&lt;li&gt;Focusing on API security&lt;/li&gt;
&lt;li&gt;Implementing residential proxy detection&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;a href="/blog/frictionless-customer-experiences/"&gt;Explore strategies for balancing security and user experience&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Executive vs Engineer Perspectives&lt;/h2&gt;
&lt;p&gt;Our survey found differences in cybersecurity priorities between executives and engineers:&lt;/p&gt;
&lt;p&gt;&lt;img alt="Executive vs Engineer Cybersecurity Priorities" src="/static/images/survey/planned-security-measures.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Figure 3: Comparison of cybersecurity priorities between executives and engineers&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;The gap matters because budget, architecture, and incident response are often owned by different teams. Account protection plans need to cover both executive risk concerns and engineering realities, including the threat from RESIPs.&lt;/p&gt;
&lt;h2&gt;Final Thoughts&lt;/h2&gt;
&lt;p&gt;Our 2024 survey results point to a simple position: MFA is widely used, but it is not the whole account protection strategy. Bot protection, breached credential checks, WAAP and residential proxy detection are still unevenly adopted. That matters because credential stuffing does not depend on one weakness; it combines reused credentials, automation, proxy networks and weak response controls.&lt;/p&gt;
&lt;p&gt;Australian businesses do not need every control at once, but they need a layered plan that reflects how account takeover attacks are run now. For teams reviewing their controls, resip detection and mobile/API coverage are worth checking explicitly because both are easy to miss if the programme is still centred on MFA and IP reputation.&lt;/p&gt;</content><category term="Account Protection"></category><category term="Account Protection"></category><category term="Credential Stuffing"></category><category term="Residential Proxies"></category><category term="API Security"></category><category term="Fraud Prevention"></category><category term="Bot Management"></category></entry><entry><title>Application Security Beyond MFA</title><link href="https://www.peakhour.io/blog/why-mfa-is-an-incomplete-defence/" rel="alternate"></link><published>2024-07-15T10:00:00+10:00</published><updated>2024-07-15T10:00:00+10:00</updated><author><name>AC</name></author><id>tag:www.peakhour.io,2024-07-15:/blog/why-mfa-is-an-incomplete-defence/</id><summary type="html">&lt;p&gt;MFA helps, but it does not stop social engineering, residential proxy abuse, credential stuffing, or session risk on its own.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Multi-factor authentication (MFA) remains a useful defence against &lt;a href="/learning/security/account-takeover-protection/"&gt;account takeovers&lt;/a&gt;, but it is not a complete control. Attackers increasingly work around MFA with social engineering, automation, and infrastructure that makes malicious traffic look ordinary.&lt;/p&gt;
&lt;p&gt;MFA answers one narrow question: can the user present a second factor at this point in the flow? That is valuable. It does not prove the password was safe, the session will remain safe, the device is trusted, or the person entering the code has not been manipulated. Account protection needs to cover the request path before MFA, around MFA, and after MFA.&lt;/p&gt;
&lt;h2&gt;OTP Bots Target the Human, Not the Cryptography&lt;/h2&gt;
&lt;p&gt;A &lt;a href="https://www.kaspersky.com/blog/when-two-factor-authentication-useless/51434/"&gt;Kaspersky article&lt;/a&gt; describes the rise of OTP bots: tools that call or message users and convince them to hand over one-time passwords. The attacker does not need to break the MFA system. They need the victim to read out a fresh code at the same moment the attacker is logging in.&lt;/p&gt;
&lt;p&gt;The usual flow is simple. The attacker obtains a working username and password from a breach, phishing kit, or credential stuffing result. They attempt a login, which triggers an OTP. The victim receives a call or message claiming to be from the bank, retailer, courier, or support team. The story is urgent enough to make the code feel like part of protecting the account, not compromising it.&lt;/p&gt;
&lt;p&gt;AI phone assistants such as &lt;a href="https://curiousthing.io/products/lucy-ai-phone-answering-agent"&gt;Lucy&lt;/a&gt; are built for legitimate business use, but similar conversational technology lowers the effort required to run more convincing criminal call flows. The security issue is not that AI magically defeats MFA. It is that a fluent, responsive call can make social engineering less scripted and harder for a user to dismiss.&lt;/p&gt;
&lt;p&gt;This is why "we have MFA" should not end the account protection conversation. MFA can stop many stolen-password logins, but it cannot reliably stop a user from being tricked in real time.&lt;/p&gt;
&lt;h2&gt;Residential Proxies Weaken the Surrounding Checks&lt;/h2&gt;
&lt;p&gt;Attackers also work to make the login itself look unremarkable. &lt;a href="/learning/security/datacenter-vs-residential-proxies/"&gt;Residential proxies&lt;/a&gt; route traffic through IP addresses assigned to ordinary home or mobile internet connections. That lets malicious traffic borrow the appearance of normal customer traffic.&lt;/p&gt;
&lt;p&gt;Traditional controls often lean too heavily on IP address, geolocation, and request volume. Residential proxy networks weaken all three. An attacker can rotate through many IPs, keep each source below a simple rate limit, and choose an exit location that roughly matches the victim's country or city. If the login looks local enough, the MFA challenge may be the only control left.&lt;/p&gt;
&lt;p&gt;That is a poor place to put all the risk. A login with a correct password, a plausible IP address, and a successful OTP can still be an account takeover. The system needs to keep evaluating the request: device and browser signals, network fingerprint, known breached credentials, velocity across accounts, and behaviour after login.&lt;/p&gt;
&lt;h2&gt;Automation Happens Before and After MFA&lt;/h2&gt;
&lt;p&gt;MFA is usually visible at the point of login, but account takeover campaigns are broader than one prompt. Bots test credential pairs across login forms and APIs. Tools such as OpenBullet and similar automation frameworks can replay login flows at scale. Breached credential lists give attackers a cheap starting point because password reuse remains common.&lt;/p&gt;
&lt;p&gt;Once an attacker gets through, the next actions matter. They may change the email address, add a device, disable notifications, alter delivery details, use stored payment methods, transfer value, or test what the account can access. If monitoring treats a successful MFA as the end of risk, those actions can happen inside a trusted session.&lt;/p&gt;
&lt;p&gt;The defence needs to be layered around the actual attack path:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Check credential risk before and during login, especially known breached username and password pairs.&lt;/li&gt;
&lt;li&gt;Use bot and browser signals to detect automation even when traffic is distributed.&lt;/li&gt;
&lt;li&gt;Rate limit on better keys than IP alone, such as TLS or HTTP/2 fingerprints, headers, routes, ASNs, countries, and account behaviour.&lt;/li&gt;
&lt;li&gt;Treat residential proxy evidence as a risk input, not just an allow-or-block label.&lt;/li&gt;
&lt;li&gt;Monitor session and account changes after MFA, then challenge, hold, revoke, or review when behaviour changes.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This does not mean every login needs more friction. It means the system should have more choices than "ask for MFA" or "allow". A low-risk login from a known device can keep moving. A login using breached credentials through proxy infrastructure can be slowed, challenged, or blocked before the user receives a confusing call. A successful login followed by high-risk account changes can trigger fresh verification or session invalidation.&lt;/p&gt;
&lt;h2&gt;Controls Around MFA&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://www.peakhour.io/products/advanced-rate-limiting/"&gt;Peakhour's Advanced Rate Limiting&lt;/a&gt; helps reduce reliance on IP address by grouping and limiting requests using signals such as HTTP/2 and TLS fingerprints, ASNs, countries, request headers, and route context. That matters when credential stuffing is spread across residential proxies.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.peakhour.io/products/bot-management/"&gt;Peakhour's Bot Management&lt;/a&gt; adds another layer by looking for automation, browser inconsistency, suspicious device patterns, and residential proxy use. The aim is to identify the machinery behind the attack before it becomes a clean-looking login attempt.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.peakhour.io/solutions/use-case/prevent-account-takeovers/"&gt;Peakhour's Account Protection&lt;/a&gt; brings those signals closer to the account decision. Breached credential checks, bot evidence, rate limits, proxy context, custom rules, and monitoring should all feed the decision to allow, challenge, rate limit, block, log, or review.&lt;/p&gt;
&lt;p&gt;User education still has a place, especially around OTP sharing and unexpected calls. It should not be the main control. Users are asked to make security decisions at bad moments, often under pressure, with limited context. Technical controls should reduce the number of times an attacker can create that moment.&lt;/p&gt;
&lt;h2&gt;MFA Still Belongs in the Stack&lt;/h2&gt;
&lt;p&gt;The point is not to remove MFA. Strong MFA, especially phishing-resistant methods, raises the cost of account takeover and should remain part of the stack. The mistake is treating MFA as proof that the account is safe.&lt;/p&gt;
&lt;p&gt;Account protection works better when MFA is one decision point inside a wider system. The login attempt, credential history, network path, device, session, account changes, and transaction behaviour all carry evidence. MFA is useful evidence. It is not the whole case.&lt;/p&gt;</content><category term="Account Protection"></category><category term="Account Protection"></category><category term="Credential Stuffing"></category><category term="Bot Management"></category><category term="API Security"></category><category term="Residential Proxies"></category><category term="Threat Detection"></category></entry><entry><title>How To Exclude Query String Parameters from Search Engine crawling</title><link href="https://www.peakhour.io/blog/how-to-exclude-query-string-parameters-from-search-engines-using-robots-txt/" rel="alternate"></link><published>2024-05-21T13:00:00+10:00</published><updated>2024-05-21T13:00:00+10:00</updated><author><name>Dan</name></author><id>tag:www.peakhour.io,2024-05-21:/blog/how-to-exclude-query-string-parameters-from-search-engines-using-robots-txt/</id><summary type="html">&lt;p&gt;Double crawling of pages by search engines due to filtering options and query strings can be a massive drain on server resources. Learn how to control it using robots.txt.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Last year we wrote about the problem of &lt;a href="/blog/when-good-bots-break-bad/"&gt;excessive crawling from search engine spiders&lt;/a&gt;.
Search engines such as Google and Bing aim to index as much content as possible. For ecommerce sites, this often means
indexing pages with query string parameters used for sorting, filtering, or pagination. Those parameters help users
navigate the site, but they can cause a few predictable crawler problems:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Over-Crawling&lt;/strong&gt;: Search engines may spend too much time crawling similar pages with different parameters, wasting crawl budget.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Duplicate Content&lt;/strong&gt;: Pages with different parameters can be treated as duplicate content, weakening SEO performance.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Server Load&lt;/strong&gt;: Excessive crawling can increase server load, slow down your site, and affect user experience. Search
  engines typically account for 30-50% of page requests to an ecommerce store. Managing their crawling effectively can
  have a material effect on site speed and server spend.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Another common cause of over crawling is internal searches being indexed.&lt;/p&gt;
&lt;p&gt;In our previous article we mentioned using the webmaster tools provided by Google and Microsoft to manage crawler
behaviour by adding ignored parameters. Since then, both tools have been updated and no longer allow you to add
parameters to ignore during a crawl.&lt;/p&gt;
&lt;h2&gt;Differences in Crawling and Indexing&lt;/h2&gt;
&lt;p&gt;Search engines maintain an 'index' of web pages. Pages in this index are what appear in search results. To maintain
the index, the search engine crawls a website to 'discover' new content and keep existing entries up to date. Webmasters
can control what gets indexed with tags or headers in their web pages. These include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Canonical Tags can be used to indicate the preferred version of a page. This helps
  consolidate link 'juice' and tell the search engine which URL to index.&lt;/li&gt;
&lt;li&gt;Noindex tags can be used to prevent specific pages from being indexed. This is useful
  for thank you pages, admin pages or any content you don't want to appear in search results.&lt;/li&gt;
&lt;li&gt;&lt;a href="/learning/seo/nofollow-link-attribute"&gt;Nofollow links&lt;/a&gt; can be used to indicate to a search engine not to pass on SEO
  value to the linked page.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;However, controlling what does or does not get indexed does not prevent content from being crawled. The only way
to do that is via the robots.txt file. You may be familiar with the Disallow directive in
the robots.txt file, but you can also use wildcards to prevent crawling of url parameters.&lt;/p&gt;
&lt;h2&gt;An example...&lt;/h2&gt;
&lt;p&gt;Consider an ecommerce store that has a category page which can then be customised with the following parameters:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;    orderBy
    colors
    brands
    page
    results
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;These may appear in any order, and the combinations can result in 100s or even 1000s of variations of essentially the
same page. Google is fairly smart when presented with this scenario, but Bing.... Bing can crawl very aggressively and
it likes to try everything. In our example above, we may want to stop crawling everything except the page number, in
which case an effective way to control crawler behaviour would be:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;    User-agent: &lt;span class="gs"&gt;*&lt;/span&gt;
&lt;span class="gs"&gt;    Disallow: /*&lt;/span&gt;?*orderBy=*
    Disallow: /*?*colors=*
    Disallow: /*?*brands=*
    Disallow: /*?*results=*
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;We can't really do this in a single Disallow because the parameters might be in any order. By including the ? in the url
we're ensuring that the parameter names are only in the query string, not in the main url path. This prevents crawlers
from wasting crawl budget and putting unnecessary load on server resources.&lt;/p&gt;
&lt;h2&gt;Final Thoughts&lt;/h2&gt;
&lt;p&gt;Search engines can often make up 30-50% of the overall page requests to a website. Managing their behaviour helps
maximise useful crawling and minimise server utilisation. Keep an eye on your access logs for unwanted behaviour, and
use robots.txt where it gives you the right level of control.&lt;/p&gt;</content><category term="Bots"></category><category term="SEO"></category><category term="Bot Management"></category><category term="Web Performance"></category><category term="DNS"></category></entry><entry><title>Addressing Key Cloud Security Categories</title><link href="https://www.peakhour.io/blog/peakhour-cloud-security-post-wiz/" rel="alternate"></link><published>2024-05-01T10:00:00+10:00</published><updated>2024-05-01T10:00:00+10:00</updated><author><name>AC</name></author><id>tag:www.peakhour.io,2024-05-01:/blog/peakhour-cloud-security-post-wiz/</id><summary type="html">&lt;p&gt;An analysis of Peakhour's role in addressing key cloud security categories identified in recent industry analysis, demonstrating its comprehensive approach to modern cloud security challenges.&lt;/p&gt;</summary><content type="html">&lt;p&gt;A recent &lt;a href="https://www.scalevp.com/insights/a-world-after-wiz-emerging-opportunities-in-cloud-security/"&gt;Scale Venture Partners analysis&lt;/a&gt; sets out emerging opportunities in cloud security after Wiz. Peakhour is a reverse proxy rather than a cloud control-plane product, but it addresses several of these categories and covers related security needs at the application edge.&lt;/p&gt;
&lt;h2&gt;Cloud Security Posture Management (CSPM)&lt;/h2&gt;
&lt;p&gt;The analysis identifies CSPM as a key category in cloud security. Peakhour is not a traditional CSPM, but it contributes to security posture management through:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Traffic Analysis: Peakhour analyses incoming traffic patterns to identify potential security risks.&lt;/li&gt;
&lt;li&gt;Configuration Recommendations: Peakhour recommends security configuration improvements based on observed traffic patterns.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Cloud Workload Protection Platform (CWPP)&lt;/h2&gt;
&lt;p&gt;The article notes that CWPP products provide granular protection for cloud workloads. Peakhour contributes to workload protection through:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Application-Layer Filtering: Peakhour filters traffic at the application layer to protect cloud workloads.&lt;/li&gt;
&lt;li&gt;Real-Time Threat Detection: Peakhour detects and blocks threats in real-time.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Cloud Detection &amp;amp; Response (CDR)&lt;/h2&gt;
&lt;p&gt;CDR focuses on detecting, investigating, and responding to incidents. Peakhour supports CDR work via:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Log Generation: Peakhour generates detailed logs of all traffic for incident investigation.&lt;/li&gt;
&lt;li&gt;Anomaly Detection: Peakhour detects anomalous traffic patterns that indicate security incidents.&lt;/li&gt;
&lt;li&gt;Automated Response: Peakhour responds to detected threats by blocking malicious traffic.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Cloud-Native Application Protection Platform (CNAPP)&lt;/h2&gt;
&lt;p&gt;The analysis defines CNAPP as a combination of CSPM, CWPP, and CDR. Peakhour aligns with that model through:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Integrated Security: Peakhour provides a single platform for traffic filtering, threat detection, and response.&lt;/li&gt;
&lt;li&gt;Application-Centric Protection: Peakhour's reverse proxy design protects cloud-native applications at the application edge.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Cloud Infrastructure Entitlement Management (CIEM)&lt;/h2&gt;
&lt;p&gt;Peakhour does not directly manage cloud infrastructure entitlements, but it complements CIEM efforts through:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Access Pattern Analysis: Peakhour analyses access patterns to applications, providing insights that can inform entitlement decisions.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Non-Human Identity (NHI)&lt;/h2&gt;
&lt;p&gt;The article highlights the growing importance of managing non-human identities. Peakhour contributes to this area by:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Service-to-Service Communication Monitoring: Peakhour monitors and controls service-to-service communication.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Remediation Ops (RemOps)&lt;/h2&gt;
&lt;p&gt;RemOps focuses on managing the growing volume of security alerts. Peakhour supports RemOps through:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Alert Aggregation: Peakhour aggregates security events from traffic analysis into usable alerts.&lt;/li&gt;
&lt;li&gt;Prioritisation: Peakhour prioritises alerts based on threat severity and potential impact.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Additional Peakhour Capabilities&lt;/h2&gt;
&lt;p&gt;Peakhour also addresses &lt;a href="/learning/cloud-security/introduction-to-cloud-security/"&gt;cloud security&lt;/a&gt; needs outside the categories covered in the Scale VP analysis:&lt;/p&gt;
&lt;h3&gt;DDoS Protection&lt;/h3&gt;
&lt;p&gt;Peakhour provides DDoS protection via:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Layer 7 Rate Limiting: Peakhour protects against application-layer DDoS attacks.&lt;/li&gt;
&lt;li&gt;Traffic Anomaly Detection: Peakhour identifies and mitigates DDoS attacks in real-time.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Content Delivery Network (CDN)&lt;/h3&gt;
&lt;p&gt;Peakhour's delivery and cache functionality reduces cloud load and traffic bills through:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Traffic Optimisation: Peakhour reduces load on origin servers and decreases traffic bills.&lt;/li&gt;
&lt;li&gt;Geographic Distribution: Peakhour serves content from geographically distributed nodes.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Bot Management&lt;/h3&gt;
&lt;p&gt;Peakhour manages bot traffic through:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Bot Detection: Peakhour identifies bot traffic.&lt;/li&gt;
&lt;li&gt;Policy Control: Peakhour implements policies for managing different types of bots.&lt;/li&gt;
&lt;li&gt;Automated Mitigation: Peakhour applies countermeasures against malicious bot activity.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Cloud Visibility&lt;/h3&gt;
&lt;p&gt;Peakhour addresses visibility gaps in modern cloud environments:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Traffic Insights: Peakhour provides detailed insights into front-end traffic patterns.&lt;/li&gt;
&lt;li&gt;Real-Time Analytics: Peakhour delivers real-time analytics on traffic, threats, and application behaviour.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Final Thoughts&lt;/h2&gt;
&lt;p&gt;Peakhour addresses several categories identified in the Scale VP analysis of emerging cloud security opportunities. It also covers adjacent needs at the application edge, where traffic, threats, bots, delivery, and visibility meet.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;See how Peakhour's Application Security Platform addresses key areas of modern cloud security. &lt;a href="/contact-sales/"&gt;Contact our team&lt;/a&gt; to strengthen your cloud security posture.&lt;/em&gt;&lt;/p&gt;</content><category term="Security"></category><category term="API Security"></category><category term="Threat Detection"></category><category term="Account Protection"></category><category term="DevSecOps"></category><category term="Application Security"></category><category term="CDN"></category></entry><entry><title>Managing Breached Credential Usage</title><link href="https://www.peakhour.io/blog/breached-credentials-protection-application-security-platform/" rel="alternate"></link><published>2024-03-15T00:00:00+11:00</published><updated>2024-03-15T00:00:00+11:00</updated><author><name>AC</name></author><id>tag:www.peakhour.io,2024-03-15:/blog/breached-credentials-protection-application-security-platform/</id><summary type="html">&lt;p&gt;How breached credential checks and risk signals help detect credential stuffing without adding unnecessary login friction.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Credential &lt;a href="/learning/security/credential-stuffing-defence/"&gt;stuffing attacks&lt;/a&gt; remain a common way to take over accounts on applications and APIs. For DevOps, SRE, and DevSecOps teams, the problem is not just whether a password is correct. It is whether the login attempt carries signs of automation, credential reuse, or known compromise. Effective &lt;a href="/solutions/use-case/prevent-account-takeovers/"&gt;account protection&lt;/a&gt; needs breached credential checks alongside contextual risk analysis.&lt;/p&gt;
&lt;h2&gt;Breached Credential Databases and Risk Profiling&lt;/h2&gt;
&lt;p&gt;Modern Application Security Platforms can use breached credential intelligence containing billions of leaked username and password combinations from historical data breaches. Used at login time, this gives security teams an immediate signal that an account may be at higher risk, even before there is confirmed account takeover activity.&lt;/p&gt;
&lt;h3&gt;Enterprise Credential Intelligence&lt;/h3&gt;
&lt;p&gt;Peakhour's Application Security Platform includes &lt;a href="/products/breached-credentials"&gt;Breached Credentials&lt;/a&gt; protection designed to work with existing authentication systems. The platform provides:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Real-Time Credential Checking&lt;/strong&gt;: Validation against breached credential data during login attempts&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;API-Native Integration&lt;/strong&gt;: Integration with authentication services and identity providers&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Privacy-Preserving Verification&lt;/strong&gt;: Hashing mechanisms that protect user privacy whilst enabling threat detection&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DevSecOps Compatibility&lt;/strong&gt;: RESTful APIs for security automation and CI/CD workflows&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Building Statistical Models&lt;/h2&gt;
&lt;p&gt;To detect &lt;a href="/learning/bots/anatomy-of-credential-stuffing-attack/"&gt;credential stuffing&lt;/a&gt;, organisations need a baseline for normal breached credential use. This typically involves:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Collecting data from API and login endpoint attempts&lt;/li&gt;
&lt;li&gt;Aggregating data using device fingerprints&lt;/li&gt;
&lt;li&gt;Analysing login patterns and credential use frequency&lt;/li&gt;
&lt;li&gt;Establishing baselines for typical user behaviour&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;These models show how often breached credentials appear in normal login traffic, and when the pattern starts to look like automated testing rather than ordinary user behaviour.&lt;/p&gt;
&lt;h2&gt;Application Security Platform Integration&lt;/h2&gt;
&lt;p&gt;Breached credential checks are most useful when they feed into the rest of the application security stack:&lt;/p&gt;
&lt;h3&gt;Multi-Layer Defence Strategy&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Edge Processing&lt;/strong&gt;: Credential validation at the CDN edge&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;API Protection&lt;/strong&gt;: Coverage for both web applications and mobile APIs&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bot Management Integration&lt;/strong&gt;: Correlation with bot detection systems to identify automated credential testing&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Rate Limiting Coordination&lt;/strong&gt;: Rate limits adjusted by credential risk&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;DevSecOps Operational Excellence&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Security Automation&lt;/strong&gt;: Response workflows for high-risk credential attempts&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Compliance Reporting&lt;/strong&gt;: Audit logging and monitoring for security reviews&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Threat Intelligence Feeds&lt;/strong&gt;: Updates from breach monitoring&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Custom Rule Engine&lt;/strong&gt;: Policy configuration for organisation-specific requirements&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Breached credential protection is one part of account takeover defence. On its own, it can show that a password has appeared in a breach. It should sit alongside broader controls such as bot management, rate limiting, API protection, and DDoS mitigation, while still giving teams a clear basis for deciding whether to block, challenge, or monitor a login attempt.&lt;/p&gt;
&lt;p&gt;The practical goal is to make credential risk visible at the point of authentication without treating every user as suspicious. That requires breached credential checking to be part of the login flow, not a separate report reviewed after the attack has already run.&lt;/p&gt;</content><category term="Account Protection"></category><category term="Credential Stuffing"></category><category term="Account Protection"></category><category term="DevSecOps"></category><category term="Application Security"></category><category term="Threat Detection"></category><category term="API Security"></category></entry><entry><title>Rate Limiting for API Security</title><link href="https://www.peakhour.io/blog/introducing-advanced-rate-limiting/" rel="alternate"></link><published>2024-01-24T13:00:00+11:00</published><updated>2024-01-24T13:00:00+11:00</updated><author><name>AC</name></author><id>tag:www.peakhour.io,2024-01-24:/blog/introducing-advanced-rate-limiting/</id><summary type="html">&lt;p&gt;How advanced rate limiting protects modern applications and APIs from sophisticated threats including proxy networks, distributed attacks, and automated abuse in enterprise security environments.&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;a href="/blog/rate-limiting/"&gt;Rate limiting&lt;/a&gt; prevents servers from being overwhelmed by too many requests in a short period of time. Typically,
rate limiting is configured using rules made up of a filter, for example a path like /login, and a limit on the number
of requests a user can make in a given time, such as 10 requests in a minute. If a user exceeds this limit, they are usually
blocked for a timeout period.&lt;/p&gt;
&lt;p&gt;But how do you identify a user? Traditionally rate limiting has used the IP address for grouping requests, assuming
that requests from the same IP address will be the same user. That assumption is now weak. IP addresses are rarely static
and are often shared. For example, an office network might have hundreds of individual computers in it but present a single
IP address for all those computers to the internet. Mobile operators commonly use carrier-grade network address translation
(CGNAT) to share the same IP across
thousands of devices or users. Bot networks, seeking to avoid security controls like rate limiting, will rotate
their requests through thousands of different IP addresses. This makes rate limiting based on IP addresses a poor choice
from both a functional and a security perspective.&lt;/p&gt;
&lt;h2&gt;Introducing Advanced Rate Limiting&lt;/h2&gt;
&lt;p&gt;Peakhour's &lt;a href="/products/advanced-rate-limiting/"&gt;Advanced Rate Limiting&lt;/a&gt; service lets you create
filters using any HTTP request characteristic, for example URI, request method, headers, cookies, country,
network fingerprints and more. You can also use response headers and response codes, so a rule can count
failed login attempts, repeated 404s from a scraper, or traffic that crosses an API threshold.&lt;/p&gt;
&lt;p&gt;For counting requests you can use the following fields for grouping:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;IP Address&lt;/li&gt;
&lt;li&gt;ASN&lt;/li&gt;
&lt;li&gt;Country Code&lt;/li&gt;
&lt;li&gt;HTTP/2 Fingerprint&lt;/li&gt;
&lt;li&gt;TLS Fingerprint&lt;/li&gt;
&lt;li&gt;Any combination of Request Headers&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You can use one of those fields, or a combination of them, to identify users with more control than IP address alone.&lt;/p&gt;
&lt;p&gt;You can also separate the filter and mitigation expression. For example excessive attempts to /login can be blocked on
the entire site.&lt;/p&gt;
&lt;p&gt;This matters because rate limiting is not just a request counter. In Peakhour it sits beside bot management, WAF,
DDoS protection, traffic controls, and origin shielding on the same managed edge path. That gives operators a practical
way to set different thresholds for verified crawlers, suspicious automation, authenticated API clients, and normal
visitors without pushing every policy change into the application. It also gives them allowed, blocked, and
threshold-hit evidence to tune the rule after it is deployed, whether Peakhour is the active edge or adding controls
beside an existing CDN or cloud edge.&lt;/p&gt;
&lt;h2&gt;Putting it into action&lt;/h2&gt;
&lt;p&gt;Advanced Rate Limiting can help protect applications from attacks like
&lt;a href="/products/ddos-protection/"&gt;Layer 7 DDoS&lt;/a&gt;,
Account Takeovers, Credential Stuffing, and more. Here are some real
world examples you can configure using our dashboard
and API.&lt;/p&gt;
&lt;h3&gt;Protect against general site abuse&lt;/h3&gt;
&lt;p&gt;Our example website is a medium-sized ecommerce store that has page URLs ending in /. It serves Australian clients and typically
sees around 100 page requests a minute from non-search-engine traffic during peak traffic times. With that baseline,
we can set up rate limiting to prevent general site abuse and protect against
layer 7 DDoS attacks.&lt;/p&gt;
&lt;p&gt;Peakhour rate limiting starts with zones. You specify your request limits in these zones.&lt;/p&gt;
&lt;div class="text-center" style="padding: 20px 0px"&gt;
&lt;img src="/static/images/blog/advanced-rate-limit-zone.jpg" alt="rate limit zone"/&gt;
&lt;/div&gt;

&lt;p&gt;Here we've specified a maximum of 45 requests in 1 minute. We're going to apply this limit to page loads only. Since our
typical maximum for all users on this website is 100 in a minute,
it seems reasonable that a real user is not going to view 40 pages in 1 minute. We could also specify a value for error
responses in a minute. An error could be a 404, which a scraper might typically get when looking for removed URLs.&lt;/p&gt;
&lt;p&gt;Now let's define our filter and our counter. For our filter we mentioned that pages end in /, so we'll use that, but
exclude verified bots to make sure they're not restricted when crawling the site. A verified bot is a crawler like
Google or Bing, that Peakhour has verified as legitimate by using reverse DNS to confirm
they are who they say they are.&lt;/p&gt;
&lt;p&gt;Attackers, scrapers, and others looking to abuse a site will launch an attack using a particular piece of software. That piece of
software will have a &lt;a href="/blog/tls-fingerprinting/"&gt;TLS fingerprint&lt;/a&gt;
(like JA3) that remains the same, even as the attacker rotates
their user-agent, IP address, and other characteristics, so we'll use the TLS fingerprint as our request counter.&lt;/p&gt;
&lt;div class="text-center" style="padding: 20px 0px"&gt;
&lt;img src="/static/images/blog/advanced-rate-limiting-rule.jpg" alt="rate limit rule"/&gt;
&lt;/div&gt;

&lt;h3&gt;Rate Limit authenticated API Users&lt;/h3&gt;
&lt;p&gt;It is common for APIs to require an Authorization header as part of the request to authenticate access. By grouping
requests on the value of this header, we can rate limit a specific API client even if it uses multiple applications,
or if its credentials are stolen.&lt;/p&gt;
&lt;div class="text-center" style="padding: 20px 0px"&gt;
&lt;img src="/static/images/blog/advanced-rate-limiting-header.jpg" alt="rate limit rule"/&gt;
&lt;/div&gt;

&lt;h3&gt;Protecting from Account Takeovers&lt;/h3&gt;
&lt;p&gt;Account Takeover attacks have been in the news recently, with several high-profile
websites being victims. Credential Stuffing and
Brute Force attacks rely on attempting lots of logins to identify valid credentials.
Along with lots of attempts come lots of failures. Attackers will rely on software like &lt;a href="/blog/the-rise-of-openbullet/"&gt;openbullet&lt;/a&gt;
to carry out their attacks, using proxy networks to constantly rotate IP addresses and defeat traditional rate limiting.&lt;/p&gt;
&lt;p&gt;The program the attacker is using will present a consistent TLS fingerprint. We can make a special
rule for our login form that tracks failed login attempts by TLS Fingerprint, effectively tracking the attacker as
they rotate IP address.&lt;/p&gt;
&lt;p&gt;If the attack is low and slow, we can track failed attempts over a longer timeframe by using the response
from the server when adding to our counting zone.&lt;/p&gt;
&lt;div class="text-center" style="padding: 20px 0px"&gt;
&lt;img src="/static/images/blog/rate-limit-failed-logins.jpg" alt="failed logins rate limit rule"/&gt;
&lt;/div&gt;

&lt;h2&gt;Final Thoughts&lt;/h2&gt;
&lt;p&gt;Advanced rate limiting is a practical response to the limits of IP-based controls. IP address rotation is the standard
amongst attackers and scrapers, rendering the traditional approach obsolete. Useful protection now needs to identify
the actor behind the requests, protect the origin before expensive application work is triggered, and give teams enough
evidence to adjust the policy without guesswork. Counting requests against a combination of network fingerprints,
request fields, response signals, and bot context is how you stop abuse from scrapers, SEO spiders, and layer 7
attackers without treating every visitor the same.&lt;/p&gt;</content><category term="Application Security"></category><category term="Rate Limiting"></category><category term="API Security"></category><category term="DDoS"></category><category term="Residential Proxies"></category><category term="Bot Management"></category><category term="Threat Detection"></category></entry><entry><title>The Iconic is the latest Account Takeover victim in the news</title><link href="https://www.peakhour.io/blog/account-takeover-fraud-theiconic/" rel="alternate"></link><published>2024-01-15T13:00:00+11:00</published><updated>2024-01-15T13:00:00+11:00</updated><author><name>Dan</name></author><id>tag:www.peakhour.io,2024-01-15:/blog/account-takeover-fraud-theiconic/</id><summary type="html">&lt;p&gt;Popular Australian fashion website TheIconic recently suffered reputational damage from fraudsters placing orders after an account takeover. Learn how this happens and what you can do to stop it.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Major Australian fashion ecommerce website theiconic.com.au recently announced it would refund victims of an
account takeover attack. The attack allowed fraudsters to order items using stored credit cards in the victims'
accounts and have them sent to locations in Victoria.&lt;/p&gt;
&lt;p&gt;The fraud caused reputational damage to The Iconic, with users taking to social media to complain about both the fraud and
the difficulty of contacting support to report it.&lt;/p&gt;
&lt;p&gt;The Iconic deserves credit for issuing refunds to affected users. That stands in stark contrast to the response to a similar
recent attack at 23andme.com. While 23andme victims didn't
suffer any monetary loss, the website's response was to change its terms and conditions and blame the victims for reusing
passwords across sites. That same password reuse is what allowed users at The Iconic to be defrauded.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;EDIT&lt;/strong&gt;: Since writing this article major websites, danmurphys.com.au, binge.com.au and guzmanygomez.com have all been
affected by similar credential &lt;a href="/learning/security/credential-stuffing-defence/"&gt;stuffing attacks&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;So why and how are these attacks carried out, and what can you do about it?&lt;/p&gt;
&lt;h2&gt;Why are Account Takeover attacks carried out?&lt;/h2&gt;
&lt;p&gt;Financial gain remains a primary motivator. Once they gain control of an account, attackers can make unauthorised
purchases (as in the case of The Iconic), transfer funds, or access credit card details. eCommerce platforms,
financial services, and any site with stored payment information are particularly vulnerable. Bypassing fraud controls
is another major motivator. Many eCommerce stores will trust orders from an existing account with a history, allowing
fraudsters to order goods with stolen cards.&lt;/p&gt;
&lt;p&gt;Access to sensitive information is another goal. Personal data, confidential business information, or intellectual
property can be exploited for various illegal purposes, including identity theft, selling data on the dark web (23andMe), or
corporate espionage.&lt;/p&gt;
&lt;p&gt;ATO attacks can also enable further malicious activity. Compromised accounts can be used to distribute malware, launch
further attacks, or perpetrate scams. This can damage the reputation of the affected website, erode user trust, and lead
to significant financial and legal repercussions.&lt;/p&gt;
&lt;h2&gt;How are Account Takeover attacks carried out?&lt;/h2&gt;
&lt;p&gt;Common techniques used to compromise user accounts on websites include:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Phishing:&lt;/strong&gt; Phishing involves tricking users into revealing their login credentials.
Attackers send emails or messages resembling legitimate communications from trusted entities, directing users to fraudulent
websites where their details are captured.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Credential Stuffing&lt;/strong&gt;: This method involves using previously breached username and password pairs to gain access to
accounts on different websites. Because many users reuse passwords across multiple platforms, attackers can successfully
breach accounts by trying these known combinations. Credential Stuffing is the
type of attack used on both The Iconic and 23andMe.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Brute Force Attacks&lt;/strong&gt;: Attackers use automated software to generate and try a vast number of username and password
combinations until they find the right one to gain access.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Social Engineering&lt;/strong&gt;: Beyond technical methods, fraudsters often use social engineering tactics to manipulate
individuals into revealing their credentials. This can be through phone calls, social media interactions, or other
personal contact methods.&lt;/p&gt;
&lt;h2&gt;What can users do about it?&lt;/h2&gt;
&lt;p&gt;Users can reduce the risk of their accounts being taken over by:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Using a password manager to use strong, different passwords on different sites.&lt;/li&gt;
&lt;li&gt;Checking their commonly used emails on &lt;a href="https://haveibeenpwned.com"&gt;have I been pwned&lt;/a&gt; and, if listed, making sure the
  exposed passwords are updated.&lt;/li&gt;
&lt;li&gt;Making sure MFA (Multi Factor Authentication) is enabled if available on a website.&lt;/li&gt;
&lt;li&gt;Being alert to phishing attempts. Never follow links/call numbers in emails. Go to a site directly to login/look up phone
  numbers. If you receive a phone call asking for personal/login information always hang up and call back on an official company
  number to be sure you're talking to a legitimate company representative.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;What can websites do about it?&lt;/h2&gt;
&lt;p&gt;Quite a bit. Websites can minimise the risk by:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Enforcing strong passwords.&lt;/li&gt;
&lt;li&gt;Providing MFA options on log in forms to make account takeover more difficult.&lt;/li&gt;
&lt;li&gt;Checking logins against Have I been Pwned to alert users that their account might be compromised.&lt;/li&gt;
&lt;li&gt;Locking accounts after 3 or more failed attempts for a set amount of time.&lt;/li&gt;
&lt;li&gt;Emailing account holders when changes to an account happen, eg changes to email or delivery address.&lt;/li&gt;
&lt;li&gt;Preventing automated abuse of login forms, we'll go into more detail in the next section.&lt;/li&gt;
&lt;li&gt;Monitoring login attempts for suspicious activity, ie unusual amounts of attempts/failures and odd locations.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Preventing automated log in attempts&lt;/h2&gt;
&lt;p&gt;Credential stuffing and brute force account takeover attacks rely on trying many combinations of usernames/passwords to find
valid logins. They rely on automated tools like &lt;a href="/blog/the-rise-of-openbullet/"&gt;openbullet&lt;/a&gt; to carry out these attacks.
There are many techniques that can mitigate attacks of increasing sophistication. Some can be implemented on your server
if you have the expertise, or at your CDN/WAF provider if you have one.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Block attempts to log in over HTTP 1.1. This rule relies on the fact that most attackers will be using scripting/programming
   languages for their automation. All modern browsers will use HTTP 2 or higher, while scripts will use 1.1 by default.&lt;/li&gt;
&lt;li&gt;Block attempts with no/incorrect referrer header. To log in you have to visit a login page and fill out a form, automated scripts bypass
   the login page and POST straight to the login handler, more often than not the referring login page is missing in the
   request.&lt;/li&gt;
&lt;li&gt;Use Bot Management to detect automated attempts at logging in. Bot management services can
   use sophisticated techniques like network and browser fingerprinting
   and behavioural analysis, ie mouse movement/form access/speed, to determine whether the login attempt is human or a bot.&lt;/li&gt;
&lt;li&gt;Use Advanced Rate Limiting to limit log in attempts from a class of device. No
   bot management solution is foolproof, sophisticated attackers will use full browsers and rotate their IP address using
   &lt;a href="/blog/residential-proxies-unseen-challenges/"&gt;residential proxies&lt;/a&gt; to get past protections. Traditional IP address based rate limiting
   is useless against these sorts of attacks. Advanced rate limiting can count attempts by the connecting program type to
   defeat attacks and generate alerts when an attack is happening.&lt;/li&gt;
&lt;li&gt;Use residential proxy detection to flag logins as a fraud signal.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Unfortunately 23andMe used the tactic of blaming the victims for reusing passwords. While offering MFA, they didn't enforce
it, and clearly didn't enforce strong passwords. Further, while they had a major security vendor in place, that vendor was either
ineffective, or not utilised properly. All up 14k accounts were compromised, and 7 million other accounts accessed via a sharing
feature. That level of activity should have been caught much earlier unless the attacker was extremely sophisticated and
patient, carrying out their attack over a long period of time. That amount of effort belies the claim by 23andme that
the "the information that was potentially accessed cannot be used for any harm". Haven't they heard of Bond villains
making genetic weapons...&lt;/p&gt;
&lt;p&gt;The Iconic have the same security vendor as 23andme and don't offer MFA. Their automated prevention is weak (no bot protection
and only IP based rate limiting which allowed for 300 attempts), which allowed
the attacks to happen. Desperate users were notified of changes to their accounts, but couldn't get in touch with support
to prevent the attackers using their stored credit cards. To their credit, The Iconic is refunding clients.&lt;/p&gt;
&lt;p&gt;While no countermeasure is perfect at preventing
Account Takeovers, the potential loss of reputation and damage to clients
makes it imperative that website owners take practical steps to prevent them. While users also bear responsibility
for securing their accounts, websites that hold sensitive
information need to take every possible step to protect themselves and their users, not just wash their hands and
blame the victims.&lt;/p&gt;</content><category term="Security"></category><category term="Account Protection"></category><category term="Credential Stuffing"></category></entry><entry><title>HTTP Security Headers</title><link href="https://www.peakhour.io/blog/http-security-headers-web-application-protection/" rel="alternate"></link><published>2023-11-28T14:00:00+11:00</published><updated>2023-11-28T14:00:00+11:00</updated><author><name>AC</name></author><id>tag:www.peakhour.io,2023-11-28:/blog/http-security-headers-web-application-protection/</id><summary type="html">&lt;p&gt;Comprehensive guide to HTTP security headers for protecting web applications from client-side attacks. Learn essential browser security configurations for modern application security platforms and DevSecOps workflows.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Traditionally, web security has focused on the server side: protecting the application itself from attack. That work is
necessary, but it often leaves the client side under-specified. Client-side attacks move the exposure point into the
user's browser, where the business impact can be serious.&lt;/p&gt;
&lt;p&gt;Magecart attacks are a clear example. Attackers inject skimming scripts into websites to steal sensitive customer
information, such as credit card details, directly from the user's browser. Session hijacking and Cross-Site Scripting
(XSS) attacks also exploit browser vulnerabilities, leading to unauthorised access and data breaches. These attacks
don't just risk user data; they can erode trust, damage reputations, and result in significant financial and legal
repercussions for businesses.&lt;/p&gt;
&lt;p&gt;HTTP security headers are practical controls for these types of attacks. Properly implemented, they instruct browsers
on how to handle website content and interactions safely.&lt;/p&gt;
&lt;h2&gt;Key HTTP Security Headers&lt;/h2&gt;
&lt;h3&gt;Content-Security-Policy (CSP)&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Purpose&lt;/strong&gt;: CSP prevents Cross-Site Scripting (XSS) attacks by specifying which sources browsers should allow when
loading scripts, images, and other resources. It can also prevent MageCart-style attacks by restricting the host names
that an injected script can communicate with.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nt"&gt;Content-Security-Policy&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;script-src&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;self&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;https&lt;/span&gt;&lt;span class="o"&gt;://&lt;/span&gt;&lt;span class="nt"&gt;apis&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;google&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;com&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;This example allows scripts to load only from the site's own domain ('self') and https://apis.google.com.&lt;/p&gt;
&lt;h3&gt;X-Frame-Options&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Purpose&lt;/strong&gt;: This header protects against clickjacking attacks by controlling whether a browser allows a page to
be rendered in a &lt;code&gt;&amp;lt;frame&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;iframe&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;embed&amp;gt;&lt;/code&gt;, or &lt;code&gt;&amp;lt;object&amp;gt;&lt;/code&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;X-Frame-Options: DENY
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;This setting prevents any domain from framing the content. Another option is &lt;code&gt;SAMEORIGIN&lt;/code&gt;, which only allows framing by
the same site.&lt;/p&gt;
&lt;h3&gt;X-Content-Type-Options&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Purpose&lt;/strong&gt;: This header prevents MIME-sniffing, where a browser might incorrectly interpret the content type of a
resource, leading to security vulnerabilities.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;X-Content-Type-Options: nosniff
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;This instructs the browser to follow the content type declared in the HTTP headers.&lt;/p&gt;
&lt;h3&gt;X-XSS-Protection&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Purpose&lt;/strong&gt;: This enables the browser's inbuilt XSS protection features. However, this header is largely deprecated in
favour of CSP.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nt"&gt;X-XSS-Protection&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;1&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;mode&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nt"&gt;block&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;This configuration enables the protection and tells the browser to block the page if an XSS attack is detected.&lt;/p&gt;
&lt;h3&gt;Strict-Transport-Security (HSTS)&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Purpose&lt;/strong&gt;: HSTS forces the browser to use HTTPS over HTTP, ensuring encrypted communication and protecting against
man-in-the-middle attacks. Alternatively, you can automatically redirect all requests to HTTPS on your web server or at
your EDGE provider. For example, Peakhour allows you to set up EDGE redirects to force all traffic to HTTPS.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nt"&gt;Strict-Transport-Security&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;max-age&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nt"&gt;31536000&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;includeSubDomains&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;This example tells the browser to use HTTPS for all subdomains for one year.&lt;/p&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Implementing the correct HTTP security headers is a straightforward way to improve web application security. These
headers form part of the first line of defence against many common security vulnerabilities. As threats evolve, keeping
security headers current and properly configured helps safeguard your users and your brand.&lt;/p&gt;</content><category term="Security"></category><category term="Application Security"></category><category term="Account Protection"></category><category term="API Security"></category><category term="Credential Stuffing"></category><category term="Drupal"></category><category term="DDoS"></category></entry><entry><title>RFC 9460</title><link href="https://www.peakhour.io/blog/rfc-9460-dns-evolution/" rel="alternate"></link><published>2023-11-16T00:00:00+11:00</published><updated>2023-11-16T00:00:00+11:00</updated><author><name>AC</name></author><id>tag:www.peakhour.io,2023-11-16:/blog/rfc-9460-dns-evolution/</id><summary type="html">&lt;p&gt;Introducing SVCB and HTTPS records in DNS and their impact on web connectivity.&lt;/p&gt;</summary><content type="html">&lt;p&gt;RFC 9460 introduces two DNS record types: "SVCB" (Service Binding) and "HTTPS". They let browsers learn more connection details during DNS lookup, before redirects and TLS negotiation add extra steps. The result is cleaner connection setup, with practical improvements in speed, security, and efficiency.&lt;/p&gt;
&lt;h2&gt;Understanding the Current Process&lt;/h2&gt;
&lt;p&gt;Traditionally, when a browser connects to a website, it follows a sequence:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Browser requests site via HTTP.&lt;/li&gt;
&lt;li&gt;Server redirects request to HTTPS.&lt;/li&gt;
&lt;li&gt;Browser receives ALPN (Application-Layer Protocol Negotiation) during the HTTPS handshake.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The model is secure, but it is not optimal. It involves multiple round trips, which affects Time to First Byte (TTFB) and the overall user experience. Load balancing and failover are also less direct than they could be. RFC 9460 changes this by allowing DNS to provide the necessary connection details earlier. That reduces the steps involved in establishing a secure connection, lowering TTFB.&lt;/p&gt;
&lt;h2&gt;The Impact of SVCB and HTTPS Records&lt;/h2&gt;
&lt;p&gt;SVCB and HTTPS records move useful connection hints into DNS. They speed up the time-to-first-packet by incorporating the Alt-Svc HTTP header and ALPN TLS extension into DNS, which shortens connection setup. These records also enable redirection at the zone apex, a task not possible with CNAMEs. They simplify DNS load distribution and failover, making web services more resilient. They also remove the need for HSTS preloading and support Encrypted Client Hello (ECH), formerly ESNI, for better privacy.&lt;/p&gt;
&lt;h2&gt;Adoption and Industry Response&lt;/h2&gt;
&lt;p&gt;Adoption started before the RFC was finalised. Firefox has been conducting HTTPS lookups since May 2020, limited to DNS over HTTPS (DoH). Apple's iOS, Safari, and macOS have followed suit since September 2020. Chrome introduced partial support in December 2020 and has recently enabled ECH by default. Various DNS service providers have also started supporting HTTPS and SVCB records.&lt;/p&gt;
&lt;p&gt;As reported on &lt;a href="https://netmeister.org/blog/https-rrs.html"&gt;Netmeister&lt;/a&gt;, adoption is still early but not insignificant. As of October 2023, about 10 million domains have implemented an HTTPS record for their 'www' service names, roughly 4.4% of domains. Around 9.1 million domains, or about 4.0%, use the record on their bare second-level domain name. Among the top 1 million domains, approximately 22.5K (25.5%) use HTTPS records for 'www' service names, and nearly 24K (25.6%) use them on bare domains.&lt;/p&gt;
&lt;p&gt;&lt;img alt="October 2023 Usage" src="/static/images/blog/https-records-oct-2023.png"&gt;&lt;/p&gt;
&lt;h2&gt;What the Records Look Like&lt;/h2&gt;
&lt;p&gt;A typical &lt;a href="/learning/service-binding-record/"&gt;SVCB record&lt;/a&gt; might look like this:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;_example.com. 7200 IN SVCB 1 svc4.example.net. (alpn=&amp;quot;h2,h3&amp;quot; port=&amp;quot;8004&amp;quot;)
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;This record indicates that the service at &lt;code&gt;_example.com&lt;/code&gt; can be accessed at &lt;code&gt;svc4.example.net&lt;/code&gt; using either HTTP/2 or HTTP/3 on port 8004.&lt;/p&gt;
&lt;p&gt;An &lt;a href="/learning/https-record/"&gt;HTTPS record&lt;/a&gt; could be:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;example.com. 3600 IN HTTPS 0 svc.example.net.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;This record suggests that &lt;code&gt;example.com&lt;/code&gt; should be accessed securely through &lt;code&gt;svc.example.net&lt;/code&gt;.&lt;/p&gt;
&lt;h2&gt;Apex Domains and the Importance of SVCB/HTTPS Records&lt;/h2&gt;
&lt;p&gt;One long-running DNS limitation is the inability to use CNAME records at the apex (root level) of a domain due to conflicts with other necessary records like NS and SOA. RFC 9460's SVCB/HTTPS records address this by enabling apex domain aliasing without those conflicts. This matters for efficient content delivery networks (CDNs) and load balancing strategies.&lt;/p&gt;
&lt;h2&gt;These records enhance capability&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;1. Load Balancing:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Consider a website that needs to distribute traffic across multiple servers. SVCB records can indicate different server endpoints with varying priorities.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;example.com. IN SVCB 10 server1.example.com. (alpn=&amp;quot;h2,h3&amp;quot;)
example.com. IN SVCB 20 server2.example.com. (alpn=&amp;quot;h2&amp;quot;)
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;In this example, &lt;code&gt;server1.example.com&lt;/code&gt; is the preferred endpoint (lower priority number), offering both HTTP/2 and HTTP/3 protocols. If it's unavailable, traffic automatically shifts to &lt;code&gt;server2.example.com&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2. Failover Mechanism:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;For a service that requires high availability, SVCB records can express failover directly:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;critical-service.example.com. IN SVCB 1 primary-service.example.com. (alpn=&amp;quot;h2,h3&amp;quot;)
critical-service.example.com. IN SVCB 2 backup-service.example.com. (alpn=&amp;quot;h2&amp;quot;)
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Here, &lt;code&gt;primary-service.example.com&lt;/code&gt; is the primary endpoint. If it fails, the system automatically falls back to &lt;code&gt;backup-service.example.com&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3. Apex Domain Usage:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;A practical advantage of SVCB/HTTPS records is their ability to handle apex domains, where CNAME records are not feasible. This is important for root domain aliasing to different service providers.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;example.com. IN HTTPS 0 cdn-provider.example.net.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;This record indicates that the apex domain &lt;code&gt;example.com&lt;/code&gt; is to be served through &lt;code&gt;cdn-provider.example.net&lt;/code&gt;, overcoming traditional DNS limitations.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;4. Encrypted ClientHello Support:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Future enhancements of SVCB could include keys for Encrypted ClientHello, which improves privacy and security during the initial TLS handshake.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;secure.example.com. IN SVCB 1 tls-service.example.net. (ech=&amp;quot;base64-encoded-key&amp;quot;)
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;This record can be used to initiate a TLS connection with &lt;code&gt;tls-service.example.net&lt;/code&gt; using the provided Encrypted ClientHello key.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;5. Directing Traffic to Specific Protocols:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;For services that need to direct clients to newer or more efficient protocols, SVCB records can specify the exact protocols to use.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;api.example.com. IN SVCB 1 api-server.example.com. (alpn=&amp;quot;h3&amp;quot;)
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Clients that understand HTTP/3 can connect directly using this protocol, bypassing the usual HTTP/1.1 or HTTP/2 protocols.&lt;/p&gt;
&lt;h2&gt;The Long Wait&lt;/h2&gt;
&lt;p&gt;HTTPS has been around for a while, so RFC 9460 raises an obvious question: why did this take so long? Apex records have had their share of problems, including not being able to use CNAMEs and having to resort to custom records like ALIAS or Cloudflare's 'cname flattening'.&lt;/p&gt;
&lt;p&gt;It is a fair question. We've had some bizarre records hanging around for ages along with a wide range of solutions to the "CNAME at the zone apex"
problem.&lt;/p&gt;
&lt;p&gt;Credit to the creators of RFC 9460 for getting this through and obtaining browser support:
   - B. Schwartz from Meta Platforms, Inc.
   - M. Bishop from Akamai Technologies
   - E. Nygren from Akamai Technologies&lt;/p&gt;
&lt;h2&gt;Final Thoughts&lt;/h2&gt;
&lt;p&gt;RFC 9460 gives DNS a more useful role in HTTPS connection setup. SVCB and HTTPS records let operators publish endpoint, protocol, failover, and privacy information before the browser starts negotiating the connection. That gives service providers more precise control over how clients reach web services, with practical benefits for performance, reliability, and security.&lt;/p&gt;</content><category term="Interest"></category><category term="HTTP"></category><category term="Web Performance"></category><category term="Rate Limiting"></category><category term="TLS Fingerprinting"></category><category term="CDN"></category><category term="DDoS"></category></entry><entry><title>Dive into CVSS Scores</title><link href="https://www.peakhour.io/blog/confluence-cvss-vectors/" rel="alternate"></link><published>2023-11-10T00:00:00+11:00</published><updated>2023-11-10T00:00:00+11:00</updated><author><name>AC</name></author><id>tag:www.peakhour.io,2023-11-10:/blog/confluence-cvss-vectors/</id><summary type="html">&lt;p&gt;Understand CVSS by examining the Atlassian CVE-2023-22515 and CVE-2023-22518.&lt;/p&gt;</summary><content type="html">&lt;h3&gt;Understanding CVSS through Atlassian Confluence Vulnerabilities&lt;/h3&gt;
&lt;p&gt;The Common Vulnerability Scoring System (CVSS) gives security teams a shared way to rate the severity of software vulnerabilities. It does not predict risk on its own; it describes the characteristics of a specific security flaw. CVSS uses three metric groups: Base, Temporal, and Environmental. The result is a score from 0 to 10, represented by a vector string that records the details behind the score.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Base Metrics&lt;/strong&gt; describe the inherent aspects of a vulnerability, including how it can be exploited and its potential system impact.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Temporal Metrics&lt;/strong&gt; change over time, reflecting current exploitability and available mitigations.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Environmental Metrics&lt;/strong&gt; account for the specific environment where the vulnerability exists, tailoring the score to the affected organisation.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The &lt;a href="https://nvd.nist.gov/vuln-metrics/cvss"&gt;National Vulnerability Database (NVD)&lt;/a&gt; utilises CVSS to assign base scores and provides tools for calculating Temporal and Environmental scores.&lt;/p&gt;
&lt;h4&gt;Atlassian Confluence Vulnerability Analysis&lt;/h4&gt;
&lt;p&gt;Two Atlassian Confluence vulnerabilities show why the vector matters as much as the headline score:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;CVE-2023-22515&lt;/strong&gt; is a critical flaw with a base score of 10.0. It is exploitable remotely, with low complexity, no privilege requirements, and no need for user interaction. The attack vector is network-based, so exposure is not limited to local access. Its broad scope and impact across confidentiality, integrity, and availability make it a vulnerability that needs immediate attention.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;CVE-2023-22518&lt;/strong&gt; shares many similarities with CVE-2023-22515, including a critical base score of 10.0. It can also be exploited remotely without privileges or user interaction, and with low complexity. Its impact on the system's confidentiality, integrity, and availability is high, allowing attackers to gain complete control and shut down the affected resources.&lt;/p&gt;
&lt;p&gt;Both CVE-2023-22515 and CVE-2023-22518 are critical vulnerabilities that demand urgent remediation. Understanding their CVSS vectors helps prioritise the security response and the mitigations needed.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;CVE-2023-22515&lt;/strong&gt; carries a CVSS score of 10 because it is remotely exploitable, easy to execute, and does not require privileges or user interaction.&lt;/p&gt;
&lt;h5&gt;CVSS Vector for CVE-2023-22515&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Base Score:&lt;/strong&gt; 10.0 (Critical)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Vector:&lt;/strong&gt; CVSS:3.0/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This vector indicates:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Attack Vector (AV): Network (N)&lt;/strong&gt; - The vulnerability is remotely exploitable.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Attack Complexity (AC): Low (L)&lt;/strong&gt; - It is easy to exploit without major obstacles.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Privileges Required (PR): None (N)&lt;/strong&gt; - No special access is needed.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;User Interaction (UI): None (N)&lt;/strong&gt; - It can be exploited without user involvement.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Scope (S): Changed (C)&lt;/strong&gt; - The impact extends beyond the initial target.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Confidentiality, Integrity, Availability (C/I/A): High (H)&lt;/strong&gt; - There is a complete loss of confidentiality, integrity, and availability.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Atlassian's high CVSS score for CVE-2023-22515 reflects its critical nature and the need for immediate action.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;CVE-2023-22518&lt;/strong&gt; has the same CVSS score of 10, with similar impact across confidentiality, integrity, and availability.&lt;/p&gt;
&lt;h5&gt;CVSS Vector for CVE-2023-22518&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Base Score:&lt;/strong&gt; 10.0 (Critical)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Vector:&lt;/strong&gt; CVSS:3.0/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This vector means:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Attack Vector (AV): Network (N)&lt;/strong&gt; - Exploitable remotely.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Attack Complexity (AC): Low (L)&lt;/strong&gt; - Easy to exploit with minimal barriers.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Privileges Required (PR): None (N)&lt;/strong&gt; - No user privileges required.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;User Interaction (UI): None (N)&lt;/strong&gt; - No need for user action.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Scope (S): Changed (C)&lt;/strong&gt; - Broad impact beyond the initial system.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Confidentiality, Integrity, Availability (C/I/A): High (H)&lt;/strong&gt; - Complete compromise of the system's security.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Understanding the CVSS scores for these vulnerabilities helps teams prioritise their security response. For a full breakdown and history of CVSS, see &lt;a href="https://en.wikipedia.org/wiki/Common_Vulnerability_Scoring_System"&gt;Wikipedia&lt;/a&gt;. More detailed information on CVSS can also be found in &lt;a href="https://www.first.org/cvss/"&gt;FIRST's official CVSS documentation&lt;/a&gt;.&lt;/p&gt;</content><category term="Interest"></category><category term="Threat Detection"></category><category term="DevSecOps"></category><category term="Application Security"></category><category term="Anomaly Detection"></category><category term="Credential Stuffing"></category><category term="Core Web Vitals"></category></entry></feed>