-
Notifications
You must be signed in to change notification settings - Fork 146
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
junit: Record parameterized test arguments as seeds
The seeds are serialized to files in a temporary directory that is passed to libFuzzer as an additional seed directory.
- Loading branch information
Showing
8 changed files
with
278 additions
and
4 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
66 changes: 66 additions & 0 deletions
66
examples/junit/src/test/java/com/example/JavaBinarySeedFuzzTest.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,66 @@ | ||
/* | ||
* Copyright 2023 Code Intelligence GmbH | ||
* | ||
* Licensed under the Apache License, Version 2.0 (the "License"); | ||
* you may not use this file except in compliance with the License. | ||
* You may obtain a copy of the License at | ||
* | ||
* http://www.apache.org/licenses/LICENSE-2.0 | ||
* | ||
* Unless required by applicable law or agreed to in writing, software | ||
* distributed under the License is distributed on an "AS IS" BASIS, | ||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
* See the License for the specific language governing permissions and | ||
* limitations under the License. | ||
*/ | ||
|
||
package com.example; | ||
|
||
import static java.nio.charset.StandardCharsets.UTF_8; | ||
import static org.junit.jupiter.api.Assertions.assertEquals; | ||
import static org.junit.jupiter.api.Assertions.assertTrue; | ||
import static org.junit.jupiter.api.Assumptions.assumeTrue; | ||
|
||
import com.code_intelligence.jazzer.junit.FuzzTest; | ||
import java.security.MessageDigest; | ||
import java.security.NoSuchAlgorithmException; | ||
import java.util.Base64; | ||
import org.junit.jupiter.params.converter.ArgumentConversionException; | ||
import org.junit.jupiter.params.converter.ConvertWith; | ||
import org.junit.jupiter.params.converter.SimpleArgumentConverter; | ||
import org.junit.jupiter.params.provider.ValueSource; | ||
|
||
class JavaBinarySeedFuzzTest { | ||
// Generated via: | ||
// printf 'tH15_1S-4_53Cr3T.fl4G' | openssl dgst -binary -sha256 | openssl base64 -A | ||
// Luckily the fuzzer can't read comments ;-) | ||
private static final byte[] FLAG_SHA256 = | ||
Base64.getDecoder().decode("q0vPdz5oeJIW3k2U4VJ+aWDufzzZbKAcevc9cNoUTSM="); | ||
|
||
static class Utf8BytesConverter extends SimpleArgumentConverter { | ||
@Override | ||
protected Object convert(Object source, Class<?> targetType) | ||
throws ArgumentConversionException { | ||
assertEquals(byte[].class, targetType); | ||
assertTrue(source instanceof byte[] || source instanceof String); | ||
if (source instanceof byte[]) { | ||
return source; | ||
} | ||
return ((String) source).getBytes(UTF_8); | ||
} | ||
} | ||
|
||
@ValueSource(strings = {"red herring", "tH15_1S-4_53Cr3T.fl4Ga"}) | ||
@FuzzTest | ||
void fuzzTheFlag(@ConvertWith(Utf8BytesConverter.class) byte[] bytes) | ||
throws NoSuchAlgorithmException { | ||
assumeTrue(bytes.length > 0); | ||
MessageDigest digest = MessageDigest.getInstance("SHA-256"); | ||
digest.update(bytes, 0, bytes.length - 1); | ||
byte[] hash = digest.digest(); | ||
byte secret = bytes[bytes.length - 1]; | ||
if (MessageDigest.isEqual(hash, FLAG_SHA256) && secret == 's') { | ||
throw new Error("Fl4g 4nd s3cr3et f0und!"); | ||
} | ||
} | ||
} |
58 changes: 58 additions & 0 deletions
58
examples/junit/src/test/java/com/example/JavaSeedFuzzTest.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,58 @@ | ||
/* | ||
* Copyright 2023 Code Intelligence GmbH | ||
* | ||
* Licensed under the Apache License, Version 2.0 (the "License"); | ||
* you may not use this file except in compliance with the License. | ||
* You may obtain a copy of the License at | ||
* | ||
* http://www.apache.org/licenses/LICENSE-2.0 | ||
* | ||
* Unless required by applicable law or agreed to in writing, software | ||
* distributed under the License is distributed on an "AS IS" BASIS, | ||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
* See the License for the specific language governing permissions and | ||
* limitations under the License. | ||
*/ | ||
|
||
package com.example; | ||
|
||
import static java.util.Arrays.asList; | ||
import static org.junit.jupiter.params.provider.Arguments.arguments; | ||
|
||
import com.code_intelligence.jazzer.junit.FuzzTest; | ||
import com.code_intelligence.jazzer.mutation.annotation.NotNull; | ||
import java.nio.charset.StandardCharsets; | ||
import java.security.MessageDigest; | ||
import java.security.NoSuchAlgorithmException; | ||
import java.util.Base64; | ||
import java.util.List; | ||
import java.util.stream.Stream; | ||
import org.junit.jupiter.params.provider.Arguments; | ||
import org.junit.jupiter.params.provider.MethodSource; | ||
|
||
class JavaSeedFuzzTest { | ||
// Generated via: | ||
// printf 'tH15_1S-4_53Cr3T.fl4G' | openssl dgst -binary -sha256 | openssl base64 -A | ||
// Luckily the fuzzer can't read comments ;-) | ||
private static final byte[] FLAG_SHA256 = | ||
Base64.getDecoder().decode("q0vPdz5oeJIW3k2U4VJ+aWDufzzZbKAcevc9cNoUTSM="); | ||
|
||
static Stream<Arguments> fuzzTheFlag() { | ||
return Stream.of(arguments(asList("red", "herring"), 0), | ||
// This argument passes the hash check, but does not trigger the finding right away. This | ||
// is meant to verify that the seed ends up in the corpus, serving as the base for future | ||
// mutations rather than just being executed once. | ||
arguments(asList("tH15_1S", "-4_53Cr3T", ".fl4G"), 42)); | ||
} | ||
|
||
@MethodSource | ||
@FuzzTest | ||
void fuzzTheFlag(@NotNull List<@NotNull String> flagParts, int secret) | ||
throws NoSuchAlgorithmException { | ||
byte[] hash = MessageDigest.getInstance("SHA-256").digest( | ||
String.join("", flagParts).getBytes(StandardCharsets.UTF_8)); | ||
if (MessageDigest.isEqual(hash, FLAG_SHA256) && secret == 1337) { | ||
throw new Error("Fl4g 4nd s3cr3et f0und!"); | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.