# Beveiligingsmodel en resterende risico's

## Wat het product nu daadwerkelijk handhaaft

De server legt een profiel bij creatie vast en biedt geen wijzigingsroute voor bestaande profielsessies. Een leerlingaanvraag kan dat profiel niet vervangen. Alle online opdrachten worden opnieuw berekend onder het serverprofiel; `ans` wordt uit de eigen sessie betrokken, niet uit de aanvraag. Ook functies die verborgen in wetenschappelijke formules voorkomen, zoals faculteit en nCr, worden op de vereiste functieklasse gecontroleerd.

Een nieuwe sessie heeft geen geschiedenis, bestanden of `ans`. De website importeert geen leerlingbestanden. De leerling krijgt een eenmalige willekeurige code; na gebruik wordt de code verwijderd en een afzonderlijk HttpOnly/SameSite-sessiecookie uitgegeven. Docent- en leerlingcookies hebben verschillende paden. Het docentenwachtwoord wordt met scrypt gecontroleerd; aanmeldpogingen worden begrensd. De lokale automatisch gegenereerde docentsleutel is een beheercredential, geen leerlingaccount.

Een willekeurige browserinstantie-ID, servergeneratie en oplopend opdrachtnummer bewaken hervatten en herhaling. Een tweede instantie met hetzelfde cookie veroorzaakt controle nodig. De laatste opdracht kan idempotent worden herhaald na een verloren antwoord. De status verandert naar controle nodig bij herstart, versieverschil, gemeld vensterverlies of contactverlies. Het feitelijke rekenwerk blijft staan. De docent moet hervatten toestaan; daarbij wordt de generatie vernieuwd. Serverherstart maakt bestaande docentlogins ongeldig.

HTTP-verzoeken hebben een beperkte omvang. Formulebomen, aantallen, numeriek werk en workerlooptijd zijn begrensd. Een beperkte Content Security Policy verbiedt scripts van derden en framing; de server controleert Host/Origin bij wijzigingen. Er zijn geen externe scripts, fonts, analytics, uploads of AI-koppelingen. Het standaardadres is uitsluitend loopback. Privémappen worden niet statisch aangeboden.

## Wat dit niet bewijst

Een browserinstantie-ID, profielhash, code, cookie, screenshot, fullscreenmodus of kleur bewijst **geen apparaatbeveiliging**. Een leerling die zijn apparaat/browser beheert, kan de JavaScript-interface wijzigen, lokaal werk veranderen, cookies uitlezen met apparaatbeheer, profielmeldingen namaken of op andere apparaten rekenen. Een identieke gekopieerde cliënt met gestolen cookie en exact dezelfde instantie-ID kan niet betrouwbaar van het origineel worden onderscheiden. Alleen een tweede afwijkende instantie wordt gedetecteerd. Dit is een bekende, niet opgeloste grens.

Daarom meldt zowel leerling- als docentscherm voortdurend dat het apparaat niet afgeschermd is. `deviceVerified` is altijd false; `deviceVerificationSupported` is false. De server weigert `controlled:true` met HTTP 409. Er is geen schakelaar waarmee een docent deze ontbrekende technische voorziening stilzwijgend kan wegklikken.

| Laag | Nu beschikbaar | School/ontwikkeling nog nodig |
| --- | --- | --- |
| Rekenomgeving | Allowlist, vaste profiel-/versiegegevens, serverherberekening, schone sessie, herstelbeslissing | Onafhankelijke review; verifieer broncode/build en installatie |
| Apparaat | Geen blokkade van andere apps, bestanden, communicatie, AI of OS-sneltoetsen | Werkelijk beheerd apparaat, kiosk/SEB, least privilege, allowlists, geblokkeerde extensies/ontwikkeltools, beheerstatus en concrete verificatieadapter |
| Netwerk | Eigen servercommunicatie, HTTPS-inrichting ondersteund via reverse proxy | Schoolnetwerkbeleid, isolatie, tijdige statuscontrole; wifi blokkeren alleen is onvoldoende |
| Toezicht | Werkplek-ID, docentoverzicht, beperkte incidentmeldingen | Fysieke koppeling leerling/werkplek, controle tweede apparaten en materialen, menselijke storingsbeslissing |

## Ondersteunde apparaten en eerlijke claims

| Opstelling | Oefenen | Gecontroleerd toetsen in deze versie |
| --- | --- | --- |
| Windows, moderne browser | Implementatie is lokaal in Windows gebruikt; specifieke browsertests in het bewijs | Nee |
| Chromebook, moderne Chrome | Webstandaarden zijn ervoor gekozen; fysieke Chromebook nog niet getest | Nee, ook niet door alleen deze site in fullscreen te openen |
| Schoolbeheerde Windows met SEB/kiosk | Windows-headeradapter geïmplementeerd | Nog niet vrijgegeven: praktijkdemonstratie ontbreekt |
| Schoolbeheerde Chromebook met kioskbeleid | Kandidaat voor vervolgtest; beleid/licenties door ICT controleren | Nee: concrete beheerstatuskoppeling en demonstratie ontbreken |
| Onbeheerd privéapparaat | Oefenen | Nee |

De officiële SEB-documentatie is geraadpleegd. De Windows-headercontrole weigert starten en voortzetten zonder passende Browser Exam Key. Zie [SEB-inrichting en grenzen](SEB.md). Geen fysieke SEB-test of apparaatattestatie als bewijs geleverd. Op Vercel blijven gehashte docentlogins en sessies bij gewone koude starts behouden via Redis; de genoemde herstartintrekking geldt voor de lokale Node-server.

## Aanvallen en controles

Uitgevoerde geautomatiseerde scenario's staan met resultaat in de TAP-uitvoer: anonieme docentaanvragen, cross-origin wijziging, oude gegevens bij sessiecreatie, clientprofiel wijzigen, uitgeschakelde functies rechtstreeks aanroepen, nCr/faculteit via formule, vervalste `ans`, herhaalde opdracht, verkeerd opdrachtnummer, code opnieuw gebruiken, tweede browser, gewijzigde rekenversie, werkelijk 46 seconden contactverlies, serverherstart, onbevoegd hervatten, afsluiten, wissen en afscherming van privépaden.

Niet uitgevoerd: jailbreak van SEB/kiosk, OS-/firmwareaanvallen, malware, identieke cookie/instantieklonen op echte apparaten, netwerkmanipulatie op school, volledige penetratietest, klasbelasting en stroomuitval. Lokale hosting gebruikt JSON; Vercel gebruikt Redis-transacties. Geen aangetoonde beschikbaarheidsgarantie voor schoolafnames.

## Offline en herstel

Een serviceworker cachet alleen de leerlingrekenomgeving; docentbeheer en API zijn nooit offlinecache-antwoorden. Een actieve serviceworker wordt niet tijdens gebruik gedwongen vervangen. Bij een nieuwe release moeten alle oude tabs gesloten worden. Bij versieverschil wordt geen nieuwe sessie toegelaten. De server controleert ook of de bronbestanden tijdens het proces gewijzigd zijn vóór een volgende berekening.

Online rekenwerk wordt op de server opgeslagen. Bij verbindingsverlies rekent de browser verder onder zijn lokale profielkopie en bewaart maximaal 100 wachtende opdrachten. De controletoestand is dan onbekend. Bij terugkeer is een docentbeslissing nodig; pas daarna worden opdrachten servermatig herberekend. Verloren antwoorden worden met opdrachtnummers ontdubbeld.

**Lokale opslag is geen vertrouwd bewijs van herkomst.** Op een onbeheerd apparaat kan iemand oude opdrachten of gegevens in een lokale herstelkopie zetten. Het profiel kan daardoor servermatig niet worden verruimd, maar de oorsprong en het tijdstip van de inhoud zijn niet bewezen. Het docentvenster vermeldt dit vóór hervatten. Voor een streng gecontroleerde toets zijn beschermde opslag, apparaatbinding en een controleerbare herstelketen nodig; die ontbreken. Dit is een blokkerende randvoorwaarde voor beoordeelde afname, geen opgeloste beveiligingsclaim.

Een technische onderbreking is nooit automatisch bewijs van fraude. De log bewaart geen fraudelabel, score of automatische conclusie.
