--- license: mit --- # SD-CPP-001: stable-diffusion.cpp GGUFReader Process Crash PoC **Security Research — Responsible Disclosure** ## Vulnerability Three input validation failures in `src/gguf_reader.hpp` (GGUFReader class) of [stable-diffusion.cpp](https://github.com/leejet/stable-diffusion.cpp) allow an attacker to crash any process loading a malformed GGUF file. | Bug | Line | Root Cause | Impact | |-----|------|-----------|--------| | 1 | 62 | `std::string key(key_len, '\0')` with no bound check | `std::length_error` uncaught -> `std::terminate()` | | 2 | 140 | `info.name.resize(name_len)` with no bound check | `std::bad_alloc` not caught by `catch(runtime_error)` | | 3 | 155 | `shape[3] *= shape[4]` signed int64 multiply | Undefined behavior (signed overflow) | **Commit**: d6dd6d7b555c233bb9bc9f20b4751eb8c9269743 ## Reproduction ```bash python3 poc_sd_cpp_gguf_reader.py # Generates 3 PoC files (32-92 bytes each) # Build stable-diffusion.cpp from source git clone https://github.com/leejet/stable-diffusion.cpp cd stable-diffusion.cpp && mkdir build && cd build cmake .. && cmake --build . --config Debug # Trigger crash ./bin/sd --model /path/to/poc_metadata_oob.gguf -p "test" -o /dev/null # Expected: "terminate called after throwing an instance of 'std::length_error'" ``` ## Trigger Condition GGUFReader is a fallback parser invoked when `gguf_init_from_file()` fails (model.cpp:419). A GGUF file with version=999 triggers this fallback reliably. The fallback parser performs zero validation on length fields read from the file. ## Suggested Fix Add upper-bound validation before string allocations and widen the catch block: ```cpp // Line 62: bound key_len if (key_len > 65536) { LOG_ERROR("key_len too large"); return false; } // Line 214: catch all exceptions, not just runtime_error } catch (const std::exception& e) { ``` ## Reporter Viridis Security (Justin Hart) — viridisnorthllc@gmail.com