Skip to content
KitploitKITPLOIT
도구블로그
제출
도구블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

··피드·문의·개인정보·© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
dtls-fuzzer — dtls-fuzzer는 DTLS 서버 구현을 위한 프로토콜 상태 퍼저입니다. | Kitploit
도구/GitLabGitLab/pfg666/dtls-fuzzer
FuzzingNetwork Security
GitLabpfg666/dtls-fuzzer

dtls-fuzzer

dtls-fuzzer는 DTLS 서버 구현을 위한 프로토콜 상태 퍼저입니다.

저장소 보기
495년 전아직 검토되지 않음

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

dtls-fuzzer는 DTLS 서버의 프로토콜 상태 퍼징을 수행하는 Java 도구입니다. 구체적으로 다음과 같은 기능을 지원합니다:

  1. 알파벳이 주어지면 로컬 DTLS 서버 구현의 모델을 자동으로 생성할 수 있습니다.
  2. 테스트(입력 시퀀스)와 알파벳이 주어지면 DTLS 서버 구현에서 테스트를 실행할 수 있습니다.
  3. 여러 학습 실행을 포함하는 배치 학습 작업을 실행할 수 있습니다.

dtls-fuzzer는 DTLS 메시지를 생성/구문 분석하고 상태를 유지하기 위해 TLS-Attacker를 사용합니다. 이를 위해 TLS-Attacker가 DTLS 지원으로 확장되었습니다. dtls-fuzzer는 DTLS 개선 사항을 구현한 TLS-Attacker의 버전 3.0b에 의존합니다.

아티팩트 내용

아티팩트에는 다음이 포함됩니다:

  1. 소스 코드와 논문에 표시된 것과 일치하는 실험 데이터를 포함한 dtls-fuzzer의 파일 구조 설명;
  2. 선택한 SUT(System Under Test)/DTLS 서버 구현에서 dtls-fuzzer를 평가하기 위한 안내.

dtls-fuzzer 파일 구조

dtls-fuzzer 루트 디렉토리에서 가장 중요한 폴더는 다음과 같습니다:

  1. 'src', dtls-fuzzer의 Java 소스 코드를 포함하는 디렉토리;
  2. 'examples', 알파벳, 테스트, 명세(즉, 모델) 및 학습 실험을 시작하기 위해 dtls-fuzzer에 제공될 수 있는 인수 파일의 예제를 포함하는 디렉토리. 이 디렉토리의 파일은 학습 실험을 위한 입력으로 사용됩니다;
  3. 'experiments', 실험과 관련된 데이터를 포함하는 디렉토리. 이 데이터 중 일부는 학습 실험을 위한 입력으로도 사용됩니다. 가장 주목할 만한 폴더는 다음과 같습니다:
    1. 'suts', Java SUT용 바이너리 포함. 이 SUT는 소스 코드가 공개되어 있는 맞춤형 DTLS 서버 프로그램입니다;
    2. 'patches', 소스 코드가 컴파일되기 전에 일부 SUT(특히 유틸리티)에 적용된 패치. 이러한 패치의 주요 목적은 학습 중 타이밍 유도 동작을 방지하고, SUT에서 기능을 활성화/비활성화하며, 사전 공유 키와 같은 매개변수를 구성하는 것이었습니다;
    3. 'keystore', 학습 중 사용된 키 자료(예: 공개-개인 키 쌍, Java 키 저장소);
    4. 'results', 실험 결과.

실험 결과

'experiments/results'에는 작업의 주요 출력인 실험 결과가 포함됩니다. 특히:

  • 'all_ciphers'에는 실행된 모든 실험의 출력 폴더가 포함됩니다;
    • 'mapper'에는 매퍼 결정 중 일부를 정당화하는 데 도움이 되는 실험 결과가 포함됩니다(섹션 5.2 참조).
  • 'included'에는 수렴된 실험의 출력 폴더가 포함됩니다(수렴은 학습이 성공적으로 모델을 생성했음을 의미함).
    • 'all_ciphers'의 모든 실험이 성공적이거나 최종 모델로 종료된 것은 아닙니다(이러한 경우 학습이 수렴되지 않았다고 말합니다).

출력 폴더

출력 폴더 이름은 실험 구성에 따라 지정됩니다. 즉:

  • 테스트된 SUT/구현;
  • 사용된 알파벳(포함된 키 교환 알고리즘 측면에서), 'all'은 4개의 키 교환 알고리즘이 모두 사용되었음을 나타냄;
  • 해당되는 경우 클라이언트 인증이 필요(req), 선택 사항(nreq) 또는 비활성화(none)되었는지 여부;
  • 테스트 알고리즘: 무작위 걷기(rwalk) 또는 그 변형(stests);
    • 변형을 사용한 실험은 논문에 포함되지 않았습니다.
  • 선택적으로, 재전송이 출력에 포함되었는지/제외되었는지 여부(incl 또는 excl).
    • 재전송은 기본적으로 포함되었습니다.

예를 들어, 폴더 이름 'jsse-12_rsa_cert_none_rwalk_incl'은 JSSE 12 DTLS 구현에 대한 실험을 나타내며, RSA 핸드셰이크를 수행하기 위한 입력을 포함하는 알파벳을 사용하고, 클라이언트 인증이 비활성화되었으며, 테스트 알고리즘은 무작위 걷기이고 재전송이 포함됩니다.

출력 폴더에는 다음이 포함됩니다:

  • 'alphabet.xml', 입력 알파벳;
  • 'command.args', 다양한 실험 매개변수가 포함된 인수 파일. 가장 주목할 만한 것은:
    • queries, 가설이 최종으로 간주되기 위해 통과해야 하는 무작위 걷기 테스트 수의 상한
    • equivalenceAlgorithms, 사용된 모델 기반 테스트 알고리즘
    • runWait 및 timeout, 각각 시작 및 응답 시간 제한(이에 대해서는 나중에 다룸)
  • 'sul.config', TLS-Attacker에 대한 SUT 종속 구성. 동일한 구성을 사용하여 TLS-Attacker만으로 SUT에서 워크플로 추적을 실행할 수 있습니다;
  • 'hyp[0-9]+.dot', 중간 가설;
  • 'statistics.txt', 총 테스트 수, 학습 시간 등의 실험 통계;
    • 표 4에 이 데이터가 표시됩니다.
  • 'nondet.log', 발생한 비결정적 동작의 로그;
  • 'learnedModel.dot', 학습이 수렴된 경우 학습된 모델(즉, 최종 가설);
  • 'error.msg', 실험이 실패하거나 학습이 중지되어 최종 모델로 수렴되지 않은 경우 생성된 오류 메시지.
    • 주요 원인은 시간 관련 비결정성(동일한 입력이 다른 결과를 초래함)입니다.

평가자는 (예를 들어) 'included'의 실험 결과가 표 4에 표시된 결과와 일치하는지, 또는 표 2에서 테스트된 구성이 'all_ciphers'에도 나타나는지 확인할 수 있습니다. 논문에 나타난 모델은 상당한 정리/트리밍의 결과인 반면, 출력 폴더에 나타난 모델은 변경되지 않았습니다.

dtls-fuzzer 평가 단계

dtls-fuzzer를 평가하기 위해서는 다음 단계를 수행해야 합니다:

  1. 사전 요구 사항 충족 확인
  2. dtls-fuzzer 설치
  3. SUT 설정
  4. dtls-fuzzer를 사용하여 SUT에 대한 모델 생성
  5. 결과 분석

이 평가 섹션 다음에는 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에서 제공하는 'dot' 유틸리티가 시스템 PATH에 있는 것으로 가정합니다.

요약하면, 권장되는 사전 요구 사항은 다음과 같습니다:

  • 최신 Linux 배포판, 가급적 Debian 기반
  • 실험 재현/안정적인 학습을 위한 데스크탑/서버 머신
  • (>=) 4GB RAM
  • Java 8 JDK
  • maven
  • graphviz

환경 설정

Java 8 JDK

dtls-fuzzer는 Java 8 JDK(Java Development Kit)가 필요합니다. Java가 설치되지 않은 경우 OpenJDK 구현(Ubuntu에서는 'apt-get'을 통해)을 설치하며, 이 하위 섹션의 나머지는 건너뛸 수 있습니다.

root@kitploit:~
> sudo apt-get install openjdk-8-jdk

Java 버전이 설치된 경우 다음을 실행하여 버전을 확인할 수 있습니다:

root@kitploit:~
> java -version

버전 코드는 1.8로 시작해야 하며(예: 1.8.0_242), 가상 머신은 "Server VM"(전체 JDK가 설치되었음을 나타내며, 런타임 환경만이 아님)이어야 합니다. 그렇다면 Java 설정이 완료된 것입니다. 그렇지 않은 경우, 설치된 Java VM을 나열하여 Java 8 JDK가 플랫폼에 설치되었지만 현재 선택되지 않았는지 확인할 수 있습니다:

root@kitploit:~
> update-java-alternatives --list

Java 8 JDK가 나타나면 동일한 명령을 사용하여 Java 8 JDK를 기본 Java 구현으로 구성할 수 있습니다.

root@kitploit:~
> sudo update-java-alternatives --set java-1.8.0-openjdk-amd64

그렇지 않으면 처음에 표시된 대로 전체 설치를 수행해야 합니다. 불행히도 'update-java-alternatives'가 때때로 성공하지 못하여 "오류" 메시지가 표시됩니다. 이러한 경우 'update-alternatives'를 사용하여 'java'(인터프리터) 및 'javac'(컴파일러)로 선택된 Java VM을 대화식으로 구성할 수 있습니다.

root@kitploit:~
> sudo update-alternatives --config java
> sudo update-alternatives --config javac

기타

Java 8이 설정되면 다른 종속성인 maven, graphviz 및 일부 일반적인 SUT 종속성을 설치합니다. 그런 다음 dtls-fuzzer의 저장소를 선택한 폴더에 복제하고 아티팩트 브랜치를 체크아웃합니다. 마지막으로 해당 폴더를 현재 디렉토리로 만듭니다.

root@kitploit:~
> 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

dtls-fuzzer 설치

먼저 'prepare.sh' 스크립트를 실행하여 dtls-fuzzer가 의존하는 라이브러리, 즉 두 개의 로컬 .jar와 TLS-Attacker 3.0b를 설치합니다. 그런 다음 도구 자체를 설치합니다. POSIX 시스템에서 결과 명령은 다음과 같습니다:

root@kitploit:~
> bash prepare.sh
> mvn clean install

이 단계 후에 'target' 디렉토리가 생성되어 'dtls-fuzzer.jar'를 포함해야 합니다. 이것이 실행 가능한 라이브러리입니다. 이 시점부터 명령은 dtls-fuzzer의 루트 디렉토리에서 실행된다고 가정합니다.

빠른 실행

PSK(사전 공유 키)만 사용하여 OpenSSL 1.1.1b에 대한 모델을 생성한다고 가정해 보겠습니다. dtls-fuzzer의 빠른 실행은 다음과 같습니다.

먼저 'setup_sut.sh' 스크립트에 의해 자동으로 SUT를 설정합니다.

root@kitploit:~
> bash setup_sut.sh openssl-1.1.1b

그런 다음 'args/openssl-1.1.1b' 폴더에서 인수 파일을 선택합니다. 선택할 수 있는 여러 인수 파일이 있습니다:

root@kitploit:~
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'의 해당 테스트를 매개변수로 제공합니다. 다음을 실행합니다:

root@kitploit:~
>  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 메시지입니다"라는 메시지를 출력해야 합니다. 이 메시지는 핸드셰이크를 완료한 후 보내는 메시지입니다. 설정이 작동하는 것을 확인했으므로 이제 다음을 실행하여 학습을 시작할 수 있습니다:

root@kitploit:~
> 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' 명령으로 이 디렉토리를 확인하여 실험의 현재 상태(생성된 가설 수 등)를 확인할 수 있습니다.

root@kitploit:~
> ls output/openssl-1.1.1b_psk_rwalk_incl/

모든 것이 잘 진행된 경우

모든 것이 잘 진행되면 20-30분 후에 출력 디렉토리에 'learnedModel.dot' 파일이 포함되어야 합니다. graphviz 'dot' 유틸리티를 사용하여 파일을 .pdf로 내보내고 즐겨 사용하는 .pdf 뷰어로 .pdf를 열어 시각화할 수 있습니다.

root@kitploit:~
> 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'를 사용하여 더 나은/트리밍된 버전의 모델을 생성할 수 있습니다. 다음과 같이 수행할 수 있습니다:

root@kitploit:~
> 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

이제 모델을 명세와 비교하여 시스템의 적합성을 확인할 수 있습니다...

문제가 발생한 경우

'ls'로 출력 디렉토리를 확인할 때 'error.msg'를 찾을 수 있습니다. 이는 실험이 실패하고 학습이 갑자기 종료되었음을 나타냅니다. 이러한 경우 파일 내용을 표시하면 실패 이유를 알 수 있습니다.

root@kitploit:~
> cat output/openssl-1.1.1b_psk_rwalk_incl/error.msg

잠재적인 발견 사항이 시스템에 대해 검증되는 한(어차피 그래야 함) 마지막으로 생성된 가설에 대해 적합성 확인을 계속 수행할 수 있습니다.

SUT 설정

SUT 설정을 위한 스크립트를 제공합니다. 이 스크립트는 소스 파일을 다운로드하고 일부 종속성(jvm)을 설치하며 SUT를 빌드합니다. 자동 설정이 제공되는 SUT를 보려면 다음을 실행하십시오:

root@kitploit:~
> bash setup_sut.sh

예를 들어 Contiki-NG의 tinydtls 구현을 설정하려면 다음을 실행하십시오:

root@kitploit:~
> bash setup_sut.sh ctinydtls

스크립트는 dtls-fuzzer의 루트 디렉토리에 두 개의 폴더를 생성합니다.

  • 'suts', SUT 바이너리가 배포되는 위치
  • 'modules', 종속성이 배포되는 위치

불행히도 SUT 설정을 자동화하는 것은 복잡한 과정이므로 다음과 같은 단축 방법을 사용합니다. Java SUT(JSSE, Scandium)의 경우 구현을 빌드하지 않고 'experiments/suts' 디렉토리의 컴파일된 .jar를 사용합니다. 이러한 Java SUT(서버 애플리케이션)의 소스 코드는 Scandium 및 JSSE에서 온라인으로 공개되어 있으며, PionDTLS의 경우도 마찬가지입니다. 종속성을 자동으로 설치하면 'sudo' 액세스 권한을 요청할 수 있습니다. 이는 nettle과 같은 외부 라이브러리에 의존하는 GnuTLS와 autoconf에 의존하는 Eclipse의 TinyDTLS에서 발생합니다. 마지막으로, 이러한 시스템 설정의 복잡성으로 인해 NSS 및 PionDTLS에 대한 자동 설정/인수 파일을 제공하지 않습니다.

문제 해결

설치 과정에서 문제가 발생하면 'suts' 폴더(또는 SUT 특정 'suts/SUT' 폴더)를 삭제하고 설정 스크립트를 다시 실행하면 문제가 해결될 수 있습니다. 또한 빌드 실패 시 구현의 소스 코드가 'suts' 디렉토리에 다운로드되어 있어야 합니다. 해결 방법은 구현을 수동으로 빌드하는 것입니다. 구현이 빌드되면 설정이 작동합니다.

여기에 다양한 SUT가 가지는 종속성의 불완전한 트리를 제공합니다. 기울임꼴로 표시된 것은 'setup_sut.sh'가 'sudo' 액세스 권한을 사용하여 설치하려는 종속성입니다.

  • GnuTLS:
    • m4
    • pkg-config
    • nettle
  • Eclipse's TinyDTLS
    • m4
    • autoconf
  • WolfSSL
    • m4
    • autoconf
    • libtool
  • nettle
    • m4
    • pkg-config
  • autoconf
    • aclocal
      • automake
      • autotools-dev

SUT 구성 학습

이제 SUT 구성을 학습할 준비가 되었습니다. 다양한 SUT 구성을 위한 인수 파일은 dtls-fuzzer 홈 디렉토리의 'args' 디렉토리에 제공됩니다. 각 인수 파일 이름은 'experiments/results/'의 출력 폴더 이름으로 설명된 실험 설정(SUT, 알파벳, 인증)을 설명합니다. 인수 파일을 사용하여 SUT 학습을 시작하려면 다음을 실행하십시오:

root@kitploit:~
> java -jar target/dtls-fuzzer.jar @args/sut_name/arg_file

출력 폴더는 생성된 'output' 디렉토리에 저장됩니다.

매개변수 조정

테스트 상한

논문의 실험과 비교하여, 성능이 낮은 하드웨어에 맞게 여러 SUT의 응답 시간 초과를 증가시켰습니다. 학습 시간을 단축하려면 무작위 걷기 알고리즘의 테스트 상한을 20000에서 5000으로 줄이는 것이 좋습니다. 이는 다음을 통해 수행할 수 있습니다:

root@kitploit:~
> java -jar target/dtls-fuzzer.jar @args/sut_name/arg_file -queries 5000

이렇게 하면 인수 파일의 상한 설정이 덮어쓰여집니다. GnuTLS, PionDTLS 및 JSSE를 제외하고, 이 낮은 상한에 대해 학습이 동일한 모델을 생성할 것으로 예상됩니다.

타이밍 매개변수

타이밍이 문제가 되어 비결정성이 발생하고, 정보를 제공하는 'error.msg' 파일과 함께 갑작스러운 종료가 발생할 수 있습니다. 이러한 경우 조정할 수 있는 두 가지 노브가 있습니다:

  1. 응답 시간 초과(서버가 응답하지 않는다고 결론을 내리기 전에 각 응답을 기다리는 시간);
  2. 시작 시간 초과(서버가 시작될 때까지 기다리는 시간).

이 매개변수는 인수 파일의 해당 설정을 (더 높은 값으로) 덮어써서 조정할 수 있습니다:

root@kitploit:~
> java -jar target/dtls-fuzzer.jar @args/sut_name/arg_file -timeout new_response_timeout -runWait new_start_timeout

타이밍 관련 문제를 피하기 위해 충분히 강력한 머신에서 실험을 실행하는 것이 좋습니다. 비결정성의 주요 원인은 SUT가 시작되거나 응답을 생성하는 데 너무 오래 걸리는 것입니다. 더 많은 컴퓨팅 성능이 제공될수록 이러한 가능성은 줄어듭니다.

학습 시간

특히 종료될 것으로 예상되지 않는 실험의 경우 일정 기간 후에 자동으로 실험을 종료할 수 있습니다. 이 기간은 시간 제한 매개변수를 통해 설정할 수 있으며, 실험이 실행될 수 있는 최대 기간을 할당합니다. 이 기간은 ISO 8601 형식으로 제공됩니다. 실험 실행 시간을 60분으로 제한하려면 다음을 실행합니다:

root@kitploit:~
> java -jar target/dtls-fuzzer.jar @args/sut_name/arg_file -timeLimit "PT60M"

동시 실험 및 포트 충돌

서버가 다른 포트에서 수신하도록 구성된 경우 여러 실험을 동시에 실행할 수 있습니다. 각 실험을 별도의 터미널에서 시작하도록 선택할 수 있습니다. 또는 'disown' 유틸리티를 사용하여 단일 터미널에서 실험을 시작할 수 있습니다:

root@kitploit:~
> java -jar target/dtls-fuzzer.jar @args/ctinydtls/learn_ctinydtls_psk_rwalk 1>/dev/null 2>&1 & disown

그러나 몇 개 이상(>2)의 실험을 실행하면 머신에 추가 부담이 발생합니다. 또한 우발적인 포트 충돌로 인한 학습 실패 가능성이 높아집니다. 대부분의 구성에서 서버는 로컬호스트의 일부 하드코드된 포트에서 수신하도록 구성되며, 'args'에 제공된 구성은 고유한 하드코드된 포트를 사용합니다. JSSE 및 Scandium 구성의 경우 설정이 다릅니다. 모든 테스트에서 SUT는 동적으로 선택된 포트에서 수신하는 서버를 시작하고 TCP 소켓을 통해 dtls-fuzzer에 포트를 전달합니다. 이렇게 하면 서버가 패킷을 수신할 준비가 되었을 때 dtls-fuzzer에 알릴 수 있다는 장점이 있습니다(이것이 없으면 dtls-fuzzer는 서버가 시작될 때까지 임의의 시간 동안 맹목적으로 기다려야 합니다). 단점은 할당된 포트가 다른 실험의 일부 하드코드된 포트와 동일할 수 있다는 것입니다. 이는 서버 스레드가 최근에 중지되었고 새 스레드가 아직 시작되지 않은 경우(즉, 하드코드된 포트가 동적 할당에 사용될 수 있음)에 발생합니다. 이러한 형태의 충돌을 피하기 위해 Scandium 및 JSSE 실험을 다른 모든 실험과 분리하여 실행하는 것이 좋습니다.

제안된 구성

자동 빌드가 안정적이고, 학습이 빠르거나 흥미로운 버그가 발견된 다음 구성을 제안합니다. 명령을 실행하기 전에 SUT를 설정했는지 확인하십시오. 가능한 경우 PSK 구성에 초점을 맞출 것입니다. 그 이유는 작은 암호를 사용하는 PSK는 다른 암호화 메커니즘보다 훨씬 적은 처리 시간이 필요하기 때문입니다.### OpenSSL 1.1.1b 모든 openssl-1.1.1b 구성(예: 'args/openssl-1.1.1b/learn_openssl-1.1.1b_all_cert_req_rwalk_incl')을 시도할 수 있습니다. 실험은 모든 키 교환 알고리즘을 실행하며 빠르게 종료됩니다(1일 미만). 모든 (PSK, RSA, ECDH, DH) 키 교환 알고리즘을 사용하는 클라이언트 인증서 요구 구성 명령어:

root@kitploit:~
> LD_LIBRARY_PATH=suts/openssl-1.1.1b/ java -jar target/dtls-fuzzer.jar @args/openssl-1.1.1b/learn_openssl-1.1.1b_all_cert_req_rwalk_incl -queries 5000

참고: OpenSSL을 학습할 때는 LD_LIBRARY_PATH 변수를 설치 디렉터리로 지정해야 합니다.

MbedTLS 2.16.1

OpenSSL과 동일한 이유로 모든 mbedtls-2.16.1 구성을 사용할 수 있습니다. SUT가 느리므로 실험 완료에 더 많은 시간이 소요됩니다. 클라이언트 인증서 인증 비활성화 구성 및 모든 키 교환 알고리즘 사용 명령어:

root@kitploit:~
> java -jar target/dtls-fuzzer.jar @args/mbedtls-2.16.1/learn_mbedtls_all_cert_none_rwalk_incl -queries 5000

PSK를 사용하는 Contiki-NG TinyDTLS

이 구성에 대해 얻은 모델의 수정된 버전이 부록에 나와 있습니다. 입력 알파벳이 작아 테스트가 더 쉬우므로 낮은 테스트 상한인 2000을 사용할 수 있습니다.

root@kitploit:~
> java -jar target/dtls-fuzzer.jar @args/ctinydtls/learn_ctinydtls_psk_rwalk -queries 2000

PSK를 사용하는 WolfSSL 4.0.0

WolfSSL의 경우 학습이 비교적 빠르게 종료되어야 하는 PSK 구성을 제공합니다.

root@kitploit:~
> java -jar target/dtls-fuzzer.jar @args/wolfssl-4.0.0/learn_wolfssl-4.0.0_psk_rwalk -queries 2000

클라이언트 인증이 비활성화된 GnuTLS 3.6.7

분석한 최신 GnuTLS 버전은 깔끔하고 간결한 모델을 생성했습니다. 안타깝게도 클라이언트 인증을 활성화하면 필요한 테스트 수가 급격히 증가했습니다. 학습 시간을 단축하기 위해 인증을 비활성화하는 구성을 권장합니다:

root@kitploit:~
> java -jar target/dtls-fuzzer.jar @args/gnutls-3.6.7/learn_gnutls-3.6.7_all_cert_none_rwalk_incl -queries 2000

버그 수정 전 Scandium PSK

이 구성에 대해 얻은 모델의 수정된 버전이 논문에 나와 있습니다. 모델은 중요한 버그를 드러내지만, 안타깝게도 실험이 오래 걸립니다. Scandium 또는 JSSE와 관련되지 않은 실험과 병렬로 실행해서는 안 됩니다. 명령어:

root@kitploit:~
> java -jar target/dtls-fuzzer.jar @args/scandium-2.0.0/learn_scandium-2.0.0_psk_rwalk -queries 2000

인증 필수 JSSE 12.0.2

이 구성에 대해 얻은 모델의 수정된 버전이 논문에 나와 있습니다. 모델은 중요한 버그를 드러냅니다. Scandium 또는 JSSE와 관련되지 않은 실험과 병렬로 실행해서는 안 됩니다. 참고: JSSE 학습은 종료/수렴되지 않으며, 점점 더 많은 상태를 가진 가설을 구축합니다. 따라서 JSSE 실험은 하루 후(논문에서는 이틀 후) 자동으로 종료되도록 구성했습니다. RSA 키 교환 명령어:

root@kitploit:~
> java -jar target/dtls-fuzzer.jar @args/jsse-12/learn_jsse-12_rsa_cert_req_rwalk_incl 

어려운 학습 대신, 인증서 메시지를 전혀 보내지 않고 이 설정에서 핸드셰이크를 완료할 수 있는지 간단히 테스트하고 싶을 수 있습니다. 이는 다음 명령으로 실행할 수 있습니다:

root@kitploit:~
> java -jar target/dtls-fuzzer.jar @args/jsse-12/learn_jsse-12_rsa_cert_req_rwalk_incl -test examples/tests/rsa

결과 분석

학습이 완료되면 출력 디렉터리에서 분석할 항목은 다음과 같습니다:

  • 'statistics.txt': 실험 통계(총 테스트 수, 학습 시간 등);
  • 'nondet.log': 발견된 비결정적 동작 로그. 모든 것이 정상이면 비어 있어야 합니다;
  • 'learnedModel.dot': 성공적인 종료 시 생성된 학습된 모델(또는 최종 가설);
  • 'hyp[0-9]+.dot': 중간 가설;
  • 'error.msg': 학습을 중단시키는 문제 발생 시 생성됩니다. 학습 실험이 시간 초과된 경우에도 생성됩니다.

모델 시각화

.dot 학습 모델은 graphviz 라이브러리를 사용하여 .pdf로 변환하여 시각화할 수 있습니다:

root@kitploit:~
> dot -Tpdf learnedModel.dot  > learnedModel.pdf

안타깝게도 모델 크기가 커짐에 따라 이 방법으로 생성된 .pdf는 읽기가 점점 어려워집니다. 따라서 'trim_model.sh'에서 액세스하는 가지치기 스크립트를 개발/사용/가져왔습니다. 스크립트는 다음을 실행하여 사용법 정보를 제공합니다:

root@kitploit:~
> bash trim_model.sh

가장 기본적인 형태로 스크립트를 사용하는 것을 권장합니다:

root@kitploit:~
> bash trim_model.sh learnedModel.dot 

스크립트는 다음을 수행합니다:

  1. 상태와 입출력 레이블을 간결화합니다
  2. 핸드셰이크 완료로 이어지는 경로에 색상을 지정합니다
    • 사용자는 해당 핸드셰이크가 구성에 비추어 합법적인지 확인해야 합니다
  3. 동일한 상태를 연결하고 동일한 출력을 가지지만 다른 입력을 가진 3개 이상의 전환 그룹을 'Other' 입력으로 병합합니다
  4. (선택 사항) 핸드셰이크를 더 이상 완료할 수 없는 상태를 제거합니다(JSSE에 특히 유용)
  5. (선택 사항) 동일한 상태를 연결하는 전환을 단일 에지에 배치합니다

(5)는 'experiments\scripts'에 있는 사용자 정의 mypydot Python 3 라이브러리를 설치해야 합니다. 다른 모든 단계는 기본 'sed'와 dot-trimmer Java 라이브러리를 사용합니다. 이 라이브러리의 .jar 파일이 'experiments\scripts'에 포함되어 있습니다.

일반적인 dtls-fuzzer 둘러보기

도움말 페이지 표시

다음을 실행합니다:

root@kitploit:~
> java -jar target/dtls-fuzzer.jar -help

DTLS 구현 학습

옵션의 수가 부담스러울 수 있습니다. DTLS 서버 구현을 학습하려면 몇 가지 옵션만 지정하면 됩니다. 즉, "-connect ip_address:port"는 실행 중인 DTLS 서버가 수신 대기하는 주소입니다. 알파벳을 포함한 다른 모든 옵션은 기본값으로 설정됩니다.

단일 학습 실행

예를 들어 포트 20000에서 수신 대기하는 로컬 서버 구현에 대한 학습을 실행하려면 다음을 실행합니다:

root@kitploit:~
> java -jar target/dtls-fuzzer.jar -connect localhost:20000

이러한 유형의 학습에는 문제가 있을 가능성이 높습니다. 학습하려면 각 테스트 후에 서버를 재설정할 수 있어야 합니다. 일부 서버는 한 테스트에서 다른 테스트로 상태를 전달합니다. 이로 인해 학습 중 비결정론이 발생할 수 있으므로, 제공된 명령을 사용하여 각 테스트마다 새 서버 스레드를 시작하는 것이 더 나은 접근 방식입니다. 테스트가 실행되면 서버 스레드가 종료되어 적절한 재설정이 보장됩니다. OpenSSL의 예:

root@kitploit:~
> java -jar target/dtls-fuzzer.jar -connect localhost:20000 -cmd "openssl s_server -accept 20000 -dtls1_2"

매개변수가 너무 많으면 명령이 매우 길어질 수 있습니다. dtls-fuzzer는 JCommander를 사용하여 인수를 구문 분석하며, 파일에서 매개변수를 읽을 수도 있습니다. 인수 예제는 'experiments/args'를 참조하십시오. dtls-fuzzer에 인수 파일을 제공하려면 "@"를 앞에 붙여 매개변수로 제공합니다. 명령에 다른 명시적 인수를 추가할 수도 있습니다(인수 파일의 값을 덮어씁니다).

root@kitploit:~
> java -jar target/dtls-fuzzer.jar @arg_file ...덮어쓰는 매개변수...

배치 학습

일괄 학습 실행을 시작하려면 'experiments/scripts'에 있는 'launcher.py' 스크립트를 사용할 수 있습니다. 인수 파일이 있는 디렉터리가 제공되면 도구는 각 인수 파일에 대한 학습 프로세스를 시작합니다.

root@kitploit:~
> python3 experiments/scripts/launcher.py --jar target/dtls-fuzzer.jar --args args_folder

테스트 스위트 실행

학습 실험을 실행하기 전에 인수, 특히 타이밍 매개변수가 올바르게 설정되었는지 확인하는 것이 도움이 됩니다. 이를 위해 dtls-fuzzerr는 SUT에서 사용자 정의 테스트 스위트(테스트 모음)를 실행하고 출력 요약을 제공할 수 있습니다. 이 기능은 실패한 학습 실험을 진단할 때, 즉 무엇이 잘못되었는지 찾는 데에도 사용할 수 있습니다.

기본 알파벳을 사용하여 서버에서 테스트 스위트를 실행하려면 다음을 실행할 수 있습니다:

root@kitploit:~
> java -jar target/dtls-fuzzer.jar -connect localhost:20000 -test test_file

테스트 파일의 예는 'examples/tests'를 참조하십시오. 테스트 파일은 개행으로 구분된 입력 목록으로 구성됩니다. 테스트는 빈 새 줄로 구분됩니다. 각 테스트의 끝은 파일의 끝이거나 빈 새 줄입니다. "#"은 주석 처리된 줄을 나타냅니다.

모델/명세가 있는 경우, 명세의 출력과 비교하여 테스트 스위트를 실행할 수도 있습니다.

root@kitploit:~
> java -jar target/dtls-fuzzer.jar -connect localhost:20000 -test test_file -specification model

테스트 실행 횟수는 기본값이 1인 '-times' 매개변수로 구성할 수 있습니다. 이를 높게 설정하면 각 테스트의 출력을 비교하여 학습 구성의 비결정론을 감지하는 데 도움이 됩니다.

root@kitploit:~
> java -jar target/dtls-fuzzer.jar -connect localhost:20000 -test test_file -times 10

마지막으로, 학습 실험에 대한 인수 파일이 있는 경우 필요한 테스트 인수를 추가하기만 하면 관련 SUT에서 테스트를 실행할 수 있습니다:

root@kitploit:~
> java -jar target/dtls-fuzzer.jar @learning_arg_file -test test_file
도구 다운로드