GitHub RadarBlue team tool
AI-powered phishing & threat-analysis platform to automatically inspect, classify, and report suspicious emails, files, URLs, IPs, and hashes built for teams and organizations Primary language: Python. 85 stars.
Project links:Open GitHub projectBack to radar
<p align="center"> <img alt="Suspicious Logo" src="/assets/suspicious-logo.png" height="330" width="260"> </p> <p align="center"> <strong>Phishing & threat-analysis platform</strong> </p>
<p align="center"> <a href="https://github.com/thalesgroup-cert/suspicious/actions/workflows/ci.yml"> <img src="https://img.shields.io/github/actions/workflow/status/thalesgroup-cert/suspicious/ci.yml?branch=main&style=for-the-badge&logo=github&label=CI" alt="CI"> </a> <a href="https://github.com/thalesgroup-cert/suspicious/graphs/contributors"> <img src="https://img.shields.io/github/contributors/thalesgroup-cert/suspicious?style=for-the-badge" alt="Contributors"> </a> <a href="https://github.com/thalesgroup-cert/suspicious"> <img src="https://img.shields.io/github/stars/thalesgroup-cert/suspicious?style=for-the-badge&logo=opensourceinitiative&logoColor=white" alt="Stars"> </a> <a href="https://github.com/thalesgroup-cert/suspicious/issues?q=is%3Aissue+is%3Aclosed"> <img src="https://img.shields.io/github/issues-closed-raw/thalesgroup-cert/suspicious?style=for-the-badge&logo=github" alt="Closed Issues"> </a> <a href="./LICENSE"> <img src="https://img.shields.io/github/license/thalesgroup-cert/suspicious?style=for-the-badge&logo=opensourceinitiative&logoColor=white" alt="License"> </a> </p>
Documentation: <https://thalesgroup-cert.github.io/suspicious/>
Suspicious inspects, classifies, and reports suspicious emails, files, URLs, IPs, and file hashes. Submit an item from the web UI or forward an email to a monitored mailbox; Suspicious runs it through YARA rules, a sandbox, metadata checks, and a machine-learning email classifier, then returns a scored verdict and a full report.
Built and maintained by the Thales Group CERT.
.eml, .msg), documents, archives, executables, URLs,IP addresses, and file hashes.
submission history.
S3-compatible storage.
Requires Docker and Docker Compose v2.
git clone https://github.com/thalesgroup-cert/suspicious.git
cd suspicious
# Example configs that run as-is for local development
cp docs/getting-started/examples/deployment-env.example deployment/.env
cp docs/getting-started/examples/Suspicious-settings.example.json Suspicious/settings.json
cd deployment
docker network create suspicious_net
docker compose build suspicious
docker compose up -d db_suspicious redis_cache redis_broker
docker compose up -d --no-deps suspicious
make migrate
make seed-config
make createsuperuserOpen <http://localhost:9020/admin/> and sign in.
The example configs use throwaway local credentials. Change every secret
before exposing the app. Full guide, the complete stack (UI, HTTPS, Cortex),
and configuration reference: [INSTALL.md](INSTALL.md) and [CONFIG.md](CONFIG.md).
Three files hold all configuration. Templates ship in the repo.
| File | Purpose | |------|---------| | deployment/.env | Image versions, ports, paths, database and storage credentials | | Suspicious/settings.json | Django settings, integrations, branding, SMTP, allowed domains | | email-feeder/config.json | IMAP/IMAPS mailboxes, S3 storage, polling interval |
See [CONFIG.md](CONFIG.md) for every parameter.
| Component | Role | |-----------|------| | Django REST API | Submission, analysis orchestration, reports. Gunicorn on port 9020. | | React UI (React 19, Vite, MUI) | Frontend served by Nginx on port 9021. | | Celery worker + beat | Background jobs: case finalisation, Cortex sync, stale-job rescue, KPI snapshots. | | MariaDB | Metadata, results, KPIs. Holds the CaseAnalyzerJob ledger behind the Cortex webhook lookup. | | Valkey / Redis | Celery broker and Django cache. | | Elasticsearch | Search and indexing. | | Cortex | Analyzer engine — YARA, AI, sandbox, metadata, FileInfo. Reports back via an HMAC-signed webhook. | | ChromaDB | Vector store for semantic similarity against past cases. | | RustFS (S3-compatible) | Stores uploads, attachments, artifacts. | | Email Feeder | Polls IMAP/IMAPS mailboxes and imports emails. Runs as a non-root user. | | Traefik | Reverse proxy and TLS termination. | | Vault | Production secret storage. |
Case. For each analyzer it writes an AnalyzerReport and aCaseAnalyzerJob row in one transaction, pinning the (case, cortex job) mapping at dispatch.
CaseAnalyzerJob, then enqueues a Celerytask that takes a per-case lock, updates the job, and calls finalise_case once the case has no pending jobs left.
finalise_case scores the case, pushes to TheHive/MISP if configured, queriesChromaDB for similar past cases, and emails the reporter.
jobs stuck past STALE_JOB_TIMEOUT_SECONDS (every 600 s), so cases never stall.
Analyzers/AIMailAnalyzer classifies emails by intent (phishing, malicious, suspicious, benign) using a Sentence-Transformers embedding model and a custom classifier, with ChromaDB for similarity search. It runs as a Cortex analyzer alongside the static rules.
To train it on your own data:
Analyzers/AIMailAnalyzer/ for the training scripts.Use it alongside YARA, sandbox, and metadata analyzers. Do not auto-block on the classifier alone.
See [CONTRIBUTING.md](CONTRIBUTING.md) for coding standards and the pull request flow.
git checkout -b feature/your-feature
# make changes, commit, push
# open a pull requestBug reports and ideas are welcome in issues.
Image: Dashboard Phishing Campaigns
GitHub Actions runs six workflows plus Dependabot under .github/.
| Workflow | Trigger | Runs | |----------|---------|------| | ci.yml | PRs and pushes to main/test | commit-lint, ruff, migration-drift check, Django tests, feeder tests, frontend (eslint + tsc + vitest + build), image builds | | e2e-deploy.yml | PRs, pushes to main/feature/frontweb | full-stack deploy smoke test against a stubbed Cortex | | docs.yml | PRs and pushes to main | builds the MkDocs site and deploys it to GitHub Pages | | release.yml | pushes to main/test, v* tags | builds and pushes images to GHCR with SBOM and provenance | | codeql.yml | PRs, pushes to main, weekly | CodeQL for Python and JS/TS | | security.yml | PRs, weekly | Trivy, gitleaks, pip-audit, pnpm audit |
| Component | Image | |-----------|-------| | Django API | ghcr.io/thalesgroup-cert/suspicious | | Frontend | ghcr.io/thalesgroup-cert/suspicious-ui | | Email feeder | ghcr.io/thalesgroup-cert/suspicious-feeder |
Deployment is manual via deployment/Makefile (make deploy); CI never holds production credentials.
Released under the Apache License, Version 2.0. See `LICENSE`.
Questions, ideas, or bugs: open an issue.