📘 學習筆記:深入理解TEE OSes
Understanding TEE OSes In Depth
一、TEE OS 概述
📌 定義與作用
- OS:軟件與硬件之間的橋樑
- TEE OS:TEE軟件與TEE硬件之間的橋樑
-
TEE OS 分類:
- Enclave 內的庫操作系統:Haven, SGX-LKL, Gramine, Occlum
- CVM 內的客户操作系統:Linux, Gramine-TDX, Asterinas
二、主要 TEE OS 介紹
1. Haven (OSDI’14)
- 首個為 Intel SGX 設計的庫OS,提供 Windows ABI
-
結構包括:
- Application → Windows 8 API
- Library OS → Drawbridge ABI
- Shield module(線程、虛擬內存、調度、文件系統等)
- Untrusted runtime → Drawbridge ABI, SGX priv. ops
- SGX driver
2. Gramine-SGX (ATC’17)
- Linux 兼容的單進程庫OS
- 提供28種安全接口分類:Safe, Benign, DoS, Unsafe
3. Occlum (ASPLOS’20)
- Linux 兼容的多進程庫OS,使用 Rust 編寫
- 強調強隔離、最小化應用修改
4. SGX-LKL (EuroSys’21)
- 基於 Linux Kernel Library 的 SGX 移植版本
5. Graphic-TDX (CCS’24)
- 為 Intel TDX 設計的 Linux 兼容單進程庫OS
- TCB 比傳統 Linux 內核小得多
三、Lago 攻擊:TEE OS 的主要威脅
📌 定義
- Lago 是莎士比亞戲劇《奧賽羅》中的角色,不直接殺人,而是通過謊言和半真半假的話操縱奧賽羅自我毀滅。
- Lago 攻擊:不可信的操作系統向 TEE 提供惡意輸入,利用 TEE 內部漏洞進行攻擊。
🛡️ 攻擊示例(Linux 內核漏洞)
1. 內存安全漏洞(virtio_ring.c)
i = virtio16_to_cpu(_vq->vdev, desc[i].next);
- 問題:越界索引(Out-of-bound indexing)
2. 整數溢出(virtio_console.c)
nr_queues = use_multiport(portdev) ? (nr_ports + 1) * 2 : 2;
vqs = kmalloc_array(nr_queues, sizeof(struct virtqueue *), GFP_KERNEL);
- 問題:整數溢出 → 分配零大小對象
3. Use-after-Free(virtio_net.c)
if (mtu < dev->min_mtu) {
goto free;
}
...
free: free_netdev(dev);
- 問題:未設置錯誤號 → Use-after-Free
四、Asterinas:內存安全的 Rust 內核
🛡️ 防禦 Lago 攻擊的設計
-
內存能力對象:
VmFrame:物理內存頁DmaCoherent:一致性DMA映射VmSpace:用户內存空間DmaStream:流式DMA映射
- 所有內存訪問必須通過這些對象的安全方法
✅ 優勢
- 比 Linux 或其他 Rust 內核更內存安全
- 最小化 TCB(比 RedLeaf、Theseus、Tock 更小)
- 性能與 Linux 相當
五、MiSDisk:安全的虛擬磁盤
🎯 目標
- 保護 TEE 的磁盤 I/O 免受強大攻擊者
-
提供 CIFC 保證:
- Confidentiality(機密性)
- Integrity(完整性)
- Freshness(新鮮度)
- Consistency(一致性)
🧱 多層設計
- L3:可信塊 I/O 層(BIO)
- L2:事務性鍵值存儲(TxKV)
- L1:事務性日誌存儲(TxLog)
- L0:安全日誌層(EditJournal)
🚀 性能
- 在 FIO 和 trace-driven 測試中顯著優於 SGX-PFS
六、總結
- TEE OS 是 TEE 軟件與硬件之間的橋樑
- Lago 攻擊 是 TEE 最大威脅
- Asterinas 能有效防禦基於內存的 Lago 攻擊
- MiSDisk 提供對基於 I/O 的 Lago 攻擊的 CIFC 保護