
x86 프로세서 퍼저
: x86 프로세서 퍼저
sandsifter는 x86 프로세서에서 숨겨진 명령어와 하드웨어 버그를 감사합니다. 머신 코드를 체계적으로 생성하여 프로세서의 명령어 집합을 검색하고 실행 중 이상 징후를 모니터링합니다. Sandsifter는 모든 주요 벤더의 비밀 프로세서 명령어, 디스어셈블러, 어셈블러, 에뮬레이터의 광범위한 소프트웨어 버그, 엔터프라이즈 하이퍼바이저의 결함, 그리고 x86 칩의 양성 및 보안에 치명적인 하드웨어 버그를 발견했습니다.
다양한 x86 프로세서가 존재하는 가운데, 이 도구의 목표는 사용자가 자신의 시스템에서 숨겨진 명령어와 버그를 확인할 수 있도록 하는 것입니다.
프로세서에 대한 기본 감사를 실행하려면:
sudo ./sifter.py --unk --dis --len --sync --tick -- -P1 -t

컴퓨터가 체계적으로 스캔되어 이상 명령어를 찾습니다. 상단 절반에서는 sandsifter가 현재 프로세서에서 테스트 중인 명령어를 볼 수 있습니다. 하단 절반에서는 sandsifter가 발견한 이상 징후를 보고합니다.
검색은 프로세서의 속도와 복잡성에 따라 몇 시간에서 며칠까지 걸릴 수 있습니다. 완료되면 결과를 요약합니다:
./summarize.py data/log

일반적으로 프로세서에서 수백만 개의 문서화되지 않은 명령어가 발견되지만, 이들은 대개 소수의 다른 그룹으로 분류됩니다. 이상 징후를 비닝한 후, 요약 도구는 각 명령어를 문제 범주에 할당하려고 시도합니다:
'Q'를 눌러 종료하고 시스템 스캔의 텍스트 기반 요약을 얻습니다:
스캔 결과는 도구가 자동으로 분류하기 어려울 수 있으며 수동 분석이 필요할 수 있습니다. 결과 분석에 도움이 필요하면 부담 없이 ./data/log 파일을 [email protected]으로 보내주십시오. 이 로그에는 프로세서 제조사, 모델 및 개정판(/proc/cpuinfo) 외에는 개인 정보가 포함되지 않습니다.
sandsifter로 스캔한 결과, 수십 개의 opcode 범주에 걸친 문서화되지 않은 프로세서 기능, 엔터프라이즈 하이퍼바이저의 결함, 거의 모든 주요 디스어셈블리 및 에뮬레이션 도구의 버그, 그리고 프로세서 자체에 보안 취약점을 여는 치명적인 하드웨어 버그가 발견되었습니다.
결과에 대한 자세한 내용은 프로젝트 백서에서 확인할 수 있습니다.
(TODO: 여기에 상세 결과 목록)
Sandsifter를 사용하려면 먼저 Capstone 디스어셈블러를 설치해야 합니다: http://www.capstone-engine.org/. Capstone은 일반적으로 다음 명령으로 설치할 수 있습니다:
sudo apt-get install libcapstone3 libcapstone-dev
sudo pip install capstone
Sandsifter는 다음 명령으로 빌드할 수 있습니다:
make
그런 다음 다음 명령으로 실행합니다:
sudo ./sifter.py --unk --dis --len --sync --tick -- -P1 -t
플래그는 --flag를 사용하여 sifter에 전달하고, -- -f를 사용하여 injector에 전달합니다.
예시:
sudo ./sifter.py --unk --dis --len --sync --tick -- -P1 -t
Sifter 플래그:
--len
모든 명령어에서 길이 차이 검색 (디스어셈블러가 예상한 것과 다르게 실행되거나, 디스어셈블러가 예상한 명령어가 존재하지 않는 경우)
--dis
유효한 명령어에서 길이 차이 검색 (디스어셈블러가 예상한 것과 다르게 실행된 명령어)
--unk
알려지지 않은 명령어 검색 (디스어셈블러가 모르지만 성공적으로 실행되는 명령어)
--ill
--unk의 반대, 잘못된 디스어셈블리 검색 (성공적으로 실행되지 않지만 디스어셈블러가 인식하는 명령어)
--tick
주기적으로 현재 명령어를 디스크에 기록
--save
종료 시 검색 진행 상황 저장
--resume
마지막 저장 상태에서 검색 재개
--sync
검색 결과를 발견 즉시 디스크에 기록
--low-mem
결과를 메모리에 저장하지 않음
Injector 플래그:
-b
모드: 무차별 대입
-r
모드: 무작위 퍼징
-t
모드: 터널 퍼징
-d
모드: 외부 지시 퍼징
-R
원시 출력 모드
-T
텍스트 출력 모드
-x
주기적 진행 상황을 stderr에 기록
-0
널 역참조 허용 (sudo 필요)
-D
중복 접두사 허용
-N
NX 비트 미지원
-s 시드
무작위 검색의 시드 값
-B brute_depth
무차별 검색의 최대 검색 깊이
-P max_prefix
검색할 최대 접두사 수
-i 명령어
검색을 시작할 명령어 (포함)
-e 명령어
검색을 종료할 명령어 (제외)
-c 코어
검색을 수행할 코어
-X 블랙리스트
지정된 명령어를 블랙리스트에 추가
-j 작업
동시에 실행할 작업 수
-l range_bytes
각 하위 범위의 기본 명령어 바이트 수
m: 모드 - sifter의 검색 모드 변경 (무차별 대입, 무작위, 또는 터널)
q: 종료 - sifter 종료
p: 일시 중지 - 검색 일시 중지 또는 재개
스캔은 네 가지 검색 알고리즘을 지원하며, 명령줄에서 설정하거나 단축키로 전환할 수 있습니다.
sudo
최상의 결과를 위해 도구는 루트 사용자로 실행해야 합니다. 이는 프로세스가 주소 0의 페이지를 메모리에 매핑할 수 있도록 하기 위해 필요하며, 이는 루트 권한이 필요합니다. 이 페이지는 많은 명령어가 메모리 액세스에서 세그먼트 폴트가 발생하는 것을 방지하여 더 정확한 오류 분석을 가능하게 합니다.
접두사
명령어 검색 깊이의 주요 제한은 탐색할 접두사 바이트 수이며, 접두사 바이트가 추가될 때마다 검색 공간이 약 10배씩 증가합니다. -P 플래그로 접두사 바이트를 제한하십시오.
색상
sifter의 인터페이스는 256색 터미널용으로 설계되었습니다. 터미널에 따라 세부 사항이 매우 다르지만, 대략 다음 명령으로 설정할 수 있습니다:
export TERM='xterm-256color'
GUI
인터페이스는 터미널이 최소한 특정 크기 이상이라고 가정합니다. 인터페이스가 제대로 렌더링되지 않으면 터미널 크기를 늘려 보십시오. 이는 종종 터미널 글꼴 크기를 줄여서 해결할 수 있습니다.
어떤 경우에는 그래픽 프론트엔드 없이 도구를 실행하는 것이 바람직하거나 필요할 수 있습니다. 이는 injector를 직접 실행하여 수행할 수 있습니다:
sudo ./injector -P1 -t -0
직접 injector 호출의 결과를 필터링하려면 grep을 사용할 수 있습니다. 예를 들어,
sudo ./injector -P1 -r -0 | grep '\.r' | grep -v sigill
는 프로세서와 디스어셈블러가 명령어 길이에 대해 일치하지 않지만(grep '.r') 명령어가 성공적으로 실행된 경우(grep -v sigill)를 검색합니다.
목표 지향 퍼징
많은 경우 퍼저를 특정 대상으로 지시하는 것이 유용합니다. 예를 들어, 에뮬레이터가 반복된 'lock' 접두사(0xf0) 주변에 결함이 있다고 의심되면 -i 및 -e 플래그를 사용하여 퍼저를 명령어 공간의 이 영역으로 지시할 수 있습니다:
sudo ./sifter.py --unk --dis --len --sync --tick -- -t -i f0f0 -e f0f1 -D -P15
레거시 시스템
매우 오래된 시스템(i586 클래스 프로세서, 낮은 메모리 시스템)을 스캔하려면 sifter에 --low-mem 플래그를, injector에 -N 플래그를 전달하십시오:
sudo ./sifter.py --unk --dis --len --sync --tick --low-mem -- -P1 -t -N
스캔이 너무 빨리 완료되는 경우(예: 스캔이 몇 초 만에 완료됨), 일반적으로 스캔 중인 프로세서에 이 플래그가 필요하기 때문입니다.
32비트 vs. 64비트
기본적으로 sandsifter는 호스트 운영 체제의 비트 수를 대상으로 빌드됩니다. 그러나 일부 명령어는 32비트 프로세스와 64비트 프로세스에서 다르게 동작합니다. 이러한 시나리오를 탐색하려면 64비트 시스템에서 32비트 sandsifter를 실행하는 것이 유용할 때가 있습니다.
64비트 시스템에서 32비트 sandsifter를 빌드하려면 Capstone을 32비트로 설치해야 합니다. 이에 대한 지침은 확인할 수 있습니다.
sandsifter는 Christopher Domas (@xoreaxeaxeax)의 연구 노력입니다.
그런 다음 sandsifter를 32비트 아키텍처용으로 빌드해야 합니다:
make CFLAGS=-m32
이렇게 하면 64비트 시스템에서 32비트 명령어 공간을 탐색할 수 있습니다.