detecting-cryptomining-in-cloud について
クラウド環境での不正な暗号資産マイニングを調査する、クラウドセキュリティおよびインシデント対応担当者向けのスキルガイドです。コスト、計算リソース、ネットワーク、ランタイムのシグナルを組み合わせ、初期侵入経路の追跡も扱います。
主な機能
- 01コスト、計算、ネットワーク、プロセスのシグナルを相関
- 02GuardDuty の暗号資産関連検出結果を分析
- 03マイニングプールへの接続を調査
- 04ECS と EKS のコンテナを監視
- 05マイニングを封じ込め初期アクセスを追跡
活用シーン
- 01予期しないクラウド計算コストの調査
- 02GuardDuty のマイニング検出への対応
- 03コンテナ内の不審なマイニングプロセスの確認
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ mukul975/ anthropic-cybersecurity-skills --skill detecting-cryptomining-in-cloudインストール後、Claude Code で/detecting-cryptomining-in-cloudを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
LICENSEreferences/api-reference.mdscripts/agent.py詳細
クラウドでの暗号資産マイニングの検出
使用するタイミング
- クラウドの請求アラートで、予期しないコンピューティングコストの急増が示された場合
- GuardDuty が CryptoCurrency または Impact の検出結果タイプを生成した場合
- マイニングインスタンスの起動に使われた可能性のある、侵害された IAM 認証情報を調査する場合
- コンテナワークロードで不正なプロセス実行を監視する場合
- リソースハイジャック攻撃に対する事前検知コントロールを確立する場合
使用しないでください。正当な暗号資産マイニングの運用、物理ハードウェア上でのクラウド外のマイニング検出、またはマイニング活動と無関係な一般的なマルウェア分析には使用しないでください。
前提条件
- EC2、ECS、EKS の Runtime Monitoring を有効にした Amazon GuardDuty
- コンピューティング使用率のアラートを設定した CloudWatch または Azure Monitor
- マイニングプールの IP へのネットワークトラフィック分析用に VPC Flow Logs を有効化
- AWS Cost Anomaly Detection または Azure Cost Management のアラートを設定
ワークフロー
ステップ 1:複数のシグナルで検出を確立する
コスト異常、コンピューティング使用率、ネットワークトラフィック、ランタイムプロセスの 4 つのシグナルカテゴリ全体に検出を導入します。
# AWS Cost Anomaly Detection
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": "[email protected]", "Type": "EMAIL"}],
"Threshold": 50.0,
"Frequency": "IMMEDIATE"
}'
# CloudWatch alarm for CPU utilization spike
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 の CryptoCurrency 検出結果を監視する
EC2、ECS、EKS のワークロードにおける暗号資産マイニング活動に特化した GuardDuty の検出結果に対するアラートを設定します。
暗号資産マイニングに関する主な GuardDuty の検出結果タイプ:
CryptoCurrency:EC2/BitcoinTool.B- 暗号資産関連ドメインへのネットワーク接続CryptoCurrency:Runtime/BitcoinTool.B- マイニングプロセスの実行をランタイムで検出Impact:EC2/BitcoinTool.B- EC2 インスタンスが既知の Bitcoin マイニングプールと通信Impact:Runtime/CryptoMinerExecuted- ランタイムエージェントが暗号資産マイニングバイナリの実行を検出
# EventBridge rule for cryptocurrency findings
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"}
]
}
}'
# Auto-remediation Lambda for crypto findings
aws events put-targets \
--rule CryptoMiningDetection \
--targets '[{
"Id": "CryptoAutoRemediate",
"Arn": "arn:aws:lambda:us-east-1:123456789012:function/crypto-remediate"
}]'
ステップ 3:マイニングプールへの接続についてネットワークトラフィックを分析する
一般的なポート(3333、4444、5555、8333、9999、14444)で稼働する既知の暗号資産マイニングプールへの接続について、VPC Flow Logs と DNS クエリを監視します。
// Sentinel KQL query for mining pool connections
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
# AWS Athena query for VPC Flow Logs mining pool detection
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 ポッドのデプロイを監視します。
# Check for recently registered ECS task definitions with suspicious images
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
# Known malicious mining images to watch for:
# - Images with high pull counts from unknown registries
# - Images containing xmrig, cpuminer, minergate, or ccminer binaries
# - Images with entrypoint pointing to /tmp/.hidden or /dev/shm paths
# Monitor CloudTrail for suspicious ECS/EKS activity
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:マイニング活動に対応し、封じ込める
マイニングが確認された場合は、悪意のあるワークロードを終了する前にフォレンジック証拠を保全し、直ちに封じ込め措置を実施します。
# Auto-remediation Lambda for cryptomining incidents
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')
# Snapshot EBS volumes for forensics before isolation
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'Forensic snapshot - crypto mining - {instance_id}',
TagSpecifications=[{
'ResourceType': 'snapshot',
'Tags': [{'Key': 'Incident', 'Value': 'CryptoMining'},
{'Key': 'SourceInstance', 'Value': instance_id}]
}]
)
# Disable API termination protection if set by attacker
ec2.modify_instance_attribute(
InstanceId=instance_id,
DisableApiTermination={'Value': False}
)
# Isolate instance with empty security group
vpc_id = finding['resource']['instanceDetails']['networkInterfaces'][0]['vpcId']
isolation_sg = ec2.create_security_group(
GroupName=f'crypto-isolation-{instance_id}',
Description='Cryptomining isolation - no traffic allowed',
VpcId=vpc_id
)
# Revoke default egress rule
ec2.revoke_security_group_egress(
GroupId=isolation_sg['GroupId'],
IpPermissions=[{'IpProtocol': '-1', 'IpRanges': [{'CidrIp': '0.0.0.0/0'}]}]
)
ec2.modify_instance_attribute(
InstanceId=instance_id,
Groups=[isolation_sg['GroupId']]
)
return {'status': 'contained', 'instance': instance_id}
ステップ 6:初期アクセス経路を追跡する
攻撃者がマイニングワークロードをデプロイするためにどのようにアクセス権を得たかを特定するため、CloudTrail ログを調査します。一般的な侵入経路には、侵害された IAM 認証情報、公開されたアクセスキー、コンテナイメージを介したサプライチェーン攻撃があります。
# Trace the initial access for the compromised identity
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
# Check for RunInstances calls in unusual regions
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: $region - RunInstances calls: $count"
fi
done
主な概念
| 用語 | 定義 |
|---|---|
| クリプトジャッキング | クラウドのコンピューティングリソースを不正に使用して暗号資産をマイニングする行為です。通常は、CPU 向けのアルゴリズムを採用する Monero(XMR)が対象です |
| Stratum プロトコル | TCP ポート 3333、4444、またはカスタムポートで動作するマイニングプール通信プロトコルです。ネットワークフローログで特定できます |
| XMRig | クリプトジャッキング攻撃でよく見られるオープンソースの Monero マイニングソフトウェアです。多くの場合、コンテナ内の隠しバイナリとしてデプロイされます |
| API Termination Protection | 侵害されたマイニングインスタンスをセキュリティチームが迅速に終了できないよう、攻撃者が有効にする EC2 属性です |
| Cost Anomaly Detection | 機械学習を使用して、不正なリソース使用を示す可能性のある異常な支出パターンを特定する AWS サービスです |
| Runtime Monitoring | エージェントをデプロイして、暗号資産マイニングバイナリの実行を含むプロセスレベルのアクティビティを検出する GuardDuty の機能です |
| Attack Sequence | 認証情報の窃取、インフラストラクチャのデプロイ、マイニングの実行を関連付け、単一の Critical イベントとして扱う GuardDuty Extended Threat Detection の検出結果です |
ツールとシステム
- 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 のコミット履歴を確認し、流出した認証情報を特定して削除します
- CloudTrail の無効化を防止し、IMDSv2 の使用を強制する AWS Config ルールをデプロイします
注意点:すべての AWS リージョンでマイニング用インスタンスを確認しないと、見落としたリージョンでマイナーが稼働し続けることになります。インスタンスの停止を試みる前に API 終了保護を無効にしないと、対応時間が無駄になります。
出力形式
Cryptomining Incident Response Report
=======================================
Incident ID: INC-2025-0223-CRYPTO
Detection Time: 2025-02-23T14:23:00Z
Containment Time: 2025-02-23T14:41:00Z (18 minutes)
INITIAL ACCESS:
Vector: Exposed IAM access key in public GitHub repository
Credential: AKIAIOSFODNN7EXAMPLE (user: ci-deploy)
First Malicious Activity: 2025-02-23T14:12:00Z
IMPACT:
Instances Launched: 200 (p3.2xlarge GPU instances)
Regions Affected: 8 (us-east-1, us-west-2, eu-west-1, eu-central-1, ...)
Estimated Cost: $4,200 (18 minutes at $15,400/hour)
Mining Pool: stratum+tcp://pool.supportxmr.com:3333
Cryptocurrency: Monero (XMR)
DETECTION SIGNALS:
[14:15] GuardDuty: Stealth:IAMUser/CloudTrailLoggingDisabled (HIGH)
[14:18] Cost Anomaly: EC2 spend 4,200% above baseline
[14:23] GuardDuty: CryptoCurrency:EC2/BitcoinTool.B (HIGH) x 200
CONTAINMENT ACTIONS:
[14:25] IAM access key AKIAIOSFODNN7EXAMPLE deactivated
[14:30] CloudTrail re-enabled in all 8 regions
[14:35] API termination protection disabled on 200 instances
[14:41] All 200 instances terminated
REMEDIATION:
- Compromised access key deleted
- GitHub repository secret scanning enabled
- AWS Config rule deployed: cloudtrail-enabled (auto-remediate)
- SCP deployed: deny ec2:RunInstances for GPU instance types without approval