재즈로 자바 코드를 퍼징하는 방법은 무엇입니까?

퍼징이란 무엇입니까?



최신 퍼징 솔루션은 테스트 중인 코드의 구조를 분석하고 초당 수천 개의 자동화된 테스트 사례를 생성합니다. 프로세스는 생성된 입력으로 가능한 한 많은 새 프로그램 상태에 도달하도록 설계되었습니다. 또한 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 취약점을 발견했습니다.

즐기시기 바랍니다,
고마워, 라민

좋은 웹페이지 즐겨찾기