What it imports
The connector has two feeds, configured independently. Most deployments only want the first.Your organization’s threats (on by default)
Everything ChainPatrol has investigated on your behalf, from the moment a report is filed, not just once it is confirmed. Each asset carries labels describing where it is in its lifecycle:
This feed is marked TLP:AMBER by default, because it names your brands and your open investigations.
The global blocklist (off by default)
Every asset on the ChainPatrol blocklist, roughly 500,000 entities, with no organization context: no brands, no reporting history, no takedown progress. Every asset is labelledchainpatrol:status:blocked.
This feed is marked TLP:CLEAR by default. It is off by default because the first run imports the whole blocklist.
If you enable both feeds, an asset that is on the global blocklist and was reported for your organization carries both TLP:CLEAR and TLP:AMBER. That is deliberate: the fact that it is blocked is public, but the investigation context around it is not.
How each asset is modelled
Each asset becomes up to four kinds of OpenCTI object:- Indicator: a STIX pattern such as
[url:value = 'https://…'], carrying the labels, the score and, for cleared assets,revoked: true. - Observable: the asset itself. The indicator is linked to it with a
based-onrelationship. - User-Account: for social media profiles, the handle, linked to the observable with
related-to. - Notes: one per lifecycle transition (reported, escalated, blocked, takedown submitted…), each with a link to the asset’s page in ChainPatrol.
Crypto addresses (
ADDRESS) and IP addresses are not imported yet.
Scores
Every indicator carries anx_opencti_score reflecting how sure ChainPatrol is, so you can build detection rules on a threshold. Only blocked assets are marked for detection (x_opencti_detection: true). An open report is a claim, not a finding.
You can change any of these scores. See Configuration.
Requirements
- OpenCTI 7.261008.0. The connector is built against the matching
pyctiversion, so run a connector release that matches your platform. - A ChainPatrol API key. Create one in the ChainPatrol dashboard under Settings → API Keys.
Install
Add the connector to your OpenCTIdocker-compose.yml:
Configuration
Every setting is an environment variable. When running from source, the same settings can go inconfig.yml under chainpatrol:, using the lower-case name without the prefix (for example CHAINPATROL_ORG_FEED_TLP becomes org_feed_tlp). Environment variables win over the file.
The connector refuses to start if the API key is missing, if both feeds are disabled, if a TLP, page size or score is out of range, or if any state scores higher than
blocked. A misconfiguration fails loudly rather than running as a silent no-op.
Polling
The first run is a full backfill: every threat in your history is imported. Later runs only fetch what changed since the previous run. Each run rewinds its starting point byCHAINPATROL_POLL_OVERLAP_MINUTES so that a change landing mid-run is never missed. Re-reading a few minutes is harmless, because every update is an upsert. If a run fails, the next one retries the same window instead of skipping it.
Labels you add are safe
OpenCTI adds labels without removing old ones, so an asset that moved frominvestigating to blocked would otherwise carry both. Before each update the connector removes the outdated chainpatrol:status:*, chainpatrol:takedown:* and chainpatrol:liveness:* label. It never removes chainpatrol:brand:* labels, since several brands can apply, and it never touches labels outside the chainpatrol: prefix, so your analysts’ labels and other connectors’ labels are left alone.