1. 程式人生 > >Chrome中Sandbox沙盒技術Linux Sandbox

Chrome中Sandbox沙盒技術Linux Sandbox

Chromium OS中沙盒相關

以下各個設施均與minijail相關,與之配合執行

  • User ids
  • Capacities
  • Namespace
  • Seccomp filters
  • Securely mounting cryptohome daemon store folders

需要注意:以下技術並不完全都是chrome os的,大部分都是linux支援的。

Linux Sandboxing Summary

image
上圖包含了幾個Sandbox的分層,括號內寫了哪些東西主要用了哪些Sandbox Layer

User ids

作用:指定某個服務或應用以哪個使用者的身份執行。即minijail的-u引數。
相當於Windows的右鍵-以其它使用者身份執行。

exec minijail0 -u devbroker -c 0009 /usr/bin/permission_broker \
    --access_group=${PERMISSION_BROKER_GRANT_GROUP}

此時應用的許可權被侷限於該使用者擁有的許可權。

Capabilities

當一些非特權應用,需要一些root使用者才能呼叫的函式時,則通過Capacities將一些root才能使用的函式授權給普通許可權的程式去使用

作用:使能非root服務、程序呼叫要求root許可權的函式。

在conf檔案中對exec minijail0新增-c 引數即可開放對應的函式。

exec minijail0 -u devbroker -c 0009 /usr/bin/permission_broker \
    --access_group=${PERMISSION_BROKER_GRANT_GROUP}

其中,-c後面跟的mask指示了允許非root程式授權呼叫哪些root函式。mask的計算方法如下。

https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/include/uapi/linux/capability.h
計算方法:#define CAP_TO_MASK(x)      (1 << ((x) & 31)) /* mask for indexed __u32 */

其中,-c跟著的mask值並不是一定只包含了一個函式,有可能是多個函式經過計算之後得出的mask值,而後進行相加。例如:樣例中的0009就不是隻開放了一個函式,經過計算,發現是開放了兩個函式。

通過mask得出開放的函式的計算過程如下:

  1. -c 0009:即mask為0000 0000 0000 1001
  2. 判斷開放了多少個函式的方法是看二進位制中有幾多個1。原理是:每個函式對應一個十進位制數字,該數字首先執行操作:(x) & 31,然後使用1左移得到的結果:(1 << ((x) & 31)),然後依次按照這個步驟對各個函式計算左移結果,最終將所有左移結果相加。因此二進位制中有多少1,那表明開放的函式就有多少個。
  3. 樣例中為1001,兩個1,兩個函式,其中第一個1是8,8是1右移3位得到的,所以(x) & 31就是3。
  4. (x) & 31 == 3因此x=3,查capacities.h得到對應巨集定義CAP_FOWNER,即開放的其中一個函式為fowner()

在各個服務的upstart conf檔案中找到exec minijail0,新增引數-c MASK 即可授權該服務訪問指定的root許可權函式

Namespace

Linux namespace可以將各個程序之間分隔開,使得采用了不同名稱空間的程序看到的事物檢視不相同。

作用:namespace可以讓程序擁有自己單獨的檢視,並且任何對系統的修改不會影響名稱空間之外。在名稱空間內,程序擁有獨立的、不一定等同於真實物理環境的系統環境,且自身的修改不會影響系統。

  • 名稱空間是對系統資源的包裝。
  • 同一名稱空間內的程序可以看到其他程序的修改,但是不同名稱空間之間的程序之間不能看到修改。

A namespace wraps a global system resource in an abstraction that
makes it appear to the processes within the namespace that they have
their own isolated instance of the global resource. Changes to the
global resource are visible to other processes that are members of
the namespace, but are invisible to other processes. One use of
namespaces is to implement containers.

/proc/[pid]/ns包含了每個程序所在的名稱空間。

Seccomp filters

SECure COMPuting

BPF: Berkeley Packet Filter 安全計算模組

*.policy指定規則,告知minijail:

  • 可以呼叫哪些、不可以呼叫哪些syscall
  • 哪些syscall可以使用哪些引數而另外的引數不允許使用

policy檔案設定對應的syscall為允許呼叫和禁止呼叫,通過ebuild檔案將*.policy檔案安裝到指定的位置,在啟動時通過minijail的-S引數指定應用的policy檔案。