開發安全流動應用程式
主頁 > 
開發安全流動應用程式
< 返回

開發安全流動應用程式

智能手機和平板電腦的增長令公眾及機構用戶與企業互動的方式產生重大轉變。由於現今流動應用程式會用作接達敏感資料和進行重要商業活動,因此亦可能受到不同的威脅。傳統上,開發團隊專注於應用程式的效能及功能,而保安團隊只在所有開發工作完成及推出程式時才參與其中。為開發和維護安全的流動應用程式,在開發流動應用程式的不同階段須作出各項保安考慮和采取保安措施(包括技術與管理層面)。

開發流動應用程式的保安考慮

保安概念應納入整個流動應用程式發展周期,以處理保安規定遵行要求,並將保安風險減至最低。軟件開發的方法正不斷演變,敏捷軟件開發或 DevOps (結合「開發」與「操作」)等新的開發模式利用反覆式開發程序達致持續整合和持續交付的目的,以更快速建立流動應用程式。這個方法著重持續的溝通、整合、測量和交付,以促進程式開發、測試及質素保證之間各個程序。

為方便了解在流動應用程式開發過程中的相關保安注意事項,以下會探討發展周期的一般階段和主要保安考慮。

要求階段
Flow direction down
設計階段
Flow direction down
開發階段
Flow direction down
測試階段
Flow direction down
推出前階段
Flow direction down
維護與支援階段
Flow direction down
下架階段

要求階段

在要求階段應考慮保安因素,以致保安概念可納入整個發展周期。應連同功能要求一併訂定保安要求,並在軟件開發其他階段進一步加入保安因素。如能妥善訂定保安要求,便可於早期階段解決已確定的風險,大大減少後期階段的額外工作和補救工作。在訂定保安要求時應考慮以下各個方面:

1.
架構、設計和威脅模型要求
應制定程序,確保在規劃流動應用程式的架構和設計時已明確處理保安注意事項。每項組件的功能和保安角色均應清晰界定,並涵蓋威脅模型、安全開發和密碼匙管理等項目,例如在推行前採取相關及足夠的保安控制措施保護數據和交易。
2.
數據儲存和私隱要求
開發者應充分了解所處理數據的類型和敏感度,以及是否涉及關鍵交易。敏感數據可能無意地披露予同一裝置上的其他應用程式,數據亦可能在傳遞期間外泄。此外,與其他類型裝置比較,流動裝置較容易遺失或被盜取。開發者應依偱有關私隱的法律和規例(例如《個人資料(私隱)條例》),訂定合適的數據儲存和私隱要求。如流動應用程式對私隱有重大影響,應進行私隱影響評估。
3.
加密技術的要求
應採用加密技術保護在流動裝置儲存和處理,或在裝置與伺服器之間傳輸的數據。確保流動應用程式按照業界良好作業模式採用加密技術,包括:
使用經核實的加密庫。
正確選擇和配置加密原語。
避免重複使用同一組密碼匙作多種用途。
使用安全的隨機數字產生器產生隨機數值。
4.
認證和對話管理要求
應妥善認證和管理用戶帳戶和對話,包括使用隨機產生的接達權標認證客戶端的請求、執行明確的密碼政策,以及在發現過多登錄嘗試時鎖定帳戶等。應用程式狀態變更也應妥善處理,例如在應用程式從後台恢復時需要重新認證。
5.
網絡通訊要求
開發者應確保流動應用程式與遠程服務端點之間所交換資料的機密性完整性。處理所有應用程式數據時應使用運用已適當設置的傳輸層保安( TLS )規約的加密頻道。在使用 TLS 時,程式必須執行證書確認功能,不應接受任何自簽及/或不可信賴的證書。另外,程式亦應可偵測有否使用未獲授權證書,以防範網絡攻擊(例如中間人攻擊)。
6.
環境互動要求
應考慮以安全的方式使用平台應用程式界面和標準組件,包括應用程式之間的通訊(程序間的通訊)。
7.
程式碼質素和建立設置要求
開發應用程式時應遵從保安編碼作業模式,例如程式應以可信賴的證書簽署,並應將流動裝置的預設接達權限降至最低(例如停用相機/麥克風和預設啓用「不追蹤」功能)。
8.
抵禦還原工程能力的要求
如流動應用程式會處理或接達敏感資料,應採取保護措施以增強程式抵禦還原工程的能力。應考慮採取一系列混淆控制措施,如「應用程式隔離」、「阻止動態分析和竄改」、「裝置綁定」和「模擬器偵測」等。

設計階段

設計階段涉及根據要求階段所定的規格設計應用程式架構。建立程式架構後,開發團隊應參照訂定的保安要求,通過識別潛在的遵行要求問題及保安風險審查相關系統設計。這包括為特定類型的數據設計適當的保安控制措施,並結合威脅模型以識別和處理與應用程式有關的風險。

開發階段

經常留意保安編碼標準有助改善保安狀況,並減少發生可導致違反保安事件的常見錯誤。在開發階段進行保安評估,還有助確定所需的保安控制措施,並適時向開發者提供有關程式碼安全的意見。此外,應進行靜態源碼保安評估( SAST ),及早了解程式碼的質素,以便製作統一和優質的流動應用程式。

測試階段

除用戶驗收測試外,系統測試、壓力測試、回歸測試和單元測試均對確認系統功能的效能和準確性大有幫助。由於相關平台和測試環境各有不同,與網上應用系統比較,流動應用程式的測試可能更具挑戰性。開發者應建立全面的測試計劃以設計測試方式,並訂定「什麼」、「何時」及「如何」等測試細節。

按此連結以了解更多關於開發流動應用程式的測試。

推出前階段

在應用程式推出前和作出重大變更後,應進行保安風險評估和保安審計。每次進行保安漏洞修復時均可能需要更新程式碼,因而可能帶來新的保安漏洞。因此,必須持續評估相關風險和影響,以確保流動應用程式安全。

維護與支援階段

應用程式任何新增功能或對現有功能的更新都可能為系統帶來變更,因此應制定、記錄、測試和審查保安措施,確保系統得到妥善保護或免被破壞。持續測試對保障安全十分重要,可保護應用程式免受大部分攻擊。應定期審視應用程式,確保有足夠的保障。

下架階段

如應用程式不再符合預定目標或有其他應用程式更能達到預期目的,應考慮將程式下架。下架計劃的建議如下:

制定通知方案知會所有相關持份者(例如應用程式用戶)
從正式運作環境移除應用程式(例如流動應用程式商店)
保安設計與數據保密

保安設計與數據保密的概念應納入整個應用程式系統設計及開發程序,以保障數據和個別人士的私隱權。開發者應確保已將保安考慮納入為基本架構設計的一部分,並應審視因應潛在保安問題而作的詳細設計,以及決定和制定應對潛在威脅的緩解措施。在訂定私隱要求時,亦應遵從相關法律、規例和條例(例如《個人資料(私隱)條例》)。在系統設計階段,開發者應注意以下良好作業模式,以保障用戶私隱:

用戶通知

知會用戶應用程式將收集什麼資料/數據、有關資料將作什麼用途,以及將如何處理該些資料。
容許用戶選擇不查閱/使用個人資料。
在用戶要求移除應用程式或刪除帳戶時,讓用戶可選擇刪除所有應用程式相關數據及與帳戶相關的資料。

數據處理

盡量減少收集個人資料(特別是敏感個人資料),並將流動裝置功能(例如相機和位置追蹤)的使用權限降至最低。
採用嚴謹的加密功能和接達控制措施保障用戶的個人資料,以免在未獲授權的情況下被接達、外泄或使用。避免將個人辨識資料(例如身分證明文件、通訊記錄)或其他敏感資料儲存在用戶裝置上。
未經用戶許可,切勿將敏感資料上載或同步傳輸至外部系統或裝置。
在完成聲稱的資料用途後,清除敏感數據(例如地理位置數據)。
流動應用程式的常見保安風險

現將關鍵的流動應用程式保安漏洞列載如下,用戶和開發團隊應審視和訂定其應用程式的保安要求。此外,程式開發者應留意這些常見的保安漏洞,避免其程式碼出現同樣問題。

1.
不當使用平台
這個潛在威脅源於程式誤用平台功能和沒有採用平台的保安控制措施(例如 Android 意圖、平台權限、誤用生物識別功能或有關流動作業系統的其他保安控制措施)。誤用平台功能可能令系統蒙受風險(如跨網址程式編程)。
2.
數據儲存不安全
在開發團隊假設用戶或惡意軟件無法接達流動裝置的檔案系統及裝置的敏感資料時,數據儲存不安全的漏洞便會出現。通過流動惡意軟件、經修改的應用程式或取證工具,可能會導致數據損失或程式中的敏感資料遭提取。
3.
通訊不安全
從某一點到另一點的通訊不安全會構成暴露應用程式數據的風險,可能導致敏感資料在網絡通訊過程中外泄。有關問題的成因可能是交握式通訊不良、保密插口層( SSL )版本不正確、使用不合格的交涉協議及以純文字格式傳輸敏感數據資產。
4.
認證不安全
攻擊者可能會破解密碼、密碼匙或認證權標,以假冒其他用戶的身分。有關問題的成因可能是欠缺或沒有妥善推行帳戶認證機制,以及對話管理不當。
5.
加密不足
攻擊者會盜取或接達保護欠佳的數據,這可能是由於沒有妥善使用加密功能,為敏感資料資產加密。
6.
授權不安全
攻擊者可能會繞過授權機制並執行超越權限的功能。如流動應用程式只依靠客戶端授權而沒有進行伺服器端授權程序,在伺服器未能正確執行流動應用程式所訂定的身分和權限授權時,便可能發生有關問題。
7.
客戶端程式碼質素
客戶端程式碼質素欠佳可能產生漏洞(如緩衝區滿溢和記憶體外泄),讓攻擊者可對流動應用程式作出惡意輸入。這可能會引致執行外部程式碼或遠程伺服器拒絕服務( DoS )。
8.
竄改程式碼
攻擊者可能會以存放於第三方位置的惡意應用程式竄改該流動應用程式,以獲取個人或金錢利益。攻擊者亦可能通過仿冒詐騙攻擊誘騙用戶安裝應用程式。
9.
還原工程
攻擊者可能會分析核心二進制代碼,找出其源碼、源碼庫、算法和其他資產,從而利用漏洞、收集敏感數據或盜取知識產權。
10.
外部功能
在開發階段,開發者可能會建立一些隱藏的後門程式或功能,以便為應用程式除錯。如後門程式在推出的版本仍然存在,攻擊者便可利用這些後門程式作出惡意行為。
開發安全流動應用程式的注意事項

流動應用程式與其他應用系統一樣,有類似的保安考慮和風險,因此一般有關程式開發的良好作業模式亦適用於開發流動應用程式。因應不同的用途、使用模式和流動平台,流動應用程式開發者亦應留意遠端網絡服務、平台整合和流動裝置的不安全性。開發者在建立安全的流動應用程式時應考慮以下各個方面:

一般考慮
開發流動應用程序的一般考慮
Flow direction down
系統/軟件
認證和對話管理
服務器控制措施
程序代碼混淆/逆向工程
使用第三方/開放源碼庫
數據
數據儲存和保護
網上支付
網絡管理
通訊保安

一般考慮

處理敏感資料時必須緊記安全及提供充分的保護。
知會用戶應用程式將接達和上載什麼資料,以及有關資料將作什麼用途。
如會收集個人資料,應提供收集個人資料聲明。
採取「最小權限」原則,以最小的系統權限及接達權限執行應用程式。
按照良好作業模式開發和執行應用程式。
設計和提供方法,讓應用程式能進行保安修補程式更新。
如流動應用程式會處理關鍵/敏感數據,一旦發現已被越獄(jailbreaking)或破解(rooting),應拒絕執行應用程序或向用戶發出警告。
在處理數據前,必須確認所有客戶端提供的數據,並檢查數據是否在預期類型、範圍和長度的範圍內。
在程式處理大量用戶數據時知會用戶和得到用戶的同意。

認證和對話管理

避免只使用裝置所提供的識別碼(如 UID 或 MAC 地址)識別裝置,而應利用應用程式和裝置特有的識別碼。
採用適當的認證機制,並根據流動應用程式風險評估結果,在處理敏感或財務交易時考慮使用雙重認證。
避免儲存密碼;完成計算密碼的雜湊後,應立即清除/刪除載有密碼的記憶體位置。
充分利用由流動平台所提供的最新保安機制,以保護用戶的憑證
在每個活動/畫面開始時檢查用戶是否已在登入狀態,否則應切換到需登入狀態。
在應用程式的對話超時或用戶登出時,清除和刪除所有與用戶數據有關的記憶體和用作數據解密的主密碼匙。

數據儲存和保護

只收集和披露程式業務用途所需的數據。
按數據的敏感度對數據儲存進行分類和採取相應的控制措施,並根據分類處理、儲存和使用數據。
除非已採取適當的保安措施(例如嚴謹的加密),否則不應將應用數據儲存至外置儲存器。
將敏感數據儲存或暫存至非易失性記憶體時,使用適當的算法和密碼匙長度進行加密,並將流動應用程式所需使用的數據減至最少,以保護數據。
對應用程式可接收數據的相關區域進行輸入確認和檢查,以防止客戶端代碼注入或屏幕劫持。
在不再需要敏感數據時,清除和刪除記憶體中所有敏感數據。
採用沙盒技術隔離應用程式,通過防止其他應用程式與受保護的應用程式進行互動,提高程式的安全性。

通訊保安

任何敏感數據(例如個人資料或信用卡資料)的傳遞均應使用端對端加密方法(例如 TLS )以作保護。
如得悉應以保密超文本傳輸規約( HTTPS )連接,偵測每項請求的連接是否均已使用 HTTPS 。
在使用 TLS 時,程式必須執行證書確認功能,不應接受自簽及/或不可信賴的證書。
啓動應用級虛擬私有網絡( per-app VPN ),安全地從任何地方和在任何流動裝置接達內部網絡資源。

伺服器控制措施

評估流動應用程式的後端服務以找出保安漏洞,並確保後端系統執行已強化的配置和安裝最新的保安修補程式。
確保後端伺服器已保存足夠的記錄或資料,以作保安事故偵測及應變和進行調查。
檢視應用程式的程式碼,以避免在流動應用程式與後端伺服器之間不慎傳送數據。

網上支付

就使用應用程式將會涉及的費用向用戶發出警告並獲取其同意。
如涉及付款資源,應推行保安控制措施(如白名單或重新認證),以防止在未經授權或意外的情況下接達有關資源。
如需進行網上支付,應使用安全的流動支付服務。使用由官方提供的應用程式界面/範本,並嚴格遵從其執行指引。
知會用戶流動裝置必須支援的最低技術規格(例如 TLS 支援),以進行支付服務。
在開發設有網上流動支付服務的流動應用程式時遵守特定的數據保安標準(例如 PCI DSS )。

程式碼混淆/還原工程

於應用程式啓動時驗證應用程式的識別碼,以確保程式碼沒有被更改或破壞。
如程式碼沒有被編製成機器碼格式以防止還原工程,應盡量使用混淆軟件,以保護源碼和隱藏應用程式資料。
對包含敏感數據的應用程式採用抗除錯技術(如防止除錯程式附加至程式程序)。

使用第三方/開放源碼庫

使用可靠及/或官方版本的軟件開發工具(例如軟件開發套裝、軟件庫),以避免在不知情的情況下引入木馬程式或後門程式。
留意流動應用程式所使用的第三方框架/應用程式界面的最新發布,以安裝保安修補程式和進行升級。
應先確認所有經不可信賴的第三方應用程式往來的數據(如廣告網絡),才在流動應用程式中使用。
開發流動應用程式的測試

由於流動作業系統、硬件組件和網絡環境各有不同,因此在流動裝置上測試流動應用程式較在個人電腦上測試網上應用系統更具挑戰性。測試流動程式時應考慮以下各個方面:

測試流動應用程式的功能

為了確保流動應用程式能在支援的裝置上正常運作,應進行功能測試,以驗證應用程式的功能規格。此外,亦需考慮進行不同類型的流動應用程式測試:

1.
兼容性測試:確保應用程式能在支援的裝置(如配備 iOS 和 Android 等不同流動平台,以及不同屏幕尺寸和作業系統版本的裝置)上正常運作。
2.
效能測試:測量應用程式的效能,如回應速度、可接受的用戶負載和程式穩定性等。
3.
系統測試:確保流動應用程式能找出並處理可能出現的異常情況,並能從意外終止事故中恢復正常運作。

測試程式碼質素

開發者在流動應用程式開發過程中會使用不同的編程語言和框架,如沒有遵從保安編碼作業模式,應用程式可能會出現常見的漏洞(例如弱點插入、記憶體損毀和跨網址程式編程)。舉例來說,插入攻擊多數利用流動裝置的跨進程通訊( IPC )界面,以惡意應用程式攻擊在該裝置上運作的另一應用程式。開發者應進行測試,確定可容許不可信賴輸入的進入點,或確定使用已知的危險源碼庫或應用程式界面的地方。

流動應用程式的加密技術

加密技術對於保護用戶在流動網絡環境中的數據至關重要,因攻擊者或可對用戶裝置作實體接達。開發者應採用妥善的加密方法或合適的密碼匙儲存應用程式界面儲存敏感資料。不要使用任何包含已知漏洞的加密算法或規約。採用良好作業模式和保安配置,確保有關加密算法是最新的,並且符合行業標準。切勿使用過時的加密法(例如 DES )或雜湊函數(例如 SHA1 )。應檢查其他配置問題,如密碼匙長度不足、硬編碼密碼匙和不嚴謹的密碼匙產生函數。

流動應用程式的認證

前端客戶及後端伺服器均應整合和進行適當的身分認證,以防止遭受密碼字典攻擊暴力攻擊。一般而言,屬非敏感性質的應用程式可考慮以用戶名稱/密碼認證;至於屬敏感性質的應用程式,則通常會考慮使用雙重認證(例如 SMS 和權標)。應進行測試,確保前端用戶及後端伺服器均貫徹執行有關認證程序。

應按以下步驟測試應用程式的認證和授權方法:

確定應用程式使用的附加認證方法。
找出提供關鍵功能的所有端點。
驗證已在所有伺服器端點嚴格執行該些附加的認證方法。

測試網絡通訊

流動裝置與伺服器之間的網絡通訊通常在不可信賴的網絡上進行,因此流動應用程式可能會蒙受網絡攻擊(如小包探取法或中間人攻擊)的風險。在處理敏感數據時,應使用加密連接(例如 HTTPS),以確保網絡數據的機密性和完整性。攔截接受測試的應用程式所接收和傳送的網絡通訊,並確保通訊已加密,例如利用數據包分析器收集網絡通訊,並利用網絡規約分析器以人類可讀格式顯示收集所得的通訊。最後,驗證伺服器已按照良好作業模式進行配置。