OWASP 類別:MASVS-CODE:程式碼品質
總覽
Android 應用程式可運用以 C 和 C++ 等語言編寫的原生程式碼,執行特定功能。不過,如果應用程式使用 Java Native Interface (JNI) 與這類原生程式碼互動,可能會因原生程式碼實作中存在緩衝區溢位等問題,而暴露於相關弱點。
影響
儘管在效能最佳化和混淆處理等方面的影響非常正面,但在 Android 應用程式中使用原生程式碼可能會對安全性造成負面影響。C/C++ 等原生程式碼語言缺乏 Java/Kotlin 的記憶體安全功能,因此容易發生緩衝區溢位、釋放後使用錯誤和其他記憶體毀損問題,導致當機或任意程式碼執行。此外,如果原生程式碼元件存在安全漏洞,即使其餘部分是以安全的 Java 編寫,仍可能導致整個應用程式遭到入侵。
因應措施
開發與程式設計指南
- 安全程式碼編寫指南:如果是 C/C++ 專案,請遵守既有的安全程式碼編寫標準 (例如 CERT、OWASP),以減少緩衝區溢位、整數溢位和格式字串攻擊等安全漏洞。優先使用以品質和安全性著稱的程式庫,例如 Abseil。盡可能採用 Rust 等記憶體安全語言,效能與 C/C++ 相當。
- 輸入驗證:嚴格驗證從外部來源收到的所有輸入資料,包括使用者輸入內容、網路資料和檔案,防止注入式攻擊和其他安全漏洞。
強化編譯選項
只要啟用堆疊保護 (Canary)、唯讀重定位 (RELRO)、資料執行防止 (NX) 和位置無關可執行檔 (PIE) 等保護機制,即可防範各種安全漏洞,強化使用 ELF 格式的原生程式庫。方便的是,Android NDK 編譯選項預設已啟用所有這些保護措施。
如要驗證二進位檔中是否已實作這些安全機制,可以使用 hardening-check 或 pwntools 等工具。
Bash
$ pwn checksec --file path/to/libnativecode.so
Arch: aarch64-64-little
RELRO: Full RELRO
Stack: Canary found
NX: NX enabled
PIE: PIE enabled
確認第三方程式庫沒有安全漏洞
選擇第三方程式庫時,請優先使用在開發社群中享有盛名的程式庫。您可以透過 Google Play SDK 索引等資源,找出備受好評且值得信賴的程式庫。請務必將程式庫更新至最新版本,並主動使用 Exploit-DB 資料庫等資源,搜尋與程式庫相關的已知安全漏洞。使用 [library_name] vulnerability 或 [library_name] CVE 等關鍵字進行網路搜尋,即可找到重要的安全性資訊。
資源
- CWE-111:直接使用不安全的 JNI
- 漏洞資料庫
- 檢查二進位檔是否具備安全強化功能
- 使用 pwntools 檢查二進位安全性設定
- Linux 二進位檔安全強化
- 使用 Relocation Read-Only (RELRO) 強化 ELF 二進位檔
- OWASP 二進位檔保護機制
- SEI CERT 編碼標準
- OWASP 開發人員指南
- Google Play SDK 索引
- Android NDK
- Android Rust 簡介
- Abseil (C++ Common Libraries)
- 連結器會強制執行 PIE