Code signing
Door: Tom Tervoort
Wat is code signing?
Digitale handtekening onder stuk software
Geeft garanties over bron
Voorkomt modificatie door derden
Bijvoorbeeld met doel malware toe te voegen
Ontvanger software heeft verificatiemechanisme en publieke sleutel nodig
Hoe werkt het?
Bij softwarerelease: maak een 'vingerafdruk'
Elke afdruk dient 'uniek' te zijn voor deze code
Gebruiker kan ook afdruk maken
Methode: cryptografische hashfunctie
Versleutel afdruk met geheime sleutel
Bijvoorbeeld met RSA of ElGamal
Gebruiker bezit publieke sleutel
Kan overgelaten worden aan instantie
Lever versleutelde afdruk mee met software
Wat doet het wel/niet?
'Correcte' code signing garandeert:
Authenticiteit
Integriteit
Bewijsbaarheid van eigenaar
Maar niet:
Goedwillendheid van ontwikkelaar
Absentie van malware
Ook wanneer niet de intentie van ondertekenaar D.m.v. modificaties vóór ondertekening
Mogelijke toepassingen
Updatemechanisme
Software repositories
Bijv. in OS, virusscanner Hoster hoeft niet vertrouwd te worden
'Extended priviliges' in browser
Gebruiker geeft toestemming
ActiveX, signed Javascript
In de praktijk onveilig
De vingerafdruk
Functie over alle bits in software en certificaat
Resultaat is een zo uniek mogelijke bitreeks
Enige modificatie software => andere vingerafdruk Er bestaan programma's met dezelfde afdruk
Maar deze dienen moeilijk te vinden te zijn
Cryptografische hashfunctie
Oplossing: 'sterke' cryptografische hashfunctie
Eisen:
Hash niet te klein
Niet inverteerbaar
Zwakke botsingvrijheid
Aanvaller kan geen ander programma met zelfde afdruk vinden
Sterke botsingvrijheid
Aanvaller kan ook geen botsende programma's genereren
Kraken hashfunctie
Brute-force
Programma random aanpassen tot toevallige match
Chosen prefixaanval
Verjaardagsaanval
Twee programma's tegelijk brute-forcen
Complexiteit: O(2n/2)
MD5
Populaire hashfunctie
128-bit hashes
Verjaardagsaanval in O(264)
1996: eerste botsing gevonden
2008: bestaande X.509-certificaten vervalsen
RFC 6151: ”MD5 niet meer acceptabel”
Tenminste, voor code signing
Kraken kan al na zo'n 250 evaluaties
SHA-1
Secure Hash Algorithm
Afkomstig van de NSA
Veel theoretische aanvallen
Verjaardagsaanval: O(280)
Geclaimt record: botsing na 257 evaluaties
Maar: nog geen in de praktijk gedemonstreerd
SHA-2: (nog) geen aanvallen gevonden
Encryptie van afdruk
Assymetrische encryptie
Meestal RSA
'Correcte' RSA-implementatie is veilig
Sleutel moet wel groot genoeg zijn
Tenzij iemand snel factoren kan ontbinden
Maar niet elke implementatie is correct
Bugs benutten
Voorspelbare RNG
De geheime sleutel
Hoe houd je de geheime sleutel privé?
Overlaten aan een gespecialiseerde partij
Zo min mogelijk blootstellen aan buitenwereld
CA? Ontwikkelaar OS? Smartcard, hardwaremodule Analoge beveiliging
… en hoe zit het met de source code?
Misschien wel essentiëler dan sleutel!
De publieke sleutel
Hoe distribueer je de publieke sleutel?
Aanwezig in OS
Meeleveren met software
Duurdere en veiligere host (+ veilig kanaal)
Via certificaat
Enkel eerste download 'onveilig'
Net zo belangrijk:
Controleprogramma vingerafdruk
Kwetsbare punten
Vingerafdruk
RSA-implementatie
Geheime sleutel
Publieke sleutel
Verificatieprogramma
Voorbeelden praktijkaanvallen
Flamevirus
Via Windows-update
MD5-botsing, trucs met certificaten
Nintendo Wii
Domme fout in verificatie vingerafdruk
Axis-browser van Yahoo
Geheime sleutel in code!
Conclusie
Code signing
Geeft 'garantie' van authenticiteit en integriteit
Ideaal voor distributie updates
Geen vertrouwde host nodig
Maar:
Kies de juiste crypto-algoritmen (makkelijk)
Bescherm en verspreid sleutels juist (moeilijk)
Maak geen implementatiefouten (bijna onmogelijk)