Skip to content

[Security] Arbitrary code execution through unrestricted DLL scanning in PluginDiscovery #4

@pournasserian

Description

@pournasserian

Summary

PluginDiscovery.Scan() resolves the scan path from Assembly.GetExecutingAssembly().Location / Environment.ProcessPath and enumerates all *.dll files in the application's output directory that match ScanAssemblyPatterns (default: FluentCMS.Plugins.*). Any DLL placed in that directory will be loaded and executed with the application's full trust level on next startup.

Location

Plugins/FluentCMS.Infrastructure.Plugins/Discovery/PluginDiscovery.csScan() method (~line 42)

Risk

A supply-chain or filesystem-level attacker can drop a malicious DLL matching the naming pattern and have arbitrary code execute at application startup. There is no:

  • File signature / hash verification
  • Allowlist of trusted publishers (Authenticode)
  • Sandbox or isolated execution

Reproduction

  1. Build the host application.
  2. Copy a malicious DLL named FluentCMS.Plugins.Evil.dll into the output directory.
  3. Restart the application — the DLL is discovered, loaded, and any IPluginStartup implementation executes.

Recommendation

  1. Allow operators to configure an explicit, out-of-tree plugin directory instead of defaulting to the host binary directory:
    options.PluginDirectory = "/opt/myapp/plugins"; // separate from binaries
  2. Optionally add file hash verification or Authenticode certificate validation before loading each assembly.
  3. Consider a plugin allowlist (name + expected hash) stored in a protected configuration location.

Severity

🔴 Critical / Security

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workingsecurity

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions