위험한 Linux 명령: 어떤 면에서 한 명령은 해롭고 다른 명령은 효과가 없는 것처럼 보입니까?

위험한 Linux 명령: 어떤 면에서 한 명령은 해롭고 다른 명령은 효과가 없는 것처럼 보입니까?

많은 사람들이 알고 있듯이 >>연산자는 명령 뒤에 입력하는 내용에 명령의 출력을 추가합니다.

파일을 덮어쓰거나 파일에 데이터를 추가하는 데 사용될 수 있다는 것을 알고 있지만 악의적인 방식으로 사용될 수도 있다는 것도 알고 있습니다. 드라이브나 파티션을 출력으로 사용하면 명령의 출력이 다음 위치에 직접 기록됩니다. 해당 드라이브나 파티션이 손상될 수 있습니다.

예를 들어, >> /dev/sda명령에 추가하면 명령의 출력이 /dev/sda.

호기심에 Ubuntu VM을 설정하고 재미있게 사용해 보았습니다. 컴퓨터의 가상 드라이브는 /dev/vda, /dev/vda1부팅 파티션은 , /dev/vda2루트 파티션은 이며, 별도의 파티션이 없습니다 /home.

이제 재미있는 부분이 나옵니다.

  • echo "Hello world" >> /dev/vda가상 머신에서 (루트로) 실행한 다음 다시 시작해도 아무 것도 손상된 것 같지 않습니다 . 재부팅 후 정상적으로 시작되었고 그 이후에는 모든 것이 괜찮아 보였습니다.
  • 그러나 echo "Hello world" >> /dev/vda1동일한 가상 머신(또한 루트)에서 실행한 다음 다시 시작하면 부팅에 실패합니다.

그래서 나는 출력 쓰기가 왜 vda1나쁜지 이미 알고 있습니다(부팅 파티션이 손상됨). 내 질문은: 출력을 추가하면 /dev/vda아무 일도 일어나지 않는 것처럼 보이지만 출력을 추가하면 문제가 발생하는 이유 는 무엇입니까 /dev/vda1? 결과를 전달하면 명령 출력이 /dev/vda2"이후"이기 때문에 기록됩니까 ?/dev/vda1vdavda2

답변1

UEFI 모드로 부팅하신 것 같습니다. 이는 부팅 프로세스가 드라이브의 헤드 끝을 확인하지 않음을 의미합니다.

BIOS 모드(별칭 CSM 레거시 모드)에서 부팅하는 경우 드라이브의 첫 번째 바이트에는 마스터 부트 레코드 MBR이 포함되어야 합니다. 파티션 테이블도 디스크 헤드와 매우 가까운 곳에 저장됩니다.

블록 장치에서 사용되는 경우 >>추가되지 않고 드라이브 헤드에 씁니다. /dev/sdcUSB 플래시 드라이브가 포함된 아래 데모를 참조하세요 .

$ sudo bash -c 'echo "Hello world" >> /dev/sdc'
$ sudo dd if=/dev/sdc bs=12 count=1
Hello world
1+0 poster in
1+0 poster ut
12 byte kopierade, 0,00127171 s, 9,4 kB/s

설명이 정확하다면 헤드엔드에 긴 데이터 블록(MBR뿐만 아니라 파티션 테이블을 덮을 만큼 긴)을 쓰면 프로세스가 손상됩니다.

BIOS 부팅을 위해 설정된 드라이브에서 드라이브 헤드에 쓰면 MBR이 손상되었기 때문에 부팅 프로세스가 손상됩니다.

편집 1:

FAT32 파일 시스템의 파티션 헤더를 같은 방식으로 쓰면 파일 시스템이 손상되었음을 알 수 있습니다.

$ lsblk -o model,name,size,fstype,label,mountpoint /dev/sdc
MODEL   NAME    SIZE FSTYPE LABEL MOUNTPOINT
Voyager sdc     7,5G              
        ├─sdc1  256M vfat         
        └─sdc2  512M vfat

$ sudo dd if=/dev/sdc1 bs=12 count=1
�X�mkfs.fat1+0 poster in
1+0 poster ut
12 byte kopierade, 0,00118622 s, 10,1 kB/s

$ sudo bash -c 'echo "Hello world" >> /dev/sdc1'

$ lsblk -o model,name,size,fstype,label,mountpoint /dev/sdc
MODEL   NAME    SIZE FSTYPE LABEL MOUNTPOINT
Voyager sdc     7,5G              
        ├─sdc1  256M              
        └─sdc2  512M vfat         

$ sudo dd if=/dev/sdc1 bs=12 count=1
Hello world
1+0 poster in
1+0 poster ut
12 byte kopierade, 0,00118594 s, 10,1 kB/s

편집 2:

파티션 #2는 영향을 받지 않습니다. ASCII가 아닌 문자의 보기 흉한 표현뿐만 아니라 16진수 덤프도 살펴보는 것이 좋습니다.

$ sudo dd if=/dev/sdc2 bs=12 count=1 | hexdump -C
1+0 poster in
1+0 poster ut
12 byte kopierade, 0,00129779 s, 9,2 kB/s
00000000  eb 58 90 6d 6b 66 73 2e  66 61 74 00              |.X.mkfs.fat.|
0000000c

관련 정보