Serverless Security Threats
Function Permission Abuse
Threat Scenarios:
- Excessive permissions lead to lateral movement attacks
- Malicious code executes privileged operations
- Improper function calls form attack chains
Typical Cases:
- In 2020, a company’s Lambda function with excessive IAM permissions was exploited, leading to data breaches
- Attackers injected malicious code by polluting environment variables
Defense Measures:
(1) Principle of Least Privilege
# serverless.yml IAM permission configuration example
provider:
iamRoleStatements:
- Effect: Allow
Action:
- dynamodb:GetItem
- dynamodb:PutItem
Resource: "arn:aws:dynamodb:us-east-1:123456789012:table/Orders"
- Effect: Allow
Action:
- logs:CreateLogGroup
- logs:CreateLogStream
- logs:PutLogEvents
Resource: "*"
Optimization Techniques:
- Use
serverless-pseudo-parametersplugin to dynamically reference resources - Validate permission policies with AWS IAM Access Analyzer
- Regularly audit and tighten permissions
(2) Environment Variable Security
// Securely load environment variables
require('dotenv').config({ path: '../.env.production' });
// Encrypt sensitive information
const encryptedSecret = process.env.ENCRYPTED_SECRET;
const decrypted = decryptWithKMS(encryptedSecret);
Security Recommendations:
- Disable direct configuration of
AWS_ACCESS_KEY_IDandAWS_SECRET_ACCESS_KEY - Use AWS Secrets Manager to manage sensitive information
- Encrypt environment variables for storage
Data Leakage Risks
Threat Scenarios:
- Unencrypted data transmission
- Sensitive data inadvertently logged
- Insecure API responses exposing data
Typical Cases:
- In 2019, a company’s API Gateway misconfiguration returned the entire user database
- Logging credit card numbers led to PCI DSS violations
Defense Measures:
(1) Data Transmission Encryption
# API Gateway HTTPS enforcement configuration
provider:
apiGateway:
binaryMediaTypes:
- '*/*'
minimumCompressionSize: 0
endpointConfiguration:
types:
- REGIONAL
Security Configurations:
- Enforce HTTPS (redirect HTTP to HTTPS)
- Enable TLS 1.2+ encryption
- Configure HSTS headers
(2) Data Storage Encryption
// KMS encryption example
const AWS = require('aws-sdk');
const kms = new AWS.KMS();
async function encryptData(data) {
const params = {
KeyId: process.env.KMS_KEY_ID,
Plaintext: data
};
const { CiphertextBlob } = await kms.encrypt(params).promise();
return CiphertextBlob.toString('base64');
}
Encryption Strategies:
- Static data: Use KMS or SSE encryption
- Data in transit: TLS 1.2+
- Sensitive fields: Application-layer encryption
(3) Log Security
# serverless.yml log configuration
provider:
logging:
http: true
level: INFO
exclude:
- "password"
- "credit_card"
Log Handling Recommendations:
- Implement structured logging
- Sanitize sensitive data
- Control log access
- Regularly audit logs
DDoS and Cold Start Attacks
Threat Scenarios:
- API-layer DDoS attacks causing service unavailability
- Malicious requests triggering cold start storms
- Resource exhaustion attacks
Typical Cases:
- In 2021, an API Gateway without rate limiting was paralyzed by a DDoS attack
- Attackers triggered cold starts with high-frequency calls, causing service delays
Defense Measures:
(1) DDoS Protection
# CloudFront DDoS protection configuration
resources:
Resources:
CloudFrontDistribution:
Type: AWS::CloudFront::Distribution
Properties:
DistributionConfig:
ViewerCertificate:
CloudFrontDefaultCertificate: true
HttpVersion: http2
PriceClass: PriceClass_100
WebACLId: !Ref WAFWebACL
Protection Strategies:
- Use AWS Shield Advanced
- Configure WAF rules (rate limiting, IP blacklisting)
- Enable CloudFront caching
(2) Cold Start Mitigation
# Provisioned Concurrency configuration
provider:
provisionedConcurrency: 5 # Number of pre-warmed instances
Optimization Solutions:
- Use Provisioned Concurrency to maintain active instances
- Implement health check endpoints
- Optimize initialization code (lazy loading)
- Use Lambda@Edge to preprocess requests
Security Design
IAM Permission Management
Design Principles:
- Principle of least privilege
- Separation of duties
- Permission auditing
Implementation Example:
# serverless.yml IAM configuration
provider:
iamRoleStatements:
- Effect: Allow
Action:
- s3:GetObject
- s3:PutObject
Resource: "arn:aws:s3:::my-bucket/*"
- Effect: Deny
Action:
- s3:DeleteObject
Resource: "*"
Best Practices:
- Validate policies with AWS IAM Access Analyzer
- Implement permission boundaries
- Regularly rotate IAM credentials
- Use Service Control Policies (SCPs) to restrict account permissions
Data Encryption and Signing
Encryption Layers:
- Transport Layer: TLS 1.2+
- Storage Layer: KMS/SSE
- Application Layer: Field-level encryption
Implementation Example:
// KMS encryption/decryption example
const AWS = require('aws-sdk');
const kms = new AWS.KMS();
async function encryptField(data) {
const params = {
KeyId: process.env.KMS_KEY_ID,
Plaintext: data
};
const { CiphertextBlob } = await kms.encrypt(params).promise();
return CiphertextBlob.toString('base64');
}
async function decryptField(encryptedData) {
const params = {
CiphertextBlob: Buffer.from(encryptedData, 'base64')
};
const { Plaintext } = await kms.decrypt(params).promise();
return Plaintext.toString('utf-8');
}
Signing Implementation:
// Request signing example
const crypto = require('crypto');
function signRequest(data, secret) {
return crypto
.createHmac('sha256', secret)
.update(JSON.stringify(data))
.digest('hex');
}
VPC and Network Isolation
VPC Configuration Example:
# serverless.yml VPC configuration
provider:
vpc:
securityGroupIds:
- sg-12345678
subnetIds:
- subnet-12345678
- subnet-87654321
Network Isolation Strategies:
- Public Subnets: API Gateway/NAT Gateway
- Private Subnets: Databases/internal services
- Security Groups: Minimal open port principle
VPC Best Practices:
- Use NAT Gateway instead of NAT Instance
- Configure VPC Flow Logs to monitor traffic
- Implement network ACL restrictions
- Use PrivateLink for VPC endpoint connections
Security Best Practices
Function Least Privilege Principle
Implementation Steps:
- Divide Lambda execution roles by function
- Use AWS IAM Policy conditions to restrict access
- Regularly audit permission usage
Example Policy:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"dynamodb:GetItem",
"dynamodb:Query"
],
"Resource": "arn:aws:dynamodb:us-east-1:123456789012:table/Orders",
"Condition": {
"ForAllValues:StringEquals": {
"dynamodb:LeadingKeys": ["${aws:userid}"]
}
}
}
]
}
Permission Optimization Tools:
- AWS IAM Access Analyzer
- Policy Sentry
- Cloud Custodian
API Authentication and Authorization (JWT/OAuth)
JWT Verification Example:
const jwt = require('jsonwebtoken');
async function authenticate(event) {
const token = event.headers.Authorization?.split(' ')[1];
if (!token) throw new Error('Unauthorized');
try {
const decoded = jwt.verify(token, process.env.JWT_PUBLIC_KEY);
return decoded;
} catch (err) {
throw new Error('Invalid token');
}
}
OAuth2 Implementation:
const axios = require('axios');
async function getAccessToken() {
const response = await axios.post('https://auth.example.com/oauth/token', {
grant_type: 'client_credentials',
client_id: process.env.CLIENT_ID,
client_secret: process.env.CLIENT_SECRET
});
return response.data.access_token;
}
Authorization Strategies:
- Role-Based Access Control (RBAC)
- Attribute-Based Access Control (ABAC)
- OAuth2 Scope restrictions
Logging and Security Auditing
Structured Logging Example:
// Structured logging
const winston = require('winston');
const logger = winston.createLogger({
level: 'info',
format: winston.format.json(),
transports: [
new winston.transports.Console(),
new winston.transports.File({ filename: 'app.log' })
]
});
function logRequest(event) {
logger.info('API Request', {
path: event.path,
method: event.httpMethod,
headers: redactHeaders(event.headers),
queryStringParameters: event.queryStringParameters
});
}
Security Audit Key Points:
- Log all API calls and response statuses
- Record IAM permission usage
- Log sensitive operations (data modification, deletion)
- Implement log rotation and retention policies
Log Analysis Tools:
- AWS CloudWatch Logs Insights
- ELK Stack (Elasticsearch, Logstash, Kibana)
- Splunk
Comprehensive Security Strategies
Secure Development Lifecycle (SDL)
SDL Phases:
- Requirements Analysis: Identify security requirements
- Design: Security architecture review
- Development: Secure coding standards
- Testing: Security testing (penetration testing, SAST/DAST)
- Deployment: Security configuration checks
- Operations: Continuous monitoring and response
Toolchain:
- Static Analysis: ESLint, Bandit
- Dynamic Analysis: OWASP ZAP, Burp Suite
- Dependency Scanning: Snyk, Dependabot
Security Monitoring and Response
Monitoring Metrics:
- Anomalous API call patterns
- Abnormal permission usage
- Data access anomalies
- Network traffic anomalies
Response Process:
- Detect security incident
- Isolate affected resources
- Collect evidence (logs, network traffic)
- Analyze root cause
- Implement remediation measures
- Restore services
- Conduct post-incident analysis (write report, improve processes)
Compliance Assurance
Common Compliance Standards:
- GDPR (Data Protection)
- HIPAA (Healthcare Data)
- PCI DSS (Payment Card Industry)
- SOC 2 (Trust Services)
Compliance Implementation Recommendations:
- Data classification and grading
- Access control auditing
- Data encryption in transit and at rest
- Security incident response plan
- Regular compliance audits



