Stack Overflow w proftpd!

Data publikacji: 05/11/2010, CERT Polska

proftpd

W popularnym serwerze FTP znaleziono klasyczny błąd pozwalający nadpisać dane znajdujące się na stosie. Dokładny opis błędu można znaleźć na bugzilli proftpd :
http://bugs.proftpd.org/show_bug.cgi?id=3521. Błąd zgłoszony przez TippingPoint związany jest z czytaniem sekwencji znaków zaczynających się od TELNET_IAC (opis sekwencji w RFC854). Możliwe jest przeprowadzenie zdalnego ataku na serwer FTP. Podatne są wersje 1.3.2 oraz 1.3.3.

Dziecko zabite, kanarek na stosie oraz martwa wołowina

W laboratorium CERT Polska udało się pomyślnie przeprowadzić atak na serwer FTP. Proftpd dla każdego nowego połączenia tworzy nowy proces potomny (child). Atak nie powoduje awarii całego serwera FTP – zakończony zostaje jedynie proces potomny. W przypadku kiedy w systemie aktywne były mechanizmy ochrony przed tego typu błędami, atak zakończył się komunikatem o wykryciu uszkodzenia stosu. Więcej o „kanarkach na stosie” można przeczytać na wikipedii.

screen1

W przypadku braku mechanizmów ochrony możliwe jest nadpisanie ramek odłożonych na stosie. Udało się przeprowadzić atak, którego skutkiem jest ustawienie rejestru EIP na określoną wartość (w tym przypadku 0xdeadbeef).

screen2

Jak się zabezpieczyć?

Na dzień dzisiejszy (05/11/2010) nie został opublikowany żaden atak umożliwiający zdalne wykonanie wstrzykniętego kodu. Niestety może być to tylko kwestia czasu.Jak można się było spodziewać 7/11/2010 na liście Full Disclosure pojawił się remote exploit platformy Linux i BSD.

W wersji CVS został już wprowadzony patch w pliku plik netio.c :

 /* In the situation where the previous byte was an IAC,
 * into the output buffer, and decremented buflen (size
 * buffer remaining). Thus we need to check here if bu
 * before trying to decrement buflen again (and possibl
 * the buflen size_t data type).
 */
 if (buflen == 0) {
   break;
 }
 *bp++ = cp;
 buflen--;
}

Dostępna jest również reguła dla snort-a wykrywająca próby ataków wykorzystujących opisaną lukę:

alert tcp any any -> any 21 (
    msg:"ProFTPd stack overflow ";
    pcre:"/[^x0A]+xFF[^xFF|xFE|xFD|xFC|xFB|xF4|xF2].+[x0Ax00]/";
    sid: 120002;
    rev: 5;
)