人臉辨識技術已普遍應用在日常生活中,但隨之而來的安全威脅也與日俱增,照片攻擊便是其中使人臉辨識系統面臨重大安全挑戰的威脅之一,本文將說明如何利用Python、OpenCV等影像處理技術讓人臉辨識系統也能分辨照片與真人,進而提升安全性。
生物辨識技術是根據人類臉部、指紋、掌紋、虹膜、指靜脈、聲音、簽名和步態等各種獨一無二的生理特徵來進行使用者身分識別,具有比傳統帳號密碼更為有效、精準、方便與安全的特性。生物辨識技術已普遍應用在生活中各領域,包括住家或辦公大樓的門禁系統、行動裝置身分認證、行動支付、海關出入境查驗以及犯罪調查等。
近年來,愈來愈多的案例發現,生物辨識系統容易遭受偽冒攻擊(稱作Presentation Attack或Spoofing Attack),亦即攻擊者透過非法方式冒用合法用戶的生物特徵,來欺騙生物辨識系統取得合法用戶系統存取權限及重要資料。
2016年,國際標準化組織(ISO/IEC)頒布了針對生物辨識系統的國際標準ISO/IEC 30107-1:2016 Information technology—Biometric presentation attack detection—Part 1: Framework。ISO/IEC 30107主要目的是透過術語定義和建立偽冒攻擊(Presentation Attack Detection,簡稱PAD)的模型與系統架構,利用此攻擊模型來做相對應的檢測,以對生物辨識系統的偽冒攻擊進行有效的防禦。ISO/IEC 30107所定義的偽冒攻擊防禦範圍只有在生物辨識系統最前端的感測器(如圖1左側虛線框選的部分)。
簡單來說,就是要確定感測器所擷取的生物特徵是從合法用戶的真實生物特徵,而非經過變造或偽冒。
人臉辨識系統偽冒攻擊種類
常見針對人臉辨識系統的偽冒攻擊可以分成照片攻擊、影片攻擊、面具攻擊等三類,分別介紹如下。
照片攻擊
針對人臉辨識系統的偽冒攻擊成本最低且最容易執行的手法即為照片攻擊(Photo Attack)。攻擊者可利用偷拍的方式或從網路社群媒體下載合法用戶的臉部照片,並利用高解析的印表機印出照片或者直接使用手機螢幕,在人臉辨識系統的感測器前顯示合法用戶的臉部影像,即可實施照片攻擊,如圖2所示。
影片攻擊
惡意攻擊者不使用靜態的人臉照片,而是使用數位設備(例如手機、平板或筆記型電腦)播放合法用戶的臉部動態影片,如圖3所示。影片攻擊屬於進階式攻擊手法,在感測器前顯示合法用戶的各種動態動作,例如頭部擺動、臉部表情、眨眼等等,因此更加難以防範。
面具攻擊
惡意使用者透過配戴合法使用者的3D臉部矽膠面具對人臉辨識系統實施偽冒攻擊,如圖4所示。由於矽膠面具仿造了合法用戶臉部的完整3D結構,因此這種特殊威脅十分難以偵測。但3D面具製作不易,須具備特殊設備及高成本,較不容易實現;加以3D面具是僵硬的,缺乏具體的生理資訊(如表情與溫度變化),要有效達到攻擊目的亦有其困難之處,所以前述的照片和影片攻擊是對人臉辨識系統最常見的偽冒攻擊手段。
常見的照片攻擊偵測方法可廣泛區分為靜態方法與動態方法兩大類。靜態方法偏重於靜態圖像分析而非連續影片的分析,因此大多採用紋理分析技術,假設真人臉部和偽造品表面性質會有差異的前提下,檢查皮膚紋理、溫度特性、反射率及顏色等屬性之差異或變化進而判斷真偽。動態方法基於偵測人類臉部動態自發性的生理行為,如頭部擺動、瞳孔縮放、眨眼、打哈欠、微笑等動作。
由於人臉照片是靜止不動的影像,不可能出現臉部各種表情與動作。根據這個簡單的特性,因此可以分析人臉動作來作為偵測的依據。
進行程式實作
本文將簡單介紹如何使用Python 2.7、 OpenCV2及Dlib 19.2實作眨眼偵測做為偽冒防禦的方法,另外建議也可參考國外部落客Adrian Rosebrock的網站,有十分豐富的OpenCV應用介紹,包括眨眼偵測的詳盡步驟與範例程式碼(https://www.pyimagesearch.com/2017/04/24/eye-blink-detection-opencv-python-dlib/)。本文採用的Dlib套件是由C++所實作的機器學習工具箱,其中有已經訓練好的人臉特徵點函式,可以快速即時地計算出照片中包括眉毛、眼睛、鼻子、嘴巴、輪廓等68個人臉特徵點,如圖5所示。
透過Dlib函式所得出的人眼周邊特徵點(如圖5中P37~P42及P43~P48),定義眼部長寬比值(Eye Aspect Ratio,EAR),分別計算出EARR及EARL兩個指標表示雙眼的眼部長寬比,接著可以利用連續時間內EARR和EARL兩個指標之差異值進行眨眼判斷,如公式1~2所示。
.....................公式1
.....................公式2
此偵測方法經過人臉特徵點計算後,即可利用特徵點的座標值進行快速計算,無須額外的影像處理,因此計算十分快速。完整的實作方法流程,可參考圖6所示。
STEP 1 將所需函式如NumPy、OpenCV及Dlib匯入,如圖7所示。
STEP 2 建立測試影像的資料路徑,例如所在目錄下的「/input」目錄,如圖8所示。
STEP 3 使用OpenCV內建已訓練好的Cascade分類器進行人臉偵測。
STEP 4 若可順利偵測出人臉,則繼續使用Dlib內建已訓練好的函式,進行人臉特徵點計算,如圖9所示。
STEP 5 藉著利用人眼周邊特徵點(編號37至46)進行EAR眨眼特徵計算,計算得出的EAR值可以視為特徵向量,交由後續步驟使用,如圖10所示。
建立訓練資料庫,將有眨眼的影像標記(Label)為1(圖11);無眨眼的影像標記為0,如圖12所示。緊接著,運用機器學習方法中常用的支持向量機(Support Vector Machines,簡稱SVM)之線性分割(Linear Separability)的方法進行訓練,所得之訓練模型將可作為後續眨眼判斷使用,最後結果將如圖13所示。
當測試時,將影像輸入訓練好的模型,若透過模型判定輸出為1,則表示為真人;若輸出為0,代表是偽冒。
實際情境演練
話說喜歡科技生活化的唐風,在一家科技公司擔任資安技術人員,協助公司引進了先進的人臉辨識系統作為員工登入電腦時的認證解鎖技術,讓員工不必頻繁地鍵入帳號和密碼反覆登入電腦,大大地提升了安全性與便利性,頗受主管及員工的好評。
但由於最近受到全世界流行之新型冠状病毒(COVID-19)疫情影響,員工被要求在公司內配戴口罩上班,唐風發現部分員工由於不想為了使用電腦而頻繁穿脫口罩,會直接列印或用手機上秀出自己的大頭照對著人臉辨識系統,竟然也能順利登入公司電腦。這讓唐風十分困擾,因為員工貪圖一時方便,可能會讓公司內部出現非常大的資安漏洞。
為了解決這個問題,唐風在人臉辨識系統前端加了一個判別眨眼的功能,可以用來確認是員工本人還是員工的大頭照。唐風設計的流程參考了本文的眨眼偵測範例,如圖14中間框選的部分所示,公司電腦在進行人臉辨識前,必須先經過眨眼偵測模組,判別是否是真人,接著才進行正常的人臉辨識;一旦發現並非真人,電腦會直接拒絕登入的要求。
唐風將眨眼偵測模組加入了人臉辨識系統之後,也對公司員工進行了教育訓練,並提醒員工新的功能做法雖然在疫情情況下會人感覺不便,但卻能有效地預防公司電腦遭到冒用或資料外洩的風險,不僅保障員工個人的權益,也維護了公司的聲譽與資產。
結語
隨著生物辨識技術的成熟發展,人臉辨識已經被廣泛使用於各種商業用途,現在已有許多國家開始運用人臉辨識系統進行支付、刷卡、ATM提款等等金融相關應用,其安全性將攸關到政府、企業及個人等各個層面,也將持續面臨未來各種的安全挑戰。人臉動態特徵除了眨眼,還有頭部擺動、表情變化、嘴巴開合等等特徵也能拿來做為區分真人與偽冒的方式,有興趣的讀者可以試著發揮想像力,自己動手做實驗,看看哪種方法對於強化人臉辨識系統的安全性最有效。
<本文作者:社團法人台灣E化資安分析管理協會(ESAM, https://esam.io/)/ 國防大學理工學院資訊工程學系資訊科技實驗室,主持人為周兆龍博士,實驗室致力於國防資訊相關教學與應用研究,其領域包含影像處理、機器學習、生物辨識、資訊安全。>