
dtls-fuzzer는 DTLS 서버 구현을 위한 프로토콜 상태 퍼저입니다.
dtls-fuzzer는 DTLS 서버의 프로토콜 상태 퍼징을 수행하는 Java 도구입니다. 구체적으로 다음과 같은 기능을 지원합니다:
dtls-fuzzer는 DTLS 메시지를 생성/구문 분석하고 상태를 유지하기 위해 [TLS-Attacker][tlsattacker]를 사용합니다. 이를 위해 TLS-Attacker가 DTLS 지원으로 확장되었습니다. dtls-fuzzer는 DTLS 개선 사항을 구현한 TLS-Attacker의 [버전 3.0b][tlsattackerver]에 의존합니다.
아티팩트에는 다음이 포함됩니다:
dtls-fuzzer 루트 디렉토리에서 가장 중요한 폴더는 다음과 같습니다:
'experiments/results'에는 작업의 주요 출력인 실험 결과가 포함됩니다. 특히:
출력 폴더 이름은 실험 구성에 따라 지정됩니다. 즉:
예를 들어, 폴더 이름 'jsse-12_rsa_cert_none_rwalk_incl'은 JSSE 12 DTLS 구현에 대한 실험을 나타내며, RSA 핸드셰이크를 수행하기 위한 입력을 포함하는 알파벳을 사용하고, 클라이언트 인증이 비활성화되었으며, 테스트 알고리즘은 무작위 걷기이고 재전송이 포함됩니다.
출력 폴더에는 다음이 포함됩니다:
평가자는 (예를 들어) 'included'의 실험 결과가 표 4에 표시된 결과와 일치하는지, 또는 표 2에서 테스트된 구성이 'all_ciphers'에도 나타나는지 확인할 수 있습니다. 논문에 나타난 모델은 상당한 정리/트리밍의 결과인 반면, 출력 폴더에 나타난 모델은 변경되지 않았습니다.
dtls-fuzzer를 평가하기 위해서는 다음 단계를 수행해야 합니다:
이 평가 섹션 다음에는 dtls-fuzzer의 주요 사용 사례를 소개하는 사용 가이드가 이어집니다.
dtls-fuzzer는 Ubuntu 18.04 및 Debian 9 Linux 배포판에서 테스트되었습니다. 최신 Linux 배포판에서도 작동할 것입니다. 다른 플랫폼에 대한 지원은 테스트되지 않았습니다. 이 가이드는 Debian 기반 배포판('apt-get'이 있는)을 사용한다고 가정합니다.
Java 8 JDK(Java Development Kit) 가상 머신(VM)이 필요합니다. 실험을 실행하는 데 사용된 버전은 1.8.0_222이지만, 이후 Java 8 버전도 작동해야 합니다. 도구는 Java 9 이상에서는 빌드되지 않습니다. 또한 종속성 관리/배포를 위해 maven('mvn' 유틸리티)에 의존합니다.
충분히 강력한 머신을 사용하는 것이 좋습니다. 그렇지 않으면 응답 대기 시간과 같은 민감한 타이밍 매개변수가 너무 낮아져 논문에서 얻은 것과 다른 출력이 발생할 수 있습니다. 더 나쁜 경우 학습 실험이 실패할 수 있습니다. 원래 실험은 다중 코어 서버에서 실행되었지만, i7 프로세서가 있는 데스크탑에서도 학습이 가능할 것으로 예상됩니다(완전히 테스트되지는 않았지만). 타이밍 매개변수를 적절히 조정하면 약한 시스템에서도 학습이 가능합니다. 마지막으로, .dot 모델을 .pdf로 내보내 시각화하려면 [graphviz 라이브러리][graphviz]를 설치해야 합니다. graphviz에서 제공하는 'dot' 유틸리티가 시스템 PATH에 있는 것으로 가정합니다.
요약하면, 권장되는 사전 요구 사항은 다음과 같습니다:
dtls-fuzzer는 Java 8 JDK(Java Development Kit)가 필요합니다. Java가 설치되지 않은 경우 OpenJDK 구현(Ubuntu에서는 'apt-get'을 통해)을 설치하며, 이 하위 섹션의 나머지는 건너뛸 수 있습니다.
> sudo apt-get install openjdk-8-jdk
Java 버전이 설치된 경우 다음을 실행하여 버전을 확인할 수 있습니다:
> java -version
버전 코드는 1.8로 시작해야 하며(예: 1.8.0_242), 가상 머신은 "Server VM"(전체 JDK가 설치되었음을 나타내며, 런타임 환경만이 아님)이어야 합니다. 그렇다면 Java 설정이 완료된 것입니다. 그렇지 않은 경우, 설치된 Java VM을 나열하여 Java 8 JDK가 플랫폼에 설치되었지만 현재 선택되지 않았는지 확인할 수 있습니다:
> update-java-alternatives --list
Java 8 JDK가 나타나면 동일한 명령을 사용하여 Java 8 JDK를 기본 Java 구현으로 구성할 수 있습니다.
> sudo update-java-alternatives --set java-1.8.0-openjdk-amd64
그렇지 않으면 처음에 표시된 대로 전체 설치를 수행해야 합니다. 불행히도 'update-java-alternatives'가 때때로 성공하지 못하여 "오류" 메시지가 표시됩니다. 이러한 경우 'update-alternatives'를 사용하여 'java'(인터프리터) 및 'javac'(컴파일러)로 선택된 Java VM을 대화식으로 구성할 수 있습니다.
> sudo update-alternatives --config java
> sudo update-alternatives --config javac
Java 8이 설정되면 다른 종속성인 maven, graphviz 및 일부 일반적인 SUT 종속성을 설치합니다. 그런 다음 dtls-fuzzer의 저장소를 선택한 폴더에 복제하고 아티팩트 브랜치를 체크아웃합니다. 마지막으로 해당 폴더를 현재 디렉토리로 만듭니다.
> sudo apt-get install maven graphviz autotools-dev automake libtool
> git clone -b usenix20-artifact https://github.com/assist-project/dtls-fuzzer.git ~/dtls-fuzzer
> cd ~/dtls-fuzzer
먼저 'prepare.sh' 스크립트를 실행하여 dtls-fuzzer가 의존하는 라이브러리, 즉 두 개의 로컬 .jar와 TLS-Attacker 3.0b를 설치합니다. 그런 다음 도구 자체를 설치합니다. POSIX 시스템에서 결과 명령은 다음과 같습니다:
> bash prepare.sh
> mvn clean install
이 단계 후에 'target' 디렉토리가 생성되어 'dtls-fuzzer.jar'를 포함해야 합니다. 이것이 실행 가능한 라이브러리입니다. 이 시점부터 명령은 dtls-fuzzer의 루트 디렉토리에서 실행된다고 가정합니다.
PSK(사전 공유 키)만 사용하여 OpenSSL 1.1.1b에 대한 모델을 생성한다고 가정해 보겠습니다. dtls-fuzzer의 빠른 실행은 다음과 같습니다.
먼저 'setup_sut.sh' 스크립트에 의해 자동으로 SUT를 설정합니다.
> bash setup_sut.sh openssl-1.1.1b
그런 다음 'args/openssl-1.1.1b' 폴더에서 인수 파일을 선택합니다. 선택할 수 있는 여러 인수 파일이 있습니다:
learn_openssl-1.1.1b_all_cert_none_rwalk_incl
learn_openssl-1.1.1b_all_cert_nreq_rwalk_incl
learn_openssl-1.1.1b_all_cert_req_rwalk_incl
learn_openssl-1.1.1b_psk_rwalk_incl
관심 있는 인수 파일은 'learn_openssl-1.1.1b_psk_rwalk_incl'이며, 파일 이름이 PSK를 나타냅니다. 따라서 이를 선택하고 퍼저를 실행합니다. 또한 학습 시간을 단축하기 위해 테스트 수를 200개로 제한합니다. 마지막으로 OpenSSL의 경우 LD_LIBRARY_PATH를 구현 디렉토리('suts/openssl-1.1.1b/')로 설정해야 합니다. 학습을 실행하기 전에 설정이 작동하는지 확인하기 위해 간단한 테스트를 실행하는 것이 좋습니다. 좋은 테스트는 핸드셰이크를 완료하는 것입니다. 인수 파일과 'examples/tests'의 해당 테스트를 매개변수로 제공합니다. 다음을 실행합니다:
> LD_LIBRARY_PATH=suts/openssl-1.1.1b/ java -jar target/dtls-fuzzer.jar @args/openssl-1.1.1b/learn_openssl-1.1.1b_psk_rwalk_incl -test examples/tests/psk
모든 것이 잘 진행되면 서버는 "이것은 hello 메시지입니다"라는 메시지를 출력해야 합니다. 이 메시지는 핸드셰이크를 완료한 후 보내는 메시지입니다. 설정이 작동하는 것을 확인했으므로 이제 다음을 실행하여 학습을 시작할 수 있습니다:
> LD_LIBRARY_PATH=suts/openssl-1.1.1b/ java -jar target/dtls-fuzzer.jar @args/openssl-1.1.1b/learn_openssl-1.1.1b_psk_rwalk_incl -queries 200
실험을 위한 출력 디렉토리 'output/openssl-1.1.1b_psk_rwalk_incl/'가 생성된 것을 확인할 수 있습니다. 'ls' 명령으로 이 디렉토리를 확인하여 실험의 현재 상태(생성된 가설 수 등)를 확인할 수 있습니다.
> ls output/openssl-1.1.1b_psk_rwalk_incl/
모든 것이 잘 진행되면 20-30분 후에 출력 디렉토리에 'learnedModel.dot' 파일이 포함되어야 합니다. graphviz 'dot' 유틸리티를 사용하여 파일을 .pdf로 내보내고 즐겨 사용하는 .pdf 뷰어로 .pdf를 열어 시각화할 수 있습니다.
> dot -Tpdf output/openssl-1.1.1b_psk_rwalk_incl/learnedModel.dot > output/openssl-1.1.1b_psk_rwalk_incl/learnedModel.pdf
> evince output/openssl-1.1.1b_psk_rwalk_incl/learnedModel.pdf
마지막으로 'trim_model.sh'를 사용하여 더 나은/트리밍된 버전의 모델을 생성할 수 있습니다. 다음과 같이 수행할 수 있습니다:
> bash trim_model.sh --output output/openssl-1.1.1b_psk_rwalk_incl/nicerLearnedModel.dot output/openssl-1.1.1b_psk_rwalk_incl/learnedModel.dot
> dot -Tpdf output/openssl-1.1.1b_psk_rwalk_incl/nicerLearnedModel.dot > output/openssl-1.1.1b_psk_rwalk_incl/nicerLearnedModel.pdf
> evince output/openssl-1.1.1b_psk_rwalk_incl/nicerLearnedModel.pdf
이제 모델을 명세와 비교하여 시스템의 적합성을 확인할 수 있습니다...