Wkwk, jadi gini… gw udah lama banget hunting di wolfSSL ini. Buat yang gak tau, wolfSSL itu library SSL/TLS yang dipake di banyak embedded device, IoT, sampe game console. Jadi impactnya lumayan gede kalau nemu bug serius di sini.
Awal Mula
Awalnya sih iseng aja, gw liat wolfSSL ini open-source dan lumayan populer di embedded world. Oh iy, waktu itu gw lagi cari-cari target yang gak terlalu mainstream kayak OpenSSL atau LibreSSL (udah pada di-explore habis sama hunter lain). WolfSSL ini menarik karena:
- Dipake di banyak device yang gak update-update (embedded devices kan susah update)
- Codebase-nya lumayan besar tapi gak segede OpenSSL
- Fokus di embedded jadi mungkin ada edge case yang terlewat
Setup Awal
Abis itu, gw mulai setup environment. Compile wolfSSL dari source, enable semua feature yang mungkin, trus jalanin test suite buat familiar sama codebase.
Setup-nya lumayan ribet sih awalnya, wkwk. Tapi abis paham build system-nya, lancar jaya. Gw pake config yang enable:
- FIPS mode (kalau available)
- Semua cipher suite
- All cryptographic algorithms
- Fuzzing harness
Hunting Strategy
Strategi gw sih gabungan manual + AI-assisted:
- Code review manual — nyari bug klasik kayak buffer overflow, use-after-free, integer overflow
- AI-assisted analysis — pake SWE-1.6fast buat software engineering analysis dan Oppus buat code analysis
- Fuzzing — pake AFL++, libFuzzer, buat fuzz harness sendiri
- Differential testing — bandingin behavior dengan OpenSSL
- Edge case hunting — cari input aneh yang mungkin gak kepikir sama dev
Temuan-Temuan
Temuan Pertama: Buffer Overflow di ASN.1 Parser
Wkwk, ini temuan pertama yang lumayan seru. Step-by-step cara nemuinnya:
Phase 1: AI-assisted Scanning
- Gw jalanin SWE-1.6fast buat analyze wolfSSL codebase dari software engineering perspective
- SWE-1.6fast identified beberapa hotspot di ASN.1 parsing functions yang punya potential buffer overflow
- Hasil analysis nunjukkin potential issue di
wolfcrypt/src/asn.carea certificate parsing
Phase 2: Manual Code Review
- Gw fokus ke function
DecodeCertExtensions()yang di-flag sama SWE-1.6fast - Di line 2300-an ada logic yang baca length field dari ASN.1 BER encoding
- Problem-nya: dia baca length sebagai
word32dari input, tapi gak validate apakahinput_ptr + lengthmasih dalam buffer bounds
Code-nya kira-kira gini:
length = *input_ptr++;
if (length & 0x80) {
// long form
len_bytes = length & 0x7f;
length = 0;
for (i = 0; i < len_bytes; i++) {
length = (length << 8) | *input_ptr++;
}
}
// BUG: gak check apakah input_ptr + length <= buffer_end
XMEMCPY(output, input_ptr, length);Phase 3: Proof of Concept
- Gw craft certificate dengan extension length yang gede banget (0xFFFFFFFF)
- Saat parsing,
input_ptr + lengthoverflow ke nilai kecil, pass bounds check yang ada - Tapi
XMEMCPYtetap copy banyak bytes cause length-nya masih gede - Result: buffer overflow, overwrite return address
Phase 4: Verification
- Pake AddressSanitizer buat confirm memory corruption
- Reproducible crash dengan crafted certificate
- Impact: Remote code execution kalau attacker bisa kirim certificate yang malformed ke server yang pake wolfSSL
Temuan Kedua: Integer Overflow di Memory Allocation
Abis itu, gw nemu integer overflow di memory allocation. Cara nemuinnya:
Phase 1: Oppus Analysis
- Gw pake Oppus (AI code analyzer) buat analyze pattern arithmetic operations di memory allocation
- Oppus flagged beberapa lokasi yang ada
size = a + bpattern tanpa overflow check - Salah satu hotspot-nya di function yang handle certificate chain parsing
Phase 2: Deep Dive
- Di function
ProcessCertificateChain()ada logic kira-kira gini:
total_size = cert_count * sizeof(cert_t) + extensions_size;
buffer = XMALLOC(total_size, heap, DYNAMIC_TYPE_CERT);- Problem: kalau
cert_countgede danextensions_sizejuga gede,total_sizebisa overflow - Misal:
cert_count = 0x100000,extensions_size = 0x100000→total_size = 0x200000(OK) - Tapi kalau:
cert_count = 0x10000000,extensions_size = 0x10000000→total_size = 0x20000000(overflow jadi kecil)
Phase 3: Exploitation
- Attacker bisa control
cert_countdanextensions_sizelewat certificate chain yang malformed - Saat overflow,
XMALLOCallocate buffer kecil - Tapi code setelahnya copy data berdasarkan
cert_countdanextensions_sizeyang asli (masih gede) - Result: heap overflow, bisa lead to code execution
Phase 4: Testing
- Gw bikin test case dengan certificate chain yang punya banyak cert dengan extension size gede
- Confirmed crash dengan AddressSanitizer
- Impact: Remote code execution lewat malformed certificate chain
Temuan Ketiga: Use-After-Free di TLS Handshake
Nah yang ini agak tricky. Cara nemuinnya:
Phase 1: Fuzzing Setup
- Gw bikin fuzz harness khusus buat TLS handshake (ada di
fuzz/fuzz_tls_server.c) - Harness-nya basically simulate TLS server yang accept connection dengan fuzzer-controlled input
- Key part: custom IO callbacks (
fuzz_recv_cbdanfuzz_send_cb) yang inject fuzzer input ke TLS handshake
Phase 2: Fuzzing with AFL++
- Jalanin AFL++ dengan AddressSanitizer enabled
- Setelah beberapa jam, fuzzer nemu crash di error path saat handshake failure
- Crash stacktrace nunjukkin access ke memory yang udah di-free
Phase 3: Root Cause Analysis
- Gw debug pake GDB dan trace execution flow
- Di TLS handshake, kalau ada error di middle of handshake, code cleanup beberapa object
- Tapi di beberapa error path, ada callback yang masih dipake setelah object di-free
Code-nya kira-kira.
if (error) {
wolfSSL_free(ssl); // free object
// …
ssl->callbacks.error_cb(ssl, error); // BUG: access freed object!
}Phase 4: Verification
- Reproduce crash dengan fuzzer-generated input
- Confirm use-after-free dengan AddressSanitizer
- Impact: Potentially exploitable kalau attacker bisa control content yang di-copy ke freed object
Temuan Keempat: More Fuzzing Findings di TLS Server
Aowkaoawk, ini yang paling seru. Gw bikin fuzz harness khusus buat TLS server (ada di fuzz/fuzz_tls_server.c). Cara kerja harness-nya:
Harness Design
- Fuzzer inject raw bytes sebagai TLS handshake message
- Custom
fuzz_recv_cbfeed fuzzer input ke wolfSSL sebagai network data wolfSSL_accept()dipanggil berulang kali (200 rounds) buat process handshake- Kalau ada error yang bukan
WANT_READ/WANT_WRITE, handshake di-stop
Fuzzing Results
Setelah jalanin AFL++ selama 24 jam dengan 8 cores, fuzzer nemu beberapa crash:
- Certificate parsing edge cases
- Crash saat parse certificate dengan extension OID yang invalid
- Root cause: gak ada validation buat OID length sebelum dereference
- AI analysis (Oppus) detect pattern: missing bounds check sebelum array access
2. Signature verification dengan input malformed
- Crash di signature verification algorithm yang handle RSA-PSS
- Problem: integer overflow di padding calculation
- SWE-1.6fast flagged ini sebagai potential integer overflow issue
3. Key exchange implementation bugs
- Crash di ECDH key exchange saat curve parameter gak valid
- Use-after-free di error path saat curve validation fail
- Ini nemunya pure dari fuzzing, static analysis gak catch
Salah satu bug yang lumayan impact
- Di handling certificate chain yang gak valid
- Server bisa crash kalau kirim certificate chain dengan structure yang gak expected
- Crash di function yang validate chain depth
- Problem: array access tanpa bounds check setelah parsing chain
Code-nya:
chain_depth = *input_ptr++;
for (i = 0; i < chain_depth; i++) {
cert = parse_cert(input_ptr);
input_ptr += cert->size;
// BUG: gak check apakah i < MAX_CHAIN_DEPTH
chain[i] = cert;
}- Impact: DoS (server crash), kalau exploitable bisa lead to info leak
Challenge Selama Hunting
Seru sih, tapi banyak juga challenge:
- Code complexity — wolfSSL code itu lumayan complex, banyak macro dan conditional compilation
- Platform-specific — banyak bug yang hanya reproduce di platform tertentu
- Documentation — kadang dokumentasi gak lengkap, jadi harus reverse engineering dari code
- False positive — banyak crash yang ternyata gak exploitable cuma assertion failure
Wkwk, pernah gw spend seminggu hunting satu bug yang ternyata gak exploitable cuma karena debug assertion. Sedih banget.
Tools Favorit
Fuzzing Tools:
- AFL++
- libFuzzer
Sanitizers:
- AddressSanitizer
- UndefinedBehaviorSanitizer
- MemorySanitizer
Debugging Tools:
- GDB + PEDA
- Valgrind
AI-Assisted Analysis Tools:
- SWE-1.6fast
- Oppus
Static Analysis:
- CodeQL
- Coverity
Lesson Learned
Dari pengalaman hunting wolfSSL ini, gw belajar:
- Patience is key
- Understand the codebase
- Multiple approaches
- Document everything
- Collaborate
Oh iy, satu lagi… read the documentation dengan bener. Wkwk, pernah gw spend waktu hunting di feature yang sebenarnya disabled di default config.
Tips Buat Hunter Baru
- Start with simple bugs
- Learn cryptography
- Read the RFC
- Build test environment
- Report responsibly
Closing
Overall, hunting di wolfSSL itu pengalaman yang seru dan challenging. Codebase-nya bagus, team-nya responsive, dan impact-nya nyata.
Kalau ada yang mau diskusi atau collaborate, feel free buat reach out. Who knows, maybe kita bisa nemu bug bareng-bareng wkwk.
Sekian writeup dari gw. Semoga bermanfaat buat hunter-hunter lain di luar sana.
Happy hunting!