We take security seriously at AVA. If you discover a security vulnerability, please report it responsibly.
Please do NOT report security vulnerabilities through public GitHub issues.
Instead, please report them via one of the following methods:
- Email: Send details to the repository maintainers
- GitHub Security Advisories: Use the "Report a vulnerability" button in the Security tab
When reporting a vulnerability, please include:
- Description of the vulnerability
- Steps to reproduce the issue
- Potential impact assessment
- Any suggested fixes (optional)
- Initial Response: Within 48 hours
- Status Update: Within 7 days
- Resolution Target: Based on severity (Critical: 7 days, High: 30 days, Medium: 90 days)
This project is designed to use AWS IAM roles and the default credential chain. Never hardcode AWS credentials in configuration files or source code.
Recommended credential methods:
- IAM roles for Amazon EC2
- IAM roles for AWS Lambda
- IAM roles for Amazon ECS tasks
- Environment variables (for local development only)
- AWS CLI configuration profiles
When deploying this solution:
- Network Security: Deploy in private subnets where possible; use VPC endpoints for AWS services
- IAM Policies: Review and customize IAM policies to follow least privilege principles
- Encryption: Enable encryption at rest and in transit for all data stores
- Logging: Enable CloudTrail and access logging for audit purposes
- Authentication: Amazon Cognito JWT validation ships enabled. Set
ENVIRONMENTto your real environment name (production,staging, ...). The control plane also carries a development bypass that returns a hardcoded admin without reading the presented credential; it is gated so that it can only ever activate whenENVIRONMENTisdevelopment,dev,local, ortest, and the resolution is logged at startup underAUTH-GATE. Confirm that line says refusing before exposing an endpoint. - Outbound requests: URLs the platform is asked to fetch on a caller's behalf (OIDC
discovery documents, A2A agent cards, SaaS connector endpoints) are validated against
server-side request forgery: the host is resolved, non-public addresses are refused, the
connection is pinned to the validated address to defeat DNS rebinding, and credentials
are dropped across a cross-host redirect. To reach a genuinely private issuer, add its
range to
SAFE_FETCH_ALLOWED_PRIVATE_CIDRSrather than removing the check; no value of that setting can expose the instance metadata endpoint. - Error responses: A 500 from the deployment and agent APIs carries a fixed summary and
an
error_ref, not the underlying exception. This is deliberate rather than terse: these routes wrap boto3 calls, and botocore copies the service's own message verbatim, so anAccessDeniedreads "User: <caller arn> is not authorized to perform: <action> on resource: <target arn>" - the account id, the ECS task role, and the target. To diagnose a failure, search the backend logs for theerror_reffrom the response; the full traceback is there. Note that a failure recorded against a deployment is readable later throughGET /deployments/{id}/status, so the same rule applies to what gets stored, not only to what gets returned. - Response sanitization: the governance surfaces read a customer's own AWS estate, so
almost every payload starts life containing account identifiers.
backend/src/core/security_utils.pyis the single place that strips them, and 27 backend modules import from it: 12-digit account ids become************, a full ARN is reduced to its resource tail, and CVE ids, IPv4 addresses, S3 bucket URIs, caller identities and STS session suffixes are redacted from free text such as security-finding titles. This is an invariant, not a cleanup pass - a new route that returns an ARN, a finding title, a budget name or a boto3 error string must mask it at the point it is serialized. The helpers deliberately preserve the governance signal (severity, resource type, a correlatable role name) so masking does not cost the surface its meaning.
The repository ships a demo-oriented default posture. These are known gaps rather than oversights; close them before exposing a deployment.
| Gap | Where | What to do |
|---|---|---|
| Interactive API docs are always served and are not behind auth | backend/src/main.py sets docs_url / redoc_url / openapi_url unconditionally |
Set them to None outside development, or keep the API off the public internet |
| No security response headers | Neither the bundled frontend/nginx.conf nor the FastAPI app sets Content-Security-Policy, Strict-Transport-Security, X-Frame-Options, or X-Content-Type-Options |
Add them at your edge (CloudFront, ALB, or the reverse proxy you front the app with) |
The session JWT is held in browser localStorage |
frontend/src/api/client.ts |
Any cross-site scripting flaw can exfiltrate a live session. Moving the token to an HttpOnly, Secure, SameSite cookie is the durable fix |
| Wildcard CORS in the bundled API Gateway module | infrastructure/modules/api_gateway/main.tf sets allow_origins = ["*"] and allow_headers = ["*"] |
Restrict to your own origins. Note the application-level CORS in main.py is already a tight allowlist (settings.CORS_ORIGINS); only the IaC module is permissive |
| DynamoDB point-in-time recovery and deletion protection are off on most control-plane tables | infrastructure/environments/dev/main.tf |
Deliberate, so terraform destroy works for dev teardown. Enable both before the stack backs anything audited - see platform/control_plane/infrastructure/README.md for which tables hold non-regenerable evidence |
This project uses Amazon Bedrock for AI/ML capabilities. Important considerations:
- Human Review: AI outputs are advisory and should be reviewed by qualified personnel
- Input Validation: Validate and sanitize inputs before sending to AI models
- Output Filtering: Review AI outputs before using in production workflows
- Prompt Injection: Be aware of prompt injection risks; implement appropriate safeguards
- Data Privacy: Ensure customer data handling complies with applicable regulations
The AVA deploys a multi-agent AI system with the following components:
- Compute layer (Amazon EC2, AWS Lambda, or AgentCore Runtime)
- AI layer (Amazon Bedrock with Claude models)
- Data layer (Amazon S3 for customer data)
| Risk Category | Risk | Mitigation |
|---|---|---|
| Authentication | Development auth bypass returns an admin without checking the credential, and defaults to on | Gated on ENVIRONMENT; fails closed on any unrecognised value; resolution logged at startup |
| Network | Caller-supplied URLs could reach internal addresses or instance metadata (SSRF) | Resolve-and-validate, connection pinned to the validated address, credentials dropped on cross-host redirect |
| Information disclosure | An AWS error returned to a caller names the account, the task role and the target resource | API responses carry a fixed summary plus an error_ref; the exception and its traceback go only to the backend log |
| Information disclosure | Governance payloads read from a customer's AWS estate carry account ids, ARNs, CVEs and caller identities | Centralized masking in core/security_utils.py, applied where responses are serialized |
| Session management | The session JWT is readable by any script in the page (localStorage) |
Known limitation; treat any XSS as session compromise. See Hardening required before production |
| Data Security | Customer data in S3 | Encryption at rest, TLS enforcement, access logging |
| IAM | Overly permissive policies | Scoped policies with least privilege |
| AI/ML | Prompt injection | Input validation, output review |
| AI/ML | Biased outputs | Human review required for financial decisions |
For financial services deployments, consider:
- Fair lending regulations (ECOA, Fair Credit Reporting Act)
- Data privacy regulations (GDPR, CCPA)
- Industry-specific requirements (PCI-DSS if handling payment data)
| Version | Supported |
|---|---|
| 1.x | ✅ |
Security updates are released as patch versions. We recommend:
- Subscribing to repository notifications
- Regularly updating dependencies
- Reviewing release notes for security-related changes
We appreciate the security research community's efforts in responsibly disclosing vulnerabilities.