재즈로 자바 코드를 퍼징하는 방법은 무엇입니까?
퍼징이란 무엇입니까?
최신 퍼징 솔루션은 테스트 중인 코드의 구조를 분석하고 초당 수천 개의 자동화된 테스트 사례를 생성합니다. 프로세스는 생성된 입력으로 가능한 한 많은 새 프로그램 상태에 도달하도록 설계되었습니다. 또한 fuzzer는 이러한 입력이 따르는 개별 경로를 표시하므로 소스 코드를 실행할 때 달성된 테스트 범위에 대한 자세한 피드백을 받습니다. 이러한 방식으로 fuzzer는 각 반복에서 예상 입력의 구조에 대해 더 많이 학습합니다.
퍼징의 종류
1- 덤 퍼저
2세대 Fuzzer
3- 적용 범위 안내 Fuzzer
덤 퍼저란?
Dumb fuzzer는
random input
에 대한 데이터 시도에 대한 지식 없이도 작동하며 파일 형식/네트워크 프로토콜에 대한 이해가 필요하지 않습니다. 또한 많은 시간이 걸릴 수 있습니다(행운에 따라 다름).예 Radmasa
Fuzzer 세대란?
Dumb Fuzzer와 달리 여기에서는 파일 형식/프로토콜에 대한 이해가 매우 중요합니다. 사양/형식을 기반으로 처음부터 입력을 "생성"하는 것입니다.
예 ( Peach , Sulley )
Coverage Guided Fuzzer란 무엇입니까?
Coverage guided fuzzing
는 프로그램 계측을 사용하여 코드 적용 범위를 추적하고 계측을 사용하여 프로그램 흐름을 모니터링합니다. 파일 형식에 대한 지식이 필요하지 않으며 자체 알고리즘을 사용하여 파일을 수정하고 새로운 코드 경로 범위/충돌을 확인합니다.예 ( AFL , WinAFL , HonggFuzz , LibFuzzer , Jazzer )
재저란?
오늘 우리는 Java 세계로 뛰어들어 가장 인기 있는 Java 퍼징 솔루션인 Jazzer를 확인하여 Java 프로그램에 대한 악성 입력을 자동으로 생성하는 데 사용됩니다.
도구 설정:
이제 내 VM 머신(Ubuntu 20.04)에서 쉽게 따라할 수 있도록 Jazzer 설치 프로세스를 진행하겠습니다.
Jazzer는 소스에서 빌드될 때 다음과 같은 종속성이 있습니다.
1- Bazel 4 이상 설치
2- JDK 8 이상 설치(예: OpenJDK)
3- Clang 및 LLD 9.0 이상 설치
편집 :
$ git clone https://github.com/CodeIntelligenceTesting/jazzer
$ cd jazzer
$ ./bazelisk-linux-amd64 run //:jazzer
Starting local Bazel server and connecting to it...
INFO: Analyzed target //:jazzer (79 packages loaded, 1410 targets configured).
INFO: Found 1 target...
Target //:jazzer up-to-date:
bazel-bin/jazzer
INFO: Elapsed time: 43.920s, Critical Path: 7.21s
INFO: 83 processes: 4 internal, 79 linux-sandbox.
INFO: Build completed successfully, 83 total actions
INFO: Build completed successfully, 83 total actions
driver/jazzer_driver: error while loading shared libraries: libjvm.so: cannot open shared object file: No such file or directory
오류가 있습니다.
libjvm.so: cannot open shared object file: No such file or directory
솔루션에 대해 이 오류가 있는 경우 정의해야 합니다LD_LIBRARY_PATH
.$ wget https://enos.itcollege.ee/~jpoial/allalaadimised/jdk15/jdk-15.0.2_linux-x64_bin.tar.gz
$ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/ubuntu/jdk-15.0.2/lib/server/
$ ./bazelisk-linux-amd64 run //:jazzer
INFO: Analyzed target //:jazzer (0 packages loaded, 0 targets configured).
INFO: Found 1 target...
Target //:jazzer up-to-date:
bazel-bin/jazzer
INFO: Elapsed time: 0.205s, Critical Path: 0.00s
INFO: 1 process: 1 internal.
INFO: Build completed successfully, 1 total action
INFO: Build completed successfully, 1 total action
Java HotSpot(TM) 64-Bit Server VM warning: Sharing is only supported for boot loader classes because bootstrap classpath has been appended
INFO: Loaded 8 hooks from com.code_intelligence.jazzer.sanitizers.Deserialization
INFO: Loaded 1 hooks from com.code_intelligence.jazzer.sanitizers.ReflectiveCall
Missing argument --target_class=<fuzz_target_class>
퍼징을 위한 Java lib 또는 코드를 선택하십시오(예: generex ).
1-
"com.github.mifmif:generex:1.0.2"
라이브러리를 nano maven.bzl
에 추가
load("@rules_jvm_external//:specs.bzl", "maven")
JAZZER_API_VERSION = "0.10.0"
JAZZER_API_COORDINATES = "com.code-intelligence:jazzer-api:%s" % JAZZER_API_VERSION
# **WARNING**: These Maven dependencies have known vulnerabilities and are only used to test that
# Jazzer finds these issues. DO NOT USE.
MAVEN_ARTIFACTS = [
"junit:junit:4.12",
"org.apache.commons:commons-imaging:1.0-alpha2",
"com.mikesamuel:json-sanitizer:1.2.1",
"com.google.code.gson:gson:2.8.6",
"com.fasterxml.jackson.core:jackson-core:2.12.1",
"com.fasterxml.jackson.core:jackson-databind:2.12.1",
"com.fasterxml.jackson.dataformat:jackson-dataformat-cbor:2.12.1",
"com.alibaba:fastjson:1.2.75",
"com.beust:klaxon:5.5",
"javax.validation:validation-api:2.0.1.Final",
"javax.xml.bind:jaxb-api:2.3.1",
"javax.el:javax.el-api:3.0.1-b06",
"org.hibernate:hibernate-validator:5.2.4.Final",
"com.github.mifmif:generex:1.0.2",
maven.artifact("org.apache.logging.log4j", "log4j-api", "2.14.1", testonly = True),
maven.artifact("org.apache.logging.log4j", "log4j-core", "2.14.1", testonly = True),
]
2- 이에 대한 편집
$ nano examples/BUILD.bazel
:java_fuzz_target_test(
name = "GenerexFuzzer",
srcs = [
"src/main/java/com/example/GenerexFuzzer.java",
],
target_class = "com.example.GenerexFuzzer",
deps = [
"@maven//:com_github_mifmif_generex",
],
)
3- 퍼징을 위한 Java 파일 생성
GenerexFuzzer.java
$ nano /home/jazzer/examples/src/main/java/com/example/GenerexFuzzer.java
Jazzer에 의한 퍼징을 위한 내 코드 추가
package com.example;
import com.code_intelligence.jazzer.api.FuzzedDataProvider;
import com.mifmif.common.regex.Generex;
// Found the issues.
public class GenerexFuzzer {
public static void fuzzerTestOneInput(FuzzedDataProvider data) {
try {
Generex generex = new Generex(data.consumeRemainingAsString());
generex.random();
} catch (IllegalArgumentException ignored) {
}
}
}
4- 이제 퍼징을 시작합니다.
$ ./bazelisk-linux-amd64 run //examples:GenerexFuzzer
INFO: Analyzed target //examples:GenerexFuzzer (0 packages loaded, 0 targets configured).
INFO: Found 1 target...
Target //examples:GenerexFuzzer up-to-date:
bazel-bin/examples/GenerexFuzzer
INFO: Elapsed time: 0.121s, Critical Path: 0.00s
INFO: 1 process: 1 internal.
INFO: Build completed successfully, 1 total action
INFO: Build completed successfully, 1 total action
exec ${PAGER:-/usr/bin/less} "$0" || exit 1
Executing tests from //examples:GenerexFuzzer
-----------------------------------------------------------------------------
Java HotSpot(TM) 64-Bit Server VM warning: Sharing is only supported for boot loader classes because bootstrap classpath has been appended
INFO: Loaded 8 hooks from com.code_intelligence.jazzer.sanitizers.Deserialization
INFO: Loaded 1 hooks from com.code_intelligence.jazzer.sanitizers.ReflectiveCall
INFO: Loaded 8649 no-throw method signatures
INFO: Instrumented com.example.GenerexFuzzer (took 42 ms, size +37%)
INFO: libFuzzer ignores flags that start with '--'
INFO: Running with entropic power schedule (0xFF, 100).
INFO: Seed: 2735196724
INFO: Loaded 1 modules (512 inline 8-bit counters): 512 [0x7fcec02c9010, 0x7fcec02c9210),
INFO: Loaded 1 PC tables (512 PCs): 512 [0x7fce8abfe010,0x7fce8ac00010),
INFO: -max_len is not provided; libFuzzer will not generate inputs larger than 4096 bytes
INFO: Instrumented com.mifmif.common.regex.Generex (took 16 ms, size +49%)
INFO: Instrumented com.mifmif.common.regex.util.Iterable (took 1 ms, size +0%)
INFO: Instrumented com.mifmif.common.regex.util.Iterator (took 0 ms, size +0%)
INFO: New number of inline 8-bit counters: 1024
INFO: Instrumented dk.brics.automaton.RegExp (took 17 ms, size +104%)
INFO: Instrumented dk.brics.automaton.RegExp$Kind (took 2 ms, size +42%)
INFO: Instrumented dk.brics.automaton.RegExp$1 (took 1 ms, size +102%)
INFO: Instrumented dk.brics.automaton.BasicAutomata (took 11 ms, size +130%)
INFO: New number of inline 8-bit counters: 2048
INFO: Instrumented dk.brics.automaton.Automaton (took 9 ms, size +82%)
INFO: Instrumented dk.brics.automaton.State (took 2 ms, size +55%)
INFO: Instrumented dk.brics.automaton.Transition (took 2 ms, size +74%)
INFO: Instrumented dk.brics.automaton.TransitionComparator (took 1 ms, size +97%)
INFO: A corpus is not provided, starting from an empty corpus
#2 INITED cov: 71 ft: 71 corp: 1/1b exec/s: 0 rss: 114Mb
#3 NEW cov: 176 ft: 191 corp: 2/3b lim: 4 exec/s: 0 rss: 114Mb L: 2/2 MS: 1 CopyPart-
#5 NEW cov: 178 ft: 286 corp: 3/6b lim: 4 exec/s: 0 rss: 114Mb L: 3/3 MS: 2 ChangeByte-InsertByte-
#10 NEW cov: 178 ft: 378 corp: 4/10b lim: 4 exec/s: 0 rss: 114Mb L: 4/4 MS: 5 InsertByte-ChangeBit-ChangeBinInt-InsertByte-CopyPart-
#21 NEW cov: 181 ft: 384 corp: 5/13b lim: 4 exec/s: 0 rss: 114Mb L: 3/4 MS: 1 ChangeBit-
#6375 NEW cov: 975 ft: 4248 corp: 243/1071b lim: 8 exec/s: 6375 rss: 154Mb L: 7/8 MS: 1 CrossOver-
#6391 NEW cov: 975 ft: 4250 corp: 244/1079b lim: 8 exec/s: 6391 rss: 154Mb L: 8/8 MS: 1 CopyPart-
== Java Exception: com.code_intelligence.jazzer.api.FuzzerSecurityIssueLow: Stack overflow (truncated to likely cause)
at com.mifmif.common.regex.Generex.prepareRandom(Generex.java:366)
Caused by: java.lang.StackOverflowError
at java.base/java.util.TimSort.countRunAndMakeAscending(TimSort.java:355)
at java.base/java.util.TimSort.sort(TimSort.java:220)
at java.base/java.util.Arrays.sort(Arrays.java:1232)
at dk.brics.automaton.State.getSortedTransitionArray(Unknown Source)
at dk.brics.automaton.State.getSortedTransitions(Unknown Source)
at com.mifmif.common.regex.Generex.prepareRandom(Generex.java:340)
at com.mifmif.common.regex.Generex.prepareRandom(Generex.java:366)
at com.mifmif.common.regex.Generex.prepareRandom(Generex.java:366)
at com.mifmif.common.regex.Generex.prepareRandom(Generex.java:366)
at com.mifmif.common.regex.Generex.prepareRandom(Generex.java:366)
at com.mifmif.common.regex.Generex.prepareRandom(Generex.java:366)
at com.mifmif.common.regex.Generex.prepareRandom(Generex.java:366)
LibFuzzer 충돌 입력:
MS: 2 ChangeBit-CMP- DE: "\x00\x00\x00\x05"-; base unit: b5d43fd7e3064418d903c4d27d2238f390e23c62
0x7e,0x2f,0x7d,0x0,0x0,0x0,0x5,
~/}\x00\x00\x00\x05
artifact_prefix='/root/.cache/bazel/_bazel_root/c82b104c68f93e19e57160becd18f8f0/execroot/jazzer/bazel-out/k8-opt/testlogs/examples/GenerexFuzzer/test.outputs/'; Test unit written to /root/.cache/bazel/_bazel_root/c82b104c68f93e19e57160becd18f8f0/execroot/jazzer/bazel-out/k8-opt/testlogs/examples/GenerexFuzzer/test.outputs/crash-101076ac3391a62fb4622589093c2543063de037
Base64: fi99AAAABQ==
축하합니다!
Stack overflow
취약점을 발견했습니다.즐기시기 바랍니다,
고마워, 라민
Reference
이 문제에 관하여(재즈로 자바 코드를 퍼징하는 방법은 무엇입니까?), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/raminfp/how-to-fuzz-java-code-with-jazzar-2kgi텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)