淺談XEN中Retpoline的利用

圈內人士都知道Spectre2的漏洞有若干解決方案,目前最優化的當然是retpoline方式,幾乎沒有性能損耗,另一種次之的是通過更新微碼打開軟件層對BTB硬件單元的控制,這種方式有10%-15%的性能損耗。

但是retpoline也並非萬能,在Skylake架構以上的Intel x86處理器中還有RSB相關的漏洞導致這種方式只在Skylake之前的架構中可用。而AMD則更傾向於lfence這種barrier方式。

爲了利用retpoline,XEN內核手動把所有間接近跳轉轉換爲ret形式的跳轉。從此內核中再無間接近跳轉,這類指令目前算是廢了。

下面是retpoline的替代代碼,僅僅5行彙編。

.macro IND_THUNK_RETPOLINE reg:req
        call 2f
1:
        lfence
        jmp 1b
2:
        mov %\reg, (%rsp)
        ret
.endm

爲了對間接近跳轉趕盡殺絕,GCC同樣做了更新。以便和內核中的retpoline緊密結合到一塊,全面使能retpoline的支持。

增加了一個新的編譯選項,-mindirect-branch=choice

choice可取keep/chunk/chunk-inline/chunk-extern

每一個選項的意思從其名字已經很清楚,XEN中使用的是chunk-extern,因爲XEN內核對每個間接的寄存器都提供了一個retpoline的實現,具體看下面代碼。

/* Instantiate GEN_INDIRECT_THUNK for each register except %rsp. */
.irp reg, ax, cx, dx, bx, bp, si, di, 8, 9, 10, 11, 12, 13, 14, 15
        GEN_INDIRECT_THUNK reg=r\reg
.endr
linux內核沒有時間看,估計邏輯實現上也沒有大的區別吧。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章