| name | detecting-cryptomining-in-cloud |
| description | 本 skill 教导安全团队如何检测和响应云环境中未授权的加密货币挖矿活动。内容涵盖通过计算使用异常、挖矿池网络流量模式、GuardDuty 加密货币发现以及 EC2、ECS、EKS 和 Azure Automation 工作负载上的运行时进程监控来识别挖矿指标。
|
| domain | cybersecurity |
| subdomain | cloud-security |
| tags | ["cryptomining-detection","cloud-abuse","resource-hijacking","guardduty-crypto","cost-anomaly"] |
| version | 1.0.0 |
| author | mahipal |
| license | Apache-2.0 |
检测云中的加密货币挖矿
适用场景
- 云账单告警显示意外计算成本激增时
- GuardDuty 生成 CryptoCurrency 或 Impact 类型发现时
- 调查可能用于启动挖矿实例的被入侵 IAM 凭据时
- 监控容器工作负载中的未授权进程执行时
- 针对资源劫持攻击建立主动检测控制时
不适用于:合法的加密货币挖矿操作、物理硬件上的非云环境挖矿检测,或与挖矿活动无关的通用恶意软件分析。
前置条件
- 为 EC2、ECS 和 EKS 启用 Runtime Monitoring 的 Amazon GuardDuty
- 配置 CloudWatch 或 Azure Monitor 用于计算资源利用率告警
- 启用 VPC Flow Logs 用于分析到挖矿池 IP 的网络流量
- 配置 AWS Cost Anomaly Detection 或 Azure Cost Management 告警
工作流程
步骤 1:通过多重信号建立检测
跨四个信号类别部署检测:成本异常、计算资源利用率、网络流量和运行时进程。
aws ce create-anomaly-monitor \
--anomaly-monitor '{
"MonitorName": "EC2CostSpike",
"MonitorType": "DIMENSIONAL",
"MonitorDimension": "SERVICE"
}'
aws ce create-anomaly-subscription \
--anomaly-subscription '{
"SubscriptionName": "CryptoMiningAlert",
"MonitorArnList": ["arn:aws:ce::123456789012:anomalymonitor/monitor-id"],
"Subscribers": [{"Address": "security@company.com", "Type": "EMAIL"}],
"Threshold": 50.0,
"Frequency": "IMMEDIATE"
}'
aws cloudwatch put-metric-alarm \
--alarm-name HighCPUUtilization \
--namespace AWS/EC2 \
--metric-name CPUUtilization \
--statistic Average \
--period 300 \
--threshold 90 \
--comparison-operator GreaterThanThreshold \
--evaluation-periods 3 \
--alarm-actions "arn:aws:sns:us-east-1:123456789012:security-alerts"
步骤 2:监控 GuardDuty 加密货币发现
为针对 EC2、ECS 和 EKS 工作负载上加密货币挖矿活动的 GuardDuty 发现配置告警。
GuardDuty 加密挖矿关键发现类型:
CryptoCurrency:EC2/BitcoinTool.B - 到加密货币相关域名的网络连接
CryptoCurrency:Runtime/BitcoinTool.B - 运行时检测到挖矿进程执行
Impact:EC2/BitcoinTool.B - EC2 实例与已知比特币挖矿池通信
Impact:Runtime/CryptoMinerExecuted - 运行时 Agent 检测到加密挖矿程序执行
aws events put-rule \
--name CryptoMiningDetection \
--event-pattern '{
"source": ["aws.guardduty"],
"detail-type": ["GuardDuty Finding"],
"detail": {
"type": [
{"prefix": "CryptoCurrency:"},
{"prefix": "Impact:EC2/BitcoinTool"},
{"prefix": "Impact:Runtime/CryptoMiner"}
]
}
}'
aws events put-targets \
--rule CryptoMiningDetection \
--targets '[{
"Id": "CryptoAutoRemediate",
"Arn": "arn:aws:lambda:us-east-1:123456789012:function/crypto-remediate"
}]'
步骤 3:分析到挖矿池的网络流量
监控 VPC Flow Logs 和 DNS 查询,识别到已知加密货币挖矿池在常用端口(3333、4444、5555、8333、9999、14444)上运行的连接。
// Sentinel KQL 查询,检测挖矿池连接
AzureNetworkAnalytics_CL
| where TimeGenerated > ago(24h)
| where DestPort_d in (3333, 4444, 5555, 8333, 9999, 14444, 14433, 45700)
| summarize ConnectionCount = count(), BytesSent = sum(BytesSent_d)
by SrcIP_s, DestIP_s, DestPort_d, bin(TimeGenerated, 1h)
| where ConnectionCount > 10
| project TimeGenerated, SrcIP_s, DestIP_s, DestPort_d, ConnectionCount, BytesSent
cat << 'EOF' > mining-detection.sql
SELECT srcaddr, dstaddr, dstport, protocol,
COUNT(*) as connection_count,
SUM(bytes) as total_bytes
FROM vpc_flow_logs
WHERE dstport IN (3333, 4444, 5555, 8333, 9999, 14444)
AND action = 'ACCEPT'
AND start >= date_add('hour', -24, now())
GROUP BY srcaddr, dstaddr, dstport, protocol
HAVING COUNT(*) > 10
ORDER BY connection_count DESC
EOF
步骤 4:检测容器环境中的挖矿
监控 ECS 任务定义和 EKS Pod 部署,识别已知挖矿容器镜像和可疑进程执行。
aws ecs list-task-definitions --sort DESC --max-items 50 | \
jq -r '.taskDefinitionArns[]' | while read arn; do
aws ecs describe-task-definition --task-definition "$arn" \
--query 'taskDefinition.containerDefinitions[*].[name,image]' --output text
done
aws cloudtrail lookup-events \
--lookup-attributes AttributeKey=EventName,AttributeValue=RegisterTaskDefinition \
--start-time $(date -d '-24 hours' +%Y-%m-%dT%H:%M:%S) \
--query 'Events[*].[EventName,Username,EventTime]'
步骤 5:响应和遏制挖矿活动
确认挖矿后立即执行遏制操作,在终止恶意工作负载前保留取证证据。
import boto3
import json
def lambda_handler(event, context):
finding = event['detail']
resource_type = finding['resource']['resourceType']
if resource_type == 'Instance':
instance_id = finding['resource']['instanceDetails']['instanceId']
ec2 = boto3.client('ec2')
volumes = ec2.describe_instances(InstanceIds=[instance_id])
for reservation in volumes['Reservations']:
for instance in reservation['Instances']:
for vol in instance['BlockDeviceMappings']:
volume_id = vol['Ebs']['VolumeId']
ec2.create_snapshot(
VolumeId=volume_id,
Description=f'取证快照 - 加密货币挖矿 - {instance_id}',
TagSpecifications=[{
'ResourceType': 'snapshot',
'Tags': [{'Key': 'Incident', 'Value': 'CryptoMining'},
{'Key': 'SourceInstance', 'Value': instance_id}]
}]
)
ec2.modify_instance_attribute(
InstanceId=instance_id,
DisableApiTermination={: }
)
vpc_id = finding[][][][][]
isolation_sg = ec2.create_security_group(
GroupName=,
Description=,
VpcId=vpc_id
)
ec2.revoke_security_group_egress(
GroupId=isolation_sg[],
IpPermissions=[{: , : [{: }]}]
)
ec2.modify_instance_attribute(
InstanceId=instance_id,
Groups=[isolation_sg[]]
)
{: , : instance_id}
步骤 6:追踪初始访问向量
通过调查 CloudTrail 日志,确定攻击者如何获取访问权限以部署挖矿工作负载。常见向量包括被入侵的 IAM 凭据、暴露的访问密钥以及通过容器镜像进行的供应链攻击。
aws cloudtrail lookup-events \
--lookup-attributes AttributeKey=Username,AttributeValue=compromised-user \
--start-time 2025-02-01T00:00:00Z \
--query 'Events[?EventName==`ConsoleLogin` || EventName==`GetSessionToken`].[EventTime,SourceIPAddress,EventName]' \
--output table
for region in $(aws ec2 describe-regions --query 'Regions[*].RegionName' --output text); do
count=$(aws cloudtrail lookup-events \
--region $region \
--lookup-attributes AttributeKey=EventName,AttributeValue=RunInstances \
--start-time $(date -d '-7 days' +%Y-%m-%dT%H:%M:%S) \
--query 'Events | length(@)')
if [ "$count" -gt 0 ]; then
echo "区域: $region - RunInstances 调用数: $count"
fi
done
核心概念
| 术语 | 定义 |
|---|
| 加密劫持(Cryptojacking) | 未授权使用云计算资源挖掘加密货币,通常是门罗币(XMR),因其 CPU 友好的算法 |
| Stratum 协议(Stratum Protocol) | 在 TCP 端口 3333、4444 或自定义端口上运行的挖矿池通信协议,可在网络流日志中识别 |
| XMRig | 开源门罗币挖矿软件,常见于加密劫持攻击,通常以隐藏二进制文件部署在容器中 |
| API 终止保护(API Termination Protection) | 攻击者启用的 EC2 属性,用于阻止安全团队快速终止被入侵的挖矿实例 |
| Cost Anomaly Detection | AWS 服务,使用机器学习识别可能表明未授权资源使用的异常消费模式 |
| Runtime Monitoring(运行时监控) | GuardDuty 功能,部署 Agent 检测进程级别的活动,包括加密挖矿程序执行 |
| 攻击序列(Attack Sequence) | GuardDuty 扩展威胁检测发现,将凭据窃取、基础设施部署和挖矿执行关联为单个严重事件 |
工具与系统
- Amazon GuardDuty:通过网络流量分析、DNS 查询和运行时进程监控检测加密货币挖矿
- AWS Cost Anomaly Detection:基于机器学习的服务,识别挖矿实例部署导致的意外成本增加
- VPC Flow Logs:显示到挖矿池 IP 地址和端口连接的网络流量元数据
- Falco:开源运行时安全工具,用于检测容器中的加密挖矿进程执行
- Amazon Detective:基于图形的调查工具,用于追踪从初始访问到挖矿部署的攻击路径
常见场景
场景:被入侵的 IAM 凭据用于大规模 EC2 挖矿
场景背景:公开 GitHub 仓库中泄露的 IAM 凭据在 10 分钟内被用于在 8 个 AWS 区域启动 200 个 GPU 实例。攻击者在每个区域启用了 API 终止保护并禁用了 CloudTrail。
方法:
- AWS Cost Anomaly Detection 触发告警,显示每小时 EC2 费用超过 15,000 美元
- GuardDuty 生成 Stealth:IAMUser/CloudTrailLoggingDisabled 和 CryptoCurrency:EC2/BitcoinTool.B 发现
- 立即停用被入侵的 IAM 访问密钥
- 在所有受影响区域重新启用 CloudTrail 以恢复可见性
- 禁用所有 200 个实例的 API 终止保护并终止它们
- 在终止前对具有代表性的实例创建取证快照
- 检查 GitHub 提交历史,识别并删除暴露的凭据
- 部署 AWS Config 规则,防止禁用 CloudTrail 并强制使用 IMDSv2
常见陷阱:未检查所有 AWS 区域的挖矿实例会导致未被发现的区域中的矿机持续运行。在停止实例前未禁用 API 终止保护会浪费响应时间。
输出格式
加密货币挖矿事件响应报告
=======================================
事件 ID: INC-2025-0223-CRYPTO
检测时间: 2025-02-23T14:23:00Z
遏制时间: 2025-02-23T14:41:00Z(18 分钟)
初始访问:
向量: IAM 访问密钥暴露于公开 GitHub 仓库
凭据: AKIAIOSFODNN7EXAMPLE(用户: ci-deploy)
首次恶意活动: 2025-02-23T14:12:00Z
影响:
启动实例数: 200 个(p3.2xlarge GPU 实例)
受影响区域: 8 个(us-east-1, us-west-2, eu-west-1, eu-central-1 等)
估计成本: 4,200 美元(18 分钟,每小时 15,400 美元)
挖矿池: stratum+tcp://pool.supportxmr.com:3333
加密货币: 门罗币(XMR)
检测信号:
[14:15] GuardDuty: Stealth:IAMUser/CloudTrailLoggingDisabled(高)
[14:18] 成本异常: EC2 费用超基准 4,200%
[14:23] GuardDuty: CryptoCurrency:EC2/BitcoinTool.B(高)x 200
遏制操作:
[14:25] IAM 访问密钥 AKIAIOSFODNN7EXAMPLE 已停用
[14:30] CloudTrail 已在所有 8 个区域重新启用
[14:35] 200 个实例的 API 终止保护已禁用
[14:41] 所有 200 个实例已终止
修复措施:
- 被入侵的访问密钥已删除
- GitHub 仓库密钥扫描已启用
- AWS Config 规则已部署: cloudtrail-enabled(自动修复)
- SCP 已部署: 拒绝在未经审批的情况下为 GPU 实例类型执行 ec2:RunInstances