Meerdere lines of defense: overkill of noodzaak?

ICT security krijgt steeds meer de aandacht die het verdient. Sinds 11 september vorig jaar en na een aantal geruchtmakende wormen en virussen, lijkt iedereen meer en meer doordrongen te raken van de kwetsbaarheid van ICT. Software producenten besteden inmiddels meer aandacht aan ICT security en ook netwerk beheerders zijn een steeds groter deel van hun kostbare tijd hieraan kwijt.

Speciaal voor MCSE.nl. en haar leden schrijven specialisten van Madison Gurkha een reeks praktische artikelen over ICT security in het algemeen en die van Microsoft in het bijzonder. Deze keer Guido van Rooij over het zorgvuldig omspringen met security: de noodzaak voor meerdere lines of defense.

Als antwoord op een historie van security problemen in diverse Microsoft producten, heeft Microsoft eerder dit jaar een Security Initiatief ontplooid. Dit initiatief moest leiden tot veiligere producten, onder meer door een grootschalige audit van alle soure code, en door software ontwikkelaars cursussen te geven over secure programmeren.

Het lijkt allemaal simpel, maar een recente posting van Michael Howard van Microsoft op de Bugtraq mailing list, en de discussie die daarna ontstond, laat een geheel ander beeld zien.

De discussie spitste zich toe op hoe een programma om zou moeten gaan met passwords die een gebruiker ingeeft. Normaal gesproken wordt en password gevraagd door een programma, wordt het password geverifieerd en daarna komt de laatste maar zeer belangrijke stap: het wissen van het password in het geheugen. Wanneer deze laatste stap wordt overgeslagen, dan staat het ingegeven password nog steeds ergens in het werkgeheugen.

"Nou en?", zult u misschien zeggen, maar bedenk maar eens wat er gebeurt wanneer het systeem te weinig werkgeheugen krijgt. Dan worden delen van het geheugen in de swap file neergezet. Dus op disk!

Een gesimplificeerd stukje programma in de taal C ziet er als volgt uit:

int
check_password {
char passwd[128];
int result;

result = 0;
if (get_password(passwd, 127)) {
if (correct_password(passwd)) {
result = 1;
}
}

memset(passwd,0,128);

return result;
}

De memset(..) aanroep zorgt ervoor dat het stuk geheugen waar eerst het potentiele password stond, wordt overschreven met nullen. Echter: dat gebeurt niet!

Waarom niet? Wel de meeste compilers hebben in de gaten dat er niets meer met het password gebeurt na de aanroep van de memset() functie. En dus optimaliseren ze de gehele memset() aanroep weg.

Het toevoegen van het woord volatile zou dat de oplossing moeten bieden: volatile char passwd[128];

Fout. Ook dat werkt niet, afhankelijk van de compiler en c-library. De specifieke reden is hier niet zozeer van belang.

Wat wel van belang is dat zelfs wanneer het design in orde is, de programmeurs hun werk goed lijken te doen, er toch nog steeds security problemen kunnen zijn. Een certificering kan daar eigenlijk niets aan toevoegen.

Dit lijkt een nogal demotiverende uitspraak. Er zijn echter wel degelijk een aantal maatregelen die u zelf kunt treffen. Wanneer u een systeem configureert, ga er dan vanuit dat security maatregelen die u neemt, kunnen worden doorbroken. Gebruik daarom meerdere lagen van security. Als voorbeeld wil ik IIS noemen. Zorg er eerst voor dat alle niet gebruikte extensies uit staan. Maar zorg er ook voor dat de IIS user enkel leesrechten heeft op de partitie waarop IIS draait. Zo wordt de impact van een mogelijk onbekende security probleem van IIS beperkt.

Binnenkort meer over interessante aspecten van ICT security door Madison Gurkha op MCSE.nl..

Meer informatie:
Madison Gurkha, Technology Think Tank
http://www.madison-gurkha.com
info@madison-gurkha.com