カーネルueventを偽造できますか?

カーネルueventを偽造できますか?

私の考えでは何が起こると思いますか?

私が理解したところ、USBデバイスをコンピュータに接続すると、次のことが起こります。

  1. カーネルはUSBデバイスが接続されていることを認識しました。
  2. カーネルは、ドライバなどの新しいデバイスに対して非常に低いレベルのエントリを設定します。
  3. ueventカーネルは1つをデーモンに送りますudev
  4. Udevデーモンは送信された情報で埋められます/dev

私がしたいこと

ただジャンプすることもできたかったのにステップ3ueventをudevに手動で送信します。 ueventはnetlinkを介して送信され、netlinkはソケットベースです。、理論的にはどのソケットに使うか知る必要があるのでこれが可能でなければなりません。これが可能かどうか、どのように機能するかを知っている人はいますか?

答え1

udevadm トリガー

1. 一度試してみてください

sudo udevadm trigger --verbose --action=remove --property-match='DEVNAME=/dev/sdd'

Remove ueventがトリガーされ、/dev/sddコンテンツは次のようになります。

remove@/devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.2/1-1.2:1.0/host13/target13:0:0/13:0:0:0/block/sdd
ACTION=remove
DEVPATH=/devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.2/1-1.2:1.0/host13/target13:0:0/13:0:0:0/block/sdd
SUBSYSTEM=block
MAJOR=8
MINOR=48
DEVNAME=sdd
DEVTYPE=disk
SEQNUM=12589

strace2.イット

彼が服用している用量を確認してください。

sudo strace udevadm trigger --verbose --action=remove --property-match='DEVNAME=/dev/sdd'
...
fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 37), ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fc0596a7000
write(1, "/sys/devices/pci0000:00/0000:00:"..., 101/sys/devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.2/1-1.2:1.0/host13/target13:0:0/13:0:0:0/block/sdd
) = 101
open("/sys/devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.2/1-1.2:1.0/host13/target13:0:0/13:0:0:0/block/sdd/uevent", O_WRONLY) = 3
write(3, "remove", 6)                   = 6
close(3)                                = 0
exit_group(0)                           = ?
+++ exited with 0 +++

3. まとめ

実はただ

echo 'remove' | sudo tee /sys/block/sdd/uevent

このアプローチは依然としてsysfsに依存しています。

  • デバイスsysfsが存在する必要があります。
  • ueventメッセージ本文を完全にカスタマイズできません。

sysfs ueventファイル:

cat /sys/block/sdd/uevent
MAJOR=8
MINOR=48
DEVNAME=sdd
DEVTYPE=disk

参考資料:
http://fibrevillage.com/sysadmin/93-udevadm-useage-examples http://arakilab.media.eng.hokudai.ac.jp/~msylw/2013/07/using-udev-to-trigger-events-in-example/

関連情報