DVSA Security Audit Report

Damn Vulnerable Serverless Application - Security Assessment

Assessment Date: 2024
Application: OWASP DVSA (Damn Vulnerable Serverless Application)
Architecture: AWS Serverless (Lambda, API Gateway, DynamoDB, S3, Cognito)
Risk Rating: CRITICAL – Multiple exploitable vulnerabilities present


Executive Summary

DVSA is an intentionally vulnerable serverless application designed for security training. This audit identified 15+ critical or high-severity vulnerabilities exhibiting common serverless security anti-patterns. Key risks include remote code execution (RCE), command and code injection, insecure deserialization, and overprivileged IAM policies.


Critical Vulnerabilities (CVSS 9.0–10.0)

1. Remote Code Execution (RCE) via eval() in Admin Shell [CVSS: 10.0]

Location: backend/functions/admin/admin_shell.js

Description:
A critical vulnerability allows arbitrary JavaScript code execution through eval() in the admin_shell.js Lambda. Admin users can execute any code on the Lambda runtime.

Vulnerable Code:
if (cmd) {
    try {
        eval(cmd);  // CRITICAL: Arbitrary code execution
        res = "ok";
    } catch (error) {
        console.error(error);
    }
}
Impact: Exploitation Example:
POST /admin-shell
{
  "userId": "<admin_id>",
  "cmd": "require('child_process').execSync('cat /var/task/*').toString()"
}
Remediation:

2. Command Injection in Feedback Upload Handler [CVSS: 9.8]

Location: backend/functions/processing/feedback_uploads.py

Description:
Uses os.system() with user-controlled filenames from S3 event notifications, allowing arbitrary command execution.

Vulnerable Code:
filename = parse.unquote_plus(event["Records"][0]["s3"]["object"]["key"])
os.system("touch /tmp/{} /tmp/{}.txt".format(filename, filename))  # COMMAND INJECTION
Impact: Remediation:

3. Insecure Deserialization via jsonpickle [CVSS: 9.8]

Location: backend/functions/admin/admin_update_orders.py

Description:
Uses jsonpickle.decode() on user-controlled input, enabling remote code execution through Python object deserialization.

Vulnerable Code:
unpickled = jsonpickle.decode(json.dumps(response["Item"], cls=DecimalEncoder))
Impact: Remediation:

4. Code Injection in Admin Order Queries [CVSS: 9.1]

Location: backend/functions/admin/admin_get_orders.py

Description:
User input is concatenated into Python code and executed via eval() in the DynamoDB FilterExpression.

Vulnerable Code:
fe = "Attr('paymentTS').between(dateFrom, dateTo)"
orderId = "" if 'orderId' not in event else " & Attr('orderId').eq(event['orderId'])"
fe = fe + orderId + userId + status
response = table.scan(FilterExpression=eval(fe))  # CODE INJECTION
Impact: Remediation:

5. SQL Injection in Receipt Generation [CVSS: 9.1]

Location: backend/functions/processing/create_receipt.py

Description:
SQLite queries built using string concatenation with user-controlled IDs.

Vulnerable Code:
res = cur.execute("SELECT itemId, name, price FROM inventory WHERE itemId = " + item_id + ";")
Impact: Remediation:

6. Command Injection in Email Receipt Handler [CVSS: 9.1]

Location: backend/functions/processing/send_receipt_email.py

Description:
User-controlled date or metadata flows into os.system() through shell string formatting.

Vulnerable Code:
os.system(f'echo -e "\t----------------------\n\t\tDate: {date}" >> ' + download_path)
Impact: Remediation:

High Severity Vulnerabilities (CVSS 7.0–8.9)

7. Privilege Escalation via User Attribute Manipulation [CVSS: 8.8]

Location: backend/functions/user/user_create.py

Description:
Users can make themselves admins by supplying an Admin: true attribute during registration.

Vulnerable Code:
if "Admin" in event["request"]["userAttributes"] and event["request"]["userAttributes"]["Admin"] == True:
    isAdmin = True
Impact: Remediation:

8. IDOR in Order Retrieval [CVSS: 8.6]

Location: backend/functions/order/get_order.py

Description:
The isAdmin parameter is user-controlled, allowing any user to access any order by passing isAdmin: true.

Vulnerable Code:
is_admin = event.get("isAdmin", False)
if is_admin:
    response = table.query(KeyConditionExpression=Key('orderId').eq(orderId))
Impact: Remediation:

9. Overly Permissive IAM Policies – DynamoDB Access on All Tables [CVSS: 8.5]

Location: template.yml

Description:
Multiple Lambda functions granted DynamoDB CRUD on '*' (all tables) rather than specific resources.

Affected Functions: Vulnerable Configuration:
Policies:
  - DynamoDBCrudPolicy:
      TableName: '*'
Impact: Remediation:

10. Overly Permissive IAM Policies – S3 Full Access [CVSS: 8.5]

Location: template.yml

Description:
FeedbackUploadFunction has AmazonS3FullAccess and AWSLambda_FullAccess, SendReceiptFunction has S3CrudPolicy on all buckets.

Vulnerable Configuration:
FeedbackUploadFunction:
  Policies:
    - AWSLambda_FullAccess
    - AmazonS3FullAccess

SendReceiptFunction:
  Policies:
    - S3CrudPolicy:
        BucketName: '*'
Impact: Remediation:

11. Weak Authentication – Cognito Password Policy [CVSS: 7.5]

Location: template.yml

Description:
Cognito User Pool is configured with minimum 6-character passwords and no complexity requirements.

Vulnerable Configuration:
PasswordPolicy:
  RequireLowercase: false
  RequireSymbols: false
  RequireNumbers: false
  MinimumLength: 6
  RequireUppercase: false
Impact: Remediation:

Medium Severity Vulnerabilities (CVSS 5.0–6.9)

12. Arbitrary File Read in Admin Shell [CVSS: 6.5]

Location: backend/functions/admin/admin_shell.js

Description:
Authenticated admin users can read arbitrary files on the Lambda's disk.

Vulnerable Code:
const filename = "/tmp/"+ body.file;
res = fs.readFileSync(filename, 'utf8');
Impact: Remediation:

13. Server-Side Request Forgery (SSRF) in Admin Tweet [CVSS: 6.5]

Location: backend/functions/admin/admin_tweet.py

Description:
The Twitter API endpoint is constructed from user input with no validation, allowing internal requests (e.g., to AWS instance metadata).

Vulnerable Code:
action = event['api']
url = '{}{}'.format(twitter_api, action)
req = urllib2.Request(url, data=data, headers=auth_header)
Impact: Remediation:

14. Path Traversal in Admin Receipt Download [CVSS: 6.3]

Location: backend/functions/admin/admin_get_receipts.py

Description:
Unvalidated year/month/day parameters are used to construct S3 prefixes.

Vulnerable Code:
prefix = "{}/{}/{}".format(y, m, d)
Impact: Remediation:

15. CORS Misconfiguration [CVSS: 5.8]

Location: template.yml

Description:
API Gateway allows all origins (*).

Vulnerable Configuration:
Cors:
  AllowMethods: "'*'"
  AllowHeaders: "'*'"
  AllowOrigin: "'*'"
Impact: Remediation:

Additional Security Issues


Infrastructure & Configuration Risks

IAM Policy Summary of Excessive Permissions:

Function Excessive Permission Risk
OrderCompleteFunction DynamoDBCrudPolicy on '*' Access to all DynamoDB tables
CreateReceiptFunction DynamoDBCrudPolicy on '*' Access to all DynamoDB tables
SendReceiptFunction S3CrudPolicy on '*' Access to all S3 buckets
SendReceiptFunction DynamoDBCrudPolicy on '*' Access to all DynamoDB tables
FeedbackUploadFunction AWSLambda_FullAccess Full Lambda management access
FeedbackUploadFunction AmazonS3FullAccess Full S3 access account-wide
OrderManagerFunction CloudWatchLogsFullAccess Full CloudWatch Logs access
OrderManagerFunction AmazonCognitoPowerUser User management privileges

Cognito Security Issues:

API Gateway Issues:


Recommendations

Immediate Actions (Critical)

  1. Remove or disable admin_shell.js – The eval() backdoor is an extreme risk
  2. Replace os.system() calls with safe Python file operations
  3. Remove jsonpickle; use standard json library
  4. Fix IAM policies to use resource ARNs instead of wildcards

Short-term (High Priority)

  1. Implement input validation with allowlists for all user data
  2. Fix SQL injection in create_receipt.py using parameterized queries
  3. Implement proper authorization – verify permissions based on JWTs, not request parameters
  4. Strengthen Cognito password policy (12+ chars, mixed case, numbers, symbols)
  5. Restrict CORS to explicit origins only

Long-term (Security Hardening)

  1. Deploy AWS WAF configured for the OWASP Top 10
  2. Enable CloudTrail for comprehensive audit logging
  3. Implement VPC endpoints for private service communication
  4. Enable DynamoDB encryption at rest and in transit
  5. Adopt secrets management via AWS Secrets Manager or Parameter Store
  6. Add security headers (HSTS, CSP, X-Frame-Options) to API Gateway responses

Compliance Considerations

This application violates several security standards:


Conclusion

DVSA contains intentional vulnerabilities for educational purposes only. If ever deployed with production credentials or customer data, it presents critical security risks. The combination of RCE, command injection, and excessive IAM privileges could easily result in a total AWS account compromise.

Risk Rating: CRITICAL – DO NOT DEPLOY IN PRODUCTION ENVIRONMENTS


Report generated by automated security analysis of the DVSA codebase.