Skip to the content.

datachain-ai/datachain - security scan

Repository: datachain-ai/datachain Commit scanned: 431252d7261429dd535203794cc8612acfd74af3 Scan date: 2026-07-14 Disclosure status: public — post-only (strict-norm: commercial “Studio” tier; nothing cleared the quality gate)

Summary

Severity Count
Critical 0
High 3
Medium 32
Low 0 (filtered at --min-severity medium)
Info 0

Total findings: 35 (0 real after curation)

DataChain (from the DVC / Iterative team) is a Python “context layer” for unstructured data — typed, versioned datasets over S3/GCS/Azure, with UDFs applied at scale and a hosted “Studio” tier. For a library that caches datasets and ships user functions to distributed workers, the security question is deserialization: does anything pickle.load data an attacker could shape? The completeness sweep says no. This is the 16th clean scan; the finding count is workflow lint.

Top findings

1. The deserialization surface is serialize-own-code, not load-untrusted-data

2. The one exec is schema-inference codegen over your own data

3. The count is workflow tags, a backend loader, and examples

Patterns observed

“Present” is not “reachable” for pickle. A grep for pickle on a data-caching, distributed-execution library lights up 26 sites, and the instinct is “deserialization RCE.” But the direction matters: every one is a dumps on the write side, serializing the user’s own UDF for the user’s own workers. The completeness-sweep move — search specifically for .load/.loads on an attacker-reachable source — turned the scariest-looking surface into a non-finding in one query. Same discipline as the OpenKB “CLI has no server” and inspect_ai “pickle is a local cache” reads.

The residual is a documentation trust-boundary, not a bug. The exec in schema inference is the only thing on this codebase that runs generated code, and it’s a documented convenience (infer a model from a sample) over data the pipeline author chose. Noting the assumption (“infer from trusted samples”) is useful; filing it as a vulnerability would be crying wolf, especially since a static spec avoids it and the codegen goes through a real library.

Strict-norm and clean. DataChain has a commercial Studio tier, so this is post-only by policy anyway — but there was nothing to file: no untrusted deserialization, clean deps, and a finding list that’s workflow hardening and a by-design backend loader.

Notes on the tool

Disclosure timeline

This is a post-only clean-scan write-up. The pickle/cloudpickle surface is serialize-own-UDF (no untrusted load), the one exec is documented schema-inference codegen over the pipeline author’s own data, dependencies are clean, and the finding count is workflow lint and a by-design backend loader. Nothing cleared the quality gate.

Reproduce

git clone https://github.com/datachain-ai/datachain /tmp/scan-target
python scanner/run_scan.py --repo /tmp/scan-target \
  --reports-dir ./reports/datachain-ai-datachain \
  --min-severity medium --ignore-samples