# 自我檢查事項(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 ![](https://i.imgur.com/WTFBnfy.png) 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 運作原理 ::: ![](https://i.imgur.com/hf8bs3Q.png) 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 呢?