[Security Solution] Adds mitre_attack plugin and MITRE ATT&CK data client - #288525
Open
dplumlee wants to merge 3 commits into
Open
[Security Solution] Adds mitre_attack plugin and MITRE ATT&CK data client#288525dplumlee wants to merge 3 commits into
mitre_attack plugin and MITRE ATT&CK data client#288525dplumlee wants to merge 3 commits into
Conversation
dplumlee
force-pushed
the
managed-mitre-m1-plugin
branch
from
September 2, 2026 03:25
64fbd48 to
bec3dc0
Compare
Contributor
🔍 Preview links for changed docs |
Contributor
✅ Elastic Docs Style Checker (Vale)No issues found on modified lines! The Vale linter checks documentation changes against the Elastic Docs style guide. To use Vale locally or report issues, refer to Elastic style guide for Vale. |
mitre_attack plugin and MITRE ATT&CK data client
Contributor
💛 Build succeeded, but was flaky
Failed CI StepsMetrics [docs]Module Count
Page load bundle
Unknown metric groupsshared chunks total size
total optimizer output size
Test Failures
History
cc @dplumlee |
dplumlee
marked this pull request as ready for review
September 2, 2026 05:51
| schema.literal('technique'), | ||
| schema.literal('subtechnique'), | ||
| ]), | ||
| superseded_by_id: schema.maybe(schema.arrayOf(schema.string())), |
| ]), | ||
| superseded_by_id: schema.maybe(schema.arrayOf(schema.string())), | ||
| position: schema.maybe(schema.number()), | ||
| tactic_ids: schema.maybe(schema.arrayOf(schema.string())), |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Completes: https://github.com/elastic/security-team/issues/19072 (internal)
Related Epic: https://github.com/elastic/security-team/issues/17157 (internal)
Builds on: #287226
Adds the
mitre_attackplugin, which is the backend data layer for the managed MITRE initiative. It takes the artifact and packages that were merged in #287226 and actually puts them to use: registering a Saved Object type for MITRE entities, populating it at startup from the bundled artifact, and exposing a read-only data client that the API routes will consume in later PRs.Everything is behind
xpack.mitreAttack.managedSourceEnabled, which is off by default. With the flag off the plugin does nothing at all, so this PR has no effect on any existing behavior. The legacymitre_tactics_techniques.tsblob remains the only data source until the UI cutover lands.What has been added
mitre_attackplugin: new plugin atx-pack/solutions/security/plugins/mitre_attackwith both a server and a minimal browser side. The browser plugin exists only to surface the flag asisEnabledon its start contract, which is whatsecurity_solution'suseMitreConfiguration()hook will read to decide between the new API and the legacy blob.mitre-attack-entitySaved Object type: space agnostic, hidden, stored in the Security Solution Saved Objects index.dynamic: falsewith only the fields we query, sort, or aggregate on mapped.MitreAttackDataService: owns startup population. Onstart()it bulk-creates every entity fromloadMitreArtifact()using a deterministic Saved Object id of{framework}:{framework_version}:{id}withoverwrite: true, so re-running on every restart is idempotent and multiple MITRE versions can coexist. Population is fire and forget, and a failure gets logged without blocking or crashing startup.MitreAttackDataClient: read-only client withgetById()andlist()methods, returned from the server start contract asgetMitreDataClient(). Reads go throughensureInitialized()first, so a read arriving after a failed startup population triggers one retry and then degrades to an empty collection rather than throwing an error.Notes for reviewers
scripts/check_saved_objectscan't see this type yet: Saved Object registration is gated on the feature flag (matching thetypesTiedToFeatureFlagspattern insecurity_solution/server/saved_objects.ts), and the checker boots Kibana with default config. That means the mappings are not CI-validated until the flag default flips on. I ran the checker manually against a flag-on build and it passes.bulkCreatereturns per-object errors, we log the total count plus the first 5 failing ids rather than every failure, since a fully broken run would otherwise put hundreds/thousands lines in the log. I couldn't find an existing convention for this in the codebase, but figured this might be a better solution than just logging all of what would likely be similar errors for each entity.search()is deliberately not here: The RFC lists it as technically not needed for milestone 1 MVP, and in creating this PR it seemed to be a bit too much work for something that won't be used until later. I decided to stick with the MVP methods on the data client, and it can come later with future milestones that actually consume it.How to test
There's still nothing to click, the routes and UI come in the next two PRs, so testing is mostly confirming the Saved Objects land correctly. You can do this via terminal with some of the prompts below or kibana dev tools.
Testing utils
Flag off (the default) should produce nothing at all:
curl -s -u elastic:changeme "localhost:9200/.kibana_security_solution/_count?q=type:mitre-attack-entity"Then add this to
kibana.dev.ymland restart:You should start to see the relevant logging from the mitreAttack plugin population services and you should get 873 entities for the bundled v19.1 artifact, with deterministic ids:
Restarting again should leave the count at 873 rather than duplicating anything, which is the point of the deterministic ids. It's also worth confirming the indexed fields work, since these are what the coverage overview and technique picker will rely on:
Next steps
Picking up from the plan in #287226, the remaining PRs for this milestone:
/internal/mitre/*to serve entities to the browser, built on the data client added here.useMitreConfiguration()hook.Checklist
Check the PR satisfies following conditions.
Reviewers should verify this PR satisfies this list as well.