1216 字
6 分钟
在 Linux 下,正常访问外设的 WebHUB
NOTE

封面版权由 Ne0W0r1d 所有,使用 OPPO Find X6 拍摄

前言#

因为我手上两个设备均支持 Web HUB,所以我很想在 Linux 能够正常使用 WebUSB,故写了这个博客。

NOTE

本文仅限使用 systemd 作为 Init 系统的 Linux 发行版观看,因为 udevdsystemd 的一部分。
RedHat 你干得好啊!!!😡
但根据群友反馈,udevd 可以用在非 systemd Init 的系统下,那只要你用的 udevd出现这个问题都可以食用本文章

CAUTION

除非你知道在干什么,否则千万不要这么做。瞎开 USB 权限容易导致安全性降低!!!
以下是取自 Mozilla 标准立场 英语原文及其 ChatGPT 翻译版本:

Because many USB devices are not designed to handle potentially-malicious interactions over the USB protocols and because those devices can have significant effects on the computer they’re connected to, we believe that the security risks of exposing USB devices to the Web are too broad to risk exposing users to them or to explain properly to end users to obtain meaningful informed consent. It also poses risks that sites could use USB device identity or data stored on USB devices as tracking identifiers.

很多 USB 设备在设计时根本没考虑过会遇到恶意的 USB 协议操作,而这些设备一旦接入电脑,往往就拥有相当大的权限,能对系统造成不小的影响。正因为如此,把 USB 设备直接暴露给网页使用,本身就是一件风险极高的事情:不仅不值得让用户去承担这种风险,而且这些风险也几乎不可能向普通用户解释清楚,更谈不上什么真正的“知情同意”。除此之外,这种机制还可能被网站滥用,通过 USB 设备的身份信息,甚至设备中存储的数据,对用户进行跨站跟踪。

正因如此。FireFox 并不支持 WebUSB API,请使用基于 Chromium 的浏览器(如 Chromium、Chrome、Vivaldi 等),并注意设备授权的通知,不要瞎给予网站 USB 权限

什么是 udev#

一个现代,通用的用户空间的设备管理器,其为红帽 systemd 的组成部分之一,替代了原本的 devfsdhotplug

唉红帽的大肘肘飞了当代 GNU/Linux。

现在的热插拔设备,以及用户挂载均需要过 udev 之手,其有权利阻止访问时设备,如果要正常使用 WebUSB,则需要写一个 udev 规则。

事前准备#

  • 有 udevd 的发行版
  • 编辑器
  • 可编辑系统文件权限的账户

加入规则#

参考文献:Linux配置udev规则以实现网页驱动 - Yeah’s Blog

WARNING

AIGC 警告:部分解决方案有参考 ChatGPT 进行适合我的修改。

因为参考文献不够现代,在使用 ChatGPT 和群友的努力下,将其更现代化。

使用你最喜欢的编辑器,如vim nvim nano,在/etc/udev/rules.d/ 新建一个数字-名字.rules 的文件,本篇使用 69-webhub.rules 为例子(不要大于 70),前面的数字请注意不要和里面的文件冲突,加入以下规则:

KERNEL=="hidraw*", SUBSYSTEM=="hidraw", TAG+="uaccess"

解释:

  • KERNEL=="hidraw*":匹配内核节点名(即/dev/hidraw*)
  • SUBSYSTEM=="hidraw":对应 HID 子系统”
  • TAG+="uaccess":让 ACL(访问控制列表) 给予用户权限

对比参考文献原来的设置拥有着或者加入组方式来说,更为安全,而这也是现代 systemd 推荐的方式,而不加入 MODE=“660” 的原因在于,uaccess 的 tag 就会让 ACL 授权给用户权限,660 模式 自然没必要了。使用这样这样授权就够了,浏览器能够完整访问你的 HID 设备,但太粗犷了,但你如果一堆设备,只想限制那么一两个设备。那怎么办呢?

我们可以扩展规则!!

使用 lsusb 查询设备,结果可能如下:

Terminal window
Bus 003 Device 004: ID 1a4f:5b6d GNOME is MotherFucker Keyboard
Bus 003 Device 028: ID 1145:aaba I use openSUSE BTW Mouse

再在规则文件内修改如下

KERNEL=="hidraw*", SUBSYSTEM=="hidraw", ATTRS{idVendor}=="1a4f", ATTRS{idProduct}=="5b6d", TAG+="uaccess"
KERNEL=="hidraw*", SUBSYSTEM=="hidraw", ATTRS{idVendor}=="1145", ATTRS{idProduct}=="aaba", TAG+="uaccess"

对比下来多了两个

  • ATTRS{idVendor}=="usbVendorID" 指定设备的制造商 ID(usbVendorID 改成自己设备制造商的 ID)
  • ATTRS{idProduct}=="usbVendorID" 指定设备的设备 ID(usbDeviceID 改成自己设备的设备 ID)

一行一个设备,想授权谁就授权谁!这样就够现代也足够安全了!也不会干扰到别的设备的授权!

CAUTION

但是要自己注重安全,留意浏览器的弹窗,不要瞎授权设备!!!能用客户端的驱动就用客户端的驱动罢!!!

重载规则,并测试#

可以重启自己的电脑,也可以使用如下命令重载:

Terminal window
sudo udevadm control --reload-rules
sudo udevadm trigger

重新拔插设备,这时候查阅一下 udev 信息,这样子应该就正常了!

Terminal window
udevadm test /dev/hidraw6 #设备抽象符,看自己到底是哪个
Tags:
uaccess
seat
Inotify watch:
disabled
Device node permission:
0777
Queued commands:
RUN{builtin} : uaccess

最后打开自己厂商的 WebHub。

Rappo Hub

Here We Gooo!!!

在 Linux 下,正常访问外设的 WebHUB
https://ne0w0r1d.top/posts/linux-use-webhid/
作者
Ne0W0r1d 新界
发布于
2025-12-26
许可协议
CC BY-NC-SA 4.0