PerimeterX
PerimeterX (now Human Security) is an anti-bot software that leverages advanced machine learning and behavioral analytics to accurately identify and block malicious bot traffic in real-time. There is currently 153,000 websites using PerimeterX.
Recognize PerimeterX
To identify PerimeterX’s presence on a website, look for these characteristics:
- Internal property:
window._pxAppId
property. - Collector XHR: PerimeterX can operate with or without any external server, in case of external collector, those domains can be used:
px-cdn.net
,pxchk.net
,px-client.net
In case of an internal endpoint being used, it’s format will likely follow this format:
- Cookies: PerimeterX set the cookies:
_px3
,_pxhd
,_px_vid
PerimeterX’s Device Fingerprinting
PerimeterX employs traditional techniques commonly observed in other anti-bot software, but with a particular focus on WebGL by assessing rendering capabilities. This approach goes beyond the usual strategy of merely collecting parameters and extensions, as seen in most anti-bot solutions.
General fingerprinting
devicePixelRatio
hardwareConcurrency
localStorage
indexedDB
openDatabase
sessionStorage
cpuClass
Navigator.plugins
window.performance
Behavior Analysis
PerimeterX observes various specified events and compiles them into a consistent payload for their collector API endpoint. This suggests that they utilize behavioral analysis. As a result, it’s important to be careful when activating these events. To closely replicate human interactions with the page, it is advisable to employ simulation libraries.
touchstart
touchend
touchmove
touchenter
touchleave
touchcancel
mousedown
mouseup
mousemove
mouseover
mouseout
mouseenter
mouseleave
click
dblclick
scroll
wheel
mouse
type events coordinates and details are tracked on the following attributes:
coordination_start
coordination_end
movementX
movementY
clientX
clientY
For touch
type events, the following attributes are tracked:
touches
changedTouches
Canvas Fingerprinting
PerimeterX utilizes a technique involving the use of unicode special characters for fingerprinting canvas renderings. This method is based on the significant variability in how unicode renders high-entropy elements like emojis.
First test:
Renders all characters using “8px sans-serif” default font from 0x1F600 to 0x1F64F.
Second test:
Renders the following characters using “6px sans-serif” default font:
And then the characters from 0x2699 to 0x26FF.
Results:
Notice: Result original resolution has been preserved, notice how small and pixely the rendering is, this allow better fingerprinting of anti-aliasing technique, and produce more entropy while being lighter.
WebGL fingerprinting:
PerimeterX checks for specific Anisotropic extension to detect browser type, among those values:
EXT_texture_filter_anisotropic
WEBKIT_EXT_texture_filter_anisotropic
(Safari)MOZ_EXT_texture_filter_anisotropic
(Firefox)
This method is highly efficient for identifying browser type spoofing because the properties involved cannot be falsified through traditional JavaScript proxy or Function override techniques.
Attributes fingerprint:
PerimeterX check for the following WebGL attributes:
RENDERER
SHADING_LANGUAGE_VERSION
VENDOR
VERSION
UNMASKED_VENDOR_WEBGL
UNMASKED_RENDERER_WEBGL
WEBGL_debug_renderer_info:
ALIASED_LINE_WIDTH_RANGE
ALIASED_POINT_SIZE_RANGE
ALPHA_BITS
BLUE_BITS
DEPTH_BITS
GREEN_BITS
MAX_COMBINED_TEXTURE_IMAGE_UNITS
MAX_CUBE_MAP_TEXTURE_SIZE
MAX_FRAGMENT_UNIFORM_VECTORS
MAX_RENDERBUFFER_SIZE
MAX_TEXTURE_IMAGE_UNITS
MAX_TEXTURE_SIZE
MAX_VARYING_VECTORS
MAX_VERTEX_ATTRIBS
MAX_VERTEX_TEXTURE_IMAGE_UNITS
MAX_VERTEX_UNIFORM_VECTORS
MAX_VIEWPORT_DIMS
STENCIL_BITS
getShaderPrecisionFormat:
VERTEX_SHADER
FRAGMENT_SHADER
VERTEX_SHADER
FRAGMENT_SHADER
HIGH_FLOAT
MEDIUM_FLOAT
LOW_FLOAT
Rendering fingerprint:
Execute the following shaders for WebGL fingerprinting:
Vertex Shader:
Fragment Shader:
Both are executed on a single program and then dumped using canvas.toDataURL
.
Clipboard data
Not sure how much this influence the bypass success rate, but PerimeterX does look for Clipboard Data as part of their fingerprinting process.
Fonts presence & rendering
PerimeterX will attempt to render the text mmmmmmmmmmlli
for the following fonts list:
How to bypass PerimeterX?
WIP