iT邦幫忙

2026 iThome 鐵人賽

DAY 29
0
佛心分享-IT 人自學之術

老爺爺練習VIBE CODING系列 第 29 篇

Day 29:不執行檔案的靜態安全防禦:可疑附件偵測器與 Binary Header 識別技術

  • 分享至 

  • xImage
  •  

https://ithelp.ithome.com.tw/upload/images/20260830/20070969u5gYa8R6On.png
來,大孫女、小孫女,快到爺爺身邊坐。

這會兒夜色漸漸深了,天邊只剩下最後一絲溫柔的晚霞暮紫。爺爺坐在這張帶有大地氣息、安穩沉靜的藤椅深棕色老藤椅上,摸摸我這頭白髮銀霜的頭髮,看著你們兩個抱著筆記本在微弱的燈光下認真討論,爺爺心裡真是甜滋滋的。

大孫女,你昨天把 Next.js 在地化 Prompt Engineering 記得真好;小孫女剛才在一旁一邊喝著爺爺剛泡好的琥珀熱茶,一邊好奇地問:「爺爺,現在公司的叔叔阿姨每天都會從外部網路收到好多奇奇怪怪的郵件附件,要是一不小心點開中毒了怎麼辦?直接用防毒軟體去掃不是會卡死電腦嗎?」

爺爺呵呵直笑,給你們兩個的茶杯裡再添滿熱茶。今天這第 29 天的課程,爺爺就要跟你們講一招「不戰而屈人之兵」的頂級資安防禦技術:不執行檔案的靜態安全防禦:可疑附件偵測器與 Binary Header 識別技術。

這是一門不消耗伺服器大量資源,卻能把威脅御敵於國門之外的優雅技術。


🚨 痛點場景:變裝秀與雙副檔名的「偽裝陷阱」

大孫女,你先想想,為什麼傳統的防毒軟體或直接掃描會遇到瓶頸?
當企業系統每天要處理成千上萬封郵件、數萬個附件時,如果我們對每一個進來的檔案都調用沉重的動態沙盒(Sandbox)去執行、或者調用大型掃毒軟體進行完整的特徵碼深度掃描,這會耗費極其龐大的 CPU 與記憶體資源。在高流量環境下,伺服器很快就會被卡死。

而那些壞心眼的攻擊者,最喜歡玩「變裝秀」了:

  1. 雙重副檔名欺騙:他們會把一個危險的 Windows 執行檔改名成 order.pdf.exe 或 invoice.pdf.scr。因為作業系統預設常常會隱藏已知的副檔名,可憐的同仁在畫面上只會看到一個叫 order.pdf 的檔案,圖標還長得像 PDF,一不小心雙擊(Double Click),惡意程式就跑起來了。
  2. 偷天換日改副檔名:直接把一個 .exe 執行檔,強行把後綴改名成 .txt 或 .jpg。如果我們只依賴檔案的「外觀副檔名」來過濾,系統就會輕易放行。

這就像是一隻批著羊皮的狼,如果你不扒開它的衣服看,光憑肉眼,你根本不知道它是羊還是狼!


🛠️ 架構實作:Python 版可疑附件靜態偵測器的防禦工事

大孫女,在我們設計的 Suspicious Attachment Scanner 工具中,核心原則只有一個:「絕不執行、絕不解譯、只做二進位唯讀分析」。

我們不需要跑起這個檔案,也不需要用什麼高深的防毒引擎,我們只需要像中醫把脈一樣,輕輕地開啟檔案,讀取它最前面的幾個位元組(Bytes),也就是俗稱的魔術數字(Magic Numbers)或二進位標頭(Binary Header):

1. 核心 Binary Header 識別技術

任何檔案在電腦底層儲存時,它的開頭幾個位元組都寫著它的「真實身分證」:

  • Windows 執行檔 / DLL 檔:只要開頭是 MZ(十六進位為 4D 5A)。這個 MZ 是當年設計 MS-DOS 執行檔格式的工程師 Mark Zbikowski 的名字縮寫。不管你檔名怎麼改,只要開頭是 MZ,它就是個執行檔!
  • ZIP 壓縮檔:開頭如果是 PK(十六進位為 50 4B,即 PK\x03\x04)。這代表 Phil Katz(ZIP 格式發明人),意味著這是一個壓縮檔案。
  • PDF 檔案:開頭固定是 %PDF(十六進位為 25 50 44 46)。

2. 交叉對比與風險判定邏輯

我們的 Python 偵測核心在唯讀開啟檔案後,會執行以下交叉檢驗:

  1. 比對「實際標頭」與「副檔名」:如果一個檔案的檔名寫著 report.txt,但我們讀取它的開頭二進位,發現竟然是 MZ!這代表它是一隻披著文本皮的 Windows 執行檔,系統立刻將其判定為 HIGH(高風險,惡意偽裝)。
  2. 偵測雙重副檔名:分析檔名中是否含有多個句點,若最後一個副檔名(不分大小寫)落在我們的阻擋清單中(如 .exe, .bat, .cmd, .ps1),立刻予以攔截,並記錄判定原因為 Double extension detected。

3. 強制附加安全後綴與沙盒隔離

一旦工具判定檔案屬於可疑或高風險,我們絕不直接執行它,而是對其進行 「去毒化(Sanitization)」與「命名安全處理」:

  • 附加 .txt 安全後綴:如果發現一個檔案叫 dangerous.exe,系統會將其強制重新命名為 dangerous.exe.txt。
    • 爺爺叮嚀:這裡千萬不要直接「取代」副檔名變成 dangerous.txt,因為這樣會丟失原始副檔名資訊,不便後續調查。
    • 一旦加上了 .txt,作業系統就會將其判定為純文字檔。即使同仁在桌面上不小心「雙擊」它,也只會用記事本打開一堆看不懂的亂碼,而絕對不會觸發惡意代碼的執行!這就從根本上斷絕了誤觸執行的風險。
  • 防範路徑遍歷(Path Traversal):在解析 ZIP 壓縮檔內部的檔名時,必須嚴格檢查是否含有 ../、..\\ 或絕對路徑,防止解壓縮時檔案被惡意寫入到系統關鍵目錄之外。
  • 防止 ZIP 爆彈(ZIP Bomb)攻擊:限制壓縮檔的最大層級(預設 3 層)、最大解壓比例與單一檔案容量限制,一旦超過門檻,立刻停止解壓並標記為高風險,避免伺服器硬碟與記憶體被瞬間撐爆。

💡 避坑指南:數位證據的「不覆蓋」原則與檔名衝突解決

大孫女推了推眼鏡,在筆記本上記得飛快,接著問:「爺爺,如果我們在掃描整個目錄時,發現了好幾個危險檔案都叫 danger.exe。當我們自動幫它們改名叫 danger.exe.txt 時,後面的檔案不就會把前面改好的檔案給覆蓋掉,導致數位證據不見了嗎?」

爺爺高興地哈哈大笑,摸摸大孫女的頭說:大孫女真是冰雪聰明,問到了最關鍵的維運痛點!

在安全工具的設計中,保留原始數位證據與稽核軌跡是至關重要的。如果因為檔名衝突而造成檔案覆蓋,不僅會丟失證據,還可能導致不可挽回的資料損失。

為此,我們在重新命名模組中,必須實作 「防碰撞流水號機制」:

  1. 引入 SHA-256 雜湊或時間戳記:
    當我們發現 danger.exe 判定可疑時,先分塊讀取檔案計算出它的 SHA-256 雜湊值(例如 e3b0c442...)。
  2. 生成唯一檔名:
    若預設的 danger.exe.txt 已經存在,系統應自動探測並改用 danger.exe_e3b0c442.txt,或者在檔名後加入精確到毫秒的時間戳記與遞增流水號(例如 danger.exe_1.txt、danger.exe_2.txt)。
  3. 確保無損與可追溯:
    這樣做可以保證每一個被隔離或安全化的檔案都擁有獨一無二的名稱,絕不覆蓋既有檔案。同時,在產出的 ScanReport.json 稽核報告中,必須完整記錄下【原始路徑】、【修改後路徑】、【真實二進位類型】與【SHA-256 雜湊值】,讓資安鑑識人員事後可以 100% 還原事件現場!

👴 爺爺的溫暖叮嚀

大孫女、小孫女,這不執行檔案的「靜態安全防禦」,就像是我們在院子門口安檢一樣。

我們不需要請每個進來的人把行李箱打開、把裡面的工具真的用一遍給我們看。我們只需要用一雙慧眼,看看他行李箱最上面露出的特徵,就能知道他帶的是茶葉(SAFE)還是危險的炮竹(HIGH)。保持距離,不盲目執行、不給予直接運行的關聯(.txt 後綴),這就是資安防禦中最優雅、最省力、也最安全的智慧。

夜色真的深了,天邊的晚霞暮紫已經完全退去,這壺琥珀熱茶也喝得差不多了。外面夜風涼,你們兩個快把手裡的杯子放下,跟爺爺回暖和的屋裡去,奶奶剛煮好了熱騰騰的宵夜在等著我們呢!


上一篇
Day 28:別再讓 AI 寫出「溫馨提示」!台灣繁中 Prompt Engineering 與 Next.js 本地化應用
系列文
老爺爺練習VIBE CODING 共 29 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言