使用原生程式碼

OWASP 類別:MASVS-CODE:程式碼品質

總覽

Android 應用程式可利用以 C 和 C++ 等語言編寫的原生程式碼,實作特定功能。不過,當應用程式使用 Java Native Interface (JNI) 與此原生程式碼互動時,可能會暴露出緩衝區溢位和其他原生程式碼實作中可能出現的問題等漏洞。

影響

雖然效能最佳化和模糊處理等功能帶來非常正面的影響,但在 Android 應用程式中使用原生程式碼可能會對安全性造成負面影響。C/C++ 等原生程式碼語言缺乏 Java/Kotlin 的記憶體安全功能,因此容易發生緩衝區溢位、使用已釋放記憶體的錯誤和其他記憶體毀損問題等漏洞,導致應用程式當機或任意程式碼執行。此外,即使其他部分是使用 Java 安全編寫,原生程式碼元件仍可能存在安全漏洞,進而危害整個應用程式。

因應措施

開發和編寫程式碼指南

  • 安全程式碼規範:針對 C/C++ 專案,請遵循已建立的安全程式碼標準 (例如CERT、OWASP) 來緩解安全漏洞,例如緩衝區溢位、整數溢位和格式字串攻擊。優先採用以品質和安全性聞名的 Abseil 等程式庫。盡可能採用 Rust 等記憶體安全語言,其效能可與 C/C++ 相提並論。
  • 輸入驗證:嚴格驗證從外部來源接收的所有輸入資料,包括使用者輸入內容、網路資料和檔案,以防範注入攻擊和其他漏洞。

強化編譯選項

使用 ELF 格式的原生程式庫可透過啟用堆疊保護 (Canary)、可讀取重新配置 (RELRO)、資料執行防止 (NX) 和位置無關可執行檔 (PIE) 等保護機制,強化防範各種漏洞。方便起見,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 等關鍵字進行網路搜尋,可能會洩漏重要安全資訊。

資源