close

DEV Community

JH5
JH5

Posted on • Originally published at Medium

未來應該改用 Google Magika 來判斷檔案類型?

未來應該改用 Google Magika 來判斷檔案類型?

Magika command line tool used to identify the type of a diverse set of files

幾個月前看到 Google Magika 的介紹時,有讓我的腦袋產生滿多問號的XD,為什麼 Python 已經有像 python-magic 這樣基於 libmagic 的成熟套件,為什麼 Google 還要投入資源開發 Magika 呢?

以一般的 Web 開發專案,python-magic 可能已經足夠,不過對於需要處理大量高風險檔案、或追求極致分類精準度的應用,Magika 則提供了更強大、更現代的解決方案。

在開始介紹之前,應該大家有觀念目前的檔案類型的判斷,多半是利用 file signatures 或是我們常說的魔術數字 (Magic Bytes) 來做判斷,而傳統的魔術數字 (Magic Bytes) 的工具在面臨一些複雜或是經過串改混合的檔案時,仍然常會遇到一些問題。

由於 Magika 是基於深度學習模型訓練的,它在處理純文字類的程式碼/設定檔故意偽裝/混淆的檔案時,表現會明顯優於主要依賴魔術數字(Magic Bytes)的 python-magic ( libmagic)。

程式碼檔案的具體語言識別

傳統的 libmagic 在遇到純文字的程式碼檔案時,往往難以區分具體的語言,比如 YAML 設定檔 (.yaml) 以及 Markdown 檔案 (.md) 在libmagic 上判度結果目前利用 libmagic 5.46 版本,還是會判度成 text/plain,而 Magika在這一塊就滿精準的判斷出對應的檔案類型。

[測試檔案]: markdown_sample.md  
  > python-magic (libmagic): text/plain  
  > Magika (AI-based):    markdown  

[測試檔案]: yaml-sample.yaml  
  > python-magic (libmagic): text/plain  
  > Magika (AI-based):    yaml
Enter fullscreen mode Exit fullscreen mode

另外還拿了手邊的FastQ跟VCF檔案測試了一下,不過好像沒差 XD

[測試檔案]: SRR1518133_1.fastq.gz  
  > python-magic (libmagic): application/gzip  
  > Magika (AI-based):    gzip  

[測試檔案]: HG001.hg38.vcf  
  > python-magic (libmagic): text/plain  
  > Magika (AI-based):    txt
Enter fullscreen mode Exit fullscreen mode

惡意或被混淆的檔案

這部分是資安領域中需要耗費滿多力氣之處, 比如説攻擊者經常試圖將惡意腳本偽裝成圖片將其魔術數字破壞,透過上傳 Polyglot Image 到 Server Side,測試了一下把php script 塞到JPEG檔案的結尾,不過結果好像沒差 (可能是我塞錯?)

[測試檔案]: polyglot_image.jpg  
  > python-magic (libmagic): image/jpeg  
  > Magika (AI-based):    jpeg
Enter fullscreen mode Exit fullscreen mode

不過在官方的介紹,Magika 會同時檢查檔案的中間和結尾,能偵測到惡意附加的 PHP 腳本內容,原則上應該還是要比依賴Magic Number來的強大且更難閃掉相關的檢查,且來得更 Robustness**

極高的效率與速度

Google 每天需要掃描和處理數十億的檔案或者更多,而libmagic 在讀取和處理大檔案時,為了找到匹配的魔術數字,可能需要進行大量的 I/O 操作和複雜的規則比對,這在大規模的應用中會是個滿大的瓶頸。

Magika 的設計初衷就是為了在 Google 內部的大型系統中運行,主要基於深度學習模型的快速推理 (Fast Inference),技術上它只需要讀取檔案的一小部分(預設是前 512 位元組、中間 128 位元組、和結尾 128 位元組),就能快速得出高精度的判斷結果,大幅減少 I/O 時間。

零外部依賴 (Zero External Dependencies)

對於 Python 套件外部依賴問題,Magika 的優勢就滿明顯的,無論是在Codespace 或是Colab 中,這幾天深深地感受到不需要另外裝libmagic的好處,也更適合的做環境的安裝跟部署,特別是我常用mac改完自再丟到其他linux 環境去測試。

除了上面介紹的部分,其他Magika還支援Rust, Go等主流語言,也提供了CLI的介面可以提供 Recursive的目錄掃描功能,另一個基於模型的功能,這也是libmagic比較做不到的,Magika提供了 不同的 prediction modes, 例如high-confidence, medium-confidence, and best-guess,如果你的服務是需要懷疑使用者上傳的檔案,便可以根據這些不同的懷疑等級,視情況來設計檔案隔離的流程或是人為介入review 。

未來要從Magic改用Magika嗎?

# ai# google-cloud# security

Top comments (0)