Appropå C och säkerhet

1/12/2009

Systemutveckling har jag inte haft någon stor talang för vad jag vet. Däremot kan jag programmera ganska ok. Fast mest lite äldre programmeringsspråk och bäst gillar jag C. C är så begränsat och dåligt för att skapa bra struktur att det tvingar dig till att programmera pedantiskt. Det passar mig bra. I C har jag gjort en del mindre serverlösning, implementerat ett par kommunikationsprotokoll och två eller tre säkerhetsprotokoll. Att C ännu är vanligt för sådant har att göra med:

  • En C kompilator (normalt) finns till alla aktuella hårdvaruplattformar. Bra för kommunikationsprotokoll som ligger lägre.
  • Det här är komplex kod och man återanvänder och bygger vidare på bibliotek som funnits i evighet.
  • C var förr ett bra val därför att det var snabbt och optimering var då väldigt viktigt för säkerhetslösningar och kommunikation därför att det blev så slött annars på den gamla sunkiga hårdvaran.

Förutom att återanvända kod eller för man ligger hårdvarunära ser jag ingenting bra med C när det kommer till säkerhet. Tvärtom återkommer samma fel gång på gång i nya respektive gamla lösningar.

OpenSSL visar problemet med C och säkerhet

Eftersom vi nu fått en ny version av OpenSSL 7 januari i år var jag in och tog mig en titt på den. OpenSSL har jag använt som allmänt krypteringsbibliotek och för att lägga SSL-stöd till diverse saker ett antal gånger. Det här är samma sak som hette SSLeay för evigheter sedan och som Young och Hudson sålde till det som åtminstone ett tag hette RSA Security (och en viss tid Security Dynamics efter att företaget med samma namn köpte det som jag tror bara hette RSA innan). Dock eftersom SSLeay var öppenkällkod startade folk upp ett nytt projekt och kallade det OpenSSL.

Den första OpenSSL (då egentligen SSLeay) kom i slutet av 1998. C-koden i OpenSSL har alltid varit vad vi kan beskriva som plågsamt "komplex", "svåröverskådlig" och "buggig". Fast det har blivit bättre (eller om man bara inbillar sig det därför att man nu känner igen alla underligheter). Genom åren har ju kunskapen säkerhetsproblem i C ökat liksom förhoppningsvis vanan hos de som engagerar sig. Trots det kommer det alltid nya eller så upptäcks gamla säkerhetsproblem i sådan här komplex C-kod.

Det är också ungefär samma typ av säkerhetsproblem som dyker upp som alltid dykt upp i säkerhetsprotokoll utvecklade i C eller mer allmänt. Låt mig här ta lite text från Wikipedia som beskriver ett av de senaste säkerhetshålen (men inte något av de sista jag känner till) i OpenSSL:

The Debian version of the OpenSSL library was the subject of a security breach discovered in late May 2008[6] whereby the version of OpenSSL bundled with Debian, Ubuntu, and other Debian-based distributions generated keys from a much smaller entropy pool than normal.
[Suck. Hur många gånger har vi inte sett säkerhetshåll p.g.a. det här genom åren?]

The problem was caused by trying to prevent Valgrind warnings related to the use of uninitialized memory within the OpenSSL libraries. This was done to try to make it easier to debug C applications that use the openssl libraries. If one assumes that uninitialized memory is uncorrelated to the other sources of entropy, this should not negatively affect security: OpenSSL does not depend upon using uninitialized memory for entropy. The relevant change removed two identical lines of code, however; of which one was actually used to add entropy from /dev/urandom to the pool; and so removing it meant that the pseudorandom number generator seed would be taken directly from the process ID, and nothing more. The change had been approved officially by the OpenSSL developers on their mailing list.
[Är inte det här nästan samma problem vi hade i Netscape med deras SSL för evigheter sedan? Eller blandar jag samman det med något annat? Det var ju förövrigt om jag inte helt tänker fel nu det som då hette Netscape som utvecklade de första versionerna av SSL-protokollet som med en enklare beskrivning av datatyper (struct) istället för ASN.1 som i SPKM blev det vanliga.]

Det som är så fantastiskt med OpenSSL är att så vitt jag vet har det än idag inte blivit av för någon att göra en färsk dokumentation av krypteringsstödet. Senaste är nog än idag tror jag den för SSLeay som uppdaterades tredje februari 1999: SSLeay Documentation (Columbia.edu). Och jag jag menar hur många applikationer, funktioner, förändringar av datatyper m.m. har inte olika versioner av OpenSSL ändrat om, tagit bort och lagt till? Jag vet inte. Det var flera år sedan jag sist tittade i SSLeay Documentation men det skulle inte förvåna mig om den fortfarande är användbar men plågsamt så för nybörjare om än mer plåga och mindre användbarhet än förr.

Tidigare bloggat

Mer om webbläsare och säkerhet: Google Browser Security Handbook
Diverse tips på läsning om försvarsfilosofi: IT- och informationssäkerhet -> Försvarsfilosofi

0 kommentarer

Kommentera