Skip to content

Commit 3a47e12

Browse files
committed
Add device info to qrexec call argument
This allows setting policy for individual devices, not only device types. It relies on USB qube (or wherever the device is connected) giving accurate device info, but since it's going to be granted at least partial control it needs to be trusted to some degree anyway. Build the device info based on type/vendor/product/revision (the PRODUCT property) and physical location (USB controller + port in case of USB device). The latter can be disabled, to build a policy that allows given device in any port. Fixes QubesOS/qubes-issues#3604
1 parent cdc4271 commit 3a47e12

8 files changed

+52
-4
lines changed

debian/qubes-input-proxy-sender.install

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,3 +8,4 @@
88
/usr/lib/systemd/system/qubes-input-sender-mouse@.service
99
/usr/lib/systemd/system/qubes-input-sender-keyboard@.service
1010
/usr/lib/systemd/system/qubes-input-sender-keyboard-mouse@.service
11+
/usr/lib/qubes/input-proxy-arg

qubes-rpc/Makefile

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@ install-vm:
2626
$(DESTDIR)$(USRLIBDIR)/udev/rules.d/90-qubes-uinput.rules
2727
install -m 0644 -D qubes-uinput.modules \
2828
$(DESTDIR)$(USRLIBDIR)/modules-load.d/qubes-uinput.conf
29+
install -m 0755 -D input-proxy-arg \
30+
$(DESTDIR)$(USRLIBDIR)/qubes/input-proxy-arg
2931
install -d $(DESTDIR)/etc/qubes-rpc
3032
install qubes.InputMouse $(DESTDIR)/etc/qubes-rpc
3133
install qubes.InputKeyboard $(DESTDIR)/etc/qubes-rpc

qubes-rpc/input-proxy-arg

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
#!/bin/bash
2+
3+
dev="$1"
4+
output="$2"
5+
6+
sysfs_path="/sys/class/input/${dev##*/}/device/uevent"
7+
8+
[ -e "$sysfs_path" ] || exit
9+
product="$(grep ^PRODUCT= "$sysfs_path")"
10+
[ -n "$product" ] || exit
11+
product="${product#*=}"
12+
product="${product//\"/}"
13+
product="${product//\//-}"
14+
15+
port="$(grep ^PHYS= "$sysfs_path")"
16+
# by default include also physical port (if known), but allow opt-out
17+
if [ -n "$port" ] && ! [ -e /run/qubes-service/input-proxy-exclude-port ]; then
18+
port="${port#*=\"}"
19+
port="${port%/*}"
20+
port="${port//:/_}"
21+
# separate port from device with '-'
22+
port="${port}-"
23+
else
24+
port=
25+
fi
26+
27+
mkdir -p "${output%/*}"
28+
echo "QREXEC_ARG=+$port$product" > "$output"

qubes-rpc/qubes-input-sender-keyboard-mouse@.service

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,8 @@ OnFailure=qubes-input-sender-mouse@%i.service
66
[Service]
77
Environment=TARGET_DOMAIN=dom0
88
EnvironmentFile=-/etc/qubes/input-proxy-target
9-
ExecStart=/usr/bin/qubes-input-sender qubes.InputKeyboard /dev/input/%i "$TARGET_DOMAIN"
9+
EnvironmentFile=-%t/qubes-input-proxy-env/%i
10+
ExecStartPre=/usr/lib/qubes/input-proxy-arg /dev/input/%i %t/qubes-input-proxy-env/%i
11+
ExecStart=/usr/bin/qubes-input-sender qubes.InputKeyboard${QREXEC_ARG} /dev/input/%i "$TARGET_DOMAIN"
12+
ExecStopPost=/bin/rm -f %t/qubes-input-proxy-env/%i
13+
PrivateTmp=yes

qubes-rpc/qubes-input-sender-keyboard@.service

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,8 @@ After=qubes-qrexec-agent.service
55
[Service]
66
Environment=TARGET_DOMAIN=dom0
77
EnvironmentFile=-/etc/qubes/input-proxy-target
8-
ExecStart=/usr/bin/qubes-input-sender qubes.InputKeyboard /dev/input/%i "$TARGET_DOMAIN"
8+
EnvironmentFile=-%t/qubes-input-proxy-env/%i
9+
ExecStartPre=/usr/lib/qubes/input-proxy-arg /dev/input/%i %t/qubes-input-proxy-env/%i
10+
ExecStart=/usr/bin/qubes-input-sender qubes.InputKeyboard${QREXEC_ARG} /dev/input/%i "$TARGET_DOMAIN"
11+
ExecStopPost=/bin/rm -f %t/qubes-input-proxy-env/%i
12+
PrivateTmp=yes

qubes-rpc/qubes-input-sender-mouse@.service

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,8 @@ After=qubes-qrexec-agent.service
55
[Service]
66
Environment=TARGET_DOMAIN=dom0
77
EnvironmentFile=-/etc/qubes/input-proxy-target
8-
ExecStart=/usr/bin/qubes-input-sender qubes.InputMouse /dev/input/%i "$TARGET_DOMAIN"
8+
EnvironmentFile=-%t/qubes-input-proxy-env/%i
9+
ExecStartPre=/usr/lib/qubes/input-proxy-arg /dev/input/%i %t/qubes-input-proxy-env/%i
10+
ExecStart=/usr/bin/qubes-input-sender qubes.InputMouse${QREXEC_ARG} /dev/input/%i "$TARGET_DOMAIN"
11+
ExecStopPost=/bin/rm -f %t/qubes-input-proxy-env/%i
12+
PrivateTmp=yes

qubes-rpc/qubes-input-sender-tablet@.service

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,8 @@ After=qubes-qrexec-agent.service
55
[Service]
66
Environment=TARGET_DOMAIN=dom0
77
EnvironmentFile=-/etc/qubes/input-proxy-target
8-
ExecStart=/usr/bin/qubes-input-sender qubes.InputTablet /dev/input/%i "$TARGET_DOMAIN"
8+
EnvironmentFile=-%t/qubes-input-proxy-env/%i
9+
ExecStartPre=/usr/lib/qubes/input-proxy-arg /dev/input/%i %t/qubes-input-proxy-env/%i
10+
ExecStart=/usr/bin/qubes-input-sender qubes.InputTablet${QREXEC_ARG} /dev/input/%i "$TARGET_DOMAIN"
11+
ExecStopPost=/bin/rm -f %t/qubes-input-proxy-env/%i
12+
PrivateTmp=yes

rpm_spec/input-proxy.spec.in

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,7 @@ rm -rf %{buildroot}/etc/qubes-rpc/policy
8585
/usr/bin/qubes-input-trigger
8686
%config(noreplace) /etc/xdg/autostart/qubes-input-trigger.desktop
8787
/usr/lib/udev/rules.d/90-qubes-input-proxy.rules
88+
/usr/lib/qubes/input-proxy-arg
8889
%{_unitdir}/qubes-input-sender-tablet@.service
8990
%{_unitdir}/qubes-input-sender-mouse@.service
9091
%{_unitdir}/qubes-input-sender-keyboard@.service

0 commit comments

Comments
 (0)