1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
|
---
title: 系統安全
slug: Archive/B2G_OS/Security/System_security
translation_of: Archive/B2G_OS/Security/System_security
---
<div class="summary">
<p><span class="seoSummary">本文旨在提供 Firefox OS 系統安全模型概觀,說明系統是如何保持安全性與實施權限管理。</span></p>
</div>
<h2 id="名詞解釋">名詞解釋</h2>
<p>在開始之前,有幾個名詞需要了解一下。</p>
<dl>
<dt>
網頁應用程式 (Web application)</dt>
<dd>
網頁應用程式 (<strong>web application, web app, open web app</strong>, <strong>moz app</strong>, <strong>application</strong>) 是運行在 Firefox OS (或其他支援平台)、用 <a href="/en-US/docs/HTML" title="/en-US/docs/HTML">HTML</a>, <a href="/en-US/docs/JavaScript" title="/en-US/docs/JavaScript">JavaScript</a>, 以及其他開源網頁技術所寫成的應用程式。所有 B2G 上使用者使用的應用程式都是網頁應用程式,例如撥號程式是一個 web app,但顯示在瀏覽中的網頁並不屬於網頁應用程式的範疇。</dd>
<dt>
b2g 程序 (b2g process)</dt>
<dd>
Firefox OS <strong>b2g process</strong> 通常會被叫做 "<strong>b2g</strong>" 或 "<strong>Gecko</strong>"。b2g 實際上是一個高權限 (root 權限) 應用程式,控制了所有 web app 對資源和硬體的存取。</dd>
<dt>
內容程序 (Content process)</dt>
<dd>
b2g 產生的子程序,會和 b2g 溝通,代表了 web app。它擁有的權限較低 (一般使用者權限;受限的作業系統資源存取),透過 inter-process communication (IPC) 和 OS 核心溝通。</dd>
<dt>
IPDL</dt>
<dd>
Intercommunication Protocol Definition Language, 請參照 <a href="/en-US/docs/IPDL" title="/en-US/docs/">IPDL</a>.</dd>
<dt>
AOSP</dt>
<dd>
Android Open Source Project.</dd>
<dt>
System call</dt>
<dd>
一個介於使用者空間 (user space) 和核心 (kernel) 的溝通介面,使用者空間只能透過這個介面和核心溝通。</dd>
<dt>
DAC, MAC</dt>
<dd>
使用者可設定的自主存取控制 (Discretionary Access Control) 和 系統強制的<span class="st">強制存取控制 (</span>Mandatory Access Control)。</dd>
<dt>
FOTA</dt>
<dd>
自動韌體更新機制 (Firmware Over The Air),透過無線網路"空中"更新韌體。</dd>
<dt>
MSU (Mozilla System Updater), MAR (Mozilla ARchive)</dt>
<dd>
和 Firefox 桌面產品一樣的更新機制和檔案格式。</dd>
</dl>
<h2 id="Firefox_作業系統安全模型目標與範疇">Firefox 作業系統安全模型目標與範疇</h2>
<p>Firefox OS 安全模型的設計目標:</p>
<ul>
<li>限制 web app 所能存取的資源範疇。</li>
<li>確保作業系統各層安全措施正確執行。</li>
<li>從 Gonk 層起,限制與控管安全漏洞所造成之衝擊影響。</li>
<li>Web app 權限以及所有應用程式相關安全性特色都在<a href="/en-US/docs/Mozilla/Firefox_OS/Security/Application_security" title="/en-US/docs/Mozilla/Firefox_OS/Security/Application_security">應用程式安全</a>模型詳述。</li>
</ul>
<p>下面將說明每一個目標以及 Firefox OS 如何達成個目標。</p>
<h2 id="權限強制">權限強制</h2>
<p><a href="/en-US/docs/Mozilla/Firefox_OS/Security/Application_security" title="/en-US/docs/Mozilla/Firefox_OS/Security/Application_security">應用程式安全</a>模型描述了使用者如何直接或透過受信任第三方來授予應用程式權限,這些強制加諸於內容程序 (content process) 的權限是透過限制資源存取必須經過和核心程序 (core process) 之間的 IPC call。</p>
<ul>
<li>Firefox OS 核心程序, <code>b2g</code>, 的權限極高,同時能夠存取大部分硬體資源。</li>
<li>較低權限的 Web app 的內容程序只能透過 IPC 和 b2g 溝通;IPC 是用 <a href="/en-US/docs/IPDL" title="/en-US/docs/IPDL">IPDL</a> 實現。</li>
<li>內容程序無法存取系統層級的資源。</li>
<li>每一個 Web API 都有一個以上相關聯的 IPDL 協定宣告檔 (*.ipdl).</li>
</ul>
<h2 id="內容程序初始化"><a name="Content_processes">內容程序初始化</a></h2>
<p>所有的 web app 都運行在低權限、分開的內容程序。當 web app 載入到一個特別的 {{HTMLElement("iframe")}} 型態: <em><iframe mozapp></em> 時 b2g 程序會啟動內容程序,這樣會將 web app 和其他內容隔離開來,而且和 web app 的 manifest 高度相關 (請參照 <a href="/en-US/docs/Mozilla/Firefox_OS/Security/Application_security" title="/en-US/docs/Mozilla/Firefox_OS/Security/Application_security">應用程式安全</a>模型),內容程序會在一個稱為 "out of process" (OOP) 的容器裡啟動,這個 OOP 即是 <code>plugin-container</code> 程序,並且和桌面 Firefox 所用的 <code>plugin-container</code> 程序有著相似的原始碼。</p>
<h3 id="風險">風險</h3>
<ul>
<li>當產生 web app 內容程序時的資訊外洩。</li>
<li>提高到和 b2g 一樣權限層級以及存取作業系統資源的意外可能性。</li>
<li>跳過內容程序初始化過程。</li>
</ul>
<h3 id="實作">實作</h3>
<h4 id="在_b2g_程序裡啟動">在 b2g 程序裡啟動</h4>
<p>順序如下:</p>
<ol>
<li><code>fork()</code></li>
<li><code>setuid(new, different, unused user id|nobody)</code> (無特權的使用者)</li>
<li><code>chrdir('/')</code></li>
<li><code>execve('plugin-container')</code></li>
</ol>
<p>這邊的啟動順序確保 OOP 程序運行在隔離的記憶體空間,同時只是低權限使用者,無法提高到 b2g 的高權限。</p>
<h4 id="File_descriptor_(檔案描述子)_管理">File descriptor (檔案描述子) 管理</h4>
<p>File descriptors 的管理方法是白名單;一份受允許的 file descriptors (FDs) 清單儲存在 <code>mFileMap</code> 物件,在呼叫 fork() 後 (FDs 複製前) 和呼叫 execve()前 (新 web app 開始運行),<code>LaunchApp()</code> 函數會強制關閉不在白名單上的 FD。</p>
<p>不同於傳統的黑名單作法 (close-on-exec flag: <code>CLOEXEC</code>),這種做法確保不會有多餘的開啟 FD,比較可靠。</p>
<h2 id="Content_process_sandboxing_(沙箱,低權限內容程序)"><a name="Content_process_sandboxing"></a>Content process sandboxing (沙箱,低權限內容程序)</h2>
<h3 id="風險_2">風險</h3>
<ul>
<li>記憶體錯誤或 Gecko 執行時期邏輯錯誤可能導致意外程式碼的執行。</li>
<li>作業系統,特別是核心,類似錯誤可能導致意外程式碼的執行。</li>
<li>資訊洩漏、檔案系統讀寫。</li>
</ul>
<p>下表為 sandbox 開啟下可能的威脅列表,附帶前述的可能風險。</p>
<div class="warning">
<p dir="ltr"><strong>範疇</strong>: 當攻擊者以內容程序執行意外執行碼時,會出現下面的威脅,也就是說,攻擊者發現了 Gecko 的安全漏洞。</p>
</div>
<table class="standard-table">
<thead>
<tr>
<th scope="col">威脅</th>
<th scope="col">潛在衝擊</th>
<th scope="col">可能性因子</th>
<th scope="col">建議對應作法</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<p>惡意內容程序利用核心安全漏洞</p>
<p>"2 steps attack".</p>
</td>
<td><strong>嚴重</strong>:整個裝置都將受到控制</td>
<td><strong>低</strong>: 內容程序只有有限的方法呼叫系統。</td>
<td>
<ul>
<li>減少允許的系統呼叫數量到最低需要量。</li>
<li>用預防性修正檔保護核心,例如 PaX (Protection Against eXecution).</li>
</ul>
</td>
</tr>
<tr>
<td>
<p>提升到父程序權限</p>
<p>惡意內容程序利用和父程序之間的 IPDL 安全漏洞</p>
<p>"2 steps attack".</p>
</td>
<td><strong>高</strong>: 許多敏感的系統呼叫都可以被執行 (資料損失、相機存取、網路存取等等)</td>
<td><strong>中</strong>: 父程序大量的程式碼代表大範圍的可能攻擊點。少量的 IPDL 資料消毒,例如傳送指標。</td>
<td>
<ul>
<li>以非 root / 非特權使用者執行父程序</li>
<li>盡可能以 sandbox 方法執行父程序</li>
</ul>
</td>
</tr>
<tr>
<td>
<p>惡意內容程序利用父程序攻擊核心安全漏洞</p>
<p>"3 steps attack".</p>
</td>
<td><strong>嚴重</strong>:整個裝置都將受到控制</td>
<td>
<p><strong>低</strong>: 需要父程序有可以透過 IPDL 攻擊的 bug。</p>
<p>需要核心和父程序之間的系統呼叫可利用的漏洞 (相較內容程序,父程序有更多可行的系統呼叫)</p>
</td>
<td>
<ul>
<li>以非 root / 非特權使用者執行父程序</li>
<li>盡可能以 sandbox 方法執行父程序</li>
<li>用預防性修正檔保護核心,例如 PaX (Protection Against eXecution)</li>
</ul>
</td>
</tr>
<tr>
<td>
<p>惡意內容程序、父程序、web app 利用硬體裝置的 bug</p>
<p>"1 and 2 steps attack".</p>
</td>
<td>
<p><strong>高</strong>: 可以執行特別權限的作業 (如撥號、傳 SMS 簡訊等)</p>
<p><strong>嚴重</strong>:整個裝置都將受到控制或執行硬體程式碼。</p>
</td>
<td><strong>低</strong>: 需要硬體 bug 以及 IPDL 或系統呼叫授予的硬體溝通管道</td>
<td>
<ul>
<li>對硬體裝置實施模糊測試 (Fuzz testing)</li>
<li>利用核心或父程序 API 修正檔避開問題 (關閉不安全的硬體功能、消毒資料等等)</li>
</ul>
</td>
</tr>
</tbody>
</table>
<div class="note">
<p><strong>Note</strong>:</p>
<p>* PaX (Protection Against eXecution) 是一個由 <a href="http://grsecurity.net/~paxguy1/" title="http://grsecurity.net/~paxguy1/">GrSecurity</a> (<a href="http://pax.grsecurity.net/docs" title="http://pax.grsecurity.net/docs">docs</a>) 所發佈的核心修正檔,實作了 PaX 以及額外的保護措施,如 UDEREF 和 SMAP。</p>
<p>* 未列出的安全性漏洞代表已被 snadbox 解決掉了。</p>
</div>
<h3 id="實作內容">實作內容</h3>
<p><img alt="Process Model Sandbox" src="https://mdn.mozillademos.org/files/5347/sq1ftZvuape-uCT8CDfJ10Q.png" style="width: 708px; height: 470px;"></p>
<div class="note">
<p><strong>Note</strong>: 內容程序 (Content Processes) 就是運行中的 web app,也會被限制在 sandbox 環境。</p>
</div>
<h4 id="Gecko_APIs_實作">Gecko APIs 實作</h4>
<p>內容程序可見的 APIs 絕不應該直接存取檔案系統,取而代的是應該透過 IPDL,所以說會需要存取資源的 API 都需要在父程序中有一個對應的元件代表 API 存取資源。</p>
<p>實作相關部分時要特別小心,所有送到父程序的輸入都應該要先消毒,不可以相信內容程序以及來自內容程序的 IPDL 訊息。</p>
<div class="warning">
<p><strong>Warning</strong>: 任何內容程序取得的受信任授權都可以被用來繞過 sandbox 所加諸的限制。</p>
</div>
<h4 id="何謂_seccomp">何謂 seccomp</h4>
<p>Seccomp 代表 secure computing mode (安全電腦模式),目前有兩種版本:</p>
<ol>
<li>
<p><code>seccomp</code>, 可見於 Linux kernel 2.6.12 以上版本:</p>
<ul>
<li>
<p>開啟 <code>seccomp</code> 會將程序的系統呼叫 (System call) 限制在 <code>read</code>, <code>write</code>, <code>sigreturn</code>, 和 <code>exit</code></p>
</li>
<li>
<p>使用 <code>prctl()</code> system call</p>
</li>
<li>
<p>可以在指定地方、程序初始化後啟動</p>
</li>
</ul>
</li>
<li>
<p><code>seccomp-bpf</code>, 又稱為 seccomp mode filter 或 mode 2, 可見於 Linux kernel 3.5 以上版本:</p>
<ul>
<li>
<p>如同 <code>seccomp</code>,但多了 BPF 過濾系統呼叫</p>
</li>
<li>
<p>可以使用系統呼叫白名單和啟動時傳入參數,而非單單預先寫死的作法</p>
</li>
<li>
<p>更有彈性,可以有"較多自由的 sandbox",對限制性較低的 sandbox 來說很有用,而且也可以移轉到限制性較高的 sandbox</p>
</li>
<li>
<p>多了一個安全性旗幟避免程序和子程序推翻既有權限限制</p>
</li>
</ul>
</li>
</ol>
<div class="note">
<p><strong>Note</strong>: 基於 <code>seccomp-bpf 更有彈性,所以我們決定採用,並且替版本低於3.5 的 kernel (涵蓋了目前大部分的 Android kernel)提供向下相容移植。</code>目前已經有不會造成衝突、可供使用的移植包 (請見 bug <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=790923" title="https://bugzilla.mozilla.org/show_bug.cgi?id=790923">790923</a>).</p>
</div>
<h4 id="Seccomp-bpf_效能">Seccomp-bpf 效能</h4>
<p><code>seccomp-bpf</code> 會對每一次系統呼叫造成效能負擔,目前沒有一定的效能標竿準則,但我們預估大約最高 1% 的系統呼叫負擔會產生。</p>
<p>由於我們的程序模型減少許多系統呼叫,所以實際上我們預估效能負擔將會趨近於無。</p>
<p>不過因實作細節而異, IPDL 呼叫卻可能造成效能負擔以及增加延遲,建議對於資源需求密集的 API,如 OpenGL 呼叫,可以看一下 <a href="http://code.google.com/p/chromium/issues/detail?id=29120" style="text-decoration: none;">Chromium的實作細節</a>。和 <code>seccomp-bpf</code> 一樣,我們能夠最少化 IPDL 呼叫次數來最小化效能負擔。</p>
<h3 id="實作內容_2">實作內容</h3>
<p><code>seccomp</code> 在 Gecko 以 <em><code>--enable-content-sandbox </code></em>開啟。<em>.</em></p>
<p>預設上系統呼叫拒絕資訊不會被回報,我們可以透過 <code>--enable-content-sandbox-reporter 打</code>開回報機制。</p>
<p>程式碼放在<em> </em><code>gecko/security/sandbox</code>,白名單放在 <code>gecko/security/sandbox/seccomp_filter.h</code>。</p>
<h2 id="檔案系統安全強化"><a name="File_system_hardening"></a>檔案系統安全強化</h2>
<h3 id="風險_3">風險</h3>
<ul>
<li>讀、寫、刪除另一位使用者的檔案可能會導致資訊洩漏或未預期權限提升</li>
<li>經由應用程式漏洞執行本地編譯碼</li>
<li>setuid 程式的安全漏洞導致權限提升</li>
</ul>
<h3 id="實作內容_3">實作內容</h3>
<p>原則上只有使用者內容區域可以讀寫 (除非 OS 未來要求新的讀寫區域),而且一定要包含 <code>nodev</code>、<code>nosuid</code> 和 <code>noexec</code> 選項。標準檔案系統掛載點限制如下:</p>
<table class="standard-table">
<thead>
<tr>
<th scope="col">掛載點</th>
<th scope="col">檔案系統</th>
<th scope="col">選項</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>/</code></td>
<td>rootfs</td>
<td>read-only</td>
</tr>
<tr>
<td><code>/dev</code></td>
<td>tmpfs</td>
<td>read-write, nosuid, noexec, mode=0755</td>
</tr>
<tr>
<td><code>/dev/pts</code></td>
<td>ptsfs</td>
<td>read-write, nosuid, noexec, mode=0600</td>
</tr>
<tr>
<td><code>/proc</code></td>
<td>proc</td>
<td>read-write, nosuid, nodev, noexec</td>
</tr>
<tr>
<td><code>/sys</code></td>
<td>sysfs</td>
<td>read-write, nosuid, nodev, noexec</td>
</tr>
<tr>
<td><code>/cache</code></td>
<td>yaffs2 or ext4</td>
<td>read-write, nosuid, nodev, noexec</td>
</tr>
<tr>
<td><code>/efs</code></td>
<td>yaffs2 or ext4</td>
<td>read-write, nosuid, nodev, noexec</td>
</tr>
<tr>
<td><code>/system</code></td>
<td>ext4</td>
<td>read-only, nodev</td>
</tr>
<tr>
<td><code>/data</code></td>
<td>ext4</td>
<td>read-write, nosuid, nodev, noexec</td>
</tr>
<tr>
<td><code>/mnt/sdcard</code></td>
<td>ext4 or vfat</td>
<td>read-write, nosuid, nodev, noexec, uid=1000, fmask=0702, dmask=0702</td>
</tr>
<tr>
<td><code>/acct</code></td>
<td>cgroup</td>
<td>read-write, nosuid, nodev, noexec</td>
</tr>
<tr>
<td><code>/dev/cpuctl</code></td>
<td>cgroup</td>
<td>read-write, nosuid, nodev, noexec</td>
</tr>
</tbody>
</table>
<div class="note">
<p><strong>Note:</strong> 實際的掛載點可能有所變更</p>
</div>
<h3 id="Linux_DAC_2"><span class="mw-headline" id="Linux_DAC">Linux DAC</span></h3>
<p>Linux DAC represents 是一個有名的 Linux 檔案系統權限模型。</p>
<div class="note">
<p><strong>Note: </strong>這是傳統的 user/group/others 權限模型,而非 Linux POSIX 1.e ACLs.</p>
</div>
<ul>
<li>Web app 系統使用者沒有寫入任何檔案的權限</li>
<li>setuid 二進位檔只能在必要時使用</li>
<li>新內容程序以合理的 umask 啟動</li>
</ul>
<h2 id="安全系統更新"><a name="System_updates"></a>安全系統更新</h2>
<h3 id="風險_4">風險</h3>
<ul>
<li>受感染的更新檔案導致未受信任的更新檔被安裝</li>
<li>受感染的更新檢查
<ul>
<li>使用者看不到更新</li>
<li>使用者更新到過時的更新檔,導致軟體降級</li>
</ul>
</li>
<li>安裝更新時受感染或未知的系統狀態可能導致:
<ul>
<li>遺失安裝檔案,例如一些安全性修正檔</li>
<li>安全性修正被受感染的系統推翻</li>
</ul>
</li>
<li>更新機制的安全漏洞</li>
<li>對已知漏洞缺乏更新或追蹤</li>
</ul>
<h3 id="實作內容_4">實作內容</h3>
<p>Firefox OS 的更新機制使用安全的 Mozilla 程序,更新檔是由受信任,通常是 OEM 廠商,組建、測試、簽署數位簽章。</p>
<h4 id="FOTA_(Firmware_over_the_air)_更新">FOTA (Firmware over the air) 更新</h4>
<p>系統更新可能涵蓋全部或部分 Firefox OS,如果更新涵蓋到 Gonk,那麼 <strong>FOTA</strong> (Firmware Over the Air) 安裝程序會被採用。FOTA 也可涵蓋到 OS 其他部分,例如裝置管理 (FOTA, firmware / drivers)、設定管理 (Firefox OS settings)、安全更新、Gaia、Gecko 等等。</p>
<h4 id="MSUMAR_更新">MSU/MAR 更新</h4>
<p>不牽涉到 Gonk 的更新可以透過 Mozilla 系統更新工具。Firefox OS 使用和桌面 FIrefox 一樣的更新架構、程序 Mozilla ARchive (MAR) 格式 (用於更新包)。</p>
<h4 id="更新服務">更新服務</h4>
<div class="note">
<p><strong>Note: </strong>更新服務能由 OEM 廠商提供。</p>
</div>
<p>手機內建的更新系統會定期檢查更新,一但發現新更新,會提示使用者安裝更新,另外安裝前也會檢查手機儲存空間以及驗證發行者身分:</p>
<ul>
<li>更新來源 (驗證更新和 manifest 檔的來源位置,protocol:domain:port)</li>
<li>檔案完整性 (加密 hash checksums).</li>
<li>程式碼簽章</li>
</ul>
<p>下列安全性作法會用在更新程序:</p>
<ul>
<li>Mozilla 建議並且預期更新有受信任的證明以及通過 SSL 下載。</li>
<li>更新韌體需要高度加密驗證。</li>
<li>更新前完整的更新檔必須從特定、安全的來源下載。</li>
<li>當系統更新時,系統必須要在安全的狀態下,不可以運行任何 web app。</li>
<li>金鑰必須存在裝置上安全的地方。</li>
</ul>
<p>縝密的更新檢查確保正常地安裝更新。</p>
<div class="note">
<p><strong>Note</strong>: 更多有關更新資訊,請見 <a href="/en-US/Firefox_OS/Building_and_installing_Firefox_OS/Creating_Firefox_OS_update_packages">Creating and applying Firefox OS update packages</a>.</p>
</div>
<p> </p>
|