Eigen project / onderzoek
Cipher
Cipher is een experimentele programmeertaal. Ze onderzoekt één vraag in het bijzonder: kunnen de regels over waar gevoelige data heen mag door de compiler worden gecontroleerd, zodat ze standhouden ook als iemand ze vergeet.
Eén waarde, gecontroleerd bij het compileren
Het probleem waar het naar kijkt
De meeste privacy- en beveiligingsproblemen zijn niet exotisch. Een waarde die privé had moeten blijven belandt in een logregel, een API-antwoord of bij een derde partij, omdat niets in de taal dat tegenhield.
Code review, linters en runtimecontroles vangen een deel hiervan. Ze vangen het laat, ze vangen het ongelijkmatig, en ze zijn afhankelijk van iemand die weet dat hij moet kijken.
Het idee
Geef de compiler genoeg begrip van welke waarden gevoelig zijn dat hij ze door een programma kan volgen en kan controleren hoe ze gebruikt worden.
Waar een gebruik de regels breekt, wordt de build afgekeurd. De regel houdt dan stand door hoe de taal in elkaar zit, niet omdat iedereen er die dag aan dacht.
Waar de compiler mee werkt
Cipher voegt een kleine set onderzoekstypen en controles toe. Dit zijn de onderdelen die het information-flow-idee dragen.
secret<T>
Een markering die een waarde als gevoelig aanmerkt. Ze reist met de waarde mee door het programma zoals een type dat doet, zodat de compiler ziet waar de waarde heen gaat.
Een declassificatiegrens
Een geheime waarde wordt pas een gewone waarde via een expliciete, gecontroleerde stap. Een gewone toewijzing of een cast doet het niet.
capability<A>
Bevoegdheid om iets met verhoogde rechten te doen, doorgegeven als een waarde die zichtbaar is in de code, in plaats van een omgevingsbrede rechtentoekenning die altijd beschikbaar is.
temporary<T>
Een waarde waarvan de opslag bij het verlaten van de scope wordt gewist, zodat een geheim niet langer in het geheugen blijft staan dan nodig.
Runtime policy guards
Een tweede grens die tijdens het draaien controleert, voor de gevallen die de compiler niet zelf kan afhandelen.
Native compilatie
Cipher compileert naar native code via LLVM. De controles draaien in de compiler, niet als los hulpmiddel dat overgeslagen kan worden.
Hoe een afgekeurde flow eruitziet
Een kort voorbeeld, met echte Cipher-identifiers. Het gaat om de eerste regel die niet compileert.
let password: secret<string> = "hunter2"
say(password) // afgekeurd: een geheime waarde direct naar output
let intent = request_intent("Declassify")
let cap = prove(intent)
let visible: string = declassify(password, cap)
say(visible) // toegestaan: gedeclassificeerd via een expliciete capability
Waar Cipher staat
Cipher is een research-alpha. Ze compileert en draait echte programma's, en de information-flow-controles die hier beschreven staan werken voor de gevallen waarvoor ze gebouwd zijn. Ze is niet productierijp en mag nog niet worden gebruikt om echte gevoelige data te beschermen.
De broncode is niet openbaar en er is geen releasedatum. Wat op deze pagina staat is een beschrijving van werk in uitvoering, geen plan of belofte.
- Werkt: de compiler en de taal, en de flow-controles voor outputs die de compiler kent.
- Nog experimenteel: de onderdelen buiten de kern van de taal, waaronder versleutelde opslag en messaging.
- Niet het hele plaatje: de controles verkleinen onbedoelde blootstelling. Ze zijn geen bescherming tegen elke soort aanval en gelden niet voor code buiten de controles van Cipher zelf.
Waarom ik hieraan werk
Cipher is waar ik mijn denken over beveiliging en betrouwbaarheid tegen een moeilijk probleem leg, op eigen initiatief en zonder dat een deadline het antwoord bepaalt.
Wat het oplevert komt terug in hoe ik andere software ontwerp en beoordeel. Cipher is geen product, en klantcode wordt nooit gebruikt om het te ontwikkelen.
Waar u verder kunt
Cipher is één onderdeel van mijn werk.