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.

두 번째 텍스트 모드 가상 콘솔에 대한 중복 장치 노드를 생성해 보겠습니다 /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++ 또는 ++ 인 가상 콘솔로 돌아갑니다 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예, 이는 문서에서 불행하고 혼란스러운 선택입니다.

관련 정보