Security Policy¶
Supported versions¶
Version |
Supported |
|---|---|
0.2.0 |
✅ Current release |
0.1.0 |
⚠️ Affected by two SQL injection vulnerabilities; upgrade to 0.2.0 |
< 0.1 |
❌ |
0.1.0 carries two SQL injection vulnerabilities, fixed in 0.2.0 and not backported (GHSA-5f5g-g3v5-prrg). Upgrade to 0.2.0, or if you cannot yet, apply the mitigations in the SQL injection advisory. 0.1.1 was prepared but never published.
Reporting a vulnerability¶
Please do not open a public issue for a security problem.
Report privately through GitHub’s
private vulnerability reporting,
or by email to kuanhao.chao@gmail.com with [gffbase security] in the subject.
Include, as far as you can:
the gffbase version, Python version, and operating system;
whether the compiled
gffbase._nativeextension was in use or the pure-Python fallback;a minimal input file or script that reproduces the problem;
what you observed and what you expected.
You should get an acknowledgement within 3 working days and an assessment within 10. If a fix is warranted we will agree a disclosure date with you, credit you in the advisory unless you prefer otherwise, and publish a patched release together with a GitHub Security Advisory.
Scope¶
gffbase parses untrusted third-party annotation files and executes SQL against a DuckDB database. The following are in scope:
memory-safety faults in the Rust parser (crashes, out-of-bounds reads, unbounded allocation) reachable from a malformed GFF3/GTF input;
SQL injection through any public API parameter;
path traversal or arbitrary file write via a database path, export path, or
GFFWritertarget;code execution triggered by opening a database file or parsing an input file;
denial of service through a small input causing unbounded memory or CPU use.
Out of scope:
vulnerabilities in DuckDB, PyArrow, or other dependencies — report those upstream, though we will bump the pin once a fix ships;
attacks that require the operator to already have write access to the database file or the Python process;
resource use that is proportional to a genuinely large input.
A note on FeatureDB.execute()¶
FeatureDB.execute() runs arbitrary SQL against the underlying DuckDB
connection by design. DuckDB can read and write the local filesystem
(read_csv, COPY … TO). Passing untrusted strings to execute() is
equivalent to handing over the process, and is not treated as a vulnerability in
gffbase. Everything else that reaches SQL must be parameterized or
whitelisted, and a failure to do so is in scope.