봉합사는 LLVM IR을 기반으로 한 정적 포인트 및 고차 오이트 분석 도구이며 Dr. Checker (제작자 덕분에 여러 가지 하이라이트)를 기반으로합니다. 두 가지 하이라이트는 다음과 같습니다.
우리는 수술 적으로 정확할 수 있기를 희망하는 반면, 여러 syscalls/입력 기능을 함께 스티칭하여 고차 데이터 흐름을 구성 할 수 있기를 희망합니다. 자세한 내용은 본 논문 을 참조하십시오.
먼저 레포를 복제하십시오.
~$ git clone https://github.com/seclab-ucr/SUTURE.git suture
그런 다음 봉합사를 위해 LLVM 환경을 설정하십시오.
~$ cd suture
~/suture$ python setup_suture.py -o ../suture_deps
옵션 ( setup_suture.py 의 경우) :
-b 이 LLVM 미러 리포지기에서 "release_90"(예 : LLVM 9.0)으로 기본적으로 LLVM의 분기 이름을 지정합니다.-o Suture (예 : LLVM)에서 필요한 모든 물건을 호스팅하는 폴더를 지정하고 원하는 폴더를 사용하십시오. 하드웨어에 따라 LLVM 설정에 꽤 시간이 걸릴 수 있습니다. 완료되면 env.sh 라는 SRCIPT 파일이 봉합 루트 폴더에서 생성되며 봉합사가 사용하는 환경 변수를 설정하는 명령이 포함되어 있습니다.
중요 : 봉합사를 구축/사용하기 전에 매번이 env.sh 활성화하십시오 (쉘 로그인시 자동 활성화를 위해 포함 된 명령을 .bashrc 에 추가 할 수도 있습니다)!
~/suture$ source env.sh
다음으로 우리는 봉합사를 만들 것입니다.
~/suture$ cd llvm_analysis
~/suture/llvm_analysis$ ./build.sh
성공적인 빌드에서 봉합사는 사용할 준비가되었습니다.
봉합사는 상자 외부에서 고차 오 테인트 취약점을 발견하는 데 사용될 수 있습니다.이 섹션에서는이 과정을 예로 들어보세요 (예 : 논문의 섹션 2.1에 표시된 동기 부여 예).
취약점 봉합사는 두 가지 유형의 입력이 필요합니다. (1) LLVM 비트 코드 (예 : .BC 파일)로 컴파일 된 프로그램 모듈 및 (2) 입력 기능 및 사용자 제어 인수를 나타내는 모듈의 구성 파일.
먼저 동기 부여 예를 위해 LLVM 비트 코드를 준비합시다.
~/suture$ cd benchmark
~/suture/benchmark$ ./gen.sh motivating_example
참고 : 편의를 위해 -O1 최적화 수준을 사용하여 .c ~ .bc 및 .ll (Human Readable LLVM 비트 코드)을 컴파일 할 수있는 gen.sh 제공합니다.
이제 동일한 벤치 마크 폴더 아래에 MATIVATING_EXALLE.BC 가 있어야합니다. 이것이 봉합사의 입력 프로그램 모듈입니다.
그런 다음 구성 파일이 제공되며 이미 동기 부여 예제를 준비했습니다.
~/suture/benchmark$ cat conf_motivating_example
entry0 MY_IOCTL 1
entry1 NULL_ARG
entry2 NULL_ARG
설명 : 구성 파일의 각 줄은 하나의 입력 함수의 정보 (예 : 발신자가없는 최상위 함수 및 일반적으로 외부 인터페이스 역할)의 정보를 설명합니다.
entry_x MY_IOCTL 0_2 와 같은 구성에서 지정할 수 있습니다.위에서 볼 수 있듯이 Conf_Motivating_Example은 MATIVATING_EXALLE.C : ENTRICTIVER (PARAMETER 1은 사용자 제어), Entry1 및 Entry2 (사용자 제어 매개 변수 없음)에 세 가지 입력 함수가 있음을 지정합니다. 이것은 동기 부여 예제의 코드와 일치합니다.
프로그램 비트 코드와 항목 구성 파일이 준비되면 Suture를 실행하여 오염 된 취약점을 발견 할 수 있습니다.
~/suture$ ./run_nohup.sh benchmark/motivating_example.bc benchmark/conf_motivating_example
설명 : run_nohup.sh는 봉합사의 컴파일 된 LLVM 분석 패스를 호출하는 간단한 스크립트입니다.
~/suture$ ./run_nohup.sh [path/to/program.bc] [path/to/entry_func_config]
일단 시작되면 실제 하드웨어와 대상 프로그램의 복잡성에 따라 Suture가 분석 및 취약성 검색을 완료하는 데 필요한 시간이 크게 다릅니다. 그러나 동기 부여 예와 같은 간단한 프로그램은 일반적으로 즉시 끝납니다.
분석이 끝나는 지 결정 : 실행 중에 Suture는 입력 구성 파일 의 동일한 디렉토리에서 파일에 계속 로그인하면 구성 파일 경로 가/conf_program으로/conf_program 이라고 가정하면 로그 파일이 /path/to/conf_program.log 라고 가정합니다. 로그를 모니터링하여 분석이 완료되는지 여부를 결정할 수 있습니다.
~/suture$ grep "Bug Detection Phase finished" benchmark/conf_motivating_example.log
앞서 언급 한 로그 파일은 또한 봉합사의 출력이며, Suture는 로그 파일에 발견 된 잠재적 취약점을 포함시켜 분석이 완료된 후 다음을 추출하고 최종 경고 보고서로 구성 할 수 있습니다.
~/suture$ ./ext_warns.sh benchmark/conf_motivating_example.log
설명 : ext_warns.sh는 주어진 로그 파일에 포함 된 모든 경고 (JSON)를 추출하여 최종 경고 보고서로 재구성하고 인쇄합니다. 경고 보고서는 로그 파일의 동일한 경로에서 폴더에 넣습니다. 로그 파일이 /path/to/conf_program.log 라고 가정하면 경고 보고서 폴더는 /path/to/warns-conf_program-yyy-mm-dd 입니다.
~/suture$ ls benchmark/warns-conf_motivating_example-2021-11-10/
all int_overflow taint_data_use taint_loopbound taint_ptr_def
폴더에는 5 개의 경고 보고서가 있으며, 모두 데이터 흐름 관계에 따라 함께 그룹화 된 모든 유형의 경고가 포함되어 있으며, 다른 보고서에는 특정 유형의 경고 (예 : 정수 오버플로, 오염 된 포인터 단축 등) 만 포함되며, 우리가 논문에서 찾을 수있는 방법에 대한 자세한 내용은 본 논문에서 찾을 수 있습니다 (섹션 4). 우리는 보통 통합 보고서 만 사용합니다.
~/suture$ cat -n benchmark/warns-conf_motivating_example-2021-11-10/all
1 =========================GROUP 0 (2 - 2)=========================
2 #####Warned Insts#####
3 (u'motivating_example.c', 30, [u'IntegerOverflowDetector'])
4 ######################
5
6 ++++++++++++++++WARN 0 (2 - 2)++++++++++++++++
7 IntegerOverflowDetector says: motivating_example.c@30 (bar : %add = add i8 %0, -16, !dbg !31)
8 ********Trace 0(2)********
9 #####CTX##### entry0
10 entry0 (motivating_example.c@18)
11 #####INSTS#####
12 >>>>>>>>>>>>>>>>>>tag: 0x55b206570420 tf: 0x55b20695b1b0 (2)>>>>>>>>>>>>>>>>>>
13 motivating_example.c@18 ( %cond = icmp eq i32 %cmd, 0, !dbg !31)
14 motivating_example.c@21 ( store i8 %user_input, i8* getelementptr inbounds (%struct.data, %struct.data* @d, i64 0, i32 1, i64 0), align 4, !dbg !32, !tbaa !34)
15 #####CTX##### entry1 -> bar
16 entry1 (motivating_example.c@35)
17 ----> (motivating_example.c@35 : %call = tail call i32 @bar(i8* bitcast (%struct.data* @d to i8*)), !dbg !27)
18 bar (motivating_example.c@30)
19 #####INSTS#####
20 >>>>>>>>>>>>>>>>>>tag: 0x55b2065e7050 tf: 0x55b2068174f0 (1)>>>>>>>>>>>>>>>>>>
21 motivating_example.c@30 ( %0 = load i8, i8* %add.ptr, align 1, !dbg !31, !tbaa !32)
22 motivating_example.c@30 ( %add = add i8 %0, -16, !dbg !31)
23
설명 : 높은 수준에서 경고 보고서에는 일부 경고 그룹이 포함되어 있으며 각 그룹에는 몇 가지 경고가 포함되어 있으며 각 경고에는 사용자 입력에서 발생하는 몇 가지 오염 트레이스가 포함되어 있으며 동일한 민감한 프로그램 명령문으로 표시됩니다. 다시 말해, 특정 프로그램 명세서와 특정 유형 (예 : 정수 오버플로)에 대해 하나의 경고가 제기되는 반면, 그룹은 데이터 흐름 관점에서 여러 개의 밀접하게 관련된 경고를 포함하여 (논문의 섹션 4 참조), 그룹은 여러 경고 된 프로그램 진술을 가지고 있으며 다른 경고 유형을 포함 할 수 있습니다.
위의 경고 보고서를 예로 들어보십시오.
===GROUP No. (min_order - max_order)=== 입니다. 여기서 min_order 는 최소 순서입니다 (예 : 간단히 말하면, 순서 는 오 테인트 전파에 필요한 입력 기능 max_order 시간이 더 형식적인 정의에 대해서는 3.2 절을 참조하십시오.WARN No. 번호는 그룹에 로컬입니다.***Trace No. (order)*** 에 따라 경고의 오염 된 트레이스의 헤더 라인, 오염 된 트레이스는 항상 계산할 수있는 고유 한 순서 (예 : 범위가 아닌)를 가지고 있습니다.경고 보고서는 동기 부여 예에서 유효한 정수 오버 플로우 취약성을 정확하게 지적하지만, 덜 정확한 정적 분석 도구가 생성 될 수 있다는 잠재적 오 탐지를 피하면서 세부 사항은 논문의 2.1 절에서 찾을 수 있습니다.
이 repo에는 유용한 다른 도구/스크립트도 포함되어 있습니다.
~/suture$ python llvm_analysis/AnalysisHelpers/EntryPointIdentifier/entry_point_identifier.py /path/to/prog_module.bc
~/suture$ cat /path/to/prog_module.bc.all_entries
설명 :이 스크립트는 Linux 장치 드라이버 모듈 (예 :, ioctl () , read () , write ( ) 등에서 일부 공통 입력 기능을 식별 할 수 있으며, 이는 입력 구성 파일을 봉합사 입력으로 구성하는 데 도움이됩니다. 이 유틸리티는 주로 일부 커널 도메인 지식 (예 : 드라이버 입력 지점을 정의하는 데 사용되는 File_Operations 와 같은 특정 데이터 구조)을 기반으로 원래 Dr. Checker에 의해 구현됩니다.
~/suture$ python flt_warns.py /path/to/warn_report [Regex] > /path/to/filtered_warn_report
설명 : 우리의 경험에서, 경고 보고서의 많은 잘못된 경보는 종종 동일한 문제가있는 하위 트레이션을 공유합니다 (논문의 6.3 절 참조). 경고 검토자가 하나의 잘못된 경보를 검사하고 FP 유도 하위 트레이스를 인식하는 한, 당연히 동일한 하위 트레이스를 포함하는 다른 모든 유사한 잘못된 경보를 자동으로 배제하여 검토자가 인식 된 오 탐지 속도를 줄일 수 있습니다. 이를 위해, 우리는 원래 경고 보고서와 파이썬 정규 표현식을 입력으로 가져 오는이 간단한 flt_warns.py를 제공하면 보고서의 모든 오염 트레이스와의 RE와 일치하면 오염 된 추적이 잘못된 경보로 취급됩니다. 스크립트는 일치하는 오염 트레이스를 제외한 새로운 필터링 된 경고 보고서를 생성합니다.
봉합사를 일반 목적 정적 분석으로 사용하는 데 관심이있을 수 있습니다 (예 : 특정 프로그램 위치에서 변수의 포인트-투어/오염 세트를 얻을 수 있습니다). 이것은 확실하지만, 취약성 검색과 달리, 사용하는 주요 데이터 구조와 중요한 기능에 익숙해 지도록 손을 더럽 히고 봉합 코드에 뛰어들 필요가 있습니다. 다음 팁이 도움이되기를 바랍니다.
LLVM은 후진 호환성에 대한 보장없이 매우 빠르게 발전합니다. 따라서 최신 LLVM 버전 (예 :> 9.0)으로 봉합사를 구축하려고 할 때 컴파일 오류가 발생할 가능성이 높습니다. 그러나 다행히도 이러한 컴파일 오류는 일반적으로 해결하기 쉽습니다 (예 : 종종 오래된 LLVM API를 최신 LLVM API를 대체 해야하는 경우). 따라서 기본적으로 Suture를 최신 LLVM 버전에 적응하려면 먼저 0x0에서 최신 LLVM을 설정해야합니다 (예 : Setup_Suture.py 를 활성 소스에서 LLVM Repo를 복제하고 최신 분기 이름을 클론하여 Supure를 구체화하여 제기를 구축해야합니다.