Detekcja phishingu oparta na uczeniu maszynowym

We wcześniejszym wpisie, poznaliśmy co to jest phishing, jak bardzo jest to zjawisko groźne dla każdego użytkownika sieci komputerowej (Internet) oraz zobaczyliśmy jak może wyglądać standardowy atak z wykorzystaniem elementów inżynierii społecznej – która znacznie zwiększa skuteczność powodzenia samego ataku.

W dzisiejszym wpisie, zademonstruje model, który wykorzystując metody uczenia maszynowego, pozwoli na skuteczne wykrywanie ataku, bez względu na zastosowaną technikę.

W artykule zastosuje kilka uproszczeń – dokładny opis całego mechanizmu, zajął mi …. 274 strony 🙂 Wpis ma na celu zademonstrowanie możliwości uczenia maszynowego w podniesieniu poziomu bezpieczeństwa.

Dlaczego uczenie maszynowe? Nastała pewna moda by dziś każda firma, w każdym produkcie oferowała „uczenie maszynowe” – abstrahując od konieczności jego zastosowania (klasyczny algorytm równie dobrze spełnia swoje zadanie) – nie rozumiejąc czym jest proces uczenia ,maszynowego i jakie mechanizmy stoją za nim (tak, będzie również cała seria poświęcona temu zagadnieniu). Stosując jednak metody uczenia maszynowego, możemy wykreować model detekcji ataku, odporny na zmianę wartości cech, wykryć nieznany dotychczas wzorzec (czego klasyczne metody nie potrafią, dopóki analityk taki jak ja :), ich nie uzupełni).

Każdy model uczenia maszynowego (o tym będę jeszcze pisał), potrzebuje w procesie jego trenowania (nauki) danych. Tymi danymi będą pewne cechy, wskazujące na możliwy atak phishingowy. Gdzie je znajdziemy? W każdej, phishingowej wiadomości email…

Każda wiadomość email, składa się ze zwykle niewidocznego dla odbiorcy nagłówka wiadomości (programy pocztowe, nie wyświetlają tych danych z wyjątkiem kilku pół: nadawcy, tematu, daty), właściwej treści wiadomości (tekstowej lub sformatowanej za pomocą języka HTML) oraz ewentualnych załączników. Na pierwszy rzut oka, nie ma tu nic ciekawego. Więc co może świadczyć o phishingowym charakterze, oprócz oczywistego odnośnika w treści wiadomości do strony phishingowej? Otóż właśnie niewidoczne dla odbiorcy pola nagłówka…

Wyświetlając źródło wiadomości, możemy zobaczyć mnóstwo informacji, istotnych dla użytkownika skupionego na treści wiadomości, ważnych natomiast dla systemu pocztowego oraz na potrzeby analizy (w tym właśnie wykrywania ataku phishingowego). Przykładowy nagłówek może wyglądać w następujący sposób:

Return-Path: <FtX2aGpSLNAgDhEh2Ntq@technotechme.store>
Delivered-To: <imie.nazwisko@wp.pl>
X-WP-SR: dWyc6KUtsT+WCW1uskg0A8rsLrusyQzka1PSAq1L0+/x56R3lKWQgYmF1UoTSp28MVs
 =
Received: (wp-smtpd mx.wp.pl 29602 invoked from network); 1 Mar 2023 23:45:48 +0100
Received: from 170-187-176-125.ip.linodeusercontent.com (HELO technotechme.store) ([170.187.176.125])
          (envelope-sender <FtX2aGpSLNAgDhEh2Ntq@technotechme.store>)
          by mx.wp.pl (WP-SMTPD) with SMTP
          for <imie.nazwisko@wp.pl>; 1 Mar 2023 23:45:48 +0100
Message-ID: <4T1017EroAjvcy6Ttwa5M-authsmtp@technotechme.store>
From: "60563Centrum dystrybucji" <NOREPLY@1LOGIN.WP.PL>
Subject: 60563Śledź przesyłkę: 90071329
To: "imie.nazwisko@wp.pl"<imie.nazwisko@wp.pl>
CC: <imie.nazwisko@wp.pl]>
Content-Type: text/html
Content-Transfer-Encoding: 7bit
X-WP-DKIM-Status: no signature (id: n/a)                                                      
X-WP-MailID: e3a96695adcf712f34a9b0ebe09f875d
X-WP-AV: skaner antywirusowy Poczty Wirtualnej Polski
X-WP-SPAM: YES (U9) 0100119 [QBaU]    

Wydobywając wartości niektórych pól (np. adres pola „Return-Path”, odnośniki URL, itp.), można przetworzyć ich wartości w systemie regułowym a następnie załadować je w postaci binarnego wektora cech o konstrukcji:

f_i = \begin{cases}
   0 &\text{if } value[i] \notin phishing\\
   1 &\text{if } value[i] \isin phishing
\end{cases}

gdzie:

0 – wartość pola nie wskazuje na możliwy phishing

1 – wartość pola wskazuje na możliwy phishing

Kodując w powyższy sposób cechy, uzyskujemy wektor:

f = \lang f_0, f_1, ..., f_i \rang

Tak zapisane wektory, posłużą jako dane uczące naszego modelu uczenia maszynowego.

W literaturze opisanych jest jest wiele (i dość dobrze omówionych) różnych modeli, które możemy wykorzystać do wykrywania phishingu. Do popularnych należą sieci neuronowe, Naiwny Klasyfikator Bayesa, Maszyna Wektorów Nośnych (SVM), regresja logistyczna i liniowa, drzewa decyzyjne, lasy losowe. Jaki więc model wybrać? Oczywiście, dobór najlepszego modelu należy przeprowadzić eksperymentalnie dla odpowiedniej jakości danych uczących.

Na potrzeby tego wpisu, zbudujemy model oparty o Maszynę Wektorów Nośnych (SVM). Czym jest Maszyna Wektorów Nośnych? Jest to klasyfikator1 wyznaczający hiperpłaszczyznę rozdzielający z maksymalnym marginesem zbiór danych należących do dwóch różnych klas. Graficznie można przedstawić działanie klasyfikatora w następujący sposób:

rys. 1 Zobrazowanie maszyny SVM. Źródło: opracowanie własne.

Zadaniem klasyfikatora SVM jest wyznaczenie granicy decyzyjnej (hiperpłaszczyzny rozdzielającej dwie klasy) oraz możliwie najszerszej granicy dyskryminacji (marginesu klasyfikatora) spośród możliwych, których zwykle istnieje nieskończona ilość (maksymalizacja marginesu). Nie będę przytaczał wzorów (ciekawskich odsyłam do świetnego wykładu prof. Patricka Winstona zarejestrowanego na MIT: https://www.youtube.com/watch?v=_PwhiWxHK8o ).

Mamy już wybrany model, dysponujemy danymi uczącymi (zakodowanym binarnie wektorem cech), pora więc zbudować model. Do tego celu najlepszym wyborem będzie biblioteka sklearn języka Python.

from sklearn import svm
from sklearn.svm import SVC
from sklearn.model_selection import GridSearchCV, train_test_split

Zacznijmy od przygotowania danych. Jak już wspomniałem danymi uczącymi jest kodowany binarnie wektor. Stwórzmy więc plik CSV, w którym każdy wiersz odpowiadał będzie nowemu egzemplarzy danych, a w kolumnach zapisane będą wartości poszczególnych cech (0 lub 1). W procesie nauki nadzorowanej2, każdy egzemplarz danych uczących musi być zaopatrzony w etykietę, mówiącą modelowi do jakiej klasy należą te dane. Nazwa etykiety znajdować się będzie w pierwszej kolumnie. Przykładowa zawartość pliku z danymi uczącymi:

phishing,0,1,0,0,0,0,1,0,0,0,0,0,0,0,1,1,0,0,0
phishing,0,1,0,0,0,0,1,0,0,0,0,0,0,0,1,1,0,0,0

Dane są więc odpowiednio sformatowane i zapisane w pliku. Napiszmy więc funkcję, która odczyta zawartość pliku:

#wczytanie biblioteki manipulacji i analizy danych
import pandas as pd

#załadowanie danych 
data = pd.read_csv(file_path, sep = ',', header=None)

#Przygotowanie danych, osobno cechy, osobno etykiety
X = data.iloc[:, 1:].values #cechy
y = data.iloc[:, 0].values #klasy

Odczytane dane, należy podzielić na dwa zbiory: treningowy (80% zbioru) oraz testowy (20% zbioru):

 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

Dane są odczytane, podzielone na zbiory treningowy i testowy, rozpocznijmy więc proces uczenia:

Model(X_train, X_test, y_train, y_test)

Zaraz, zaraz …. A gdzie model?! 🙂 Zanim więc rozpoczniemy proces nauki, zbudujmy więc funkcję odpowiadającą za proces uczenia. Zanim jednak przejdziemy do kodowania, jeszcze kilka słów wyjaśnienia.

  1. W tym wpisie nie będę wyjaśniał zasad działania Maszyny Wektorów Nośnych – zrobię to w osobnym artykule, poświęconym tylko temu klasyfikatorowi,
  2. Nie będę opisywał parametrów uczenia klasyfikatora SVM, ani procesu ich strojenia – będzie na to miejsce w artykule wspomnianym powyżej,
  3. Przedstawiony opis uczenia maszynowego zawiera wiele uproszczeń, gdyż celem jest ukazanie możliwości jego zastosowania do konkretnego zadania – wykrywania phishingu.

Budując jakikolwiek model uczenia maszynowego, naszymi intencjami jest uzyskanie jak najlepszych efektów uczenia maszynowego. W tym celu konieczne jest zapewnienie strojenia różnych parametrów klasyfikatora (wybór jądra3, parametry zasięgu jądra, wagi regularyzacji – o tym będę pisał omawiając dany klasyfikator). Upraszając, zastosujemy najprostsze jądro dla tego modelu, a następnie rozpoczniemy proces trenowania klasyfikatora Maszyny Wektorów Nośnych.

def Model(X_train, X_test, y_train, y_test):
   
    # definicja modelu SVM 
    model = SVC(kernel='linear')

    # Trenowanie (uczenie) klasyfikatora
    model.fit(X_train, y_train)

I już! Nasz model jest wytrenowany na wczytanych z pliku danych uczących!

Uwaga! Przedstawiony kod ma za zadanie zademonstrować możliwość wykorzystania uczenia maszynowego w detekcji phishingu. Byś mógł go wykorzystać w celach produkcyjnych, należy go uzupełnić o strojenie parametrów oraz zadbać o właściwe dane.

Teraz pora na testowanie naszego modelu. Do tego celu wykorzystamy pozostałe 20% danych odczytanych z pierwotnego zbioru danych uczących.

# Predykcja na danych testowych
y_pred = model.predict(X_test)

Model jest wytrenowany, sprawdzony na danych testowych, przekonajmy się więc jak dokładnie przewiduje wystąpienie phishingu. Dokładność przewidywania modelu określa parametr accuracy (dokładność), który możemy wyrazić wzorem:

ACC =  \frac {(\sum TP+ \sum TN)}{ P}

gdzie:

∑TP – suma cech, które otrzymały klasę True Positive

∑TN – suma cech, które otrzymały klasę True Negative

P – wielkość populacji (ilość wszystkich cech wskazujących na phishing)

Biblioteka sklearn posiada wbudowaną funkcję, która z powodzeniem obliczy dla nas dokładność naszego modelu:

# Sprawdzenie dokładności klasyfikacji
accuracy = accuracy_score(y_test, y_pred)

W moich modelach, dla pozyskanych danych uzyskałem dokładność na poziomie 88.13775510204081. Jest to bardzo dobra wartość wyjściowa, do strojenia parametrów nauki klasyfikatora oraz pozyskania właściwych danych uczących (od jakości tych danych w ogromnej mierze zależeć będzie jakość modelu i dokładność jego przewidywania).

Pozostaje nam już właściwie ostatni element budowy modelu. Dodanie funkcji, która dla nowych danych określa do jakiej klasy należą:

# Predykcja na nowych danych
y_pred = model.predict(X_new)

I to już cały model! Nie takie uczenie maszynowe straszne 🙂

Pamietaj! Wpis ten miał na celu zademonstrowanie możliwości wykorzystania technik uczenia maszynowego do detekcji ataku phishngowego. By móc ten model zastosować jako model produkcyjny, konieczne jest właściwe jego wystrojenie (wspomniałem wyżej o strojeniu parametrów), zebraniem odpowiedniej ilości danych w postaci wiadomości email (właściwe proporcje danych zarówno phishingowych jak i stanowiącej normalną, nie złośliwą korespondencję – by nie wystąpił efekt tzw. skrzywienia danych).

Mam nadzieję, że Cię zainteresowałem wykorzystaniem uczenia maszynowego. Możliwości jego zastosowania są przeogromne. Automatyzacja pracy, zwiększenie efektywności, wydajności, przyśpieszenie procesów, odkrywanie nowych modeli!!

źródło: https://wallpapers.com/terminator


[1] Klasyfikator – rodzaj algorytmu, który otrzymując nieznane dane, potrafi na podstawie wcześniejszych próbek danych, przypisze je do jednej z określonych klas decyzyjnych (zklasyfikuje je).

[2] Nauka nadzorowana – sposób treningu algorytmu uczenia maszynowego

[3] funkcja jądra (ang. kernel) – funkcja używana do przekształcenia danych wejściowych do przestrzeni o wyższej wymiarowości, gdzie klasy mogą być łatwiejsze do rozdzielenia przez hiperpłaszczyznę

Zostaw komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

Przewijanie do góry