Magika: identyfikacja plików dzięki głębokiego uczenia

nfsec.pl 9 miesięcy temu

O

d początków informatyki dokładne wykrywanie typów plików miało najważniejsze znaczenie przy określaniu sposobu przetwarzania plików. System Linux wyposażony jest w bibliotekę libmagic i narzędzie file, które od ponad 50 lat stanowią de facto standard identyfikacji typów plików. W dzisiejszych czasach przeglądarki internetowe, edytory kodu i niezliczone inne oprogramowanie opiera się na wykrywaniu typu plików w celu podjęcia decyzji o poprawnym przetworzeniu i wyświetleniu zawartości plików. Na przykład nowoczesne edytory kodu wykorzystują wykrywanie typu plików, aby wybrać schemat kolorowania składni, który ma zostać użyty, gdy programista zacznie pisać kod w danym języku.

Dokładne wykrywanie typu plików jest niezwykle trudnym problemem, ponieważ każdy format pliku ma inną strukturę lub nie ma jej wcale. Jest to szczególnie trudne w przypadku formatów tekstowych i języków programowania, ponieważ mają one bardzo podobne konstrukcje. Jak dotąd libmagic i większość innych programów do identyfikacji typów plików opierała się na manualnie opracowanym zbiorze heurystyk i niestandardowych reguł do wykrywania każdego formatu plików. Takie manualne podejście jest zarówno czasochłonne, jak i podatne na błędy, ponieważ ludziom trudno jest manualnie tworzyć uogólnione reguły. Szczególnie w przypadku zastosowań związanych z bezpieczeństwem stworzenie niezawodnego mechanizmu wykrywania typu plików przed ich dalszym procesowaniem może być wyzwaniem, ponieważ atakujący nieustannie próbują zmylić mechanizmy detekcyjne dzięki spreparowanych ładunków (ang. payloads).

W celu rozwiązania tego problemu i zapewnienia szybkiego i dokładnego wykrywania typów plików Google opracowało narzędzie o nazwie Magika – narzędzie oparte na głębokim uczeniu, które pod maską wykorzystuje niestandardowy, wysoce zoptymalizowany model, zaprojektowany i wytrenowany przy użyciu Keras, który waży tylko około 1 MB. W czasie wnioskowania program wykorzystuje standard Onnx jako silnik wnioskowania, aby zapewnić identyfikację plików w ciągu kilku milisekund – prawie tak szybko, jak standardowe narzędzia bez wsparcia uczenia maszynowego – choćby na zwykłym (nie graficznym) procesorze.

agresor@darkstar:~$ python3 -m venv filedetect agresor@darkstar:~$ source filedetect/bin/activate (filedetect) agresor@darkstar:~$ pip install magika (filedetect) agresor@darkstar:~$ magika -r /usr/bin /usr/bin/NF: Shell script (code) /usr/bin/aa-exec: ELF executable (executable) /usr/bin/add-apt-repository: Python source (code) /usr/bin/compose: Perl source (code) (filedetect) agresor@darkstar:~$ magika -r /usr/share/doc /usr/share/doc/adduser/changelog.gz: gzip compressed data (archive) /usr/share/doc/adduser/copyright: Generic text document (text) /usr/share/doc/amd64-microcode/microcode_amd.bin.README: Assembly (code) /usr/share/doc/base-passwd/users-and-groups.html: HTML document (code) /usr/share/doc/command-not-found/README.md: Markdown document (text) /usr/share/doc/ca-certificates/examples/ca-certificates/Makefile: Makefile source (code) /usr/share/doc/ca-certificates/examples/Local_Root_CA.crt: PEM certificate (application) /usr/share/doc/cloud-guest-utils/copyright: YAML source (code) /usr/share/doc/containerd/containerd-nri-integration.png: PNG image data (image) /usr/share/doc/gawk/examples/lib/grcat.c: C source (code) /usr/share/doc/gawk/examples/misc/addresses.csv: CSV document (code) /usr/share/doc/git/contrib/persistent-https/client.go: Golang source (code) /usr/share/doc/libexpat1-dev/expat.html/ok.min.css: CSS source (code) /usr/share/doc/libjansson4/README.rst: ReStructuredText document (text) /usr/share/doc/python3/_static/jquery.js: JavaScript source (code) /usr/share/doc/shared-mime-info/shared-mime-info-spec.pdf: PDF document (document)

Pomyłki (ze względu na podobieństwo składni lub zbyt małą próbkę):

/usr/share/doc/apt/examples/apt.conf: C source (code) /usr/share/doc/bc/examples/pi.b: C source (code) /usr/share/doc/gawk/examples/lib/inplace.awk: Ruby source (code) /usr/share/doc/gawk/examples/lib/libintl.awk: JavaScript source (code) /usr/share/doc/gawk/examples/lib/rewind.awk: Powershell source (code) /usr/share/doc/git/contrib/coccinelle/free.cocci: SQL source (code) /usr/share/doc/libexpat1/expat.html/style.css: C source (code) /usr/share/doc/dnsmasq-base/examples/dnsmasq.conf.example: INI configuration file (text) /usr/share/doc/zerofree/copyright: RFC 822 mail (text) (filedetect) agresor@darkstar:~$ magika -s /usr/share/doc/libexpat1/expat.html/style.css /usr/share/doc/libexpat1/expat.html/style.css: C source (code) 90%

Jak widać narzędzie bardzo dobrze radzi sobie z wieloma plikami, ale zdarzają się również pomyłki ze względu na bliską składnię lub zbyt małą ilość danych wewnątrz pliku, aby model dobrze go sklasyfikował. Co ciekawe, wersja dla języka Python określiła plik style.css jako C source (code) 90%, a wersja web demo jako CSS w 98%. Google zdradza informację, iż aktualnie narzędzie jest używane wewnątrz firmy w celu poprawy bezpieczeństwa swoich usług poprzez kierowanie plików Gmail, Drive oraz Safe Browsing do odpowiednich skanerów bezpieczeństwa i polityk treści. Ponadto będzie ono integrowane z VirusTotal jako wstępny filtr zanim pliki zostaną przeanalizowane przez Code Insight (silnik do analizowana i wykrywania złośliwego kodu wspierany przez “AI”). Myślę, iż jest to bardzo interesujący projekt i warty obserwowania, jeżeli chodzi o dalszy rozwój. Bardzo wiele osób już pozgłaszało nowe formaty do obsługi detekcji, a także błędne klasyfikacje.

Więcej informacji: Magika: AI powered fast and efficient file type identification, Detect file content types with deep learning

Idź do oryginalnego materiału