OpenCTI is where a threat intelligence team keeps what it knows. Every report, threat actor, intrusion set, malware family, vulnerability, attack pattern, indicator and observable is stored as a STIX 2.1 object and linked to the others, with confidence levels, first and last seen dates and a pointer back to the source. Analysts browse it as a graph, write their own reports and cases, and let inference rules add relationships the data implies. Connectors pull in MITRE ATT&CK, MISP events, TAXII, RSS and CSV feeds and commercial sources, and push indicators out to SIEMs and EDRs.
It is built by Filigran, a French company founded by the project's creators, as a GraphQL API in Node.js with a React front end, backed by Elasticsearch or OpenSearch, Redis, RabbitMQ and S3-compatible storage. With about 10,200 stars, 217 contributors and more than 14,800 commits since 2018, it is one of the most widely deployed open intelligence platforms, and it releases constantly: 418 releases so far, the latest, 7.261026.0, on 26 October 2026.
Two editions share the repository. The Community Edition is Apache 2.0; Enterprise Edition features sit in the same codebase under a separate Filigran licence, marked file by file, and switch on from the settings page. A public demo instance resets every night.
- Repository: github.com/OpenCTI-Platform/opencti
- Licence: custom (Other)
- Language: TypeScript. Stars: 10.2K. Forks: 1,493. Last push: Oct 28, 2026.
- Scan: safe, Oct 28, 2026, commit 1a77bde
Who it is for
CTI analysts and SOC teams who need a structured, shared memory of threats, CERTs and ISACs exchanging intelligence with members, and researchers who want MITRE ATT&CK, MISP and feed data linked in one searchable graph.
Getting started
1. Clone Filigran's Docker deployment repository (needs Docker with the Compose plugin)
git clone https://github.com/OpenCTI-Platform/docker.git && cd docker2. Create your settings from the sample, then set the passwords and a UUID admin token (uuidgen)
cp .env.sample .env3. Raise the memory map limit Elasticsearch needs
sudo sysctl -w vm.max_map_count=10485754. Start the stack, then log in at http://localhost:8080
docker compose up -dThis is a heavy stack: Elasticsearch defaults to 4 GB of memory and the platform's Node process to 8 GB, so plan a server rather than a laptop. The Compose file now also starts XTM One, Filigran's AI assistant, with its own PostgreSQL. OPENCTI_ADMIN_TOKEN must be a valid UUID or the container will not start.
Safety scan
We cloned OpenCTI-Platform/opencti at commit 1a77bde on Oct 28, 2026 and ran the checks described on the GitHub Tools page: credential patterns, decode-and-execute code, install-time scripts, committed binaries, risky CI workflows, every host the code talks to, known vulnerabilities in pinned dependencies, and project hygiene. A person read every hit. This is what we found.
- The secret hits are docstrings, documentation and test fixtures: pycti's data_to_temp_file example shows a placeholder BEGIN PRIVATE KEY line, the authentication and troubleshooting docs show which key header format to use, and the SSO provider tests use XXX as the key body. The curl | bash hit is the devcontainer Dockerfile installing Node.js, and the very long lines are an email template and a MISP mapping test fixture. The pastebin URL is test data for the TAXII ingester.
- The 1 critical advisory, in seroval, does not reach the running app. seroval comes in through solid-js, used by Filigran's embedded chatbot widget, and solid-js only calls it in its server-side rendering build; OpenCTI's front end is a client-side React app. The flaw is in deserialising untrusted JSON, which the browser bundle never does.
- Several of the 11 high advisories do ship in the backend: undici (through the Elasticsearch client) has TLS validation and denial-of-service issues, node-forge has a signature-verification flaw, and @graphql-tools/utils, under Apollo Server, has prototype pollution. Others, such as the glob CLI one, are build tooling. With Renovate enabled and releases most weeks, staying on the latest version is the fix.
- Usage telemetry is documented in the README: counts of users, connectors, entities and features enabled, sent to telemetry.filigran.io, with no intelligence content and no IP addresses, according to the docs. The source honours a telemetry_manager:enabled setting, so it can be switched off.
- 21 workflows. Two use pull_request_target, but only to label pull requests and check titles and commit signatures through the API; neither checks out fork code. All 18 third-party actions are pinned to commits. Security policy, Dependabot, Renovate, CodeQL, contributing guide and code of conduct are present; the one committed binary is the ANTLR parser generator JAR used at build time.
What the scanner counted
| Check | Result |
|---|---|
| Secrets | 8 candidates found and read; see the notes above. |
| Suspicious code | 5 pattern hits found and read; every one is listed under the raw findings. |
| Install-time code | 2 installer scripts |
| Committed binaries | 1 executable or compiled object committed; listed under the raw findings. |
| CI workflows | 21 workflows. 2 use pull_request_target, none check out the pull request head. 0 of 18 third-party actions pinned to a tag rather than a commit. |
| Network hosts | 40 distinct hosts referenced from source; most often github.com, attack.mitre.org, fakefeed.invalid, learn.microsoft.com. No URLs to bare IP addresses. |
| Known vulnerabilities | 24 advisories across 2,263 pinned packages: 1 critical, 11 high, 9 moderate, 3 low. opencti-platform/opencti-graphql/src/python/requirements.txt: 7 packages, 0 advisories; opencti-worker/requirements.txt: 3 packages, 0 advisories; yarn.lock: 2,255 packages, 24 advisories. |
| Project hygiene | Has security policy, automated dependency updates, CodeQL, licence file, contributing guide. |
| OpenSSF Scorecard | 5.6 out of 10, as of Oct 26, 2026. |
The raw findings
Every hit the scanner wrote out, with a link to the exact line at the scanned commit. Secrets candidates are redacted.
Secret candidates (8, redacted)
| Where | Rule | Match |
|---|---|---|
| client-python/pycti/connector/opencti_connector_helper.py:287 | private-key | -----B…--- (27 chars) |
| docs/docs/administration/authentication-via-ui.md:139 | private-key | -----B…--- (27 chars) |
| docs/docs/deployment/integration-manager/troubleshooting.md:135 | private-key | -----B…--- (27 chars) |
| docs/docs/deployment/integration-manager/troubleshooting.md:136 | private-key | -----B…--- (31 chars) |
| opencti-platform/opencti-graphql/tests/01-unit/modules/authenticationProvider/authenticationProvider-converter-test.ts:756 | private-key | -----B…--- (31 chars) |
| opencti-platform/opencti-graphql/tests/01-unit/modules/authenticationProvider/authenticationProvider-converter-test.ts:762 | private-key | -----B…--- (31 chars) |
| opencti-platform/opencti-graphql/tests/01-unit/modules/authenticationProvider/authenticationProvider-converter-test.ts:868 | private-key | -----B…--- (27 chars) |
| opencti-platform/opencti-graphql/tests/01-unit/modules/authenticationProvider/authenticationProvider-converter-test.ts:1547 | private-key | -----B…--- (27 chars) |
Pattern hits (5)
| Where | Rule | Match |
|---|---|---|
| .devcontainer/Dockerfile:8 | download-piped-to-shell | RUN curl -fsSL https://deb.nodesource.com/setup_16.x | bash - \ |
| opencti-platform/opencti-graphql/src/database/default-email-template-input.ts:2 | very-long-line | 29615 chars |
| opencti-platform/opencti-graphql/tests/01-unit/parser/json-mapper-misp.ts:3935 | very-long-line | 41561 chars |
| opencti-platform/opencti-graphql/tests/01-unit/parser/json-mapper-misp.ts:3946 | very-long-line | 18671 chars |
| opencti-platform/opencti-graphql/tests/03-integration/10-modules/ingestion/ingestion-taxii-resolver-test.ts:62 | exfil-host (test/example) | uri: 'https://pastebin.com/raw/7CC8nHB0', |
Installer scripts (2)
- .devcontainer/install.dependencies.sh, 11 lines
- scripts/ci/runner-info.sh, 24 lines
Committed binaries (1)
opencti-platform/opencti-graphql/builder/antlr/antlr-4.13.0-complete.jar: JAR, 2 MB
Worst known vulnerabilities (24 of 24)
| Advisory | Severity | Package | Summary |
|---|---|---|---|
| GHSA-p6vx-979v-rg4c | critical | seroval@1.5.6 | Seroval: `fromJSON()` Promise thenable assimilation invokes plugin-produced callables (bypass of GHSA-mv8w-475r-vwqw) |
| GHSA-7mx3-vvmw-hjmv | high | @graphql-tools/utils@10.11.0 | GraphQL Tools has prototype pollution in well-established utility function `mergeDeep` |
| GHSA-c4qx-w738-7hr3 | high | @graphql-tools/utils@10.11.0 | GraphQL Tools: Prototype pollution in mergeIncrementalResult via non-primitive path segments |
| GHSA-5j98-mcp5-4vw2 | high | glob@11.0.3 | glob CLI: Command injection via -c/--cmd executes matches with shell:true |
| GHSA-86w9-cpqp-85rv | high | node-forge@1.4.0 | node-forge RSA PKCS#1 v1.5 signature verification accepts extra nested DigestAlgorithm elements |
| GHSA-jp82-f5mq-hwhp | high | seroval@1.5.6 | Seroval: Memory exhaustion via unchecked TypedArray length in JSON deserialization |
| GHSA-2m5v-pch6-74hx | high | undici@7.29.0 | undici vulnerable to TLS certificate validation bypass via dropped tls options in Agent |
| GHSA-4w7w-5xrc-9h26 | high | undici@7.29.0 | undici vulnerable to cache poisoning and cross-user disclosure via cross-origin redirects |
| GHSA-qrxm-fqhp-jwvm | high | undici@7.29.0 | undici vulnerable to Denial of Service via TLS 1.2 certificate-changing renegotiation |
| GHSA-rfgv-xxqx-mfg5 | high | undici@7.29.0 | undici vulnerable to Denial of Service via unrequested WebSocket subprotocol |
| GHSA-w293-vg96-wgc3 | high | undici@7.29.0 | undici vulnerable to TLS certificate validation bypass via dropped connect options in BalancedPool |
| GHSA-xjj6-f33q-929c | high | undici@7.29.0 | undici vulnerable to Denial of Service via unhandled error on excessive content-encodings |
| GHSA-2jfj-6hjv-fm6j | moderate | undici@7.29.0 | undici vulnerable to cross-user cookie disclosure via Set-Cookie caching in shared caches |
| GHSA-3wwx-pv8p-q78v | moderate | undici@7.29.0 | undici vulnerable to Denial of Service via unhandled error in WebSocket permessage-deflate decompression |
| GHSA-3xpg-4rpp-hhhm | moderate | undici@7.29.0 | undici vulnerable to Denial of Service via unbounded decompression of compressed responses |
| GHSA-4qv8-2p9j-2685 | moderate | undici@7.29.0 | undici vulnerable to Denial of Service via unbounded memory in the EventSource parser |
| GHSA-55wc-3pg8-jfw6 | moderate | undici@7.29.0 | undici vulnerable to Denial of Service via unhandled exception in the decompress interceptor |
| GHSA-9fm3-97px-rjf6 | moderate | undici@7.29.0 | undici WebSocket client vulnerable to Denial of Service via unbounded automatic PONG buffering |
| GHSA-f72v-6w45-q472 | moderate | undici@7.29.0 | undici vulnerable to Subresource Integrity bypass via non-lowercase algorithm tokens |
| GHSA-pmjh-fq2x-6v4x | moderate | undici@7.29.0 | undici vulnerable to Denial of Service via orphaned RetryHandler response body |
| GHSA-rx4f-c7p8-82vq | moderate | undici@7.29.0 | undici vulnerable to Denial of Service via WebSocketStream unclean close |
| GHSA-2gqq-gqf2-x968 | low | undici@7.29.0 | undici vulnerable to response truncation via oversized chunked responses in the dump interceptor |
| GHSA-8436-99hf-9mmv | low | undici@7.29.0 | undici vulnerable to caching and replay of unsafe HTTP method responses |
| GHSA-r53p-7pc4-xj5r | low | undici@7.29.0 | undici vulnerable to downstream response splitting via retry interceptor |
Workflows worth a look
- .github/workflows/pr-add-labels.yml: pull_request_target
- .github/workflows/pr-check-conventions.yml: pull_request_target
By the numbers
| Stars | 10.2K |
|---|---|
| Forks | 1,493 |
| Contributors | 217 |
| Commits | 14.8K |
| Open issues | 2,003 |
| Open pull requests | 209 |
| Releases | 418 |
| Latest release | 7.261026.0 |
| Licence | custom |
| Main language | TypeScript |
| Project age | 7 years |
| Last push | Oct 28, 2026 |
| Tracked files | 7,209 |
| Lines of code | 1.1M |
| Checkout size | 237 MB |
Lines by language: TypeScript 749.8K, JavaScript 164.2K, JSON 110.4K, Python 72.5K, Markdown 30.7K, YAML 5,732.
Questions
Is OpenCTI free?
The Community Edition is Apache 2.0 and free to self-host for any purpose, commercial included. Enterprise Edition features, such as some AI, automation and audit tools, need a paid Filigran licence; Filigran also sells a hosted version. Connectors are free, but many commercial feeds they connect to need their own subscription.
Is it legal to collect threat intelligence in OpenCTI?
Storing indicators, reports and public research about threats is ordinary defensive work. Respect the sharing terms of every feed, such as Traffic Light Protocol markings and licence limits on commercial data, and check data protection rules before storing personal data such as names or email addresses that appear in incident data.
How is OpenCTI different from MISP?
They are often run together. MISP is built for sharing indicators and events between organisations and syncing instances; OpenCTI is built for analysis, modelling who did what with which tools as a STIX knowledge graph. A MISP connector feeds MISP events into OpenCTI, and many teams use MISP for exchange and OpenCTI for the analyst's view.
This post is part of GitHub Tools, where every repository is cloned and scanned before it is written up. The scan is a snapshot of one commit on one day; the repository has moved on since, so check it before you install.
