YVR18資料關注點1:PAC和BTI特性的目的
今年由於計劃衝突沒有參加Linaro Connect,假期把會議分享的材料都看了一遍,把有意思的一些資訊總結在這裡。
資源在這裡:YVR18 Resources,部分是演講視訊,部分包括膠片,但也有很多是兩者都沒有的,按我的經驗,會議結束後還沒有的,後面也補不回來,所以,基本上你這裡能看到的就是所有的材料了。
材料都有編號,格式是Nnn,其中N是第幾天的會議,nn是序號,後面提到相關材料的時候,用序號來表示。
(注:由於我和這個組織有利益相關,所以這裡只從個人角度談個人覺得有趣的技術,不做評價,也和Linaro的運作策略無關。)
ARM在指令版本v8.3(這裡都是指A系列)的時候開始引入PAC,到v8.5的時候引入了BTI。分別是對資料和指令訪問進行了更復雜的控制。我只深入看過PAC的Spec,大概的意思是可以給頁面加上一個tag,然後當你訪問這個地址的時候,如果所使用的指標(64位系統的指標有一部分空間沒有用)沒有帶有這個tag,就異常。
而BTI的作用從介紹上看是類似的,不過是作用於程式碼,如果你跳轉到另一個地址,而你所執行的指令的頁面上給定一個標記c,跳轉的目標指令如果不以bti c開頭,就異常。示例程式碼如下:
blr x0 ... good://如果x0定位在這裡,就是正常的 bti c ... bad: //如果x0定位在這裡,就會異常 mov x0, #16 ...
我最早看AuthPointer的Spec的時候,第一反應是這東西是用來支援pkey_mprotect()的。但從這次會議的介紹來看,這兩個特性首先考量的目標場景是保護ROP和JOP。
所謂ROP和JOP分別是Return Oriented Programming和Jump Oriented Programming,這是兩種攻擊技術。我們平時用得最多的緩衝區攻擊都是找到那些對入口引數判斷不嚴謹的函式,然後通過非法的輸入引數,誘導這些函式越界訪問堆疊中的資料,沖掉函式的返回值,從而讓程式執行到另一個地方,從而實現攻擊(比如更改攻擊程式的許可權等),這就是ROP。而JOP是一種更廣泛意義的ROP,由於很多程式(特別是C++一類的面向物件程式),經常使用跳轉表,如果越界訪問可以攻擊到跳轉表,同樣可以控制整個執行流程。
我猜這兩個特性最終都會依賴pkey_mprotect()來實現的,但理解這兩個特性的最終目的,也許能讓我們更加清楚應該如何測試這兩個特性是否發揮了作用。ARM在介紹中說使用PAC和BTI後,可以大幅降低製造ROP和JOP的Gadget程式碼的程式碼量,這個地方是我沒有看懂的,也許當時會場上有特別的解釋?