使用原生程式碼

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-checkpwntools 等工具。

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 等關鍵字進行網路搜尋,即可找到重要的安全性資訊。

資源