Android O中的Seccomp過濾器

谷歌開發者_發表於2017-08-12

文 / Google Android 安全工程師 Paul Lawrence


在執行 Android 的裝置中,強制執行 Android 安全模型的重任交給核心處理。由於安全團隊已加固 Android 使用者空間,隔離程式並削弱程式的許可權,因此,越來越多的安全攻擊將其焦點轉到核心上。系統呼叫是攻擊者攻擊核心的常用方式之一。


所有 Android 軟體都使用系統呼叫(簡稱為 syscall)與 Linux 核心進行通訊。核心提供許多特定於裝置和 SOC 的系統呼叫,讓使用者空間程式(包括應用)可以直接與核心進行互動。所有應用都依靠這一機制,通過唯一的系統呼叫來檢索訪問對應的行為(如開啟檔案或傳送一條 Binder 訊息)。不過,其中許多系統呼叫 Android 未予使用或未予正式支援。


Android O 利用一個名為 seccomp 的 Linux 功能,它可使應用軟體無法訪問未使用的系統呼叫。由於應用無法訪問這些系統呼叫,因此,它們不會被潛在的有害應用利用。



seccomp 過濾器

Android O 包含一個 seccomp 過濾器,該過濾器已安裝到 zygote 程式中,所有 Android 應用均衍生自該程式。由於此過濾器已安裝到 zygote,因而會影響到所有應用,因此,Android 安全團隊採取了額外的措施,以防止破壞現有應用。seccomp 過濾器允許:

  • 通過 bionic(用於 Android 的 C 執行時)顯示所有系統呼叫。這些系統呼叫是在 bionic/libc/SYSCALLS.TXT 中定義的。

  • 支援 Android 啟動的系統呼叫。

  • 常用 Android 應用使用的系統呼叫,通過執行 Google 的完整應用相容性套件確定。


Android O 的 seccomp 過濾器會阻止某些系統呼叫,如 swapon/swapoff(已被捲入一些安全攻擊)和關鍵控制系統呼叫(對應用沒有作用)。此過濾器在 arm64 中共阻止了 271 個系統呼叫中的 17 個,在 arm 中共阻止了 364 個系統呼叫中的 70 個。



開發者

在一臺執行 Android O 的裝置上測試您的應用是否使用了非法系統呼叫。


檢測到非法系統呼叫

在 Android O 中,系統將使呼叫非法系統呼叫的應用崩潰。日誌列印輸出可顯示非法系統呼叫,例如:

03-09 16:39:32.122 15107 15107 I crash_dump32: performing dump of process 14942 (target tid = 14971) 03-09 16:39:32.127 15107 15107 F DEBUG : *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** 03-09 16:39:32.127 15107 15107 F DEBUG : Build fingerprint: 'google/sailfish/sailfish:O/OPP1.170223.013/3795621:userdebug/dev-keys' 03-09 16:39:32.127 15107 15107 F DEBUG : Revision: '0' 03-09 16:39:32.127 15107 15107 F DEBUG : ABI: 'arm' 03-09 16:39:32.127 15107 15107 F DEBUG : pid: 14942, tid: 14971, name: WorkHandler >>> com.redacted <<< 03-09 16:39:32.127 15107 15107 F DEBUG : signal 31 (SIGSYS), code 1 (SYS_SECCOMP), fault addr -------- 03-09 16:39:32.127 15107 15107 F DEBUG : Cause: seccomp prevented call to disallowed system call 55 03-09 16:39:32.127 15107 15107 F DEBUG : r0 00000091 r1 00000007 r2 ccd8c008 r3 00000001 03-09 16:39:32.127 15107 15107 F DEBUG : r4 00000000 r5 00000000 r6 00000000 r7 00000037


受影響的開發者應改寫他們的應用,使其不會呼叫非法系統呼叫。


在測試期間切換 seccomp 過濾器

除記錄錯誤外,seccomp 安裝程式在執行 userdebug 和 eng builds 的裝置上遵守 setenforce,這讓您可以測試 seccomp 是否引發了某個問題。如果您輸入:

adb shell setenforce 0 && adb stop && adb start


則不會將任何 seccomp 策略安裝到 zygote。由於您無法從一個正在執行的程式中移除 seccomp 策略,因此,您必須重新啟動 shell 以使該選項生效。



裝置製造商

由於 Android O 在 //bionic/libc/seccomp 包含相關 seccomp 過濾器,因此,裝置製造商無需進行任何額外的實現。不過,在 //cts/tests/tests/security/jni/android_security_cts_SeccompTest.cpp 中有一個檢查 seccomp 的 CTS 測試。此測試檢查是否已阻止 add_key 和 keyctl 系統呼叫、是否已允許 openat 以及是否存在某些特定於應用的系統呼叫(為實現相容性,必須有這些系統呼叫)。


推薦閱讀:

Android O中關於快捷方式和微件的更新

Android測試支援庫1.0現已釋出!

Android O官方版本即將到來, 先來看看DP4開發者預覽版

萬眾矚目Instant Apps終於全面問世啦

640?wx_fmt=gif

相關文章