一、概述
seccomp 是 secure computing 的缩写,其是 Linux kernel 从2.6.23版本引入的一种简洁的 sandboxing 机制。在 Linux 系统里,大量的系统调用(system call)直接暴露给用户态程序。但是,并不是所有的系统调用都被需要,而且不安全的代码滥用系统调用会对系统造成安全威胁。seccomp安全机制能使一个进程进入到一种“安全”运行模式,该模式下的进程只能调用4种系统调用(system call),即 read(), write(), exit() 和 sigreturn(),否则进程便会被终止。
本文主要简单介绍下 seccomp 在 android 中的应用。
二、seccomp加载
不同进程加载 seccomp 的方式不一样。
2.1 native 进程
seccomp 简单来说就是一个白名单,每个进程进行系统调用(system call)时,kernal 都会检查对应的白名单以确认该进程是否有权限使用这个系统调用。这个白名单是用 berkeley package filter(BPF)格式书写的,BPF格式不那么直观,所以出现一些 wrapper 使其更具可编辑性。
android中用 minijail 来间接访问 seccomp 库加载。minijail(minijail 代码 在external/minijail)是一个帮助库,被用来解析 policy 文件并传递给 kernel,并启动 seccomp 功能。
![](https://img.haomeiwen.com/i11510028/823c2ef263a4fa6f.png)
如上图所示,先创建了一个 minijail 对象,解析 policy 文件(转化成BPF格式),最后minijail_enter 启动 seccomp 功能。
传入的参数就是 seccomp policy 文件路径,如:
![](https://img.haomeiwen.com/i11510028/656826b8885592e9.png)
seccomp policy内容如下:
![](https://img.haomeiwen.com/i11510028/38ae441553197171.png)
增加一个系统调用按这中格式加入一行即可,比如recvfrom: 1
2.2 Android应用进程
Android 应用进程使用系统默认的 policy,所以直接调用 seccomp 库接口加载 seccomp 功能即可。
![](https://img.haomeiwen.com/i11510028/c5a0ca1f4456b33c.png)
![](https://img.haomeiwen.com/i11510028/064eb6cc6fdd30db.png)
如上可知其也受限于selinux开关。
默认seccomp policy允许以下系统调用:
1、bionic暴露出来的系统调用,定义在bionic/libc/SYSCALLS.TXT
2、Android启动必要的系统调用
3、一些流行App使用的系统调用,由Google full app CTS决定
禁止对安全敏感的系统调用,如 swapon/swapoff,和一些 Application 不会用到的 key control 系统调用。总的说来,arm64架构上系统调用一共271个,禁止了17个;arm架构上系统调用一共364个,禁止了70个。
三、案例
1、如log中有如下信息:
01-01 00:04:04.936 3215 3215 E /vendor/bin/hw/android.hardware.configstore@1.0-service: libminijail[3215]: blocked syscall: recvfrom
2、应用crash
![](https://img.haomeiwen.com/i11510028/35264e73e4c2cd1a.png)
网友评论