2011-07-31 27 views
15

Pracuję dla webhosta, a moje zadanie polega na wyszukiwaniu i czyszczeniu zhakowanych kont. Sposób, w jaki znajduję dobre 90% powłok \ malware \ injections, polega na szukaniu plików, które są "nie na miejscu". Na przykład eval(base64_decode(.......)), gdzie "....." to cała masa tekstu base64, który zazwyczaj nigdy nie jest dobry. Nieco dziwne pliki wyskakują na mnie, kiedy przeglądam pliki na ciągi kluczy.Wykrywanie anomalii za pomocą Pythona

Jeśli te pliki wyskoczą na mnie jako człowiek, jestem pewien, że mogę zbudować jakiś profiler w pythonie, aby wyszukać rzeczy, które są "nie na swoim miejscu" statystycznie i zgłosić je do ręcznego sprawdzenia. Aby rozpocząć myślałem mogę porównać długość linii w plikach php zawierających najważniejsze ciągi (eval, base64_decode, exec, gunzip, gzinflate, fwrite, preg_replace, itd.) I wyglądają na linie, które odbiegają od średniej o 2 odchylenia standardowe.

Długość linii jest bardzo różna i nie jestem pewien, czy byłaby to dobra statystyka do użycia. Innym podejściem byłoby przypisanie ważonych reguł do kreślenia rzeczy (długość linii powyżej lub poniżej progu = X punktów, zawiera słowo upload = Y punktów), ale nie jestem pewien, co mogę zrobić z wynikami lub jak zdobyć punkty atrybut. Moje statystyki są trochę zardzewiałe.

Czy ktoś mógłby wskazać mi właściwy kierunek (przewodniki, tutoriale, biblioteki) do profilowania statystycznego?

+3

Ta sugestia jest trochę szeroka, aby naprawdę być przydatna, ale możesz spróbować podejścia bayesowskiego. Zbuduj korpus "dobrego" kodu i korpusu "złego" kodu i zbuduj lub użyj klasyfikatora aa (prawdopodobnie możesz użyć bezpośrednio jednego z różnych filtrów antyspamowych), aby przewidzieć, czy dany fragment nowego kodu jest bardziej prawdopodobny. być członkiem "dobrego" lub "złego" korpusu. Google do nauki bayesowskiej, filtrowania spamu itp. Byłbym skłonny przypuszczać, że możesz bezpośrednio użyć do tego projektu filtrującego spam, zamiast pisać coś od podstaw. –

+1

@Joe, Josh - jeśli wybierzesz bayesowskie podejście, w przeszłości używałem wielebnego z podobnymi problemami. Uzyskanie racjonalnych rezultatów jest łatwe, jeśli możesz uzyskać poprawne zbiory danych. http://reverend.sourceforge.net/ –

Odpowiedz

5

Oto prosty uczenie maszynowe podejście do problemu, i to, co bym zrobił, aby zacząć na ten problem i opracować wyjściową klasyfikator:

Zbuduj korpusie skryptów i dołączyć etykietę albo „dobre "(label = 0) lub" bad "(label = 1) im więcej tym lepiej. Postaraj się, aby "złe" skrypty stanowiły rozsądną część całego korpusu, 50-50 dobra/zła jest idealna.

Opracowanie funkcji binarnych wskazujących podejrzane lub złe skrypty. Na przykład obecność "eval", obecność "base64_decode" .Bądź tak wszechstronny, jak możesz być i nie bój się włączania afeature, które mogłyby uchwycić niektóre "dobre" skrypty też. Jednym ze sposobów, aby to zrobić, może być obliczenie liczby częstotliwości słów w dwóch klasach skryptu i wybranie jako słów funkcji, które pojawiają się wyraźnie w "złym", ale rzadziej w "dobrym".

Uruchom generator cech nad korpusem i zbuduj binarną macierz funkcji z etykietami.

Podziel korpus na pociąg (80% przykładów) i zestawy testów (20%). Korzystając z biblioteki nauki scikit, trenuj kilka różnych algorytmów klasyfikacji (losowe lasy, maszyny wektorowe, naiwne itd.) Z zestawem treningowym i testuj ich wydajność na niewidocznym zestawie testów.

Mam nadzieję, że mam odpowiednią dokładność klasyfikacji do porównania z. Następnie przyjrzałbym się ulepszeniom funkcji, kilku nienadzorowanym metodom (bez etykiet) i bardziej wyspecjalizowanym algorytmom, aby uzyskać lepszą wydajność.

Jeśli chodzi o zasoby, dobrym pomysłem jest oczywiście kurs Coursery Andrew Nga na temat uczenia maszynowego (który zawiera przykładową klasyfikację spamu).

Powiązane problemy