Capstone Projects-Three Tracks, One Choice¶
Pick one. The work performed here is what you describe in interviews.
Track 1-Mini-Docker (the curriculum's default)¶
Outcome: a from-scratch container runner in Go or Rust, demonstrating manual orchestration of namespaces, cgroups v2, OverlayFS, capabilities, seccomp, and a working subset of OCI runtime spec.
Functional spec¶
- Read an OCI runtime bundle (
config.json+rootfs/). - Lifecycle:
create,start,state,kill,delete, plusrun(create+start). - Apply: PID/NET/MNT/UTS/IPC/USER/CGROUP namespaces, capability dropping, seccomp filter, cgroups-v2 (memory/cpu/pids),
pivot_root, masked/readonly paths. - Spec compliance: passes a meaningful subset of the OCI runtime spec validator.
Non-functional spec¶
- Implemented in <2,500 lines of code (excluding tests).
- Memory footprint <20 MB resident.
- Container-start latency <100 ms on a baseline workload (matches
runcwithin 2×).
Architecture sketch¶
- Top-level CLI parses the lifecycle subcommand.
- Runtime orchestrator: state machine over the bundle's lifecycle.
- Init re-exec pattern (like
runc's "init"): the binary self-re-execs as the container's PID 1 supervisor; performs final mount + capability + seccomp setup; execs the user command. - State persistence in
/run/<runtime-name>/<id>/state.json.
Test rigor¶
- Unit tests for: bundle parsing, namespace setup, cgroup writes, seccomp compilation.
- Integration tests: run real bundles (Alpine, BusyBox, a small Go binary) and assert behavior.
- Spec compliance test against (a subset of)
runtime-tools/validation. - Chaos: malformed configs, missing rootfs, OOM, exhausted PIDs.
Hardening pass¶
- Default seccomp profile equivalent to
containers/common/pkg/seccomp. - Default capability set:
CAP_NET_BIND_SERVICEonly. - Read-only rootfs unless explicitly opted in.
- Rootless support (user namespace path tested).
Acceptance criteria¶
- Public repo, documented architecture.
- A README walkthrough: from
runc specto runningnginxunder your runtime. - Integration tests in CI, passing.
- A short paper (3–5 pages) comparing your runtime to
runc/crun/youki: what's similar, what's different, what you skipped and why.
Skills exercised¶
- All months-but heaviest on Months 1 (OCI specs), 2 (filesystems), 3 (runtimes), 4 (security primitives).
Track 2-Image Scanning & Signing Service¶
Outcome: an HTTP service that ingests OCI image references, runs Syft + Grype + Trivy, attaches signed SBOMs and VEX statements, and exposes a policy-gated promotion API.
Functional spec¶
- `POST /scan {image} - scan, return findings.
- `POST /promote {image, target} - verify the image meets policy (signature, SBOM, vuln thresholds, SLSA provenance) before copying to a higher-trust registry.
- `GET /audit/{image} - full triage report, including VEX state per finding.
- Policy as YAML; reload without restart.
- Plugin model: scanner backends and signature verifiers loaded at startup.
Non-functional spec¶
- 50 concurrent scans without degradation.
- Sub-second policy evaluation given pre-fetched attestations.
- Admission API compatible with Kubernetes ImagePolicyWebhook.
Architecture sketch¶
- Workers consuming a scan queue.
skopeofor image fetching;syftandtrivyshelled out (or embedded as Go libs).cosignGo SDK for signature verification.- Postgres for findings storage; Prometheus for metrics; OTel for traces.
Test rigor¶
- Unit tests for policy evaluation.
- Integration tests against a local registry with known-good and known-bad images.
- Property tests: policy decisions are deterministic given inputs.
Hardening pass¶
- Service runs rootless in its own container.
- mTLS between worker and registries.
- Findings DB encrypted at rest.
Acceptance criteria¶
- Public repo, README with end-to-end demo.
- Demonstrate full flow: image with critical CVE → scan → signed VEX → policy decision → promotion gated correctly.
Skills exercised¶
- Months 5 (supply chain) heavily; Months 1, 4 supporting.
Track 3-Custom Runtime Fork¶
Outcome: a fork of runc (or youki) adding one substantial feature: gVisor-style sandbox, a custom seccomp generator, or eBPF-based per-container observability.
Suggested scopes¶
runc-trace: a runc fork that, beforeexecve, attaches an eBPF program tracing syscalls and emitting per-container telemetry to a userspace consumer. Useful for forensic environments.runc-autoseccomp: generates a tight seccomp profile during a "learning" run, then enforces it. Removes the manual seccomp-authoring burden.runc-cap: stricter capabilities defaults; introspects the rootfs and disables capability sets the binary doesn't appear to need.
Acceptance¶
- Forked from upstream at a tagged commit; documented merge plan to maintain rebase against upstream.
- The new feature is opt-in via
config.jsonannotations or a CLI flag. - Test coverage equivalent to upstream's for the touched code.
- A short blog post explaining the feature, the design, and the upstream-contribution plan.
Skills exercised¶
- All months. Track 3 is for the candidate who wants to contribute upstream eventually.
Cross-Track Requirements¶
container-baseline/template (Appendix A) integrated.- ADRs (≥3).
THREAT_MODEL.md.- Defense readiness: 45-minute walkthrough.