Try   HackMD

自我檢查事項(sandbox)

tags: sysprog2017 dev_record

contributed by <HMKRL, HTYISABUG>


隔離執行環境的建構

  • 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

    Image Not Showing Possible Reasons
    • The image file may be corrupted
    • The server hosting the image is unavailable
    • The image path is incorrect
    • The image format is not supported
    Learn More →

    Samsung手機內建的 KNOX 功能也為每支手機提供了獨立的硬體 key, 由 bootloader 開始確認裝置安全性,若偵測到裝置韌體被修改過就會觸發處理器中的 e-fuse 保護使用者的資料安全

    refrence

  • 是否已詳細閱讀 Moxie 處理器架構的 Architecture 文件?能否用 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 長的常數作為後綴
指令太多了就不一一列出, 要用時直接去網站上查詢比較快

  • binutils, gcc, glibc, qemu 到 libffi 這些專案的作用為何?
  • binutils
  • gcc
    • 大家都知道的編譯器套件
    • 包含 compiler, assembler, linker 等各種各樣的功能
  • glibc
    • C standard library
  • qemu
    • 模擬器
    • 可模擬整個 OS, KVM 加速後可接近實機速度
    • 可模擬不同架構 CPU, 使編譯為其他架構的程式得以運行
  • libffi
    • 提供跨語言呼叫函式的函式庫
    • 僅提供最基本的功能
    • 在使用時還需做參數格式轉換等處理
  • moxiebox 打造出隔離執行 (sandbox) 的運作環境該如何與外界溝通?列出對應的程式碼並解讀
    • 提示: mmap 系統呼叫

輸入的主程式碼如下

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 結構如下

struct moxie_memory_map_ent {
    void *addr;
    size_t length;
    char tags[32 - 4 - 4];
};

addr 指向資料實際儲存的位址
length 為資料長度, 單位 byte
tags 用來標示資料
在用 src/sandbox 執行程式時輸出的文字就是跟資料有關

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

// 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 輸出

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →

BOLOS 是利用 MOXIE VM 只能在封閉環境執行, 不能直接 I/O 的特性來運轉的
包括 private key , 生成 address 跟認証交易都會在 VM 中進行
外部環境能取得的只有被 API 限制的資訊, 且也無法對內部進行規範外操作

  • 何謂 cross compiler 呢?我們為何需要?

cross compiler 能在平台上編譯不同架構處理器能運作的程式碼(例如在 x86 架構的主機上編譯 arm 執行檔,或是像 sandbox 作業一樣編譯出 moxie 執行檔)

應用情境:

  1. 執行檔實際要運作的機器和開發用的機器架構不同
  2. 執行檔要運作的機器不適合用於編譯程式(例如嵌入式環境/這次的 sandbox 環境)
  • ELF 執行檔格式包含哪些 section 呢?又在哪裡可見到詳細描述?

ELF 執行檔包含 .text/.init/.data 等 section, 可以透過 readelf -a <filename> 檢視 ELF 檔細節

  • 是否已掌握 GNU gprof 的使用?運作原理為何?
    • 提示: 參閱 raytracing 作業規範和共筆成果
  • 是否已操作 remote GDB 呢?如何在執行時期檢驗載入的 ELF 執行檔裡頭 .text.data section 內容呢?
  • 是否詳讀文件 遠端除錯 並記錄心得呢?是否在 GNU/Linux 實際照著操作?又,遇到什麼問題呢?
    • 提示: 硬體架構以不同,文章提及 IA32,但現在已是 x86_64 架構

參照 開發紀錄

參照 開發紀錄


Model Checking

  • cbmc 的作用為何?在什麼領域會需要呢?

cbmc可以用於檢查C/C++程式中的 Boundary checking: 例如指標存取是否合法/陣列存取是否超出範圍等等,可以用於預防可能出現的邏輯錯誤或程式編輯器檢查功能等

  • 能否簡介自動機理論 (automata theory) 呢?

透過不同的狀態 (state) 和事件 (event) 進行運作,可以進行各種計算
常見的例如 compiler/text processing 等領域

  • model checking 中局部狀態表示每個主題執行通訊協定的過程,而所有局部狀態構成全域狀態,每個局部狀態的改變由主體的訊息接收、發送來觸發,能否舉出實際案例說明?
  • 是否已編譯 cbmc 並用來分析 C 程式呢?若是,舉出詳細的操作和你的解讀
  • 以 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 呢?