Skip to content
link42-auPublic

About

Zero-runtime public threat knowledge explorer

Resources

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Repository files navigation

Threat10

Threat10 is a public, browser-local explorer for structured security knowledge. The restored legacy interface is the product's visual and route authority. The approved data direction is an independent build-time pipeline in this repository that produces compact, query-routed Parquet releases for the public Hugging Face dataset link42-au/threat; the static application will query immutable releases with DuckDB-Wasm.

Threat10 is structured knowledge, not live IOC monitoring. It does not claim current sightings, an ephemeral indicator feed, or an upstream availability SLA.

Current status

Area State Evidence
Independent static repository and legacy interface Live-verified interface The restored legacy UI is live at link42-au.github.io/threat10 after hosted run 33161073249 passed verification and deployment.
Source and rights evaluation Source-complete Copied F2/F3 policy and synthetic contract evidence establish fail-closed boundaries; the upstream selection was completed in the Link42 architecture work.
Enterprise tactic raw-path policy Source-complete T2B binds seven exact MITRE ATT&CK STIX paths to the normalized tactic field and passes eight fail-closed fixtures for unknown paths, kill chains, domains, tactic references, and missing or multiple matrices. Exactly one Enterprise matrix produces an asserted zero-based tactic order. This is policy evidence only; no source ingestion or matrix output exists yet.
Enterprise relationship policy Source-complete T2C allows official revoked-by replacements between techniques and sub-techniques in either direction. Eight fixtures retain fail-closed rejection for unknown predicates and every other unapproved cross-type endpoint pair.
Synthetic Parquet and DuckDB-Wasm spike In progress Local Chromium, Firefox, and Playwright WebKit prove deterministic routed entity/edge/search queries, pagination, corrupt-current fallback, and same-origin request/byte ceilings. A live Chromium proof against immutable HF data bb5fa284b55b9847f2cb01594b7c2c4cd2d74a1c and manifest e7944f9a3f40a17c5234cfbcbcbeaea09e94ea13 passed bounded anonymous HTTP-range queries and previous-good fallback. Actual Safari remains outstanding, so T2 is not source-complete.
App-owned ingestion and release pipeline T3 source-complete locally The builder pins Enterprise ATT&CK 19.2 at an immutable official commit, enforces the source, tactic, and relationship policies, and writes deterministic routed entity/relation/reference/search/matrix Parquet plus capability/source/provenance metadata. Two clean official builds reproduced all 1,029 files and 1,028 artifact hashes exactly. T5 manifest/release assembly and T6 publication remain separate later gates.
Public Hugging Face dataset Synthetic proof live; production release blocked The public, ungated link42-au/threat dataset exists, and an anonymous API read returned HTTP 200 at observed revision de75502017efa6acc83a736657785748b4e2071a. It contains only the synthetic T2 feasibility publication; T6 still requires the T5 source-derived local build and scoped publication/readback proof.
Data-backed Threat10 product Planned The legacy Pages interface is live, but upstream adapters, DuckDB queries, dataset-backed views, daily source-change builds, and the full Threat10 product are not.

Architecture

This repository contains a static SvelteKit application. GitHub Pages serves generated files; later features add an offline/build-time ingestion pipeline and query the resulting approved Parquet artifacts directly in the browser with DuckDB-Wasm. The initial full build runs locally. Subsequent public Actions builds are bounded to a daily source-change check, skip unchanged inputs, compact stable logical partitions rather than accumulating daily files, and publish immutable manifests with a previous-known-good release.

There is no application server, runtime database, account system, private workspace, runtime AI, paid feature, or browser secret. A future Hugging Face write credential is allowed only as a least-privilege build-time publication secret after the public dataset exists; it is never available to the application, forks, or pull requests.

The repository contains no third-party or production threat dataset bytes. Contract fixtures are project-authored synthetic STIX. The local builder accepts an externally downloaded, hash-pinned source file and writes only ignored local output; it does not fetch or publish. Copied source-policy documents are fail-closed inputs, not permission to expose every upstream field. See PLAN.md for the ordered implementation and publication blocker.

Synthetic T2 publication proof

The ignored-output feasibility bundle is prepared with pnpm prepare:publication:t2. After publishing its data-revision/ tree and recording the immutable Hugging Face revision, finalize the manifest-last tree with THREAT10_T2_HF_DATA_REVISION=<revision> pnpm finalize:publication:t2. See the scoped dataset-card fragment for the synthetic-only licensing boundary. These commands do not publish or use a Hugging Face token.

The published synthetic proof uses data revision bb5fa284b55b9847f2cb01594b7c2c4cd2d74a1c and manifest revision e7944f9a3f40a17c5234cfbcbcbeaea09e94ea13. Its Chromium run observed 14/14 Parquet payload responses as HTTP 206 with CORS *, transferring 2,827,775 bytes for 5,842,431 bytes of selected artifacts. The browser retained immutable manifest-selected URLs, allowed only Hugging Face's validated CDN redirect target, used no authorization or application backend, and passed entity, search, edge, empty, and previous-good fallback queries. DuckDB's full-HTTP-read fallback is disabled. This is synthetic T2 feasibility evidence, not a production Threat10 dataset or data-backed product release.

Development

Requirements:

  • Node.js 22.23.1
  • pnpm 10.15.1

Install dependencies and the Chromium test runtime:

pnpm install --frozen-lockfile
pnpm exec playwright install chromium

Run the local site:

pnpm --filter @threat10/web dev

Run formatting/lint, strict type checking, unit/component tests, copied contract and policy validation, static build validation, and the browser smoke test:

pnpm verify

The individual commands are pnpm check, pnpm typecheck, pnpm test, pnpm validate:contracts, pnpm validate:policy, pnpm validate:tactic-policy, pnpm validate:relationship-policy, pnpm build, pnpm verify:static, and pnpm test:e2e.

The T3 builder accepts a locally downloaded bundle and never fetches or publishes data itself. The reviewed production source lock is config/attack-enterprise-19.2.json. Release eligibility requires that exact repo-owned path and exact lock hash; a copied or caller-authored lock is rejected even when internally self-consistent. The lock binds the source version, immutable commit URL/path, byte size, source hash, bundle/collection/matrix/STIX/domain identities, notice, and all three machine-policy identities. A build uses an empty ignored output directory:

pnpm build:attack:t3 -- \
  --input /absolute/path/to/enterprise-attack-19.2.json \
  --source-lock config/attack-enterprise-19.2.json \
  --output .artifacts/t3-local/enterprise-attack-19.2

The lock has SHA-256 da46350f7eb708b5b90a86ed81c144485b630c2bce5656352333828e5c54114a and records commit 6cda5ad8462c79e14fbb872f4e09059b18e0cfc4, 53,835,637 input bytes, and source SHA-256 dc1639caa5501d720e280cf1cbd8fbe009884a0c9b3e6e9ed9d0c25166c3d8f4. Two clean local builds produced 4,820 entities, 21,262 relations, 38,462 references, 11,423 search rows, 872 matrix rows, and 1,028 data/metadata artifacts. Their inventory digest was identically 83c5ac2716b61f4c391aad6b57ea5cb4dc0916a9acef5cd94cc7a7fb455a8eea; including the identical build report, the complete-tree digest was 68a37287ff2cb00836519a14ced6901390e444f5a04e512af632a7dbb87e0591 across 1,029 files and 49,131,858 bytes. This is local source-complete evidence, not a Hugging Face release or data-backed site.

Data rights and attribution

Direct public hosting does not override originating-source terms. Every future file and predicate needs both the aggregator decision and the originating source/field decision. The authoritative first-release boundary is the Threat10 v1 data-content contract: official MITRE ATT&CK Enterprise STIX 2.1 only. See ATTRIBUTION.md and docs/licensing/ for the copied evidence boundary.

Licence

Threat10 code and project-authored documentation are licensed under the GNU Affero General Public License v3.0 or later, identified by AGPL-3.0-or-later.

Copyright © 2026 Iain Dickson.

Upstream data is not relicensed by this repository. Third-party libraries and Geist fonts retain their own licences; see THIRD_PARTY_NOTICES.md and LICENSES/.

About

Zero-runtime public threat knowledge explorer

Resources

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages