파일에서 단일 비트를 뒤집는 방법은 무엇입니까?


35

btrfs가 스스로 치료할 수 있다는 주장 을 테스트하기 위해 의도적으로 파일을 손상시키고 싶습니다 . 이 기사에서는 파일 시스템을 제거하고 단일 비트를 "충돌"한 다음 다시 마운트하여 사진을 손상시키는 방법에 대해 설명합니다. 오래된 파일 시스템에서는 이것이 손상되었지만 btrfs로 자체 수정해야합니다. 이론적으로 이것은 의미가 있지만 실제로 테스트하고 싶습니다.

문제는 기사에서 그 방법 을 설명하지 않는다는 것 입니다.
파일 시스템의 특정 부분에서 단일 비트를 변경하는 방법은 무엇입니까?

또한 btrfs가 내 쓰기를 의도적으로 보지 않도록 오프라인 파일 시스템 에서이 작업을 수행 해야 한다고 지적 해야합니다 .

편집 : btrfs에 대한 질문 (및 토론)이 많이 있지만, 이러한 종류의 손상을 구현하는 파일 시스템 독립 방법이 있는지 알고 싶습니다 (따라서 다른 RAID 유형 / 컨트롤러 등을 통해 비교할 수 있음).


@Dan 파일을 직접 편집하면 btrfs (또는 그 문제에 대한 파일 시스템)가 유효한 쓰기로 계산합니다. 내가 찾고있는 부패를주지 않을 것입니다.
Oli

이것은 테스트 파일 시스템입니까 (즉, 내용에 신경 쓰지 않거나 백업에서 복원해도 괜찮습니다) 단일 드라이브에서 단일 btrfs 파티션을 사용하거나 RAID 배열 위에 단일 파티션을 사용하고 있습니까? 또는 다른 구성이 있습니까?
Darth Android

1
btrfs가 올바른 ioctl을 지원하는 경우 (그렇지 않은지 확실하지 않은 경우) filefrag -v파일이있는 정확한 위치를 찾는 데 사용할 수 있습니다.
derobert

3
@Oli 투표 및 답변 측면에서 U & L에 관심이있는 잠재 고객을 찾게 될 것 같습니다. 또한, .
strugee

1
딱 좋은 장소에서 우주 광선을 쏘십시오.
smcg

답변:


20

나는 전문가가 아니지만 btrfs-progs패키지에는 실제로이 작업을 수행하기위한 도구가 포함되어 있지만 소스에서 빌드해야 할 수도 있습니다. 어쨌든 일단 설치하거나 빌드 한 후에는 btrfs 개발자가 파일 시스템을 테스트하는 데 btrfs-progs사용하는 도구를 사용할 수 있어야 btrfs-corrupt-block합니다.

내가 말했듯이, 나는 btrfs를 가지고 놀 시간이 많지 않았 으므로이 도구의 정확한 사용법을 모른다. 그러나 오프라인 파일 시스템을 손상시킬 수 있어야합니다. 오프라인 파일 시스템은 손상된 파일을 읽을 때 수정됩니다 (RAID 또는 다른 사본을 사용하도록 설정 한 경우).


2
신난다! btrfs-corrupt-block실제로 btrfs 개발자가 "트릭"이 아닌 실제 테스트로 작성 되었다고 가정하면 계산서에 정확히 맞아야합니다.
allquixotic

btrfs에 대해 더 자세히 알고 싶다면 @allquixotic linux.conf.au 2012에서 좋은 이야기가 있습니다 . 내가 말했듯이, btrfs-corrupt-block개발자가 사용하므로 트릭이라면 유용하지 않습니다 :)
strugee

3
@allquixotic 이것이 오픈 소스의 아름다움입니다 : btrfs 의 소스 코드 를 보고 확인할 수 있습니다! 물론 이것은 쉬운 일이 아니지만 실제로 원한다면 그렇게 할 수 있습니다 .
Bakuriu

@Bakuriu 나는 그것을 완전히 알고 있습니다. 나는 btrfs-corrupt-block누군가가 소스를 파고 들어 매우 빨리 발견하고 Oracle에 대한 부정적인 PR로 (적어도 다른 btrfs 개발자 / 기고자) 사용하기 때문에 진지한 테스트가 아니라는 것을 심각하게 의심 하지 않았습니다. 팔목에 불과한 의견이었습니다.
allquixotic

OP (@Oli)가 블록 (예 : 파일 시스템 구조) 또는 파일 (예 : 파일 내용 ??)을 손상시키고 싶을 지 궁금합니다 ... 그리고 자기 치유의 btrfs 주장은 전자는 후자가 아니라? [파일 시스템은 파일에서 어느 비트가 뒤집 혔는지 어떻게 알 수 있습니까? 어떤 종류의 CRC?]. 이 답변은 아마도 오른쪽에있을 것이므로 +1입니다. [그러나 "단일 비트"이상으로 변경 될 수 있습니까? "어디서나"발생하는 임의의 비트보다 더 쉽게 치료할 수있는 것을 변경 하시겠습니까?]
Olivier Dulac

16
  1. 블록 장치에서 단일 섹터의 값을 가져옵니다 (예 : /dev/sda1백만 개의 오프셋 오프셋 (예 :)).

    sudo dd if=/dev/sda1 of=/root/mysector bs=512 count=1 skip=1M
    

    이 임의의 1M * 512 바이트 오프셋은 파일 시스템의 메타 데이터 부분과 데이터가 포함 된 섹터에 있는지 확인하기위한 것입니다.

  2. 16 진 편집기로 컨텐츠를 변경하여 원시 섹터 데이터를 편집하십시오. 예를 들어 , Linux에 적합한 16 진 편집기 필요 .

  3. ifof인수를 반대로 하여 드라이브의 섹터를 다시 넣으십시오 .

    sudo dd if=/root/mysector of=/dev/sda1 bs=512 count=1 seek=1M
    

2
1 백만 번째 블록이 실제로 파일의 일부가 아닌 경우 테스트에 도움이되지 않습니다. 특정 파일이 시작되는 블록을 어떻게 찾을 수 있습니까?
Darth Android

3
그건 그렇게 거의 다. dd 명령을 파일의 정확한 위치에 고정시킬 수 있다면 이것이 가장 근접한 방법 일 것입니다.
Oli

@Oli 예, Ext 계열 파일 시스템에 대해 그렇게하는 방법을 알고 있지만 btrfs에 대해서는 그다지 경험이 없습니다. 내가 길을 찾을 수 있는지 보자.
gertvdijk

2
@Oli : 편집하려는 파일에서 한 줄을 grep 할 때까지 단순히 루프별로 블록 단위로 dd outpouting (예 : 위와 같지만 "skip = N", N은 1..max에 있음) [다른 곳에서는 발생하지 않는 라인을 생성 해보십시오. 예를 들어 암호 생성기에서 가져 와서 충분히 오래 걸립니까?]. 그런 다음 해당 특정 블록을 편집하십시오. 다시 마운트하고 변경 사항이 되돌려 졌는지 테스트하십시오 (의문의 여지없이 최고 답변에서 내 의견을 참조하십시오 ... 파일 데이터 (= 내용)와 파일 시스템 구조 자체 (= 파일 및 해당 내용의 구성 방법 사이에 혼동이있는 것 같습니다) )?)
Olivier Dulac

16

@Oli-안녕하세요, 저는 그 기사를 실제로 쓴 Jim Salter입니다. 가상 머신을 사용하여 작업을 단순화했습니다. 내가 한 일은 JPEG 파일로 시작하여 16 진수 편집기에서 열었습니다. 내가 사용한 특정 것은 Bless였습니다. 간단한 apt-get install bless 로 우분투에 설치할 수 있습니다 .

Bless에서 JPEG를 연 후 JPEG의 "고기"에 잘 들어가기 위해 페이지를 몇 번 눌렀다가 약 50 바이트 분량의 데이터를 강조 표시 한 다음 텍스트 편집기에 복사하여 붙여 넣었습니다. 사례, gEdit). 이것은 나에게 검색 할 무언가를 주었다.

이제 JPEG를 VM의 각 배열에 저장했습니다. 어레이 뒤의 스토리지는 일련의 .qcow2 파일입니다. JPEG를 배열에 저장 한 후에는 각 배열과 관련된 .qcow2 파일을 Bless에로드하여 검색 할 수있었습니다. 파일 크기는 그다지 크지 않았으며 JPEG 및 일부 메타 데이터는 아니 었습니다. JPEG에서 강조 표시하고 복사했습니다. Voila, 나는 타락 할 블록이 있었다! 이 시점에서 Bless를 사용하여 VM의 가상 디스크에 저장된 JPEG의 개별 바이트를 수동으로 편집 할 수 있었으며, 각 어레이 에서 정확히 동일한 방식 으로 그렇게 할 수있었습니다 .

유일한 주름은 기사에서 테스트 된 RAID5 어레이의 경우 스트라이프 자체의 패리티가 아니라 스트라이프의 실제 데이터 사본을 편집했는지 확인해야한다는 것입니다. 그렇지 않으면 빈 배열이므로 스트라이프의 FOLLOWING 블록에 데이터가 없으므로 패리티 블록에 데이터 블록에서 변경되지 않은 데이터가 포함됩니다. 실수로 데이터 블록 대신 패리티 블록을 편집 한 경우 이미지가 변경되지 않은 것으로 나타납니다.

마지막 참고 사항-가상 머신이 필요하지 않습니다. 베어 메탈과 동일한 방식으로 동일한 작업을 수행 할 수 있습니다. 멋진 작은 .qcow2 파일 대신 전체 원시 드라이브로 작업해야하고 드라이브를 당겨 다른 컴퓨터에 넣어야하기 때문에 엉덩이가 더 고통 스럽습니다. 또는 실제 환경 (또는 대체 환경)으로 부팅하여 엉망으로 만듭니다. (저는 ZFS의 데이터 치유를 정확히 이런 방식으로 테스트했지만 7 년 전 차세대 파일 시스템에 처음 관심을 보였던 실제 베어 메탈 머신에서 테스트했습니다.)

이것이 도움이되기를 바랍니다!


4

열린 파일에서 수행 할 작은 프로그램을 시도 할 수 있습니다.FIBMAP ioctl(2)

빠른 웹 검색 으로이 블로그 게시물 http://smackerelofopinion.blogspot.tw/2009/06/fibmap-ioctl-file-system-block-number.html 이 작업을 수행하는 방법을 자세히 설명했습니다. 컴파일하고 실행할 수있는 샘플 프로그램에

$ git clone git://kernel.ubuntu.com/cking/debug-code
$ cd debug-code/block-mapper-fibmap
$ make
$ sudo ./fibmap /path/to/your/image-file.jpg

이것은 hdparm --fibmap@falconer가 언급 한 것과 정확히 일치하는 방식 입니다.

블록 번호를 찾은 후 dd@gertvdijk가 스케치 한 것처럼 gongfu를 사용 하여 파일을 수정할 수 있습니다. 또는 fibmap.c파일 시스템 계층을 우회하여 장치 파일에 직접 쓰기 (프로그램에 대한 세 가지 매개 변수 : 1. 파일 경로, 2. 파일을 포함하는 장치 파일) 시스템, 3. 수정하려는 오프셋 및 비트).

( 면책 조항 :FIBMAP ioctl(2) 루프백 장치 또는 btrfs 파일 시스템에서 파일에 대한 작동 여부를 테스트하지 않았으며 보장 할 수는 없지만 강력하게 기대합니다. 파일에서 수행하기 전에 장치 유형을 검사하여 추측 합니다. 실패.)hdparmioctl(2)


3
sudo hdparm --fibmap /PATH/TO/FILE

파일이 위치한 LBA를 제공합니다. 이 후 @gertvdijk의 답변을 사용할 수 있습니다.


불행히도 이것은 작동하지 않는 것 같습니다. 그것은 0,39: device not found in /devbtrfs이기 때문에 또는 루프백 보유 파일에서 사용하기 때문에 (더 가능성이 높습니다)입니다. 나는 "적절한"VM으로 이것을 시도 할 것이다.
Oli

@ 올리 흠. 나는 그것이 hdparm모든 파일 시스템에서 작동 한다고 생각 했지만 그렇지 않을 수도 있습니다.
falconer
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.