27-03-06 11:59
Nedostaci rekurzivnih DNS upita
piše DINKO KORUNIĆ
Dok traje neprestana trka između sistem-administratora i različitih vrsta napadača s "one" strane Interneta, koriste se sve sofisticiranije tehnike napada. Posljednja, koja je predmet ovog članka, jest napad uz korištenje rekurzivnih DNS upita. Kao što vjerojatno znate, rekurzija omogućava DNS poslužiteljima da umjesto klijenta obave sav posao oko DNS rezolucije, neovisno o tome da li su autoritativni za traženi zapis (dakle, nije im lokalan već ga moraju dohvatiti s drugih poslužitelja).
Rekurziju ne treba miješati s reverznim DNS upitima, kada tražimo ime hosta čiju IP adresu znamo.
Osnovni problem oko rekurzivnih upita je njihova zahtjevnost - očigledno je da poslužitelj mora za svaki upit prolaziti po cijelom ili barem dobrom dijelu DNS stabla. Na kraju puta odgovor se pronalazi ili ne, te se odgovor šalje klijentu. Dakle, takvi upiti ne završavaju u kratkom vremenu, već zauzimaju računalne resurse duže vrijeme. U normalnoj situaciji, poželjno je omogućiti rekurzivne upite samo računalima za koje smo pružatelj usluge; dakle za računala u lokalnoj ustanovi, računala na lokalnim modemskim ulazima i sl. Nažalost, ogroman broj DNS poslužitelja je neispravno konfiguriran i omogućava korištenje rekurzivnih upita cijelom svijetu ili barem nekim ne-lokalnim klijentima. Prema opsežnim nezavisnim istraživanjima (Measurement Factory, sponzorirao InfoBlox) otkriveno je da oko 75% DNS poslužitelja na Internetu (dakle oko 1,3 milijuna DNS poslužitelja) otvoreno omogućava rekurziju svima.
Osnovni problem takvih konfiguracija je sljedeći:
Izvor napada: DNS poslužitelji koji omogućavaju rekurziju svima potencijalni su izvor DDoS napada. Naime, njih je moguće koristiti kao izvorišne točke za udaljeno kontrolirani distribuirani napad. Dovoljno je da napadač s centralne točke šalje male UDP pakete s lažiranom izvorišnom adresom koji predstavljaju pojedini upit. Svaki pojedinačni DNS poslužitelj je točka tzv. amplifikacije napada, budući da poslužitelj na spomenutu izvorišnu adresu odgovara relativno velikim odgovorom. Jasno je da se postiže visoka efikasnost napada ako klijent-napadač šalje upite tisućama poslužitelja u različitim mrežama koji odgovaraju i time efikasno onemogućavaju normalan rad odredišnoj mreži i računalu. Naravno, takav tip napada je relativno teško filtrirati i spriječiti zbog samog tipa komunikacije - zbog toga što predstavlja inače ispravne UDP odnosno DNS odgovore.
Trovanje DNS-a: nažalost, DNS protokol poslužiteljima omogućava slanje različitih dodatnih informacija u odgovorima na DNS upite. Napadač može iskoristiti rekurzivne DNS poslužitelje za DNS trovanje čime efikasno utiče da ranjivi DNS poslužitelji zapamte lažni odgovor na neke korisnikove upite, čime otvara prostor za niz dodatnih napada na klijentovu mrežu, računalo, itd. Najčešće se takav tip napada koristi za preusmjeravanje klijenata na Web poslužitelj napadača, pri čemu se odvija krađa osjetljivih informacija klijenta (kreditne kartice, korisničko ime i lozinka, itd) ili instalacija zloćudnih programa (virusa, špijunskih programa, trojanskih konja i sl).
Potencijalni DoS: kao što smo već objasnili, svaka rekurzija troši znatne računalne resurse. Otvoreni rekurzivni DNS poslužitelj omogućava da bilo koje računalo u svijetu može relativno lako onemogućiti normalan rad DNS poslužitelja, čime ometa normalni rad svih računala koje ovise o tom DNS poslužitelju.
Kako se zaštititi? U konfiguraciji Bind servisa obratite pažnju na dva mjesta. Možemo omogućiti, odnosno onemogućiti rekurziju pojedinačno po svakoj zoni, a možemo i globalno za sve zone, kao u našem primjeru. Pokažimo stoga konfiguraciju gdje smo pobrojali sav lokalni IP prostor u odgovarajućem CIDR zapisu u "trusted" ACL:
acl "trusted" {
161.53.116.0/22;
193.198.206.0/24;
193.198.217.192/27;
localhost;
};
Zatim ćemo globalno omogućiti rekurziju, ali samo za računala koja odgovaraju "trusted" ACL-u - dakle isključivo za računala kojima smo mi primarni ili sekundarni DNS poslužitelj:
options {
...
recursion yes;
allow-recursion { trusted; };
...
}
Pristupnu listu definirajte ispred opcija. Doduše bind koristi rekurzivni parser, pa će raditi i ako je stavite kasnije. No logičnije je da u trenutku poziva lista već bude definirana.
Preporučujemo da proučite "Secure BIND Template", izvrstan tekst o sigurnoj konfiguraciji Bind poslužitelja.
|