爲了進行面向安全的源代碼審查,我有興趣找到(全面)所有在Linux內核中註冊的ioctl命令。另外,我想將它們分類爲管理員可以訪問(例如root),哪些可以由非特權用戶訪問。Linux中的ioctl命令可以完全枚舉嗎?
我不確定是否會更容易閱讀內核源代碼或者是否有某種方式在用戶空間查詢列表。如果我需要查看內核,我需要尋找什麼函數來註冊ioctls?
爲了進行面向安全的源代碼審查,我有興趣找到(全面)所有在Linux內核中註冊的ioctl命令。另外,我想將它們分類爲管理員可以訪問(例如root),哪些可以由非特權用戶訪問。Linux中的ioctl命令可以完全枚舉嗎?
我不確定是否會更容易閱讀內核源代碼或者是否有某種方式在用戶空間查詢列表。如果我需要查看內核,我需要尋找什麼函數來註冊ioctls?
ioctls實際上並未在內核中註冊,每種類型的文件類對象都有一組不同的ioctls可用。
大部分時間使用switch語句實現它們。
那麼你真正需要做的是:
在實踐中找出可用的ioctls是非常平凡的。許多設備都有一個列出它們的手冊頁,但其他設備卻沒有,列表可能不完整。
通常在某個地方有一個大開關語句的函數。然而,存在一種「繼承」,即許多設備具有在不同級別實現的幾種不同類型的ioctl。
驅動程序的「種類」通常在幾種不同類型的硬件中實現,它們通常共享相當多的代碼。
例如,串行端口有http://lxr.linux.no/#linux+v2.6.35/drivers/serial/serial_core.c#L1107
定義自己的ioctl但串行端口也可能對每個驅動器爲基礎定義的讀寫控制,但因爲它們是ttys中,他們也到TTY的ioctl迴應。
它對每個子系統都有不同的結構,因爲它們有不同的行爲。
對於角色設備,你需要看他們的file_operations structure。在該結構中有一個名爲ioctl的函數指針,當您在該設備中調用ioctl時會調用它。
所以做你想做的事情會很困難,因爲每個設備都有自己的ioctl命令。
內核源代碼中有一個相當全面的DocumentOnion/ioctl/ioctl-number.txt中的ioctl數字列表。然而,它可能並沒有記錄每一件事,但你可以用它作爲起點:) – Bandan 2010-09-13 20:33:33
man ioctl_list還提供帶有小音符和相關頭文件的std ioctl命令列表。
這幾乎證實了我已經擔心的事情。感謝您的解釋。 – 2010-09-15 16:44:25