Pci

PCI-E、sysfs 和使用者 ID 權限異常

  • September 22, 2020

在我們的 3.X 系列核心上,專有的 PCI-Express 設備具有專有的核心驅動程序。我們在搜尋 PCI 功能時看到了一些奇怪的錯誤。我找不到任何很棒的文件 - 有誰知道核心驅動程序是否可以控制sysfs/procfs基於使用者 ID 公開哪些數據?

具體來說,此呼叫在供應商的實用程序中失敗:

c = pci_find_cap(mdev->pdev, VENDOR_EXT_CAP_ID, PCI_CAP_EXTENDED);

經過大量探勘後,我可以使用 setpci 來複製失敗VENDOR_EXT_CAP_ID

我看到的是:

  • FS 權限授予使用者和 root 讀取權限。
  • 打開文件“config”sysfs並讀取$data.
  • $data對於使用者和$dataroot是不同的。

我看不到很多關於這如何可能的文件,我們也沒有與供應商良好的升級路徑。有沒有人見過這個?

是的,核心驅動程序可以根據使用者 ID 和/或基本上核心可以訪問的任何資訊來控制它在 sysfs/procfs 中公開的數據。

當您從 procfs 或 sysfs 讀取某些內容時,用於讀取資訊的系統呼叫基本上會結束呼叫相應驅動程序中的函式。該函式可以查看呼叫讀取操作的使用者空間程序的所有資訊,並且當然可以基於此修改其輸出,或者基於核心可以訪問的任何其他資訊。

在特定情況下/sys/bus/pci/devices/<PCI device ID>/config,任何讀取它的嘗試都將在文件中的函式pci_read_config()``drivers/pci/pci-sysfs.c中結束,該函式將檢查呼叫使用者空間程序是否具有 CAP_SYS_ADMIN 功能(在大多數情況下意味著使用者是root)。如果使用者沒有該能力,該函式會將可讀的 PCI 配置數據限制在前(dev->cfg_size)字節(CardBus 上為 128 字節)。

在核心版本 2.6.5 及更低版本中,限制曾經是 256 字節,但在 2.6.6 中它被收緊為(dev->cfg_size). 在現代系統上,(dev->cfg_size)根據所討論的設備,往往是 64 或 256 字節。

你可以用一個簡單的lspci -v. 如果您以 root 身份執行它,您將看到每個設備的 PCI/PCIe 功能。但是如果你以普通使用者的身份執行它,你會得到:

Capabilities: <access denied>

引用自:https://unix.stackexchange.com/questions/610653