-
Notifications
You must be signed in to change notification settings - Fork 1
DLL_SIGNATURE_VERIFICATION
To prevent corrupted or malicious DLL loading in the modular architecture, ThemisDB implements a comprehensive security verification system for all themis_* modules.
When splitting themis_core into modular DLLs, we introduce new attack vectors:
- DLL Corruption: File corruption during transfer or storage
- DLL Tampering: Malicious modification of module files
- DLL Substitution: Replacement with malicious lookalike DLLs
- Man-in-the-Middle: Compromised DLLs during distribution
┌─────────────────────┐
│ Application Start │
└──────────┬──────────┘
│
┌──────────▼──────────┐
│ ModuleLoader │
└──────────┬──────────┘
│
┌────────────────┼────────────────┐
│ │ │
┌────────▼────────┐ ┌───▼────┐ ┌────────▼────────┐
│ Hash Verification│ │Signature│ │ Blacklist/ │
│ (SHA-256) │ │Verify │ │ Whitelist │
└────────┬────────┘ └───┬────┘ └────────┬────────┘
│ │ │
└──────────────┼─────────────────┘
│
┌────────▼────────┐
│ Load Module │
│ (if verified) │
└─────────────────┘
Main interface for loading verified modules:
themis::modules::ModuleLoader loader;
// Load a single module with verification
auto result = loader.loadModule("themis_storage.dll", "themis_storage");
if (result.success) {
// Module verified and loaded successfully
} else {
// Verification failed - module NOT loaded
spdlog::critical("Security: {}", result.errorMessage);
}
// Load all modules from directory
size_t loaded = loader.loadAllModules("/path/to/modules");Wraps existing PluginSecurityVerifier for module-specific verification:
- SHA-256 hash calculation
- Digital signature verification
- Certificate chain validation
- Policy enforcement
Global singleton tracking all loaded modules:
- Prevents duplicate loading
- Provides system-wide status
- Audit trail of loaded modules
Every module file is hashed before loading:
std::string fileHash = verifier->calculateFileHash("themis_storage.dll");
// Compare with expected hash from metadata
if (fileHash != expectedHash) {
// REJECT: File has been modified/corrupted
}Modules are signed with X.509 certificates:
{
"plugin": {
"name": "themis_storage",
"version": "1.4.0",
"signature": {
"sha256": "a1b2c3d4...",
"signature": "e5f6g7h8...",
"certificate": "-----BEGIN CERTIFICATE-----\n...",
"issuer": "CN=ThemisDB Official, O=ThemisDB, C=DE",
"subject": "CN=themis_storage",
"timestamp": 1702828800
}
}
}Verification Process:
- Extract public key from X.509 certificate
- Verify certificate hasn't expired
- Verify certificate issuer is trusted
- Verify signature using public key
- Reject if any step fails
- Verify issuer is in trusted list
- Check certificate expiration
- Optional: CRL (Certificate Revocation List) check
- Optional: OCSP (Online Certificate Status Protocol)
Blacklist - Block known malicious hashes:
loader.addBlacklistedHash("abc123..."); // BlockedWhitelist - Always allow known good hashes:
loader.addWhitelistedHash("def456..."); // TrustedAll module load attempts are logged:
// Export security audit log
loader.exportAuditLog("/var/log/themis/module_audit.json");Logged Events:
-
PLUGIN_LOADED- Module loaded successfully -
PLUGIN_LOAD_FAILED- Module load failed -
SIGNATURE_VERIFIED- Signature verification passed -
SIGNATURE_VERIFICATION_FAILED- Signature invalid -
HASH_MISMATCH- File hash doesn't match metadata -
BLACKLISTED- Module on blacklist -
UNTRUSTED_ISSUER- Certificate issuer not trusted -
CERTIFICATE_EXPIRED- Certificate has expired -
POLICY_VIOLATION- Security policy violated
// Strict security - unsigned modules rejected
policy.requireSignature = true;
policy.allowUnsigned = false;
policy.verifyFileHash = true;
policy.checkRevocation = true;
policy.minTrustLevel = PluginTrustLevel::TRUSTED;Behavior:
- ✅ Signature required for all modules
- ✅ Hash verification mandatory
- ✅ Certificate revocation check enabled
- ❌ Unsigned modules rejected
- ❌ Untrusted issuers rejected
// Relaxed security - unsigned modules allowed
policy.requireSignature = false;
policy.allowUnsigned = true;
policy.verifyFileHash = true;
policy.checkRevocation = false;
policy.minTrustLevel = PluginTrustLevel::UNTRUSTED;Behavior:
⚠️ Signature optional (but verified if present)- ✅ Hash verification still performed
- ❌ Revocation check disabled (performance)
- ✅ Unsigned modules allowed (development)
⚠️ Untrusted issuers accepted (local testing)
The ModuleLoader reuses ThemisDB's existing security infrastructure:
// Existing plugin security (src/acceleration/plugin_security.cpp)
themis::acceleration::PluginSecurityVerifier pluginVerifier;
themis::acceleration::PluginSecurityAuditor auditor;
// New module loader wraps existing infrastructure
themis::modules::ModuleSecurityVerifier moduleVerifier;
// ↓ delegates to ↓
pluginVerifier.verifyPlugin(modulePath, error);Benefits:
- ✅ Code reuse (no duplication)
- ✅ Consistent security across plugins and modules
- ✅ Existing audit infrastructure
- ✅ Proven cryptographic implementation
#include "themis/base/module_loader.h"
int main() {
themis::modules::ModuleLoader loader;
// Load core modules
auto storage = loader.loadModule("themis_storage.dll", "themis_storage");
auto query = loader.loadModule("themis_query.dll", "themis_query");
auto security = loader.loadModule("themis_security.dll", "themis_security");
if (!storage.success || !query.success || !security.success) {
spdlog::critical("Failed to load core modules - cannot start");
return 1;
}
// Application continues...
}#include "themis/base/module_loader.h"
int main() {
themis::modules::ModuleLoader loader;
// Load all modules from directory
size_t loaded = loader.loadAllModules("/opt/themisdb/lib");
if (loaded < 5) { // Minimum 5 core modules required
spdlog::critical("Insufficient modules loaded: {} < 5", loaded);
return 1;
}
// Check specific module
if (!loader.isModuleLoaded("themis_storage")) {
spdlog::critical("Required module 'themis_storage' not loaded");
return 1;
}
// Application continues...
}#include "themis/base/module_loader.h"
int main() {
themis::modules::ModuleLoader loader;
// Production deployment - strict security
loader.setRequireSignature(true);
loader.setAllowUnsigned(false);
// Whitelist known good modules (from secure build)
loader.addWhitelistedHash("a1b2c3d4e5f6g7h8..."); // themis_storage v1.4.0
loader.addWhitelistedHash("i9j0k1l2m3n4o5p6..."); // themis_query v1.4.0
// Blacklist known compromised module (security incident)
loader.addBlacklistedHash("deadbeef12345678..."); // Compromised build
// Load modules
size_t loaded = loader.loadAllModules("/opt/themisdb/lib");
// Export audit log for compliance
loader.exportAuditLog("/var/log/themis/module_audit.json");
}#include "themis/base/module_loader.h"
void printModuleStatus(const themis::modules::ModuleLoader& loader) {
auto modules = loader.getAllLoadedModules();
for (const auto& module : modules) {
spdlog::info("Module: {}", module.name);
spdlog::info(" Path: {}", module.path);
spdlog::info(" Version: {}", module.version);
spdlog::info(" Hash: {}", module.fileHash);
spdlog::info(" Verified: {}", module.verified);
spdlog::info(" Load Time: {}", module.loadTime);
}
}include/themis/base/
module_loader.h # Public API for module loading
export.h # DLL export macros for all modules
src/base/
module_loader.cpp # Implementation with security verification
src/acceleration/
plugin_security.h # Existing plugin security (reused)
plugin_security.cpp # X.509, SHA-256, signature verification
plugin_loader.h # Existing plugin loader
plugin_loader.cpp # Implementation
- Corrupted DLLs: Hash mismatch detected before loading
- Tampered DLLs: Signature verification fails
- Malicious DLLs: Blacklist blocks known bad hashes
- Expired Certificates: Rejected automatically
- Untrusted Issuers: Not in trusted issuer list
- Unsigned DLLs (Production): Rejected in production builds
- Zero-day malware: Unknown malicious code (requires AV integration)
- Compromised signing key: If attacker has private key
- Social engineering: User manually disabling verification
- Memory corruption: After DLL is loaded (use ASLR/DEP)
- Hash Calculation: ~2-5ms per module (SHA-256)
- Signature Verification: ~10-20ms per module (RSA-2048)
- Total Overhead: ~50-100ms for 5 core modules
- Memory: ~2KB per loaded module (metadata)
Conclusion: Minimal impact (~100ms startup time) for significant security gain
- Code signing with EV certificates (Windows)
- Timestamping service integration
- CRL/OCSP automatic updates
- Module update verification
- Rollback protection (version pinning)
- Hardware Security Module (HSM) signing
- Reproducible builds with hash verification
-
ModuleLoader API:
include/themis/base/module_loader.h -
Implementation:
src/base/module_loader.cpp -
Plugin Security:
src/acceleration/plugin_security.cpp -
Modularization Plan:
docs/architecture/MODULARIZATION_PLAN.md - X.509 Certificates: https://www.rfc-editor.org/rfc/rfc5280
- Code Signing: https://docs.microsoft.com/en-us/windows/win32/seccrypto/cryptography-tools
The ModuleLoader with security verification ensures that only trusted, unmodified modules are loaded into ThemisDB. This prevents corrupted or malicious DLL injection and provides a strong security foundation for the modular architecture.
Status: ✅ Implemented and ready for post-v1.3.0 modular build
Production Ready: Yes (with mandatory signatures)
Development Friendly: Yes (with optional signatures)
Zero Trust: All modules verified before loading
- Architecture-ACCESS-MODEL-IMPLEMENTATION-SUMMARY
- Architecture-ADR-003-pg-dump-sql-parser
- Architecture-BASEENTITY-PRINCIPLE
- Architecture-CACHE-STORAGE-INTEGRATION
- Architecture-CMAKE-ARCHITECTURE
- Architecture-CMAKE-FLAGS-REFERENCE
- Architecture-CMAKE-MODULAR-ARCHITECTURE
- Architecture-CONCERNS-ARCHITECTURE-DIAGRAM
- Architecture-CONCERNS-IMPLEMENTATION-SUMMARY
- Architecture-CONTENT-MODEL
- Architecture-COPILOT-THEMISDB-GRAPH-RAG-BACKEND-ARCHITECTURE
- Architecture-CRYPTO-AND-KEYS
- Architecture-FEATURE-FLAGS-REFERENCE
- Architecture-GPU-ARCHITECTURE-REVIEW-TEMPLATE
- Architecture-HTTP-SHUTDOWN-HARDENING
- Architecture-MIGRATION-GUIDE-CONCERNS
- Architecture-MIGRATION-GUIDE-v13-v14
- Architecture-MODULARIZATION-GUIDE
- Architecture-MODULAR-ARCHITECTURE-ROADMAP
- Architecture-MODULE-ARCHITECTURE-INDEX
- Architecture-P1D01-ISSMPLUGIN-DESIGN-REVIEW
- Architecture-P1-D01-ISSMPLUGIN-DESIGN-REVIEW
- Architecture-P1-D08-MAMBA-GOVERNANCE-CONTRACT
- Architecture-P1-P2-IMPLEMENTATION-COMPLETION-INDEX
- Architecture-PHASE0-COMPLETION-ASSESSMENT
- Architecture-PHASE3-QUERYENGINE-DI-ARCHITECTURE
- Architecture-PHASE4-INDEX-MANAGER-DI
- Architecture-POSTGRESQL-WIRE-PROTOCOL
- Architecture-QUERYENGINE-IMPLEMENTATION-GUIDE
- Architecture-QUERY-SCHEDULING
- Architecture-RAFT-CONSENSUS-DESIGN
- Architecture-README
- Architecture-README-SSM-HYBRID-IMPLEMENTATION
- Architecture-REFACTORING-SUMMARY
- Architecture-RESOURCE-POOLING
- Architecture-SOURCE-DIRECTORY-GUIDE
- Architecture-THEMIS-CORE-GUIDE
- Architecture-UNIFIED-ACCESS-MODEL
- Architecture-WAL-GRPC-MTLS-CONFIGURATION
- Architecture-WIRE-PROTOCOL-RETRY
- Architecture-boltzmann-observability-draft
- Architecture-experimental-logarithmic-vector-storage
- Architecture-llm-wiki-mvp-adr
- Architecture-rewrite-engine-architecture
- Architecture-rope-api-architecture
- Architecture-ssm-gguf-mamba-status
- Architecture-ssm-hybrid-analysis
- Architecture-ssm-hybrid-rollout-plan
- Architecture-ssm-plugin-interface-design-review
- Architecture-transaction-coordinators
- Architecture-wiki-secondary-index
- Architecture-wire-protocol
- Governance-DISABLED-STUB-POLICY
- Governance-DOCS-PR-POLICY
- Governance-GA-PROMOTION-SIGN-OFF
- Governance-GITHUB-MILESTONES-SETUP
- Governance-MATURITY-CLAIM-VERIFICATION-CHECKLIST
- Governance-MATURITY-EVIDENCE-REGISTRY
- Governance-MERGE-GATE-BOT-CONFIG
- Governance-MERGE-GATE-STATUS-LIVE
- Governance-PHASE3-ENFORCEMENT-RUNBOOK
- Governance-PHASE-1-CLOSURE-REPORT
- Governance-PHASE-CLOSURE-POLICY
- Governance-PHASE-DEPENDENCY-GRAPH
- Governance-PLUGIN-SUBMODULE-ROLLBACK
- Governance-PRODUCTION-READY-2026-DELIVERY-PLAN
- Governance-PR-VERSION-TARGETING
- Governance-PR-VERSION-TARGETING-BACKFILL
- Governance-QUERY-MODULE-STATUS
- Governance-README
- Governance-RELEASE-PROMOTION-GATE-POLICY
- Governance-RELEASE-VALIDATION-CHECKLIST
- Governance-SECURITY-MODULE-5671-EVIDENCE-SUMMARY
- Governance-SHARDING-P6-RESIDUAL-RISK-ACCEPTANCE
- Governance-SOURCECODE-COMPLIANCE-GOVERNANCE
- Governance-UPDATES-DEVELOPMENT-STATUS-SIGN-OFF
- Governance-WAVE-C-IMPLEMENTATION-COMPLETE
- Module-acceleration-Roadmap
- Module-access-model-Roadmap
- Module-ai-Roadmap
- Module-analytics-Roadmap
- Module-api-Roadmap
- Module-aql-Roadmap
- Module-auth-Roadmap
- Module-base-Roadmap
- Module-cache-Roadmap
- Module-cdc-Roadmap
- Module-chaos-Roadmap
- Module-chimera-Roadmap
- Module-config-Roadmap
- Module-content-Roadmap
- Module-core-Roadmap
- Module-distributed-knowledge-Roadmap
- Module-distributed-tensor-Roadmap
- Module-document-Roadmap
- Module-ethics-ai-Roadmap
- Module-evaluation-Roadmap
- Module-execution-Roadmap
- Module-exporters-Roadmap
- Module-failover-Roadmap
- Module-geo-Roadmap
- Module-governance-Roadmap
- Module-gpu-Roadmap
- Module-graph-Roadmap
- Module-image-analysis-Roadmap
- Module-importers-Roadmap
- Module-index-Roadmap
- Module-ingestion-Roadmap
- Module-llama-cpp-Roadmap
- Module-llm-Roadmap
- Module-llm-streaming-Roadmap
- Module-llm-wiki-Roadmap
- Module-maintenance-Roadmap
- Module-metadata-Roadmap
- Module-network-Roadmap
- Module-observability-Roadmap
- Module-onnx-clip-Roadmap
- Module-performance-Roadmap
- Module-plugins-Roadmap
- Module-process-Roadmap
- Module-projects-Roadmap
- Module-prompt-engineering-Roadmap
- Module-query-Roadmap
- Module-rag-Roadmap
- Module-replication-Roadmap
- Module-retrieval-Roadmap
- Module-rpc-grpc-Roadmap
- Module-scheduler-Roadmap
- Module-scraper-Roadmap
- Module-search-Roadmap
- Module-security-Roadmap
- Module-server-Roadmap
- Module-sharding-Roadmap
- Module-stable-diffusion-Roadmap
- Module-storage-Roadmap
- Module-temporal-Roadmap
- Module-tensor-Roadmap
- Module-themis-Roadmap
- Module-timeseries-Roadmap
- Module-toolbox-Roadmap
- Module-training-Roadmap
- Module-transaction-Roadmap
- Module-updates-Roadmap
- Module-user-storage-encrypted-Roadmap
- Module-utils-Roadmap
- Module-vector-search-Roadmap
- Module-voice-Roadmap
- Module-whisper-Roadmap