# 自我檢查事項(sandbox)
###### tags: `sysprog2017` `dev_record`
contributed by <`HMKRL`, `HTYISABUG`>
---
## 隔離執行環境的建構
:::info
- [x] Trusted Execution Environment (TEE) 的應用為何?(舉出共筆以外的真實世界案例)
:::
- 目前手機行動支付的運作模式分為 HCE (Host Card Emulation) 和 TSM (Trusted Service Manager) 前者為 Android Pay 採用的方式,後者則需要硬體安全元件 (SE, Secure Element)作為 TEE ,包括 SWP-SIM 卡或特殊的 SDCard ,Apple Pay 則採用內建的獨立硬體作為安全元件。
使用者的付款資料儲存在安全元件中,需要時直接由 NFC Controller存取,不透過其他應用程式或裝置本身的 CPU

Samsung手機內建的 KNOX 功能也為每支手機提供了獨立的硬體 key, 由 bootloader 開始確認裝置安全性,若偵測到裝置韌體被修改過就會觸發處理器中的 e-fuse 保護使用者的資料安全
[refrence](https://link.springer.com/content/pdf/10.1007%2F978-3-319-50500-8_18.pdf)
:::info
- [x] 是否已詳細閱讀 [Moxie](http://moxielogic.org/blog/) 處理器架構的 [Architecture](http://moxielogic.org/blog/pages/architecture.html) 文件?能否用 Moxie 組合語言寫出迴圈版本的 Fibonacci 數列程式?
:::
- Registers
- 16 個 32 bits register
|Name |Description |
|------|-------------------------|
|fp |the frame pointer |
|sp |the stack pointer |
|r0~r13|general purpose registers|
- special registers
- 只能用 getter & setter inst. 操作
- get special register: inst. `gsr`
- set special register: inst. `ssr`
- 大多跟 **Exception Handler** 有關
|Special Register|Description|
|-|-|
|0|status register with the following bit values|
|1|ptr to **Exception Handler** routine|
|2|upon invocation of **Exception Handler**, will have one of four values|
|3|the swi request number|
|4|addr. of the supervisor mode stack on which exceptions aree executed|
|5|retuen addr. upon entering the **Exception Handler**|
|6|reserved|
|7|reserved|
|8|reserved|
|9|an optional non-zero ptr to the Device Tree blob describing this device|
- instruction set
Instruction 長度皆為 16 bits, 有些會有 32 bits 長的常數作為後綴
指令太多了就不一一列出, 要用時直接去[網站](http://moxielogic.org/blog/pages/architecture.html)上查詢比較快
:::info
- [x] binutils, gcc, glibc, qemu 到 [libffi](https://sourceware.org/libffi/) 這些專案的作用為何?
:::
- binutils
- 用於處理 object code
- 包含 assembler, <span style='color: #98c379;'>linker</span>, gprof 等等功能
- 雖然根據[維基](https://zh.wikipedia.org/wiki/GNU_Binutils)來看說要搭配 gcc 使用, 不過 [gcc 實際上就有包裝 binutils](https://github.com/gcc-mirror/gcc/search?q=binutils&type=Code&utf8=%E2%9C%93)
- gcc
- 大家都知道的編譯器套件
- 包含 compiler, assembler, <span style='color: #98c379;'>linker</span> 等各種各樣的功能
- glibc
- C standard library
- qemu
- 模擬器
- 可模擬整個 OS, KVM 加速後可接近實機速度
- 可模擬不同架構 CPU, 使編譯為其他架構的程式得以運行
- libffi
- 提供跨語言呼叫函式的函式庫
- 僅提供最基本的功能
- 在使用時還需做參數格式轉換等處理
:::info
- [ ] Intel 的 [Software Guard Extensions](https://software.intel.com/en-us/sgx) 關鍵特性為何?並舉出共筆以外的應用案例
:::
:::info
- [x] [moxiebox](https://github.com/sysprog21/moxiebox) 打造出隔離執行 (sandbox) 的運作環境該如何與外界溝通?列出對應的程式碼並解讀
- 提示: `mmap` 系統呼叫
:::
輸入的主程式碼如下
```c
static bool loadRawData(machine &mach, const string &filename)
{
// open and mmap input file
mfile pf(filename);
if (!pf.open(O_RDONLY))
return false;
static unsigned int dataCount = 0;
char tmpstr[32];
// alloc new data memory range
sprintf(tmpstr, "data%u", dataCount++);
size_t sz = pf.st.st_size;
addressRange *rdr = new addressRange(tmpstr, sz);
// copy mmap'd data into local buffer
rdr->buf.assign((char *) pf.data, sz);
rdr->updateRoot();
// add to global memory map
return mach.mapInsert(rdr);
}
```
在這裡會將文件中的資料複製到記憶體中
被複製儲存的資料能經由 `moxie_memmap` 全域變數取得
這是一個 struct 指標, struct 結構如下
```c
struct moxie_memory_map_ent {
void *addr;
size_t length;
char tags[32 - 4 - 4];
};
```
`addr` 指向資料實際儲存的位址
`length` 為資料長度, 單位 byte
`tags` 用來標示資料
在用 `src/sandbox` 執行程式時輸出的文字就是跟資料有關
```shell
ep 00001000
ro 00000f8c-0000146c elf0 // tag elf0
rw 0000156c-000019d8 elf1 // tag elf1
rw 000029d8-000129d8 stack // tag stack
ro 000139d8-00013a78 mapdesc // tag mapdesc
```
輸出的主程式碼如下
`src/sandbox.cc`
```c
// static void gatherOutput(machine &mach, const string &outFilename)
uint32_t vaddr = mach.cpu.asregs.sregs[6];
uint32_t length = mach.cpu.asregs.sregs[7];
if (!vaddr || !length)
return;
char *p = (char *) mach.physaddr(vaddr, length);
```
會從 `$sr6` `$sr7` 取出記憶體位置與長度
再經由 `physaddr` 轉換為實體記憶體位置, 最後輸出為文件
輸出似乎不是單純把資料換為 ASCII 輸出
:::info
- [ ] 是否已詳閱文件 [sandbox execution environment](https://github.com/sysprog21/moxiebox/blob/master/sandbox-design.md) 呢?解釋 法國的加密貨幣硬體錢包公司 [Ledger](https://www.ledgerwallet.com/) 的 BOLOS 運作原理
:::

BOLOS 是利用 `MOXIE VM` 只能在封閉環境執行, 不能直接 I/O 的特性來運轉的
包括 private key , 生成 address 跟認証交易都會在 VM 中進行
外部環境能取得的只有被 API 限制的資訊, 且也無法對內部進行規範外操作
:::info
- [x] 何謂 cross compiler 呢?我們為何需要?
:::
cross compiler 能在平台上編譯不同架構處理器能運作的程式碼(例如在 x86 架構的主機上編譯 arm 執行檔,或是像 sandbox 作業一樣編譯出 moxie 執行檔)
應用情境:
1. 執行檔實際要運作的機器和開發用的機器架構不同
2. 執行檔要運作的機器不適合用於編譯程式(例如嵌入式環境/這次的 sandbox 環境)
:::info
- [x] ELF 執行檔格式包含哪些 section 呢?又在哪裡可見到詳細描述?
:::
ELF 執行檔包含 `.text`/`.init`/`.data` 等 section, 可以透過 `readelf -a <filename>` 檢視 ELF 檔細節
:::info
- [ ] 是否已掌握 GNU gprof 的使用?運作原理為何?
- 提示: 參閱 [raytracing](https://hackmd.io/s/HyuBWDwYl) 作業規範和共筆成果
- [ ] 是否已操作 remote GDB 呢?如何在執行時期檢驗載入的 ELF 執行檔裡頭 `.text` 和 `.data` section 內容呢?
:::
:::info
- [ ] 是否詳讀文件 [遠端除錯](http://www.study-area.org/cyril/opentools/opentools/x1265.html) 並記錄心得呢?是否在 GNU/Linux 實際照著操作?又,遇到什麼問題呢?
- 提示: 硬體架構以不同,文章提及 IA32,但現在已是 x86_64 架構
:::
參照 [開發紀錄](https://hackmd.io/JwEwzAbArATARjAtAdgMYA4qICytQM0XXxDkWAFMKoBGOUkebIA=?both#gdb-stub)
:::info
- [x] GDB 命令如 `step` 是如何透過 GDB stub 傳遞到 [moxiebox](https://github.com/sysprog21/moxiebox) 裡頭呢?兩邊的通訊協定又為何?
- 提示: 需要對照看 [moxiebox](https://github.com/sysprog21/moxiebox) 的 `src/sandbox.cc` 檔案內容和 [GDB Remote Serial Protocol](https://sourceware.org/gdb/onlinedocs/gdb/Remote-Protocol.html)
:::
參照 [開發紀錄](https://hackmd.io/JwEwzAbArATARjAtAdgMYA4qICytQM0XXxDkWAFMKoBGOUkebIA=?both#gdb-stub)
:::info
- [ ] 是否理解 GDB Macro 和 [Command Files](https://sourceware.org/gdb/onlinedocs/gdb/Command-Files.html) 呢?能否透過 [moxiebox](https://github.com/sysprog21/moxiebox) 進行練習呢?
:::
---
## Model Checking
:::info
- [x] cbmc 的作用為何?在什麼領域會需要呢?
:::
cbmc可以用於檢查C/C++程式中的 Boundary checking: 例如指標存取是否合法/陣列存取是否超出範圍等等,可以用於預防可能出現的邏輯錯誤或程式編輯器檢查功能等
:::info
- [x] 能否簡介自動機理論 (automata theory) 呢?
:::
透過不同的狀態 (state) 和事件 (event) 進行運作,可以進行各種計算
常見的例如 compiler/text processing 等領域
:::info
- [ ] model checking 中局部狀態表示每個主題執行通訊協定的過程,而所有局部狀態構成全域狀態,每個局部狀態的改變由主體的訊息接收、發送來觸發,能否舉出實際案例說明?
:::
- [ ] 是否已編譯 cbmc 並用來分析 C 程式呢?若是,舉出詳細的操作和你的解讀
- 務必詳閱 [CBMC: Bounded Model Checking for C/C++ and Java: A Short Tutorial](http://www.cprover.org/cprover-manual/cbmc.shtml)
- [ ] 以 moxiebox 為例,能否使用 cbmc 來找出程式碼實作的缺陷 (或者自己創造) 呢?
- [ ] 在 GitHub 專案中找出使用 model checking 的案例,並且具體說明其作用 (當然要親自實驗)
## 第 6 週作業回顧
- [ ] 是否已知曉搭配 computed goto 實作更高效的 opcode dispatch 呢?舉例說明並且附上效能分析
- 運用 threaded code 的技巧,並以對應的 direct threading 解釋
- [ ] 何謂 tail recursion 呢?舉出具體而微的案例並用 perf 解釋細部差異 (特別是 cycle count 的落差)
- [ ] 是否理解 Fibonacci 數列求值的多種實作方式?若是,詳述之
- [ ] GCC 如何從 3-address code 轉換,又如何轉換出給定 ISA 的組合語言程式?
- [ ] 目前採用的 LP64 資料模型下,int 實質為 32-bit,而 $fib(46)$ 尚在 32-bit 能表示的數值範圍內,但 $fib(47)$ 該如何處理?
- [ ] Fibonacci sequence 在真實世界中究竟有何應用?
- 當然不能舉「用來刁難學生」這種案例
- [ ] Fibonacci Q-Matrix 如何運作?
- [ ] 如何設計 CPU profiler 呢?
- [ ] 如果我們也想對 full-stack-hello 提出 GDB 支援,該如何實作 GDB stub 呢?