malware analysis job broker & sample store https://atomdrift.org/
  • Go 87.9%
  • Shell 11.9%
  • Makefile 0.2%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
2026-07-22 08:50:56 -04:00
cmd/hopper high/low ceiling work 2026-07-22 00:08:46 -04:00
media get stricter about empty fields 2026-04-24 09:53:30 -04:00
pkgparse add oci/clawhub/github purl tests 2026-07-11 07:00:50 -04:00
scripts dep handling to support surfacing dependency-based traits 2026-07-15 13:26:40 -04:00
testdata serve data from more archive formats 2026-06-21 20:43:49 -04:00
.gitignore add missing pool.go (gitignored) 2026-04-11 16:32:22 -04:00
.golangci.yml smarter sample serving 2026-06-21 23:52:41 -04:00
archive.go don't waste so much RAM with unnecessary JSON unmarshals 2026-06-27 18:04:40 -04:00
archive_test.go don't waste so much RAM with unnecessary JSON unmarshals 2026-06-27 18:04:40 -04:00
cleave_trait_keys_test.go faster replicas 2026-07-01 10:06:18 -04:00
extract.go memory consumption adjustments 2026-06-25 16:28:27 -04:00
extract_formats_test.go serve data from more archive formats 2026-06-21 20:43:49 -04:00
extract_test.go memory consumption adjustments 2026-06-25 16:28:27 -04:00
go.mod add sightings triage 2026-07-11 16:23:34 -04:00
go.sum add sightings triage 2026-07-11 16:23:34 -04:00
hopper.go improve triage highest 2026-07-22 08:50:56 -04:00
hopper_test.go high/low ceiling work 2026-07-22 00:08:46 -04:00
Makefile lower worker count to 40 2026-07-07 15:19:21 -04:00
migrate.go Add top-3 traits as interpret fallback 2026-07-09 10:43:50 +02:00
migrate_test.go add support for backfilling based on trait versions 2026-04-18 20:45:50 -04:00
pg.go improve triage highest 2026-07-22 08:50:56 -04:00
promotion_candidates_test.go Add sighted queue 2026-07-10 14:39:49 -04:00
provenance.go add provenance update ability 2026-06-28 20:49:27 -04:00
provenance_db_test.go add provenance update ability 2026-06-28 20:49:27 -04:00
README.md support OmniOS as a server 2026-05-08 14:58:58 -04:00
rel_test.go highest/lowest queue support 2026-07-21 15:37:10 -04:00
schema.sql Add sighted queue 2026-07-10 14:39:49 -04:00
schema_sqlite.sql Add sighted queue 2026-07-10 14:39:49 -04:00
sightings_test.go Add sighting category 2026-07-10 15:56:22 -04:00
sqlite.go improve triage highest 2026-07-22 08:50:56 -04:00

hopper

hopper

Job broker and sample store for the atomdrift malware analysis pipeline. Hopper catalogs samples, distributes analysis work to litmus workers, and publishes labeled results to collimator for ML training.

  samples ──► hopper ◄──► litmus workers (pull jobs, return verdicts)
                 │
                 └──► collimator (ML training)

Workers poll /api/next, fetch bytes from /api/file/{sha256}, and POST results to /api/result. Hopper tracks liveness, retries stuck jobs, and serves a dashboard so you can watch the swarm. Point as many litmus workers as you like at the hopper URL — they'll pull until the queue drains.

Quick start

hopper init --db samples.db                       # SQLite, for a laptop
hopper load --db samples.db --data ./samples      # expects bad/ good/ unknown/

hopper serve                                      # embedded postgres on :5433
hopper load --data ./samples                      # uses DATABASE_URL

Production deployment

PostgreSQL 18 is recommended; PostgreSQL 17+ is required for JSON_TABLE, which collimator uses to dedupe embedded hashes. On the DB host:

sudo -u postgres psql -c "CREATE ROLE hopper LOGIN PASSWORD 'changeme'; \
  CREATE DATABASE hopper OWNER hopper; ALTER ROLE hopper WITH REPLICATION;"
echo 'localhost:5432:hopper:hopper:changeme' >> ~/.pgpass && chmod 600 ~/.pgpass
hopper init                                       # applies migrations
hopper load --data /srv/samples --dashboard-addr 0.0.0.0:8081   # HTTP API + dashboard

Run the hopper load process under rc.d, systemd, or s6 — it stays up serving the worker API and dashboard. scripts/master/freebsd-bastille.sh is a working FreeBSD/bastille rollout with tuned postgres, hourly pg_dump backups, and a hopper_replica logical-replication publication for replica subscribers. Imports use COPY-based bulk loads and resume with --after <id>.

Commands & building

serve, init, load, import, reset, stats, backfill, purge-unsupported, false-positives, false-negatives, bad-review, benign-review. Run hopper for the full list. Build with Go 1.25+ and CGO: make build && make test && make lint.