This is an automated email from the ASF dual-hosted git repository.

cgivre pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/drill.git


The following commit(s) were added to refs/heads/master by this push:
     new cf6ee10825 [MINOR-UPDATE] Document staging-area precondition for 
CREATE FUNCTION / CREATE DAFFODIL SCHEMA USING JAR in threat model (#3091)
cf6ee10825 is described below

commit cf6ee108254b24fa4d88a3746273446c7f29d002
Author: Charles S. Givre <[email protected]>
AuthorDate: Wed Oct 14 14:10:11 2026 -0400

    [MINOR-UPDATE] Document staging-area precondition for CREATE FUNCTION / 
CREATE DAFFODIL SCHEMA USING JAR in threat model (#3091)
    
    Both statements only register a jar already present in a staging area
    on the cluster filesystem, so exploiting them requires filesystem write
    access the model already treats as out of scope. Add a known
    non-finding, operator guidance to restrict the staging directories,
    and update the Q4 status.
---
 THREAT_MODEL.md | 8 +++++---
 1 file changed, 5 insertions(+), 3 deletions(-)

diff --git a/THREAT_MODEL.md b/THREAT_MODEL.md
index d91288eb7b..260dda1d32 100644
--- a/THREAT_MODEL.md
+++ b/THREAT_MODEL.md
@@ -24,7 +24,7 @@
 - **Version binding:** versioned with the project; a report against version 
*N* is triaged against the model as it stood at *N*.
 - **Reporting cross-reference:** §8-property violations → report privately per 
the ASF process (`[email protected]` → `[email protected]`); §3/§9 
findings are closed citing this document.
 - **Provenance legend:** *(documented)* = Drill's own docs/repo; 
*(maintainer)* = confirmed by a Drill PMC member through this process; 
*(inferred)* = reasoned from architecture/docs, not yet PMC-ratified — each has 
a matching §14 open question.
-- **Draft confidence:** ~10 documented / 2 maintainer / ~26 inferred (cgivre's 
PR #3052 review folded: `contrib/` plugins in scope + the storage-enumeration 
non-finding).
+- **Draft confidence:** ~10 documented / 3 maintainer / ~25 inferred (cgivre's 
PR #3052 review folded: `contrib/` plugins in scope + the storage-enumeration 
non-finding; 2026-10: `CREATE FUNCTION USING JAR` / `CREATE DAFFODIL SCHEMA 
USING JAR` staging-area precondition).
 
 **What Drill is.** Apache Drill is a **schema-free, distributed SQL query 
engine** for large-scale datasets. A cluster of **Drillbit** daemons 
(coordinated via Apache ZooKeeper) accepts ANSI-SQL queries over JDBC, ODBC, a 
REST API, and a Web UI (default port **8047**), and executes them directly 
against data in configurable **storage plugins** (local/HDFS/S3 files, Hive, 
HBase, Kafka, MongoDB, RDBMS via JDBC, HTTP, …) — discovering schema at query 
time rather than requiring a pre-defined [...]
 
@@ -56,7 +56,7 @@ Intended deployment: a **clustered set of Drillbits** inside 
an operator-control
 ## §3 Out of scope (explicit non-goals)
 
 - **The security of the underlying data sources.** HDFS/S3 permissions, the 
RDBMS behind the JDBC plugin, Hive authorization, the Kafka cluster — each 
enforces its own access control. Drill assumes them; it is not responsible for 
their misconfiguration. *(inferred — §14 Q2)*
-- **Dynamic UDFs and storage-plugin configuration as code/connectivity 
execution.** Uploading a UDF jar or configuring a storage plugin is an 
**authorized admin operation**; the code/connection runs with the Drillbit's 
privileges. This is a feature, not a sandbox escape — `BY-DESIGN`. A finding 
that requires admin rights to register a UDF or add a plugin is out of model. 
*(documented — admin function; §14 Q4 confirms the trust line)*
+- **Dynamic UDFs and storage-plugin configuration as code/connectivity 
execution.** Uploading a UDF jar or configuring a storage plugin is an 
**authorized admin operation**; the code/connection runs with the Drillbit's 
privileges. This is a feature, not a sandbox escape — `BY-DESIGN`. A finding 
that requires admin rights to register a UDF or add a plugin is out of model. 
*(documented — admin function; §14 Q4 confirms the trust line)* For dynamic 
UDFs specifically, `CREATE FUNCTION USING  [...]
 - **An operator with cluster/root access, the Drillbit service account, or 
direct ZooKeeper write access.** Anyone who controls the cluster processes or 
the coordination store has already won. `OUT-OF-MODEL: adversary-not-in-scope`. 
*(inferred — §14 Q5)*
 - **Embedded / single-user mode**, where the caller owns the JVM, the 
filesystem, and all input — equivalent to an in-process library call. 
*(inferred — §14 Q1)*
 - **SQL injection in an embedding application** that string-concatenates 
untrusted input into Drill SQL — that is the embedding app's bug, not Drill's. 
*(inferred — §11)*
@@ -133,6 +133,7 @@ The security envelope is set primarily by runtime 
configuration, not compile fla
 - **Enable authentication and impersonation** before exposing Drill to more 
than one trusted user; do not run a multi-user cluster with the shipped 
auth-off / impersonation-off defaults. *(inferred — §14 Q9)*
 - **Lock down the Web UI / REST (`:8047`)** — it can configure storage plugins 
and upload UDFs; restrict it to admins and protect it with auth + TLS.
 - **Restrict who can configure storage plugins and upload dynamic UDFs** to 
trusted admins (these are code/connectivity-execution surfaces).
+- **Restrict write access to the UDF staging area** 
(`drill.exec.udf.directory.staging`, on `drill.exec.udf.directory.fs`). Write 
access there is equivalent to code execution on every Drillbit once any user 
runs `CREATE FUNCTION USING JAR`. Set `exec.udf.enable_dynamic_support = false` 
if dynamic UDFs are not needed. Apply the same restriction to the Daffodil 
schema staging area (`drill.exec.daffodil.directory.staging`, on 
`drill.exec.daffodil.directory.fs`).
 - **Configure wire encryption** (SASL/SSL) on client↔Drillbit and 
inter-Drillbit links on untrusted networks.
 - **Network-isolate** the Drillbit cluster + ZooKeeper from untrusted 
networks; give data-source credentials least privilege.
 
@@ -152,6 +153,7 @@ The security envelope is set primarily by runtime 
configuration, not compile fla
 - **"The REST API / Web UI accepts requests without authentication."** Only 
when auth is disabled — a non-default/operator-chosen posture (pending §14 Q9), 
not a Drill defect. `OUT-OF-MODEL: non-default-build`.
 - **"A query can read an arbitrary local file via the `dfs` plugin."** 
In-model only if it crosses the impersonated identity's authorization or the 
configured workspace; otherwise it is the operator's plugin-scope choice. 
*(inferred — §14 Q2/Q7)*
 - **"Drill can enumerate / read the files, schemas, or storage systems it is 
pointed at."** That is the **function** of a federated query engine — exposing 
configured storage to SQL is the point of Drill, not a vulnerability. 
`KNOWN-NON-FINDING` / `BY-DESIGN`. In-model **only** if the access crosses the 
authenticated identity's authorization (reading data an impersonated user 
shouldn't, or bypassing a Drill view — §8.2). *(maintainer — cgivre, PR #3052: 
"yes… that's the point of Drill".)*
+- **"`CREATE FUNCTION USING JAR` / `CREATE DAFFODIL SCHEMA USING JAR` lets a 
user load a malicious jar or DFDL schema."** Recurring report. Neither 
statement uploads anything: each only registers a jar that already sits in its 
staging area on the cluster filesystem (UDF: 
`drill.exec.udf.directory.staging`, binary + sources; Daffodil: 
`drill.exec.daffodil.directory.staging`). `CreateFunctionHandler` and 
`CreateDaffodilSchemaHandler` fail if the file is missing. To exploit it, the 
attacker [...]
 - **"SQL injection in Drill"** where the untrusted string was concatenated by 
an *embedding app* — that app's bug (§11), not Drill's.
 - **Dependency-tail CVEs** (Calcite, Hadoop, Jackson, Netty, a transitive jar) 
from an SCA scan — triage upstream unless Drill's own code reaches the 
vulnerable path with untrusted input.
 
@@ -182,7 +184,7 @@ The security envelope is set primarily by runtime 
configuration, not compile fla
 
 - **Q1.** Confirm the in-scope surface is "an authenticated SQL/REST client at 
the Drillbit front door (JDBC/ODBC/REST/Web UI), in a clustered multi-user 
deployment", with embedded single-user mode out of scope. Anything to add?
 - **Q2.** Confirm Drill is *not* responsible for the underlying data sources' 
own access control — that HDFS/S3/RDBMS/Hive/Kafka security is theirs, and 
Drill's job is to honor it (via impersonation/views), not replace it.
-- **Q4.** Confirm dynamic-UDF upload and storage-plugin configuration are 
**admin-only, code/connectivity-execution-by-design** — i.e. a finding that 
requires those rights is out of model.
+- **Q4.** *(Partially answered — cgivre, 2026-10: `CREATE FUNCTION USING JAR` 
and `CREATE DAFFODIL SCHEMA USING JAR` require the jar to be pre-placed in a 
staging area, so filesystem write access is the gate; folded into 
§3/§10/§11a.)* Confirm dynamic-UDF upload and storage-plugin configuration are 
**admin-only, code/connectivity-execution-by-design** — i.e. a finding that 
requires those rights is out of model.
 - **Q5.** Confirm operators with cluster-host / Drillbit-service-account / 
ZooKeeper-write access (and the data sources themselves) are out of model.
 
 **Wave 2 — auth, impersonation, defaults**

Reply via email to