이 저장소는 패치가 추적 등가 (PATE)를 보장하는지 확인하는 도구를 구현합니다.
목표는 바이너리에 적용된 보안 패치가 나쁜 행동 만 제거하거나 패치 개발자를 위해 정확하게 특성화한다는 것을 증명하는 것입니다. 검증자는 PowerPC 및 Aarch32 Binaries (현재 정적으로 연결된 ELF BINARIES가 필요함)를 지원합니다.
시작하는 가장 빠른 방법은 Docker 이미지를 만들고 Docker를 통해 도구를 사용하는 것입니다. 보다 심층적 인 빌드 지침은 아래의 개발 섹션을 참조하십시오.
먼저 명령으로 Docker 이미지를 작성하십시오.
Docker Build -Platform Linux/AMD64. -t Pate
다음으로 예를 들어 검증자를 실행하십시오.
docker run --rm -it -platform linux/amd64 -v "$ (pwd)"/tests/integration/packet/exe :/target pate-original /target/packet.exe ---patched /target/packet.patched.exe -s parse_packet.patched
검증자는 다음 명령 줄 인수를 수락합니다.
-H,-도움 이이 도움말 텍스트를 보여줍니다
-O,-원래 exe 원래 바이너리
-p,-패치 된 exe 패치 바이너리
-B,-BlockInfo 파일 이름 블록 정보와 관련된 정보
-s,-STARKYMBOL ARG이 기호로 기능에서 시작 분석
-D,-NODISCOVERY는 기능 쌍을 동적으로 발견하지 않습니다
전화.
-검증을 해결하는 데 사용하는 SMT 솔버 용산 ARG
정황. CVC4, YICE 또는 Z3 중 하나
(기본값 : yices)
-Goal-Timeout Arg 개별 목표를 몇 초 만에 확인하기위한 시간 초과
(기본값 : 300)
-heuristic timeout arg 몇 초 만에 휴리스틱 목표를 확인하기위한 시간 초과
(기본값 : 10)
-원래-애 빌 힌트 arg
코드 발견을위한 모루 사양을 구문 분석하십시오
힌트
-패치-애 빌 힌트 arg
코드 발견을위한 모루 사양을 구문 분석하십시오
힌트
-원천 분비물 힌트 arg
확률 기능이 포함 된 JSON 파일을 구문 분석하십시오
이름/주소 힌트
-패치 프로브 수소 적 힌트 arg
확률 기능이 포함 된 JSON 파일을 구문 분석하십시오
이름/주소 힌트
-Original-CSV- 기능-힌트 Arg
함수 이름/주소가 포함 된 CSV 파일을 구문 분석합니다
힌트
-Patched-CSV- 기능-힌트 Arg
함수 이름/주소가 포함 된 CSV 파일을 구문 분석합니다
힌트
-Original-bsi-hints arg parse 기능 이름/주소가 포함 된 JSON 파일
힌트
-Patched-Bsi-Hints Arg Parse 기능 이름/주소가 포함 된 JSON 파일
힌트
-no-dwarf-hints는 왜소 정보에서 메타 데이터를 추출하지 않습니다.
바이너리
-v,-Verbosity arg 로깅 출력의 진실성 (기본값 : Info)
-Save-Macaw-CFGS DIR MACAW CFGS를 제공된 디렉토리로 저장합니다
-솔직한 간섭 파일 파일
상징적 인 동안 SMT 솔버와의 상호 작용을 저장하십시오
이 파일에 대한 실행
-proof-summary-json 파일
JSON에 흥미로운 증거 결과를 저장하는 파일
체재
-로그 파일 파일 파일을 디버그 로그를 저장하는 파일
-e,-errormode arg 검증기 오류 처리 모드
(기본값 : ThrowOnanyFailure)
-r,-rescopemode arg 변수 구조 실패 처리 모드
(기본값 : ThrowOneQrescopeFailure)
-skip-unnamed-funtions 기호없이 함수의 분석을 건너 뜁니다
-Skip-divergent-control-flow
<이상이 감가 상각>
-표적 -quiv-regs arg는 충분한 동등성 조건을 계산합니다
주어진 레지스터에 평등을 설정합니다
Toplevel EntryPoint Returns. <이상이 감가 상각>
-ignore-segments arg skip spew sectments (0-Indexed) elf를로드 할 때
-json-toplevel은 JSON 출력 모드 (대화식 모드)로 Toplevel을 실행합니다
오직)
-읽기 전용 -Segments Arg Mark 세그먼트를로드 할 때 읽기 전용 (0- 인덱스)으로 표시합니다
꼬마 요정
-스크립트 파일 이름 Macaw CFGS를 제공된 디렉토리로 저장합니다
-assume-stack-scope 스택 프레임 스코핑에 대한 추가 가정이 추가됩니다
기능 호출 중 (안전하지 않음)
-ignore-Warnings Arg는 주어진 경고 유형을 제기하지 않습니다.
-Always-Classify-Return은 항상 가정하여 분류기 실패를 해결합니다
가능하면 함수가 반환됩니다.
빠른 시작 섹션에서는 Docker 컨테이너를 사용하여 테스트 케이스에서 검증자를 실행하라는 명령을 설명했습니다. 이 섹션에서는 다른 시나리오에 대한 유용한 명령을 다룹니다.
검증 자의 Docker 이미지의 tar 파일이있는 경우 명령을 사용하여 설치할 수 있습니다.
Docker Load -I/Path/to/pate.tar
다음 후 Docker를 통해 검증자를 실행합니다.
Docker Run ---rm -it -Platform Linux/AMD64 PATE -HELP
Docker와 함께 검증자를 사용하려면 로컬 파일 시스템의 디렉토리를 Docker 컨테이너에 매핑하여 출력 파일을 저장하는 것이 유용합니다. 원래와 패치 바이너리가 원래의 original.exe 및 patched.exe 라고 가정합니다.
mkdir verifierdata
CP original.exe Patched.exe VerifierData/
Docker Run ---RM -IT -Platform Linux/AMD64
-v`pwd`/verifierdata` :/verifierdata pate
-original /verifierdata/original.exe
-patched /verifierdata/patched.exe
--proof-summary-json /verifierdata/report.json
-log-file /verifierdata/pate.log
-Save-Macaw-CFGS /VERIFIERDATA /CFGS
이 명령은 두 바이너리에서 검증자를 실행하고 읽기 이벤 프린트 루프로 떨어 뜨려서 검증기의 출력을 대화식으로 탐색 할 수 있습니다.
기본적으로 검증자는 공식 프로그램 진입 지점에서 확인하기 시작합니다. 이것은 종종 그다지 유용하지 않으며 (코드 발견에 문제를 일으키는 큰 _start 가진 복잡한 바이너리에게는 문제가 될 수 있습니다). 또한, 알려진 (또는 적어도 예상되는) 충격 범위가있는 변경의 경우 영향을받는 기능 만 분석하는 것이 훨씬 빠릅니다. 대신 분석 진입 점을 지정하려면 -s <function_symbol> 옵션을 전달하면 주어진 기호에 해당하는 함수에서 분석이 시작됩니다. 이는 바이너리에 대한 기능 기호가 제공되어야합니다 (임베디드 디버그 기호로 또는 힌트 형식 중 하나로 별도로).
불분명하지만 때로는 기능 호출을 NO-OP로 취급하는 것이 유용합니다. 예를 들어, 변경되지 않았고 정확성 (예 : 신뢰할 수있는 라이브러리의 큰 암호화 기능)에 영향을 미치지 않을 수도있는 큰 기능을 무시하면 성능을 크게 향상시킬 수 있습니다. 이 기능을 사용하려면 --blockinfo 옵션을 사용하여 구성 파일을 검증기에 전달하여 구성 파일에 다음 지시 사항이 포함되어 있는지 확인하십시오.
무시-원천-결합 = [<address>, ...] 무시 가공 된 기능 = [<schander>, ...]
여기서 각 목록은 무시할 함수 주소 목록입니다. 두 목록은 별도로 지정되지만, 두 바이너리 사이에서 거의 "정렬"되어야합니다 (즉, 원래 바이너리의 함수를 무시하면 패치 된 이진의 해당 함수도 무시해야 함을 의미합니다).
검증자는 두 가지 방법으로 난쟁이 메타 데이터의 혜택을받습니다.
드워프 메타 데이터를 바이너리가없는 바이너리에 주입하려면 (예 : 제거 된 바이너리) 드워프 작가 도구를 사용하는 것이 좋습니다. Anvill JSON 형식 ( target-binary.exe )의 대상 ( target-binary.exe.json ) 및 메타 데이터의 존재를 가정하면 Docker 이미지를 통해 dwarf-writer 사용하는 예 :
Docker Load -I Dwarf-Writer-Docker.tar
mkdir dwarfwriterdata
CP Target-Binary.exe Target-Binary.exe.json DwarfwriterData/
docker run ---rm -it -v` pwd`/dwarfwriterdata :/dwarfwriterdata dwarf -writer
--anvill /dwarfwriterdata/target-binary.exe.json
/dwarfwriterdata/target-binary.exe
/dwarfwriterdata/target-binary-dwarf.exe
이것은 DwarfWriterData/target-binary-dwarf.exe 에서 Dwarf 메타 데이터로 주석이 달린 이진의 버전을 생성합니다.
llvm-dwarfdump 도구가있는 경우이를 사용하여 생성 된 드워프 메타 데이터를 검사 할 수 있습니다. pate Verifier는 드워프 메타 데이터 힌트를 무시하지 않는 한 자동으로 드워프 메타 데이터 힌트를 활용합니다.
검증기는 두 개의 바이너리를 입력으로 사용합니다 : 원래 바이너리와 패치 바이너리. 일부 보안 지향 패치는 그 행동을 크게 보존하는 원래 바이너리에 적용되었지만 바람직하지 않은 행동을 고칠 수 있다고 가정합니다. 그런 다음 검증자는 두 바이너리가 동일한 관찰 가능한 행동을 보인다는 것을 증명하려고 시도합니다. 그렇지 않으면 패치 된 바이너리가 원본과 다른 동작을 나타내는 조건을 설명하는 미분 요약을 생성합니다. 이를 통해 패치 개발자는 패치가 프로그램 시맨틱에 미치는 영향을 이해하고 영향이 의도 한 실행 경로로 제한되는지 평가할 수 있습니다.
검증자는 사용자로부터 수동으로 제공되는 사양이 필요하지 않습니다. 대신, 원래 프로그램을 원하는 행동 사양으로 취급합니다. 이 배열은 Patate Binary를 원본과 관련시키기 때문에 Pate는 관계형 검증자가됩니다. 검증자는 이진 코드 발견 및 프로그램의 상징적 실행 (기계 코드 프로그램 포함)을위한 여러 기존 라이브러리를 기반으로합니다. 대략 검증자는 다음과 같이 작동합니다.
Pate 도구는 Haskell으로 작성되었으며 GHC 컴파일러 (9.6으로 테스트)와 Cabal 빌드 도구를 컴파일해야합니다. 소스에서 건물은 다음과 같이 달성 할 수 있습니다.
git clone [email protected] : Galoisinc/Pate.git CD 페이트 git submodule 업데이트 -이니트 CP CABAL.PROJECT.DIST CABAL.PROJECT Cabal 구성 PKG : Pate ./pate.sh-- 헬프
검증자는 PATH 에서 SMT 솔버를 사용할 수 있어야합니다. 기본값은 yices z3 및 cvc4 도 작동 할 수 있지만 Pate에서 정기적으로 테스트되지는 않습니다.
이 자료는 계약 번호 N66001-20-C-4027에 따라 국방 고급 연구 프로젝트 기관 (DARPA)과 해군 정보 전쟁 센터 퍼시픽 (NIWC Pacific)이 지원하는 작업을 기반으로합니다. 이 자료에 표현 된 모든 의견, 결과 및 결론 또는 권장 사항은 저자의 의견이며 반드시 DARPA & NIWC 태평양의 견해를 반영하지는 않습니다.