Safeguard
Supply Chain•

What does the Kafka Connect plugin.path load, and who controls it?

plugin.path lists directories of connectors, converters and transformations that a Connect worker loads. Whoever writes there controls code in the worker.

Safeguard Security Team
4 min read

The plugin.path setting is a list of directories holding Connect plugins, meaning connectors, converters and transformations. A worker loads code from those directories, so whoever can write to them controls code that runs inside the worker, with its network access and its secrets.

What the docs say

The Apache Kafka Connect user guide defines plugin.path as a list of paths that contain Connect plugins (connectors, converters, transformations). The default is empty. Separately, the worker configuration reference describes a plugin.discovery setting, which decides how plugins in the classpath and plugin path are found. Its modes range from scanning by reflection only, to service loader only, with hybrid modes that warn or fail at startup if a plugin cannot be found through the service loader.

Plugins can also declare themselves through service manifest files under META-INF, for each interface such as source connector, sink connector, converter, transformation and config provider.

Why it is a supply chain question

A connector JAR is third party code with a database driver or an API client inside. Connect workers often hold credentials for several systems at once. So the plugin directory is a trust boundary, and every JAR placed there inherits the worker's access.

QuestionWhy ask it
Where did this JAR come from?A download from an unverified page is an unreviewed dependency
Which version is installed?Without a record you cannot match it to advisories
What libraries are bundled inside?A connector can carry its own copies of vulnerable libraries
Who can write to the directory?Write access equals code execution on the worker
How does a new plugin get added?An ad hoc copy to a server is not reviewable

A review routine

  1. List every plugin directory on every worker, including images that bake them in.
  2. For each plugin, record name, version, source and checksum.
  3. Generate a bill of materials for the plugin's bundled libraries and scan it.
  4. Lock down write access to those directories to your deployment process only.
  5. Build the worker image in CI so the same plugin set ships to every worker.
  6. Remove plugins nobody uses.

Step three is where the surprises are. A plugin is often a fat JAR with its own copies of libraries, and those copies do not show up in a scan of the worker's own dependencies unless the scanner opens the JAR.

Keep config providers separate

Confluent's guide notes that plugin path locations are for connectors and their specific dependent JARs, not for config providers, which belong on the default classpath. Mixing the two causes load failures and muddles who owns what. See Kafka Connect config providers.

Related reading

Network access to the REST API decides who can ask a worker to load a connector in the first place; see who can reach the Kafka Connect REST API on port 8083.

Safeguard's SBOM and dependency scanning can inventory bundled libraries, and a free scan is available at gold.safeguard.sh/scan.

Quick check

Is plugin.path set by default?

The default is empty, per the Kafka docs. Workers load plugins from whichever paths you configure.

Why scan a connector JAR separately?

It can bundle its own library copies, which a scan of the worker's declared dependencies would not report.

Sources

Last reviewed: 19 October 2026.

Never miss an update

Weekly insights on software supply chain security, delivered to your inbox.

Self-healing security runs on Safeguard.

Your first fix PR is minutes away.

No sales call required, even your agent can complete the purchase over MCP.