| Version | Supported |
|---|---|
| 0.19.x | Yes |
| 0.18.x | Yes |
| 0.16.x | No (end-of-life) |
| 0.15.x | No (end-of-life) |
| 0.14.x | No (end-of-life) |
| 0.13.x | No (end-of-life) |
| 0.12.x | No (end-of-life) |
| 0.11.x | No (end-of-life) |
| 0.10.x | No (end-of-life) |
| 0.9.x | No (end-of-life) |
| 0.8.x | No (end-of-life) |
| 0.7.x | No (end-of-life) |
| 0.6.x | No (end-of-life) |
| 0.5.x | No (end-of-life) |
| 0.4.x | No (end-of-life) |
| 0.3.x | No (end-of-life) |
| 0.2.x | No (end-of-life) |
| 0.1.x | No (end-of-life) |
0.17.x does not appear in this table because it was never published: 0.17.0
was prepared but not released, and its changes ship in 0.18.0 (see the 0.18.0
entry in CHANGELOG.md). On crates.io, 0.18.0 follows 0.16.0.
If you discover a security vulnerability in quack-rs, please report it responsibly.
Do NOT open a public GitHub issue for security vulnerabilities.
Instead, please use GitHub's
private vulnerability reporting
feature on this repository. Alternatively, email tomf@tomtomtech.net
with the subject line [quack-rs security].
- A description of the vulnerability
- Steps to reproduce (minimal test case preferred)
- The impact (e.g., memory safety, information disclosure, denial of service)
- The affected version(s)
- Acknowledgment: Within 48 hours of report
- Assessment: Within 7 days
- Fix: Depends on severity; critical issues are prioritized
This security policy covers:
- Memory safety issues in unsafe code (use-after-free, double-free, buffer overflow)
- Undefined behavior in FFI callbacks
- Panics that escape an FFI boundary (since Rust 1.81 an unwind out of an
extern "C"function aborts the process instead of being undefined behaviour, which still takes down the host's DuckDB session) - Information disclosure through uninitialized memory
This policy does not cover:
- Bugs in DuckDB itself (report those to DuckDB)
- Bugs in
libduckdb-sysbindings (report to duckdb-rs) - Logic errors in extension code built with quack-rs (those are the extension author's responsibility)
quack-rs is designed with safety as a primary concern:
#![deny(unsafe_op_in_unsafe_fn)]insrc/lib.rsandunsafe_op_in_unsafe_fn = "deny"inCargo.toml: every unsafe operation needs an explicitunsafeblock, even insideunsafe fn. Eachunsafe fndocuments its caller obligations under# Safety, and everyunsafeblock in library code carries a// SAFETY:comment, including a block inside anunsafe fnthat only forwards that function's contract (the comment then names the clause it relies on).clippy::undocumented_unsafe_blocksis enabled and CI runs clippy with-D warnings, so an unannotated block fails CI. The convention is set out in the crate docs,src/lib.rs.- No panics across FFI: The entry points generated by
entry_point!/entry_point_v2!, callbacks defined with the*_callback!macros (src/callback.rs), the closure-based builders andFfiState<T>'s callbacks run user code insidecatch_unwindand report a panic as a SQL error. A rawunsafe extern "C" fnthat an extension author passes to a builder is installed as written, with no guard; the author must use the matching macro or wrap the body incallback::catch_ffi_panic. The release profile therefore setspanic = "unwind", notabort: underpanic = "abort"a panic aborts the process beforecatch_unwindcan run, which disables the crate's entire panic-containment mechanism.validate_release_profilerejectsabortoutright, and the generated scaffold never emits it. - Double-free prevention:
FfiState<T>::destroy_callbackclears each state's tag before dropping it. - Boolean UB prevention:
VectorReader::read_boolreads asu8 != 0, never transmutes tobool. - RAII for DuckDB handles:
LogicalTypeensuresduckdb_destroy_logical_typeis always called. - Credential protection:
SecretEntryredacts field values inDebug/Displayoutput and zeroizes all sensitive data onDropusingwrite_volatile. - TLS hardening:
TlsConfigProviderhas no default minimum version —min_tls_versionis a required method, so every provider states one — andaudit_tls_provider()flags certificate-validation bypass (CWE-295) and deprecated protocol versions (CWE-327). - Structured warnings:
WarningCollectorprovides thread-safe, CWE-annotated security warning collection for extensions.