| Hasnain Lakhani | c51ab5f | 2025-08-25 10:24:14 -0700 | [diff] [blame] | 1 | # Fuzzing Apache Thrift |
| 2 | |
| 3 | This document describes the fuzzing infrastructure and goals for Apache Thrift. |
| 4 | |
| 5 | We use [OSS-Fuzz](https://github.com/google/oss-fuzz) as our primary fuzzing platform to continuously test and improve the robustness of Thrift's hand-written and generated code. |
| 6 | |
| 7 | ## Goals |
| 8 | |
| 9 | With fuzzing, we are focusing on testing the following key aspects across supported languages: |
| 10 | |
| 11 | 1. Security - Testing how the generated code handles malformed/malicious input |
| 12 | 2. Serialization round-trip correctness - Ensuring that data stays identical if we serialize then deserialize it. |
| 13 | |
| 14 | ## Supported Languages |
| 15 | |
| 16 | We currently maintain fuzzers for the following languages: |
| 17 | |
| 18 | - Go (needs improvement) |
| Hasnain Lakhani | cf41a1c | 2025-08-25 10:55:35 -0700 | [diff] [blame^] | 19 | - c_glib (partially supported, needs round-trip support) |
| Hasnain Lakhani | c51ab5f | 2025-08-25 10:24:14 -0700 | [diff] [blame] | 20 | |
| 21 | We are working on adding fuzzers for the following languages: |
| 22 | |
| Hasnain Lakhani | c51ab5f | 2025-08-25 10:24:14 -0700 | [diff] [blame] | 23 | - C++ |
| 24 | - Rust |
| 25 | - Swift |
| 26 | - Python |
| 27 | - JavaScript |
| 28 | - Java/JVM (and other JVM languages) |
| 29 | - netstd |
| 30 | |
| 31 | ## Fuzzer Types |
| 32 | |
| 33 | For each supported language, we implement at minimum: |
| 34 | |
| 35 | 1. **Deserializer Fuzzer** |
| 36 | - Takes raw fuzzer input and attempts to deserialize it into Thrift structures |
| 37 | - Tests handling of malformed/unexpected input |
| 38 | - Implemented for each supported protocol (Binary, Compact, JSON where available) |
| 39 | |
| 40 | 2. **Round-Trip Fuzzer** |
| 41 | - Deserializes fuzzer input, then re-serializes and verifies it matches |
| 42 | - Ensures data integrity through serialization cycles |
| 43 | - Tests both serialization and deserialization code paths |
| 44 | |
| 45 | ## Building and Running the Fuzzers |
| 46 | |
| 47 | Each language has its own fuzzers under the `lib/<language>/test/fuzz` directory. |
| 48 | The fuzzers are built when building the language-specific code (using the normal build system), as regular binaries (without fuzzing support enabled), to ensure that there are no build breakages. |
| 49 | |
| 50 | To ensure fuzzing can find issues as soon as possible, we will enable fuzzing support in CI once the fuzzers are stable. |
| 51 | |
| 52 | Currently the only convenient, formally supported build with fuzzing support enabled is the via the oss-fuzz workflow. For languages where local fuzzing is easy to do, documentation is provided along with the fuzzers. |
| 53 | |
| 54 | ## OSS-Fuzz Integration |
| 55 | |
| 56 | Our fuzzers run continuously on OSS-Fuzz. To view build status: |
| 57 | |
| 58 | 1. Visit the [OSS-Fuzz Status Dashboard](https://oss-fuzz-build-logs.storage.googleapis.com/index.html) |
| 59 | 2. Look for the "thrift" project |
| 60 | |
| 61 | The source code for the oss-fuzz build is [available upstream](https://github.com/google/oss-fuzz/tree/master/projects/thrift). |
| 62 | |
| 63 | We aim to improve the fuzzers through viewing the fuzz introspector reports, available [here](https://introspector.oss-fuzz.com/project-profile?project=thrift). |
| 64 | |
| 65 | *NB: The oss-fuzz integration will be significantly updated once all the language specific fuzzers are committed here. |
| 66 | |
| 67 | ## Contributing to the fuzzers |
| 68 | |
| 69 | To contribute to the fuzzing effort - please look at https://issues.apache.org/jira/browse/THRIFT-5855 for the latest status and planned work. Once the ticket is closed, |
| 70 | we would still appreciate contributions that: |
| 71 | |
| 72 | 1. Add new fuzzers for unsupported languages |
| 73 | 2. Improve existing fuzzers |
| 74 | 3. Add test cases to corpus |
| 75 | |
| 76 | If you do add or change a fuzzer, please remember to make corresponding changes to the oss-fuzz build script in case they are needed. |
| 77 | |
| 78 | Please see CONTRIBUTING.md for general contribution guidelines. |