Cloud Infrastructure Detector Skill
Purpose
Detect cloud providers, PaaS platforms, and serverless services from IP attribution, DNS records, HTTP headers, and other signals.
Input
Raw signals from Phase 2:
-
ip_signals
-
Cloud provider IP range matches, ASN data
-
dns_signals
-
CNAME delegations, TXT verification records
-
http_signals
-
Cloud-specific headers
-
tls_signals
-
Certificate issuers (ACM, GCP, etc.)
-
repository_signals
-
IaC files, CI/CD configs
Technology Categories
Major Cloud Providers
Provider Detection Signals Weight
AWS IP ranges, X-Amz-*, CloudFront headers, ACM certs 40-45
Google Cloud IP ranges, X-Goog-*, GTS certs, cloud.google.com 40-45
Microsoft Azure IP ranges, Azure headers, Azure certs 40-45
DigitalOcean IP ranges (AS14061), do.co CNAME 35-40
Linode IP ranges (AS63949) 35-40
Vultr IP ranges (AS20473) 35-40
Oracle Cloud IP ranges, Oracle headers 35-40
IBM Cloud IP ranges, IBM headers 35-40
PaaS Platforms
Platform Detection Signals Implies Weight
Heroku herokuapp.com CNAME, Heroku headers AWS 40
Vercel vercel.app CNAME, X-Vercel-Id header AWS 40
Netlify netlify.app CNAME, X-NF-* headers AWS/GCP 40
Render onrender.com CNAME AWS/GCP 35
Railway railway.app CNAME GCP 35
Fly.io fly.dev CNAME
35
Platform.sh platform.sh CNAME
35
Google App Engine appspot.com GCP 40
AWS Elastic Beanstalk elasticbeanstalk.com AWS 40
Azure App Service azurewebsites.net Azure 40
Serverless Platforms
Platform Detection Signals Implies Weight
AWS Lambda lambda-url headers, API Gateway AWS 35
Cloudflare Workers workers.dev, CF-Worker header Cloudflare 40
Vercel Functions Vercel + /api/ routes Vercel 35
Netlify Functions Netlify + /.netlify/functions/ Netlify 35
Google Cloud Functions cloudfunctions.net GCP 35
Azure Functions azurewebsites.net/api Azure 35
Container Orchestration
Platform Detection Signals Weight
Kubernetes k8s patterns, Helm charts in repo 30
Amazon EKS eks.amazonaws.com 35
Google GKE container.googleapis.com 35
Azure AKS azmk8s.io 35
Docker Swarm docker-compose patterns 25
Managed Services
Service Detection Signals Provider Weight
AWS S3 s3.amazonaws.com, X-Amz-* AWS 35
AWS CloudFront cloudfront.net CNAME AWS 40
AWS RDS rds.amazonaws.com AWS 30
Google Cloud Storage storage.googleapis.com GCP 35
Azure Blob blob.core.windows.net Azure 35
Firebase firebaseapp.com, web.app GCP 40
Detection Logic
def detect_cloud_infrastructure(signals): results = []
# IP-based Cloud Detection
for ip_data in signals.ip_signals:
if ip_data.cloud_provider:
results.append({
"name": ip_data.cloud_provider,
"category": "Cloud Provider",
"signals": [
{
"type": "ip_attribution",
"value": f"IP {ip_data.ip} in {ip_data.cloud_provider} range",
"region": ip_data.region
}
],
"total_weight": 40
})
# CNAME-based PaaS Detection
for cname in signals.dns_signals.cname_records:
for paas in PAAS_PATTERNS:
if paas.pattern in cname.target:
results.append({
"name": paas.name,
"category": "PaaS",
"signals": [
{
"type": "dns_cname",
"value": f"CNAME → {cname.target}"
}
],
"implies": paas.implies,
"total_weight": paas.weight
})
# Header-based Detection
for header, value in signals.http_signals.headers.items():
# AWS Headers
if header.startswith('X-Amz-'):
add_if_not_exists(results, "AWS", "Cloud Provider", {
"type": "http_header",
"value": f"{header}: {value}"
}, 35)
# Vercel Header
if header == 'X-Vercel-Id':
add_if_not_exists(results, "Vercel", "PaaS", {
"type": "http_header",
"value": f"X-Vercel-Id present"
}, 40)
# Netlify Headers
if header.startswith('X-NF-'):
add_if_not_exists(results, "Netlify", "PaaS", {
"type": "http_header",
"value": f"{header} present"
}, 35)
# Certificate Issuer Detection
for cert in signals.tls_signals:
if "Amazon" in cert.issuer:
add_if_not_exists(results, "AWS Certificate Manager", "Managed Service", {
"type": "certificate",
"value": f"Issuer: {cert.issuer}"
}, 35)
add_if_not_exists(results, "AWS", "Cloud Provider", {
"type": "certificate",
"value": "ACM certificate implies AWS infrastructure"
}, 30)
if "Google Trust Services" in cert.issuer:
add_if_not_exists(results, "Google Cloud", "Cloud Provider", {
"type": "certificate",
"value": "GTS certificate implies GCP infrastructure"
}, 30)
# Repository IaC Detection
if signals.repository_signals:
for file in signals.repository_signals.files:
if "terraform" in file.lower():
# Parse terraform for provider
results.append({
"name": "Terraform",
"category": "IaC",
"signals": [{"type": "repository", "value": f"File: {file}"}],
"total_weight": 25
})
if "cloudformation" in file.lower() or file.endswith('.cfn.yml'):
results.append({
"name": "AWS CloudFormation",
"category": "IaC",
"implies": ["AWS"],
"signals": [{"type": "repository", "value": f"File: {file}"}],
"total_weight": 30
})
return results
Output
{ "skill": "cloud_infra_detector", "results": { "technologies": [ { "name": "AWS", "category": "Cloud Provider", "signals": [ { "type": "ip_attribution", "value": "IP 52.84.123.45 in AWS CloudFront range", "region": "us-east-1", "weight": 40 }, { "type": "certificate", "value": "ACM certificate detected", "weight": 30 } ], "total_weight": 70, "services_detected": ["CloudFront", "ACM"] }, { "name": "Vercel", "category": "PaaS", "signals": [ { "type": "dns_cname", "value": "CNAME → cname.vercel-dns.com", "weight": 35 }, { "type": "http_header", "value": "X-Vercel-Id header present", "weight": 40 } ], "total_weight": 75, "implies": ["AWS"] }, { "name": "Terraform", "category": "IaC", "signals": [ { "type": "repository", "value": "terraform/ directory found", "weight": 25 } ], "total_weight": 25 } ], "infrastructure_summary": { "primary_cloud": "AWS", "hosting_platform": "Vercel", "cdn": "Vercel Edge Network (AWS-backed)", "container_orchestration": null, "infrastructure_as_code": "Terraform" }, "regions_detected": ["us-east-1", "us-west-2"] } }
Cloud-Specific Signals
AWS
Headers: X-Amz-Cf-Id, X-Amz-Request-Id, X-Amz-Bucket-Region CNAME: cloudfront.net, elasticbeanstalk.com, s3.amazonaws.com ASN: AS16509, AS14618 Certificate: Amazon, AWS
Google Cloud
Headers: X-Goog-*, X-GUploader-UploadID CNAME: googleapis.com, appspot.com, run.app ASN: AS15169, AS396982 Certificate: Google Trust Services
Microsoft Azure
Headers: X-Azure-, X-MS- CNAME: azurewebsites.net, azure-api.net, blob.core.windows.net ASN: AS8075 Certificate: Microsoft
Error Handling
-
Multiple cloud providers: Report all with confidence
-
PaaS on cloud: Report both PaaS and underlying cloud
-
Uncertain attribution: Lower confidence, flag for correlation