Agent Security
The PatchCTL agent is designed with minimal attack surface.
Command Whitelist
The agent only executes predefined operations:
| Command | Description |
|---|---|
check_updates | Refresh package lists |
install_updates | Apply approved updates |
get_package_info | Query package details |
health_check | System health verification |
No Arbitrary Execution
The agent cannot execute arbitrary shell commands. All operations are validated against a strict whitelist.
Privilege Model
Why Root Access?
The agent requires root access because:
- Package managers need root to install updates
- System information requires elevated privileges
- Service management needs root
Privilege Minimization
Despite running as root:
- Only whitelisted operations execute
- No shell command injection possible
- Input validation on all parameters
- Sandboxed execution environment
Network Security
Outbound Only
- Agent never accepts inbound connections
- Only HTTPS (port 443) outbound required
- No listening ports opened
Connection Security
- TLS 1.3 encryption
- Certificate validation
- No self-signed certs accepted
Binary Security
Signed Binaries
- Binaries verified by checksum
- Downloaded from secure CDN
- Integrity checked before execution
Update Security
- Self-updates verify checksums
- Rollback on verification failure
- No unsigned code execution
Data Handling
What the Agent Sends
- System identification (hostname, IP, OS)
- Hardware specs (CPU, RAM, disk)
- Package list and versions
- Update availability status
- Command execution results
What the Agent Does NOT Send
- File contents
- User data or credentials
- Network traffic
- Process listings
- Environment variables
Local Security
File Permissions
/opt/patchctl/bin/patchctl-agent # 755 root:root
/etc/patchctl/config.json # 600 root:root
Configuration Protection
- Config file readable only by root
- License key protected
- No sensitive data in logs
Audit Logging
The agent logs:
- All commands received
- Execution results
- Errors and warnings
- Connection status
Logs available via journald:
sudo journalctl -u patchctl