6 min read

OpenCTI: Organise Threat Intelligence as a Knowledge Graph (GitHub, Scanned)

A self-hosted platform that stores threat intel as linked STIX 2 data: actors, malware, reports, indicators.

OpenCTI logo
✅
Scan: safe. Nothing malicious. Two things to know: the platform sends anonymous usage counts to Filigran every six hours unless you set TELEMETRY_MANAGER__ENABLED=false, and Enterprise features share the codebase under a separate licence. Scanned Oct 28, 2026; the full report is below.

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.

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 docker

2. Create your settings from the sample, then set the passwords and a UUID admin token (uuidgen)

cp .env.sample .env

3. Raise the memory map limit Elasticsearch needs

sudo sysctl -w vm.max_map_count=1048575

4. Start the stack, then log in at http://localhost:8080

docker compose up -d

This 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

CheckResult
Secrets8 candidates found and read; see the notes above.
Suspicious code5 pattern hits found and read; every one is listed under the raw findings.
Install-time code2 installer scripts
Committed binaries1 executable or compiled object committed; listed under the raw findings.
CI workflows21 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 hosts40 distinct hosts referenced from source; most often github.com, attack.mitre.org, fakefeed.invalid, learn.microsoft.com. No URLs to bare IP addresses.
Known vulnerabilities24 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 hygieneHas security policy, automated dependency updates, CodeQL, licence file, contributing guide.
OpenSSF Scorecard5.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)
WhereRuleMatch
client-python/pycti/connector/opencti_connector_helper.py:287private-key-----B…--- (27 chars)
docs/docs/administration/authentication-via-ui.md:139private-key-----B…--- (27 chars)
docs/docs/deployment/integration-manager/troubleshooting.md:135private-key-----B…--- (27 chars)
docs/docs/deployment/integration-manager/troubleshooting.md:136private-key-----B…--- (31 chars)
opencti-platform/opencti-graphql/tests/01-unit/modules/authenticationProvider/authenticationProvider-converter-test.ts:756private-key-----B…--- (31 chars)
opencti-platform/opencti-graphql/tests/01-unit/modules/authenticationProvider/authenticationProvider-converter-test.ts:762private-key-----B…--- (31 chars)
opencti-platform/opencti-graphql/tests/01-unit/modules/authenticationProvider/authenticationProvider-converter-test.ts:868private-key-----B…--- (27 chars)
opencti-platform/opencti-graphql/tests/01-unit/modules/authenticationProvider/authenticationProvider-converter-test.ts:1547private-key-----B…--- (27 chars)
Pattern hits (5)
WhereRuleMatch
.devcontainer/Dockerfile:8download-piped-to-shellRUN curl -fsSL https://deb.nodesource.com/setup_16.x | bash - \
opencti-platform/opencti-graphql/src/database/default-email-template-input.ts:2very-long-line29615 chars
opencti-platform/opencti-graphql/tests/01-unit/parser/json-mapper-misp.ts:3935very-long-line41561 chars
opencti-platform/opencti-graphql/tests/01-unit/parser/json-mapper-misp.ts:3946very-long-line18671 chars
opencti-platform/opencti-graphql/tests/03-integration/10-modules/ingestion/ingestion-taxii-resolver-test.ts:62exfil-host (test/example)uri: 'https://pastebin.com/raw/7CC8nHB0',
Installer scripts (2)
Committed binaries (1)
  • opencti-platform/opencti-graphql/builder/antlr/antlr-4.13.0-complete.jar: JAR, 2 MB
Worst known vulnerabilities (24 of 24)
AdvisorySeverityPackageSummary
GHSA-p6vx-979v-rg4ccriticalseroval@1.5.6Seroval: `fromJSON()` Promise thenable assimilation invokes plugin-produced callables (bypass of GHSA-mv8w-475r-vwqw)
GHSA-7mx3-vvmw-hjmvhigh@graphql-tools/utils@10.11.0GraphQL Tools has prototype pollution in well-established utility function `mergeDeep`
GHSA-c4qx-w738-7hr3high@graphql-tools/utils@10.11.0GraphQL Tools: Prototype pollution in mergeIncrementalResult via non-primitive path segments
GHSA-5j98-mcp5-4vw2highglob@11.0.3glob CLI: Command injection via -c/--cmd executes matches with shell:true
GHSA-86w9-cpqp-85rvhighnode-forge@1.4.0node-forge RSA PKCS#1 v1.5 signature verification accepts extra nested DigestAlgorithm elements
GHSA-jp82-f5mq-hwhphighseroval@1.5.6Seroval: Memory exhaustion via unchecked TypedArray length in JSON deserialization
GHSA-2m5v-pch6-74hxhighundici@7.29.0undici vulnerable to TLS certificate validation bypass via dropped tls options in Agent
GHSA-4w7w-5xrc-9h26highundici@7.29.0undici vulnerable to cache poisoning and cross-user disclosure via cross-origin redirects
GHSA-qrxm-fqhp-jwvmhighundici@7.29.0undici vulnerable to Denial of Service via TLS 1.2 certificate-changing renegotiation
GHSA-rfgv-xxqx-mfg5highundici@7.29.0undici vulnerable to Denial of Service via unrequested WebSocket subprotocol
GHSA-w293-vg96-wgc3highundici@7.29.0undici vulnerable to TLS certificate validation bypass via dropped connect options in BalancedPool
GHSA-xjj6-f33q-929chighundici@7.29.0undici vulnerable to Denial of Service via unhandled error on excessive content-encodings
GHSA-2jfj-6hjv-fm6jmoderateundici@7.29.0undici vulnerable to cross-user cookie disclosure via Set-Cookie caching in shared caches
GHSA-3wwx-pv8p-q78vmoderateundici@7.29.0undici vulnerable to Denial of Service via unhandled error in WebSocket permessage-deflate decompression
GHSA-3xpg-4rpp-hhhmmoderateundici@7.29.0undici vulnerable to Denial of Service via unbounded decompression of compressed responses
GHSA-4qv8-2p9j-2685moderateundici@7.29.0undici vulnerable to Denial of Service via unbounded memory in the EventSource parser
GHSA-55wc-3pg8-jfw6moderateundici@7.29.0undici vulnerable to Denial of Service via unhandled exception in the decompress interceptor
GHSA-9fm3-97px-rjf6moderateundici@7.29.0undici WebSocket client vulnerable to Denial of Service via unbounded automatic PONG buffering
GHSA-f72v-6w45-q472moderateundici@7.29.0undici vulnerable to Subresource Integrity bypass via non-lowercase algorithm tokens
GHSA-pmjh-fq2x-6v4xmoderateundici@7.29.0undici vulnerable to Denial of Service via orphaned RetryHandler response body
GHSA-rx4f-c7p8-82vqmoderateundici@7.29.0undici vulnerable to Denial of Service via WebSocketStream unclean close
GHSA-2gqq-gqf2-x968lowundici@7.29.0undici vulnerable to response truncation via oversized chunked responses in the dump interceptor
GHSA-8436-99hf-9mmvlowundici@7.29.0undici vulnerable to caching and replay of unsafe HTTP method responses
GHSA-r53p-7pc4-xj5rlowundici@7.29.0undici vulnerable to downstream response splitting via retry interceptor
Workflows worth a look

By the numbers

Stars10.2K
Forks1,493
Contributors217
Commits14.8K
Open issues2,003
Open pull requests209
Releases418
Latest release7.261026.0
Licencecustom
Main languageTypeScript
Project age7 years
Last pushOct 28, 2026
Tracked files7,209
Lines of code1.1M
Checkout size237 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.

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.