Clean up and organize the flask-shopdb repository for better maintainability and discoverability: ## Changes - Update .gitignore for build artifacts (publish/, data/, 122M total) - Reorganize .claude/ into 6 subdirectories with README navigation - Consolidate overlapping MCP setup guides into MCP-QUICK-START.md - Move deployment docs from root to docs/deployment/ - Archive dated status reports to .claude/archived/ - Delete temporary files (logs, backups, empty reports, ~50K) ## New Structure .claude/ organized into: - setup/ - MCP, VM, Hyper-V, GitHub setup guides + scripts (17 files) - plans/ - Feature plans and protocols (5 files) - maintenance/ - Deployment checklists and reports (4 files) - archived/ - Historical documentation (9 files) - skills/ - Claude Code automation (5 files) - workflows/ - Security audit workflow (1 file) docs/deployment/ created with 6 deployment guides: - LOCAL-DEV-SETUP.md, DOCKER-SETUP.md, DOCKER-PREBUILT-APPROACH.md - PRODUCTION-READINESS.md, DEPLOY-TO-VM.md, README.md Root directory cleaned to essential docs only: - CLAUDE.md, README.md, CONTRIBUTING.md, CHANGELOG.md Benefits: - Clear navigation via README.md in each subdirectory - No duplicate/overlapping documentation - Large artifacts properly gitignored (won't bloat repository) - Historical context preserved in archived/ See .claude/CLEANUP-SUMMARY.md for complete details. Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
479 lines
13 KiB
JavaScript
479 lines
13 KiB
JavaScript
export const meta = {
|
|
name: 'endpoint-agent-security-audit',
|
|
description: 'Security and performance audit of endpoint plugin, C# agent, and tray',
|
|
phases: [
|
|
{ title: 'Discovery', detail: 'Find code, binaries, and VM runtime state' },
|
|
{ title: 'Code Security', detail: 'Multi-lens security review of source code', model: 'opus' },
|
|
{ title: 'Runtime Security', detail: 'VM runtime analysis and threat surface', model: 'opus' },
|
|
{ title: 'Performance', detail: 'Resource usage and optimization opportunities' },
|
|
{ title: 'Verify', detail: 'Adversarially verify high-severity findings', model: 'opus' },
|
|
{ title: 'Synthesize', detail: 'Security report and optimization plan', model: 'opus' }
|
|
]
|
|
}
|
|
|
|
const FINDINGS_SCHEMA = {
|
|
type: 'object',
|
|
properties: {
|
|
findings: {
|
|
type: 'array',
|
|
items: {
|
|
type: 'object',
|
|
properties: {
|
|
component: { type: 'string', enum: ['endpoint-plugin', 'csharp-agent', 'tray', 'vm-runtime'] },
|
|
severity: { type: 'string', enum: ['critical', 'high', 'medium', 'low', 'info'] },
|
|
category: { type: 'string' },
|
|
title: { type: 'string' },
|
|
description: { type: 'string' },
|
|
exploitation: { type: 'string' },
|
|
recommendation: { type: 'string' }
|
|
},
|
|
required: ['component', 'severity', 'category', 'title', 'description', 'recommendation']
|
|
}
|
|
}
|
|
},
|
|
required: ['findings']
|
|
}
|
|
|
|
const VERDICT_SCHEMA = {
|
|
type: 'object',
|
|
properties: {
|
|
confirmed: { type: 'boolean' },
|
|
severity_adjustment: { type: 'string' },
|
|
reasoning: { type: 'string' }
|
|
},
|
|
required: ['confirmed', 'reasoning']
|
|
}
|
|
|
|
// Phase 1: Discovery
|
|
phase('Discovery')
|
|
log('Discovering endpoint components and VM runtime state...')
|
|
|
|
const discovery = await parallel([
|
|
() => agent(`Find all Python files in plugins/endpoints/ directory. List API routes, models, and key functionality.`, {
|
|
label: 'Map endpoint plugin',
|
|
phase: 'Discovery'
|
|
}),
|
|
() => agent(`Find the C# agent source code. Look for: agent/, Agent/, or .cs files related to endpoint collection. List key files and what they do.`, {
|
|
label: 'Find C# agent code',
|
|
phase: 'Discovery'
|
|
}),
|
|
() => agent(`Find the tray application source code. Look for tray-related .cs files. What does the tray do?`, {
|
|
label: 'Find tray code',
|
|
phase: 'Discovery'
|
|
}),
|
|
() => agent(`Check if there are compiled executables in publish/ or deploy/ directories. What .exe files exist for deployment?`, {
|
|
label: 'Find binaries',
|
|
phase: 'Discovery'
|
|
}),
|
|
() => agent(`Use VM MCP to check what processes are running on SFTest related to ShopDB. Run: Get-Process | Where-Object {$_.ProcessName -like '*shopdb*' -or $_.ProcessName -like '*agent*' -or $_.ProcessName -like '*tray*'} | Select-Object Name,Id,CPU,WorkingSet,Path`, {
|
|
label: 'Check VM processes',
|
|
phase: 'Discovery'
|
|
})
|
|
])
|
|
|
|
const [endpointPlugin, agentCode, trayCode, binaries, vmProcesses] = discovery
|
|
log('Discovery complete')
|
|
|
|
// Phase 2: Code Security Review
|
|
phase('Code Security')
|
|
log('Performing multi-lens code security review...')
|
|
|
|
const CODE_SECURITY_DIMENSIONS = [
|
|
{
|
|
key: 'endpoint-injection',
|
|
prompt: `Review plugins/endpoints/api/routes.py for injection vulnerabilities.
|
|
|
|
Look for:
|
|
- SQL injection in raw queries or unsafe ORM usage
|
|
- Command injection in subprocess/exec calls
|
|
- Path traversal in file operations
|
|
- LDAP injection in directory queries
|
|
- Expression injection in eval/exec
|
|
|
|
Context: This is the backend that receives data from agents on shop floor PCs.
|
|
|
|
Return ONLY exploitable vulnerabilities with proof of concept.`,
|
|
component: 'endpoint-plugin'
|
|
},
|
|
{
|
|
key: 'endpoint-auth',
|
|
prompt: `Review authentication and authorization in plugins/endpoints/.
|
|
|
|
Look for:
|
|
- Weak token generation or validation
|
|
- Missing authentication on sensitive endpoints
|
|
- Authorization bypass opportunities
|
|
- Session fixation or hijacking
|
|
- Credential exposure in logs or errors
|
|
|
|
Context: Agents use service tokens (ADR-016), users use JWT.
|
|
|
|
Return findings with exploitation scenarios.`,
|
|
component: 'endpoint-plugin'
|
|
},
|
|
{
|
|
key: 'endpoint-data-validation',
|
|
prompt: `Review data validation in endpoint plugin collector payload handling.
|
|
|
|
Look for:
|
|
- Missing input validation on agent payloads
|
|
- Type confusion attacks
|
|
- Buffer overflow potential
|
|
- Integer overflow in size calculations
|
|
- Unsafe deserialization
|
|
|
|
Context: Agents POST JSON payloads to /api/collector/endpoints.
|
|
|
|
Return exploitable issues.`,
|
|
component: 'endpoint-plugin'
|
|
},
|
|
{
|
|
key: 'csharp-security',
|
|
prompt: `Review C# agent code for security vulnerabilities.
|
|
|
|
C# Agent Code: ${agentCode}
|
|
|
|
Look for:
|
|
- Unsafe P/Invoke or interop
|
|
- Insecure file operations or temp file usage
|
|
- Process injection vulnerabilities
|
|
- Privilege escalation paths
|
|
- Hardcoded credentials or keys
|
|
- Unsafe XML/JSON parsing
|
|
- Registry manipulation without validation
|
|
|
|
Context: Runs as Windows service with SYSTEM privileges.
|
|
|
|
Return critical/high findings only.`,
|
|
component: 'csharp-agent'
|
|
},
|
|
{
|
|
key: 'tray-security',
|
|
prompt: `Review tray application for security issues.
|
|
|
|
Tray Code: ${trayCode}
|
|
|
|
Look for:
|
|
- Inter-process communication vulnerabilities
|
|
- Named pipe security
|
|
- Local privilege escalation
|
|
- DLL hijacking opportunities
|
|
- Insecure update mechanism
|
|
- User data exposure
|
|
|
|
Context: Runs in user session, communicates with SYSTEM service.
|
|
|
|
Return exploitable vulnerabilities.`,
|
|
component: 'tray'
|
|
},
|
|
{
|
|
key: 'secrets-exposure',
|
|
prompt: `Search ALL endpoint-related code for exposed secrets or credentials.
|
|
|
|
Files to check:
|
|
- plugins/endpoints/
|
|
- C# agent: ${agentCode}
|
|
- Tray: ${trayCode}
|
|
- Config files
|
|
|
|
Look for:
|
|
- Hardcoded passwords, tokens, keys
|
|
- Connection strings with credentials
|
|
- API keys in code
|
|
- Cryptographic keys in source
|
|
- Comments containing credentials
|
|
|
|
Return ALL findings regardless of severity.`,
|
|
component: 'endpoint-plugin'
|
|
}
|
|
]
|
|
|
|
const codeSecurityFindings = await parallel(
|
|
CODE_SECURITY_DIMENSIONS.map(dim => () =>
|
|
agent(dim.prompt, {
|
|
label: `Security: ${dim.key}`,
|
|
phase: 'Code Security',
|
|
schema: FINDINGS_SCHEMA,
|
|
model: 'opus',
|
|
effort: 'high'
|
|
}).then(result => result ? result.findings.map(f => ({...f, component: dim.component})) : [])
|
|
)
|
|
)
|
|
|
|
const allCodeFindings = codeSecurityFindings.filter(Boolean).flat()
|
|
log(`Found ${allCodeFindings.length} code security findings`)
|
|
|
|
// Phase 3: Runtime Security on VM
|
|
phase('Runtime Security')
|
|
log('Analyzing runtime security on SFTest VM...')
|
|
|
|
const RUNTIME_DIMENSIONS = [
|
|
{
|
|
key: 'vm-attack-surface',
|
|
prompt: `Analyze the attack surface of components running on SFTest VM.
|
|
|
|
Running processes: ${vmProcesses}
|
|
Binaries: ${binaries}
|
|
|
|
Look for:
|
|
- Network ports/services exposed
|
|
- IPC mechanisms (named pipes, shared memory)
|
|
- File system access patterns
|
|
- Registry keys accessed
|
|
- Privilege levels and escalation paths
|
|
|
|
What can an attacker compromise from:
|
|
1. Another process on same machine
|
|
2. Network access
|
|
3. Unprivileged user account
|
|
|
|
Return threat model and attack vectors.`
|
|
},
|
|
{
|
|
key: 'vm-persistence',
|
|
prompt: `Review persistence mechanisms of agent and tray on SFTest.
|
|
|
|
Running processes: ${vmProcesses}
|
|
|
|
Check:
|
|
- Windows services configuration
|
|
- Startup entries (registry, startup folder)
|
|
- Scheduled tasks
|
|
- Can malware hijack these mechanisms?
|
|
- Are there weak permissions allowing replacement?
|
|
|
|
Return security risks in persistence layer.`
|
|
},
|
|
{
|
|
key: 'vm-communication',
|
|
prompt: `Analyze communication security between tray, agent, and server.
|
|
|
|
Context:
|
|
- Agent is Windows service (SYSTEM)
|
|
- Tray runs in user session
|
|
- Both communicate with Flask backend
|
|
|
|
Check:
|
|
- How do tray and service communicate?
|
|
- Is IPC authenticated/encrypted?
|
|
- Can user tamper with service via tray?
|
|
- Are network communications encrypted?
|
|
- Certificate validation?
|
|
|
|
Return exploitable communication vulnerabilities.`
|
|
}
|
|
]
|
|
|
|
const runtimeFindings = await parallel(
|
|
RUNTIME_DIMENSIONS.map(dim => () =>
|
|
agent(dim.prompt, {
|
|
label: `Runtime: ${dim.key}`,
|
|
phase: 'Runtime Security',
|
|
schema: FINDINGS_SCHEMA,
|
|
model: 'opus',
|
|
effort: 'high'
|
|
}).then(result => result ? result.findings.map(f => ({...f, component: 'vm-runtime'})) : [])
|
|
)
|
|
)
|
|
|
|
const allRuntimeFindings = runtimeFindings.filter(Boolean).flat()
|
|
log(`Found ${allRuntimeFindings.length} runtime security findings`)
|
|
|
|
// Phase 4: Performance Analysis
|
|
phase('Performance')
|
|
log('Analyzing performance and resource usage...')
|
|
|
|
const PERFORMANCE_DIMENSIONS = [
|
|
{
|
|
key: 'resource-usage',
|
|
prompt: `Analyze resource usage of agent and tray on VM.
|
|
|
|
VM Processes: ${vmProcesses}
|
|
|
|
Assess:
|
|
- CPU usage (acceptable for background service?)
|
|
- Memory footprint (is this lean or bloated?)
|
|
- Disk I/O patterns
|
|
- Network bandwidth usage
|
|
- Battery impact on laptops
|
|
|
|
Return performance issues and optimization opportunities.`
|
|
},
|
|
{
|
|
key: 'collection-efficiency',
|
|
prompt: `Review collection efficiency in endpoint plugin.
|
|
|
|
Plugin code: ${endpointPlugin}
|
|
|
|
Look for:
|
|
- Redundant data collection
|
|
- Inefficient queries
|
|
- Unnecessary polling
|
|
- Can collection frequency be reduced?
|
|
- Are we collecting data we don't use?
|
|
|
|
Return optimization recommendations with impact estimate.`
|
|
},
|
|
{
|
|
key: 'agent-optimization',
|
|
prompt: `Find optimization opportunities in C# agent.
|
|
|
|
Agent code: ${agentCode}
|
|
|
|
Look for:
|
|
- Polling intervals (can we increase them?)
|
|
- Unnecessary WMI queries
|
|
- Redundant process enumeration
|
|
- Memory leaks or inefficient allocations
|
|
- Can we batch operations?
|
|
- Threading inefficiencies
|
|
|
|
Return concrete optimizations with expected savings.`
|
|
},
|
|
{
|
|
key: 'tray-optimization',
|
|
prompt: `Find ways to reduce tray application footprint.
|
|
|
|
Tray code: ${trayCode}
|
|
|
|
Look for:
|
|
- UI refresh frequency
|
|
- Background work frequency
|
|
- Can it be more event-driven vs polling?
|
|
- Memory usage optimization
|
|
- Startup time reduction
|
|
|
|
Return optimizations prioritized by user impact.`
|
|
}
|
|
]
|
|
|
|
const performanceFindings = await parallel(
|
|
PERFORMANCE_DIMENSIONS.map(dim => () =>
|
|
agent(dim.prompt, {
|
|
label: `Perf: ${dim.key}`,
|
|
phase: 'Performance',
|
|
schema: FINDINGS_SCHEMA
|
|
})
|
|
)
|
|
)
|
|
|
|
const allPerfFindings = performanceFindings.filter(Boolean).flatMap(r => r.findings)
|
|
log(`Found ${allPerfFindings.length} performance opportunities`)
|
|
|
|
// Phase 5: Adversarial Verification
|
|
phase('Verify')
|
|
const allFindings = [...allCodeFindings, ...allRuntimeFindings, ...allPerfFindings]
|
|
const criticalFindings = allFindings.filter(f => f.severity === 'critical' || f.severity === 'high')
|
|
|
|
log(`Adversarially verifying ${criticalFindings.length} critical/high findings...`)
|
|
|
|
const verified = await pipeline(
|
|
criticalFindings,
|
|
async (finding) => {
|
|
const votes = await parallel([
|
|
() => agent(`Try to REFUTE this security finding. Be skeptical.
|
|
|
|
Finding: ${finding.title}
|
|
Component: ${finding.component}
|
|
Category: ${finding.category}
|
|
Description: ${finding.description}
|
|
|
|
Is this actually exploitable? Can it be reached? Is the impact real?
|
|
Default to confirmed=false if uncertain.`, {
|
|
phase: 'Verify',
|
|
schema: VERDICT_SCHEMA,
|
|
model: 'opus',
|
|
effort: 'high'
|
|
}),
|
|
() => agent(`ADVERSARIALLY verify this finding from a different angle.
|
|
|
|
Finding: ${finding.title}
|
|
Description: ${finding.description}
|
|
|
|
Consider: Is there a mitigating control we missed? Is the exploitation scenario realistic?
|
|
Be harsh in assessment.`, {
|
|
phase: 'Verify',
|
|
schema: VERDICT_SCHEMA,
|
|
model: 'opus',
|
|
effort: 'high'
|
|
})
|
|
])
|
|
|
|
const confirmedVotes = votes.filter(Boolean).filter(v => v.confirmed).length
|
|
const survives = confirmedVotes >= 1
|
|
|
|
return survives ? {
|
|
...finding,
|
|
verified: true,
|
|
verificationReasoning: votes.filter(Boolean).map(v => v.reasoning).join(' | ')
|
|
} : null
|
|
}
|
|
)
|
|
|
|
const confirmedFindings = verified.filter(Boolean)
|
|
log(`${confirmedFindings.length} findings confirmed after adversarial verification`)
|
|
|
|
// Phase 6: Synthesize Report
|
|
phase('Synthesize')
|
|
log('Generating comprehensive security and optimization report...')
|
|
|
|
const report = await agent(`Create a comprehensive security and optimization report.
|
|
|
|
VERIFIED CRITICAL/HIGH FINDINGS:
|
|
${JSON.stringify(confirmedFindings, null, 2)}
|
|
|
|
ALL FINDINGS SUMMARY:
|
|
- Code security: ${allCodeFindings.length}
|
|
- Runtime security: ${allRuntimeFindings.length}
|
|
- Performance: ${allPerfFindings.length}
|
|
|
|
Create report with:
|
|
|
|
# Executive Summary
|
|
- Overall security posture
|
|
- Most critical risks (top 3)
|
|
- Quick wins for security
|
|
- Performance optimization summary
|
|
|
|
# Security Findings
|
|
## Critical Issues (fix immediately)
|
|
## High Priority Issues
|
|
## Medium/Low Issues
|
|
|
|
# Runtime Environment Analysis
|
|
- Attack surface assessment
|
|
- VM security posture
|
|
- Inter-process communication risks
|
|
|
|
# Performance Optimization Plan
|
|
## Quick Wins (easy, high impact)
|
|
## Medium Effort Optimizations
|
|
## Long-term Improvements
|
|
- Estimated resource savings for each
|
|
|
|
# Recommendations
|
|
1. Immediate actions (this week)
|
|
2. Short-term (this sprint)
|
|
3. Long-term improvements
|
|
|
|
# Deployment Safety
|
|
- Are the agents safe to deploy as-is?
|
|
- What must be fixed before wider rollout?
|
|
|
|
Format as actionable guidance with specific file paths and line numbers where available.`, {
|
|
phase: 'Synthesize',
|
|
model: 'opus',
|
|
effort: 'high'
|
|
})
|
|
|
|
return {
|
|
report,
|
|
stats: {
|
|
codeSecurityFindings: allCodeFindings.length,
|
|
runtimeSecurityFindings: allRuntimeFindings.length,
|
|
performanceOpportunities: allPerfFindings.length,
|
|
criticalVerified: confirmedFindings.length
|
|
},
|
|
confirmedCritical: confirmedFindings,
|
|
allFindings: allFindings
|
|
} |