이번 챌린지 프로젝트 모범 릴리스는 대회 기간 동안 모든 챌린지 프로젝트에 존재하는 동일한 구조 및 인터페이스와 유사한 챌린지 프로젝트를 경쟁자에게 제공하는 것을 목표로 합니다.
이 예제는 다음 버전으로 개발 및 테스트되었습니다.
참고: 여기에 포함된 내용은 변경될 수 있습니다. 향후 업데이트를 확인하고 확인하세요!
src/
- 이것은 다음과 같이 수정된 챌린지 프로젝트 Linux 커널 6.1.54의 소스 코드입니다.
net/tipc/crypto.c
변경을 통해 다시 도입되었습니다.net/tipc/crypto.c
, net/tipc/tipc_test.c
변경을 통해 취약한 기능에 대한 kunit 테스트를 추가했습니다.test_harnesses/
폴더에 AIxCC 전용 하네스를 추가했습니다. run.sh
- 챌린지 프로젝트와 상호 작용할 수 있는 표준화된 인터페이스를 CRS에 제공하는 스크립트입니다.
build.sh
- 챌린지 프로젝트의 빌드 프로세스를 정의하는 스크립트입니다.
project.yaml
- 챌린지 프로젝트의 여러 중요한 측면을 자세히 설명하는 yaml 문서입니다.
exemplar_only/
- 이 폴더에는 예시 릴리스에서만 제공되는 보충 정보가 포함되어 있습니다. 이 정보는 대회 중에 제공될 것으로 예상해서는 안 됩니다.
blobs/
- 이 폴더에는 테스트 도구로 전달될 때 주입된 취약점을 트리거해야 하는 sample_solve.bin
이라는 파일이 포함되어 있습니다.patches/
- 두 개의 예제 패치가 포함된 폴더입니다.good_patch.diff
- 취약점을 제거하고 기능을 유지합니다.bad_patch.diff
- 취약점을 제거하지만 기능은 유지하지 않습니다.gen_blob.py
- 제공된 테스트 하네스에 대한 바이너리 blob을 생성하기 위한 도우미 스크립트입니다.run_internal.sh
- 요청을 처리하기 위해 Docker 환경 내에서 실행되는 스크립트입니다.setup.sh
- Docker 이미지를 빌드하기 위한 종속성 설치 스크립트입니다.test_blob.py
- 대상 하네스에 대해 수신된 데이터 blob을 테스트하는 스크립트입니다. 예시를 테스트하려면 먼저 다음을 실행하여 기본 Docker 이미지를 빌드하세요.
docker build . -t exemplar-cp-linux:base --target=exemplar-cp-linux-base
일단 구축되면 run.sh
스크립트를 통해 컨테이너와의 기본적인 상호 작용을 수행할 수 있습니다.
run.sh
스크립트는 모든 경쟁 CP에서 일관성을 유지하는 표준화된 인터페이스를 제공합니다. 소프트웨어를 빌드하기 전에 소스 저장소에서 소스를 가져와야 합니다.
./run.sh pull_source
이 명령은 현재 src/
폴더에 있는 모든 항목을 덮어쓰므로 소스 코드의 새로운 복사본을 로드할 수 있습니다.
./run.sh build [patch file]
build
명령은 선택적으로 생성된 패치 파일을 사용하여 챌린지 프로젝트를 빌드합니다. 소스 코드는 src/
폴더에 마운트된 도커 볼륨을 통해 빌드됩니다. 테스트 하니스 바이너리는 out/
폴더에 구축되어 저장됩니다. 그리고 분석에 사용될 수 있습니다.
참고: build
명령은 src/
의 현재 작업 상태와 Dockerfile에 대한 수정 사항을 빌드합니다. 패치를 테스트하려면 pull_source
명령과 깨끗한 Dockerfile을 사용하여 상태의 깨끗한 복사본을 만드는 것이 좋습니다.
./run.sh run_pov < blob_file > < harness_id >
run_pov
명령은 지정된 하네스 ID에 대해 제공된 이진 데이터 Blob 파일을 실행합니다. 유효한 하네스 ID는 project.yaml
파일에 나열되어 있습니다.
./run.sh run_tests
run_tests
명령은 챌린지 프로젝트 내에서 기능 테스트를 실행합니다. 현재로서는 run_tests
명령이 src/
디렉터리의 원래 상태를 유지합니다.
소스 코드를 가져와 있는 그대로 빌드하고 Linux 테스트 바이너리를 분석하고 결과 바이너리를 활용한다고 가정해 보겠습니다.
./run.sh pull_source
./run.sh build
file out/linux_test_harness
file src/arch/x86/boot/bzImage
그런 다음 테스트 하네스에 대해 데이터 Blob을 실행하여 살균제 트리거를 확인합니다. 자체 입력 데이터를 테스트하려면 exemplar_only 바이너리를 자체 파일로 바꾸세요.
./run.sh run_pov exemplar_only/blobs/sample_solve.bin linux_test_harness | grep -i ' pov|trigger '
새니타이저 트리거를 확인한 후 src/
디렉터리를 통해 소스 코드를 직접 수정하여 취약점 패치를 시도합니다.
sed -i ' 2310,2312d ' src/net/tipc/crypto.c
./run.sh build
./run.sh run_pov exemplar_only/blobs/sample_solve.bin linux_test_harness | grep -i ' pov|trigger '
./run.sh run_tests
살균제 트리거를 제거했지만 기능 테스트에 실패했습니다. 더 나은 솔루션을 만들고 패치 파일을 생성합니다. 원본 소스에 대해 패치를 적절하게 테스트하기 위해 소스의 깨끗한 복사본을 가져오고 POV 및 기능 테스트를 다시 실행합니다. 자신의 패치를 테스트하려면 exemplar_only 패치를 자신의 파일로 바꾸십시오.
./run.sh pull_source
./run.sh build exemplar_only/patches/good_patch.diff
./run.sh run_pov exemplar_only/blobs/sample_solve.bin linux_test_harness | grep -i ' pov|trigger '
./run.sh run_tests
이제 linux_test_harness
하네스에 전달될 때 새니타이저를 트리거하는 데이터 블롭과 기능 테스트를 통과하는 동안 해당 취약점을 해결하는 패치가 생성되었습니다.