6.8 KiB
Development Diary #001 — Initial Setup & Sicherheitsaudit
Datum: 2026-03-02 Status: Abgeschlossen
Aufgaben
1. Repository Synchronisierung
- Ausgangslage: Lokales Verzeichnis
/Volumes/ExtremePro/projects/ANEenthielt nurfirebase-debug.log - Durchgeführt:
git init git remote add origin https://github.com/maderix/ANE.git git fetch origin git checkout -b main --track origin/main - Ergebnis: 29 Dateien im
training/-Verzeichnis synchronisiert,firebase-debug.logunberührt - Commit-Stand: HEAD = origin/main (up to date)
2. Sicherheitsaudit
- Durchgeführt: Vollständige Analyse aller 38 Quelldateien (Objective-C/C/Python)
- Befunde: 19 Sicherheitsprobleme identifiziert (4 KRITISCH, 5 HOCH, 6 MITTEL, 4 NIEDRIG)
- Bericht:
docs/reports/security-audit-2026-03-02.md
Wichtigste Erkenntnisse
Das ANE-Projekt ist ein innovatives Forschungsprojekt zur direkten Nutzung des Apple Neural Engine für Training. Es nutzt reverse-engineerte private APIs (_ANEInMemoryModelDescriptor, _ANEInMemoryModel etc.) via dlopen + objc_msgSend.
Kritischste Befunde:
- CRIT-01:
dlopen()ohne Fehlerbehandlung → stiller Absturz - CRIT-03:
fread()ohne Rückgabewert-Prüfung → uninitalisierter Speicher - CRIT-04: Integer Overflow in Blob-Größenberechnung (
intstattsize_t)
Architektur-Highlights (interessant):
- Nutzt
execl()zum Prozessneustart wenn ANE-Compiler-Limit erreicht wird - IOSurface als Shared-Memory zwischen CPU und ANE
- Gradient-Accumulation mit async CBLAS auf separatem Dispatch-Queue
LOW-Finding Fixes (2026-03-02)
GitHub-Fork manni07/ANE angelegt, Branch fix/low-security-findings erstellt.
Alle 4 LOW-Findings behoben:
| Finding | Datei | Änderung |
|---|---|---|
| LOW-01 | training/Makefile |
SEC_FLAGS = -fstack-protector-strong -Wformat-security, CFLAGS_DEBUG, verify-flags Target |
| LOW-02 | training/Makefile |
ANE_COMPAT Variable mit Dokumentation, check-deprecated Target |
| LOW-03 | training/tokenize.py |
5 Eingabevalidierungen, konfigurierbare Größengrenze via MAX_ZIP_BYTES |
| LOW-04 | .gitignore (neu) |
Binaries, Logs, macOS-Metadaten, Trainingsdaten ausgeschlossen |
Simulation: 3 Iterationsrunden, Gesamtbewertung 96.35% (alle Kriterien ≥ 95%)
Remote: origin=manni07/ANE, upstream=maderix/ANE
CRIT-Finding Fixes (2026-03-02)
Branch fix/crit-security-findings erstellt. Alle 4 CRIT-Findings behoben:
| Finding | Dateien | Kernänderung |
|---|---|---|
| CRIT-01 | training/ane_runtime.h, training/stories_config.h |
dlopen() Return-Check; NSClassFromString() Validierung; g_ane_ok/g_ane_ok_large Flag; stories_config.h Re-Entry-Guard |
| CRIT-02 | training/ane_runtime.h, training/stories_io.h |
g_ane_ok-Guard in ane_compile(); g_ane_ok_large-Guard in compile_kern_mil_w(); mdl-NULL-Check vor hexStringIdentifier |
| CRIT-03 | training/model.h, training/train_large.m |
fread() Config/Header-Check als Gatekeeper; fopen() NULL-Check in save_checkpoint(); Designentscheid dokumentiert |
| CRIT-04 | training/stories_io.h, training/model.h |
int→size_t in allen build_blob* Funktionen; (size_t)-Cast in malloc()-Größen; calloc() NULL-Checks |
Simulation: 3 Iterationsrunden (CRIT-03 benötigte 3 Runs), Gesamtbewertung 96.15% (alle Kriterien ≥ 95%)
Branch: fix/crit-security-findings auf manni07/ANE
MED-Finding Fixes (2026-03-02)
Branch fix/med-security-findings erstellt (basiert auf main + cherry-pick CRIT-Commit).
Alle 6 MED-Findings behoben. Simulation: 2–3 Iterationsrunden, Gesamtbewertung 95.93% (alle Kriterien ≥ 95%).
| Finding | Dateien | Kernänderung |
|---|---|---|
| MED-01 | stories_io.h, ane_runtime.h |
IOSurfaceLock() Return-Code in allen 6 I/O-Funktionen geprüft; Early-Return mit fprintf(stderr, ...) |
| MED-02 | stories_io.h, ane_runtime.h |
Eindeutige Temp-Verzeichnisnamen via ANE_<pid>_<seq>_<hash>; atomarer g_compile_seq/ane_compile_seq Counter |
| MED-03 | ane_mil_gen.h |
mil_dims_valid() Helper + Guard in allen 7 MIL-Gen-Funktionen; nil-Return bei invaliden Dims |
| MED-04 | train_large.m, stories_config.h |
CkptHdr.pad[0] = 0x01020304 LE-Sentinel beim Speichern; Runtime-Check beim Laden (pad[0]=0 = Legacy OK); _Static_assert für LE-Kompilierzeitgarantie |
| MED-05 | stories_io.h |
_Static_assert(SEQ % 8 == 0, ...) + Alignment-Rationale-Kommentar; kein Code-Change nötig |
| MED-06 | ane_runtime.h, stories_config.h |
dispatch_once ersetzt manuelle g_ane_loaded/g_ane_init_done-Guards; thread-sichere One-Time-Init; 2 globale Variablen entfernt |
Branch: fix/med-security-findings auf manni07/ANE
Status
| Finding-Typ | Anzahl | Status |
|---|---|---|
| KRITISCH (CRIT-01–04) | 4 | ✅ BEHOBEN |
| HOCH (HIGH-01–05) | 5 | HIGH-01 ✅ BEHOBEN, HIGH-02–05 Offen |
| MITTEL (MED-01–06) | 6 | ✅ BEHOBEN |
| NIEDRIG (LOW-01–04) | 4 | ✅ BEHOBEN |
HIGH-01 Fix (2026-03-02)
Branch fix/high-security-findings erstellt. HIGH-01 behoben.
Problem
Zwei zusammenhaengende Schwachstellen:
train_large.m:n_tokens = data_len / 2ohne Mindestgroessen-Pruefung. Wenn die Token-Datei kleiner als(SEQ+1)*2Bytes ist, fuehrt das spaeter inn_tokens - SEQ - 1zu einem arithmetischen Underflow (size_t Wraparound → riesiger positiver Wert), was zu einem Out-of-Bounds-Zugriff im Trainings-Loop fuehrt.stories_cpu_ops.hembed_lookup():tokens[t]wird ohne Bereichspruefung als Index in die Embedding-Tabelle (Groesse VOCAB=32000) verwendet → Heap-Buffer-Overflow bei Token-Wert >= VOCAB.
Aenderungen
| Datei | Zeile | Aenderung |
|---|---|---|
training/train_large.m |
299–302 | Early-exit Guard: if (n_tokens < (size_t)SEQ + 1) → fprintf(stderr, ...) + return 1 |
training/stories_cpu_ops.h |
115 | Bounds-Clamp in embed_lookup(): if (tok >= VOCAB) { tok = 0; } |
Design-Entscheidungen
- Clamp statt Abort in embed_lookup: Der Fix verwendet
tok = 0(Position 0) statt Programmabbruch, weilembed_lookup()ein heisser Pfad im Trainings-Loop ist. Korrupte Token sollen das Training degradieren (schlechter Loss) aber nicht abwuergen. - Early exit in train_large.m: Hier ist ein harter Abbruch korrekt — eine zu kleine Token-Datei ist ein Konfigurationsfehler, kein transienter Datenfehler.
- embed_backward nicht gepatcht: Die
embed_backward()-Funktion hat dieselbe Schwachstelle (schreibender OOB-Zugriff). Laut Aufgabenstellung wird nurembed_lookup()adressiert. Dieembed_backward()-Schwachstelle ist in weiteren HIGH-Findings zu behandeln.
Build-Verifikation
make train_largekompiliert ohne Fehler oder neue Warnungen.- Commit:
236e495auf Branchfix/high-security-findings