~/projects/ectf-2025

SECURITY2025competition entry

MITRE eCTF 2025

A secure satellite-TV decoder design for the MAX78000 microcontroller, built for the MITRE eCTF 2025 embedded security competition, including an attack-phase submission against another team's design.

TIMELINE
Jan 2025 – Mar 2025
TEAM
5 people
CONTEXT
Competition — MITRE eCTF 2025
Binary key tree over sixteen timestamps: four issued keys cover a ten-timestamp subscription, with one frame key derived down the tree.

Overview

This is Mountain View High School’s (team mv-infosec) design for the 2025 MITRE eCTF competition: a secure decoder that decrypts subscription-gated satellite-TV broadcast frames on a MAX78000 microcontroller. In the attack phase, the team received another team’s design package to attack.

Features

  • Decodes encrypted broadcast frames and verifies them before playback
  • Subscription-based access control, with per-channel subscription updates sent to the decoder
  • Key derivation using a binary key tree so a single subscription update can grant access to a bounded time range
  • Ascon AEAD for frame encryption/authentication and Ed25519 for signing
  • Host-side encoder and subscription-generation tools in Python
  • CI build pipeline (GitHub Actions) for the Rust firmware

How it works

The decoder is no_std Rust firmware for the MAX78000 (via max7800x-hal), handling incoming packets, subscription updates, and frame decryption. Keys are derived using the Ascon hash function walking a binary interval tree, so a subscription for a time range can be represented compactly and issued as a single key. The host-side ectf25_design Python package generates global secrets, per-decoder subscriptions, and encodes broadcast frames for testing. The attack-phase package for the target team contains its C decoder (AES and SHA-256) and design document, subscription files (own.sub, expired.sub, pirated.sub), an attacker protocol file and a recorded broadcast (recording.json).

Contribution

  • Added subscription handling to the encoder side of the design package (new subscription.py, changes to encoder.py and gen_subscription.py)
  • Merged key.py into subscription.py and fixed the subscription logic
  • Moved the GitHub Actions build workflow to a self-hosted runner and adjusted it for Windows