
インターネット検索によると、マウントの「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
誰が私に話すことができますか?
- ここで問題は何ですか?
- また、ここで「foobar」と呼ばれるデバイスファイルを作成することが潜在的なセキュリティホールを引き起こす可能性があることを教えてください(nodevオプションを使用する全体的な目的がより安全であるようです)。
- ~から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
それぞれ)がターゲットデバイスと一致することが重要です。これは、デバイスノードが通信するカーネルデバイスインスタンスを決定します。4
2
これで、仮想コンソールに必要なテキストを書くことができます。ルート権限なし:
$ printf "I am an evil hacker\nin your computer\ndoing evil things.\n" >/mnt/hacker_tty
Ctrl+ Alt+を押してF2メッセージを確認してください。その後、ディストリビューションとGUIセッションを使用するかどうかに応じて、通常のセッションが通常Ctrl++または++の仮想コンソールに戻りますAlt。F7CtrlAltF1
それでは、テストファイルシステムをアンマウントし、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
はい、これは文書内の不幸で混乱した選択です。