Linuxのマウントオプションにおけるnodevの意味

Linuxのマウントオプションにおけるnodevの意味

インターネット検索によると、マウントの「nodev」オプションは、マウントされたファイルシステムからデバイスファイルを生成することを許可しないことです。私が理解した内容が正しいか、次のようにすばやく確認してみましたが、「nodev」オプションでマウントした後もデバイスファイルが生成されることを確認しました。

root@dev16:/home/vagrant# mount -o nodev /dev/sda1 ./mnt-test/
root@dev16:/home/vagrant/mnt-test# ls
bin   dev  initrd.img      lib    lost+found  mnt  proc  run   snap  sys  usr      var      vmlinuz.old
boot  etc  home    initrd.img.old  lib64  media       opt  root  sbin  srv   tmp  vagrant  vmlinuz

root@dev16:/home/vagrant/mnt-test# mknod foobar c 1 5
root@dev16:/home/vagrant/mnt-test# ls -ltr foobar
crw-r--r-- 1 root root 1, 5 Aug  3 06:11 foobar

誰が私に話すことができますか?

  1. ここで問題は何ですか?
  2. また、ここで「foobar」と呼ばれるデバイスファイルを作成することが潜在的なセキュリティホールを引き起こす可能性があることを教えてください(nodevオプションを使用する全体的な目的がより安全であるようです)。
  3. ~からhttps://haryachyy.wordpress.com/2019/04/17/learning-dpdk-huge-pages/ がありますが、mount -t hugetlbfs nodev /mnt/hugeインストール構文によると、「nodev」には「-o」が必要です。この構文は正しいですか?

ベストアンサー1

それでもデバイスノードを作成できますが、このオプションを使用してファイルシステムをマウントすると、そのファイルシステムのすべてのデバイスnodevノードが不可能。

たとえば、一時ファイルシステム用の単純なイメージファイルを作成します。

$ dd if=/dev/zero of=/tmp/test.img bs=1024 count=10240
10240+0 records in
10240+0 records out
10485760 bytes (10 MB, 10 MiB) copied, 0.0141206 s, 743 MB/s
$ sudo mke2fs /tmp/test.img
[normal mke2fs messages...]
$ sudo mount -o loop,rw /tmp/test.img /mnt

これで、テストに使用できる一時的な追加ファイルシステム(サイズ10M)が/mnt

2番目のテキストモード仮想コンソール用の冗長デバイスノードを作成しましょう/dev/tty2

$ ls -l /dev/tty2
crw--w---- 1 root tty 4, 2 Aug  4 18:34 /dev/tty2
$ sudo mknod /mnt/hacker_tty c 4 2
$ sudo chown $(whoami) /mnt/hacker_tty
$ ls -l /mnt/hacker_tty
crw-r--r-- 1 my_username root 4, 2 Aug  4 18:46 /mnt/hacker_tty

追加デバイスの名前は何でも構いません。デバイスタイプ(c文字、ブロックデバイス)、およびプライマリおよびセカンダリデバイス番号(およびbそれぞれ)がターゲットデバイスと一致することが重要です。これは、デバイスノードが通信するカーネルデバイスインスタンスを決定します。42

これで、仮想コンソールに必要なテキストを書くことができます。ルート権限なし:

$ printf "I am an evil hacker\nin your computer\ndoing evil things.\n" >/mnt/hacker_tty

Ctrl+ Alt+を押してF2メッセージを確認してください。その後、ディストリビューションとGUIセッションを使用するかどうかに応じて、通常のセッションが通常Ctrl++または++の仮想コンソールに戻りますAltF7CtrlAltF1

それでは、テストファイルシステムをアンマウントし、nodevマウントオプションを使用して再マウントしてからやり直してみましょう。

$ sudo umount /mnt
$ sudo mount -o loop,rw,nodev /tmp/test.img /mnt
$ printf '\nCurses!\nI have been foiled!\n' >/mnt/hacker_tty
bash: /mnt/hacker_tty: Permission denied
$ ls -l /mnt/hacker_tty
crw-r--r-- 1 my_username root  4, 2 Aug  4 18:46 hacker_tty

権限は変更されていませんが、デバイスノードが機能していないことがわかります。

ルートになっても役に立ちません。

$ sudo -i
[sudo] password for my_username:
# printf '\nCurses!\nI have been foiled!\n' >/mnt/hacker_tty
bash: /mnt/hacker_tty: Permission denied
# exit
$

実験が満足できたら、自分でまとめてみよう。

$ sudo umount /mnt
$ rm /tmp/test.img

これは慎重に作成された例であり、比較的無害でなければなりません。ルートファイルシステムを含むブロックデバイスと一致するデバイスノードを複製し、ファイルシステム構造を理解するのに適したツールを使用すると、ファイルシステム権限をバイパスし、コンテンツ/etc/shadow(ユーザー固有のパスワードハッシュなど)を読み取ることができます。または、ルートパスワードハッシュを含むブロックを目的のアイテムで上書きすることもできます。


では、mount -t hugetlbfs nodev /mnt/hugeファイルシステムタイプにはhugetlbfs実際に接続されているデバイスは必要ありませんが、mountコマンドはそれを認識しません。したがって、「device」パラメータ(あなたの場合はnodevなど)で指定されたすべてのエントリは完全に無視されます。

著者はそのページ「デバイスなし」の略称として使用されますnodev。インストールオプションとまったく関係のないダミープレースホルダーです。実際に必要なインストールオプションを指定するには、-o nodevはい、これは文書内の不幸で混乱した選択です。

おすすめ記事