This is an old revision of the document!
GhostTag Apocalypse is a firmware, security, and BLE simulation challenge. Students implement the protocol of an nRF52840 tag that must be found by authorized gateways without transmitting a stable identifier.
The challenge combines:
nrf52840dk/nrf52840;This is a hackathon challenge, not a complete protocol for a real product. It does not fully cover secure provisioning, key protection, replay attacks, radio certification, or a complete privacy evaluation.
Status verified on 2026-07-15:
| Component | Status | Remarks |
|---|---|---|
| Challenge code | Ready | Local commit 29a2b3d on branch nrf52840-swarm/ghosttag-apocalypse |
| Student starter | Ready | Contains exactly 3 TODOs in firmware/ghost_protocol.c |
| Native tests | Ready | SipHash vectors, rotation, tamper, wrong seed, and leakage check |
| Zephyr build | Ready | Tag and gateway for nrf52840dk/nrf52840 |
| Renode simulation | Ready | Tags, gateways, clones, deterministic positions and BLE range |
| Validator and report | Ready | Produces validation.json and output/report.html |
| Platform integration | Ready in repository | Manifest exists for the scenario and the Showcase Job |
| Local reference validation | Passed | Last local evidence: 6/6 tags, 6/6 rotated, 75 rogue packets rejected |
| Kubernetes cluster | Healthy | All 3 nodes are Ready, no failed pods, public health 200 |
| Active student scenario | No | Platform still uses rp2040-sensor-filter-tinyml |
| GhostTag image in registry | Unconfirmed | Image must be rebuilt, pushed, and verified before activation |
| GhostTag showcase | Not running | Job ghosttag-apocalypse is absent |
The BLE payload is exactly 28 bytes:
| Bytes | Content |
|---|---|
0..1 | Company ID 0xF00D |
2 | Protocol version 2 |
3 | Flags |
4..7 | Rotation epoch, little-endian |
8..11 | Public sector, little-endian |
12..19 | Authenticated ephemeral identifier |
20..27 | Authentication tag for bytes 0..19 |
The packet does not contain the stable ID of the device. The radio identity changes at every epoch, and the gateway verifies the packet using the small authorized key space of the sector.
The student receives in the browser:
firmware/ - Editable source;problem/ - Challenge statement;output/ - Logs, results, and HTML report;output/report.html.Data is kept on the user's PVC. A scenario change archives the previous workspace. PVCs must not be deleted during the challenge or at rollback.
Every Run executes, in order:
-Wall -Wextra -Werror;The validator uses only the traffic observed by gateways. It does not read the student's C variables and does not inspect the tags' memory.
| Mode | Tags | Gateways | Rogue Clones | Total Boards |
|---|---|---|---|---|
| Local smoke | 6 | 3 | 2 | 11 |
| Normal student run | 12 | 3 | 2 | 17 |
| One showcase sector | 16 | 3 | 2 | 21 |
| Complete showcase | 192 | 36 | 24 | 252 |
The showcase uses 12 independent sectors and runs a maximum of 4 in parallel.
Each sector has a limit of 3 CPU and 2560 MiB RAM. These values were
chosen after real testing; they must not be increased without a new capacity test.
The platform was recovered and hardened after the power incident:
Ready=True and schedulable workers;running state;plymouth-quit-wait.service was removed;Students only modify:
firmware/ghost_protocol.c
The student implements ghost_siphash24:
An approximate implementation or with wrong byte order will not pass.
The student completes ghost_build_payload:
0x45, the epoch, and the sector;12..19;0..19;20..27;device_seed into the packet.The same raw key must not be reused directly for both roles.
The student completes ghost_verify_payload so that it rejects:
The verification must reconstruct the expected values, don`t accept a packet just because it has the correct size and header.
problem/problem.md and the comments for the 3 TODOs;A solution is accepted only if:
GHOST_VALIDATION passed=1;GHOSTTAG FLEET SURVIVED THE APOCALYPSE.Compiling without errors is not enough.
We monitor:
We help students with compilation errors, platform usage, and interpreting the report. We do not implement TODOs for them.
The showcase is optional and separate from student runs.
Before launching:
approx. 3.76 GB image;
parallelism: 4;
Launch k8s/showcase/indexed-job.yaml and monitor all 12 completions.
The showcase is successful only if all 12 sectors finish successfully and
each log contains GHOST_VALIDATION passed=1.
The challenge can be opened to students when all points are true:
Ready;At the time of writing, the first two remaining operational actions are build/push for the image and controlled activation of the scenario. The showcase must not be launched before the disposable test.
| File | Role |
|---|---|
firmware/ghost_protocol.c | The only file edited by the student |
firmware/include/ghost_protocol.h | Wire contract and API |
firmware/tests/test_protocol.c | Public native tests |
ide/problem/problem.md | Full statement displayed in the browser |
support/gateway/ | Trusted gateway |
docker/scripts/build_firmware.sh | Native tests and Zephyr builds |
docker/scripts/generate_swarm_resc.py | Renode topology generation |
docker/scripts/validate_swarm.py | Automated acceptance criteria |
docker/scripts/generate_report.py | HTML report |
k8s/platform/active-scenario.yaml | Scenario activation for students |
k8s/showcase/indexed-job.yaml | 252-board showcase |
docs/HACKATHON_RUNBOOK.md | Operational procedure and rollback |
docs/instructor_notes.md | Recommended structure for the 3-hour session |