我有一個設備驅動程序,它允許用戶空間應用程序使用ioctl機制執行各種操作。作爲初始ioctl調用的一部分返回的是對應用程序在其他ioctl調用中提供的用戶空間應用程序應該不透明的句柄。從IOCTL調用返回一個內核句柄 - 安全問題?
在驅動程序內部,句柄是內核空間中某個控制/上下文塊的地址。如果可以信任該應用程序來忠實地回傳處理,那麼一切都很好。值得關注的是,如果應用程序是惡意的並且傳回一些驅動程序然後將其轉換爲適當的指針類型並取消引用它的任意句柄。
我在想的一個健全性檢查是與PAGE_OFFSET比較,如果小於(確保地址至少指向內核內存),則拒絕。如果頁面錯誤我認爲在內核空間中不合法呢?一個簡單的方案可能是檢查句柄是否先前返回到用戶空間,但是搜索開銷可能很高(因爲可能有很多這些句柄)。
有沒有一個強大而有效的方法來驗證句柄?任何幫助表示讚賞。
謝謝。
更重要的是,如果有不同類型的「手柄」(比方說,A型和對象的對象的類型B),他們也需要進行類型檢查(即,你確實會得到一個類型A句柄,你期望得到一個類型A句柄)。如果某些句柄或其他輸入參數是相關的,則需要對它們進行驗證,這不僅有助於將它們視爲單獨的實體時纔有意義,而且它們在所呈現的組合中是有意義的。此外,返回指針會削弱地址隨機化方案,並可以簡化成功的利用創建。我會使用索引,而不是指針。 –