Iteam
GitHub

De fem farligaste programmeringsfelen

Datorexperter från 30 kända organisationer sätter varje år ihop en lista över de farligaste programmeringsfelen. Farlighetsnivån är en sammanvägning av hur vanligt förekommande de är, hur lätta att utnyttja de är och hur stor skada de kan ställa till med. Bland de 25 farliga felen finns en kombination av gamla klassiska fel som kan uppstå i all form av /Utveckling och en uppsättning lite nyare som har med webb/Utveckling att göra. Här är topp tre:

1. Cross-site scripting (XSS)

Officiell benämning: Failure to Preserve Web Page Structure

Beskrivning: Cross-site scripting innebär att en angripare lyckas få in egen javascript-kod i HTML-koden för en sida på någon annans webbplats. För besökaren(s webbläsare) ser det ut som att all kod kommer från webbplatsen och på så sätt kan angriparen hämta ut t.ex. cookies med sparade lösenord och sessionsdata. Ett exempel är ett diskussionsforum som tillåter att man matar in HTML-taggar och scriptkod. Här är en ganska lång men bra animering som förklarar XSS: http://www.virtualforge.de/vmovie/xss_selling_platform_v1.0.php

Kända webbplatser som har råkat ut för XSS är Facebook, Myspace och Google.

Lösning/skydd: kontrollera alla indata. Bestäm vilka värden som är godkända, inte vilka som är otillåtna.

2. SQL Injection

Officiell benämning: Improper Sanitization of Special Elements used in an SQL Command

Beskrivning: SQL Injection innebär att en angripare lyckas skicka in egen kod som körs i en webbplats databas. Det vanligaste sättet är även här att man inte kontrollerar sina indata ordenligt. Det är väldigt vanligt att webbplatser inte har ett adekvat skydd mot detta.

Lösning/skydd: kontrollera alla indata. Om man använder .NET så ska man alltid använda de metoder som har SQL-parametrar (särskilda .NET-klasser) när man skapar SQL-frågor, aldrig skarva ihop egna strängar (särskilt inte med indata från användare) till SQL-frågor.

3. Classic buffer overflow

Officiell benämning: Buffer Copy without Checking Size of Input

Beskrivning: Buffer overflow är den mest klassiska av alla säkerhetsluckor och antagligen den första. Om man lägger ett för stort värde i en variabel (t.ex. fler tecken än som ryms i en sträng) så kan de överskjutande tecknen skriva över minne som hör till andra variabler. På så sätt kan en skicklig angripare skriva över till exempel variabeln som innehåller inloggad användares säkerhetsnivå, och plötsligt bli administratör genom att bara ange ett för långt användarnamn som är konstruerat på rätt sätt. Det kan tyckas svårt att konstruera en sån sträng utan stora kunskaper om exakt hur applikationen är konstruerad, men sen man först kom på idén 1972 har extremt många attacker gjorts på detta sätt. Några av de kändaste är IIS 5-masken Code red, och SQL 2000-viruset SQL Slammer. Det är också buffer overlow som har använts för att hacka XBOX, PSP och iPhone för att tillåta att användare kan köra egna program, trots att plattformarna egentligen inte tillåter det.

Lösning/skydd: kontrollera alltid storleken på de värden som läggs i variabler. I s.k. managed languages som C# där systemet själv hanterar minnet så finns inbyggda skydd mot buffer overflow, det vanligaste är att attacker görs mot språk som C och C++ där programmeraren själv hanterar minnet i applikationskoden.

Resten av listan finns här: http://cwe.mitre.org/top25/index.html

Via The Register, via slashdot.

Anders Bornholm
2010-02-19