# Apache Axis2/Java Fuzz Testing Module

Comprehensive fuzz testing for Axis2/Java parsers, mirroring the [Axis2/C OSS-Fuzz approach](https://github.com/apache/axis-axis2-c-core/tree/master/fuzz).

## Overview

This module provides Jazzer-compatible fuzz targets for security testing:

| Fuzzer | Component | Attack Vectors |
|--------|-----------|----------------|
| `XmlParserFuzzer` | AXIOM/StAX | XXE, XML bombs, buffer overflows |
| `JsonParserFuzzer` | Gson | Deep nesting, integer overflow, malformed JSON |
| `HttpHeaderFuzzer` | HTTP headers | CRLF injection, header parsing |
| `UrlParserFuzzer` | URL/URI parsing | SSRF, path traversal, malformed URLs |

## Running Fuzzers Locally

### Prerequisites

```bash
# Install Jazzer
# Option 1: Download from GitHub releases
wget https://github.com/CodeIntelligenceTesting/jazzer/releases/download/v0.22.1/jazzer-linux.tar.gz
tar xzf jazzer-linux.tar.gz

# Option 2: Use Docker
docker pull cifuzz/jazzer
```

### Build the Fuzz Module

```bash
cd /path/to/axis-axis2-java-core

# Build all modules first
mvn install -DskipTests

# Build the fuzz module
cd modules/fuzz
mvn package
```

### Run Individual Fuzzers

```bash
# XML Parser Fuzzer
./jazzer --cp=target/axis2-fuzz-2.0.1-SNAPSHOT.jar \
    --target_class=org.apache.axis2.fuzz.XmlParserFuzzer \
    --instrumentation_includes=org.apache.axiom.** \
    -max_total_time=300

# JSON Parser Fuzzer
./jazzer --cp=target/axis2-fuzz-2.0.1-SNAPSHOT.jar \
    --target_class=org.apache.axis2.fuzz.JsonParserFuzzer \
    --instrumentation_includes=com.google.gson.** \
    -max_total_time=300

# HTTP Header Fuzzer
./jazzer --cp=target/axis2-fuzz-2.0.1-SNAPSHOT.jar \
    --target_class=org.apache.axis2.fuzz.HttpHeaderFuzzer \
    --instrumentation_includes=org.apache.axis2.** \
    -max_total_time=300

# URL Parser Fuzzer
./jazzer --cp=target/axis2-fuzz-2.0.1-SNAPSHOT.jar \
    --target_class=org.apache.axis2.fuzz.UrlParserFuzzer \
    --instrumentation_includes=org.apache.axis2.** \
    -max_total_time=300
```

### Run with JUnit (Regression Testing)

The fuzzers can also be run as JUnit tests for CI integration:

```bash
mvn test -Djazzer.fuzz=true
```

## Understanding Output

### Successful Run
```
INFO: Seed: 1234567890
#1000000 DONE cov: 1234 ft: 5678 corp: 100/10Kb exec/s: 50000
```

### Crash Found
```
== Java Exception: java.lang.OutOfMemoryError
    at org.apache.axiom.om.impl.builder.StAXOMBuilder.<init>
Crash file: crash-abc123def456
```

The crash file contains the input that triggered the bug. Reproduce with:
```bash
./jazzer --cp=target/axis2-fuzz-2.0.1-SNAPSHOT.jar \
    --target_class=org.apache.axis2.fuzz.XmlParserFuzzer \
    crash-abc123def456
```

## Comparison with Axis2/C Fuzzers

| Axis2/C | Axis2/Java | Component |
|---------|------------|-----------|
| `fuzz_xml_parser.c` | `XmlParserFuzzer.java` | XML/AXIOM |
| `fuzz_json_parser.c` | `JsonParserFuzzer.java` | JSON |
| `fuzz_json_reader.c` | (integrated in JsonParserFuzzer) | JSON→XML |
| `fuzz_http_header.c` | `HttpHeaderFuzzer.java` | HTTP headers |
| `fuzz_url_parser.c` | `UrlParserFuzzer.java` | URL parsing |

## Security Vulnerability Reporting

If fuzzing finds a security vulnerability:

1. **Do NOT** open a public GitHub issue
2. Report to Apache Security Team: security@apache.org
3. Include:
   - Crash file (input that triggers the bug)
   - Stack trace
   - Axis2/Java version

## Related Documentation

- [Axis2/C OSS-Fuzz Integration](https://github.com/apache/axis-axis2-c-core/blob/master/docs/OSS-FUZZ.md)
- [Jazzer Documentation](https://github.com/CodeIntelligenceTesting/jazzer)
- [OSS-Fuzz Documentation](https://google.github.io/oss-fuzz/)
