侵害指標の分析
使用タイミング
このスキルは以下の状況で使用します:
- フィッシングメールやアラートからIOC(URL、IPアドレス、ファイルハッシュ)が生成され、迅速なトリアージが必要な場合
- 自動フィードから大量のIOCが配信され、ブロック制御に取り込む前に信頼度スコアリングが必要な場合
- インシデント調査において、観測されたネットワークアーティファクトの文脈的エンリッチメントが必要な場合
高リスクなブロック判断では、このスキル単独で使用しないでください — 特にCDNやクラウドプロバイダーといった共有インフラストラクチャの場合は、必ず自動エンリッチメントとアナリストの判断を組み合わせてください。
前提条件
- VirusTotal APIキー(無料またはEnterprise版):複数AVエンジンおよびサンドボックス検索用
- AbuseIPDB APIキー:IPレピュテーションチェック用
- MISPインスタンスまたはTIP:既知のキャンペーンとのクロスリファレンス用
- Pythonと
requests、vt-pyライブラリ、またはプリビルドコネクタを備えたSOARプラットフォーム
ワークフロー
ステップ1: IOCタイプの正規化と分類
エンリッチメントの前に、各IOCを分類します:
- IPv4/IPv6アドレス:RFC 1918プライベートアドレスか確認(外部エンリッチメントはスキップ)、フォーマットを検証
- ドメイン/FQDN:安全な取り扱いのためにデファング(
evil[.]com)、tldextractを使用して登録ドメインを抽出 - URL:ドメインとパスを分離して抽出、リダイレクタを確認
- ファイルハッシュ:ハッシュタイプ(MD5/SHA-1/SHA-256)を識別、一意性のためにSHA-256を推奨
- メールアドレス:ドメイン(MX/DMARCを確認)とローカルパートに分割し、パターン分析を実施
IOCはドキュメント内でデファングしてください(.を[.]に、://を[://]に置き換える)。これにより誤クリックを防止します。
ステップ2: 複数ソースからのエンリッチメント
VirusTotal(ファイルハッシュ、URL、IP、ドメイン):
import vt
client = vt.Client("YOUR_VT_API_KEY")
# ファイルハッシュ検索
file_obj = client.get_object(f"/files/{sha256_hash}")
detections = file_obj.last_analysis_stats
print(f"悪意のある検出: {detections['malicious']}/{sum(detections.values())}")
# ドメイン分析
domain_obj = client.get_object(f"/domains/{domain}")
print(domain_obj.last_analysis_stats)
print(domain_obj.reputation)
client.close()
AbuseIPDB(IPアドレス):
import requests
response = requests.get(
"https://api.abuseipdb.com/api/v2/check",
headers={"Key": "YOUR_KEY", "Accept": "application/json"},
params={"ipAddress": "1.2.3.4", "maxAgeInDays": 90}
)
data = response.json()["data"]
print(f"信頼度: {data['abuseConfidenceScore']}%, 報告数: {data['totalReports']}")
MalwareBazaar(ファイルハッシュ):
response = requests.post(
"https://mb-api.abuse.ch/api/v1/",
data={"query": "get_info", "hash": sha256_hash}
)
result = response.json()
if result["query_status"] == "ok":
print(result["data"][0]["tags"], result["data"][0]["signature"])
ステップ3: キャンペーン帰属による文脈化
MISPでIOCに一致する既存イベントをクエリ:
from pymisp import PyMISP
misp = PyMISP("https://misp.example.com", "API_KEY")
results = misp.search(value="evil-domain.com", type_attribute="domain")
for event in results:
print(event["Event"]["info"], event["Event"]["threat_level_id"])
ShodanでIPの文脈情報(ホスティングプロバイダ、開放ポート、バナー)を確認し、IPがbulletproofホスティングか正当なクラウドプロバイダーかを識別します(誤検出リスクの低減)。
ステップ4: 信頼度スコアと処分の割り当て
階層的な判断フレームワークを適用します:
- ブロック(高信頼度 ≥ 70%):VTで15以上のAV検出、AbuseIPDBスコア70以上、既知のマルウェアファミリーまたはキャンペーンに一致
- 監視/アラート(中信頼度 40–69%):5–14のAV検出、中程度のAbuseIPDBスコア、キャンペーン帰属なし
- ホワイトリスト/調査(低信頼度 <40%):4以下のAV検出、不正使用報告なし、正当なサービス(Google、Cloudflare CDN IP)
- 誤検出(False Positive):正当なビジネスサービスが誤ってフラグ付けされたもの。文書化し、今後のアラートから除外
ステップ5: 文書化と配布
TIP/MISPに以下の内容を記録:
- 収集したすべてのエンリッチメントデータ(タイムスタンプ、ソース、スコア)
- 処分の決定とその根拠
- 実施したブロックアクション(ファイアウォール、プロキシ、DNSシンクホール)
- 関連するインシデントチケット番号
信頼度フィールドを適切に設定したSTIXインジケータオブジェクトとしてエクスポートしてください。
主要概念
| 用語 | 定義 |
|---|---|
| IOC | 侵害指標 — 侵害の可能性を示す観測可能なネットワークまたはホストアーティファクト |
| エンリッチメント | 複数のインテリジェンスソースから生のIOCに文脈データを追加するプロセス |
| デファング | ドキュメント内での誤アクティベーションを防ぐためにIOCを修正(.を[.]に置き換え)すること |
| 誤検出率 | 悪意ありと誤ってフラグ付けされた良性アーティファクトの割合。ブロック閾値の調整に重要 |
| シンクホール | 悪意のあるドメインのルックアップを良性IPにリダイレクトするDNSサーバー。トラフィックを完全にブロックせずに検出を可能にする |
| TTL | ブロック制御におけるIOCの有効期間。IP指標は30日後、ドメインは90日後に期限切れにする |
ツールとシステム
- VirusTotal:70以上のAVエンジン、サンドボックスレポート、コミュニティコメントを備えたマルチエンジンマルウェアスキャナおよび脅威インテリジェンスプラットフォーム
- AbuseIPDB:90日間の不正使用レポート履歴を持つコミュニティ維持のIPレピュテーションデータベース
- MalwareBazaar(abuse.ch):YARAルール関連付けとマルウェアファミリータグ付け機能を備えた無料のマルウェアハッシュリポジトリ
- URLScan.io:フィッシングURLトリアージのためにスクリーンショット、DOM、ネットワークリクエストをキャプチャする無料のURL分析サービス
- Shodan:IPエンリッチメントのためにホスティングプロバイダ、開放ポート、バナー情報を提供するインターネット全体のスキャンデータ
よくある落とし穴
- 共有インフラストラクチャのブロック:CDN IP(Cloudflare 104.21.x.x、AWS CloudFront)は悪意のあるコンテンツをホストしている可能性もありますが、ブロックすると数千の正当なサイトに影響を及ぼします。
- VTスコアへの過信:VTの検出数が少ないからといって良性とは限りません — ゼロデイマルウェアやカスタムAPTツールは最初はスコア0であることがよくあります。サンドボックスの動作、MISP、パッシブDNSを確認してください。
- デファングの欠如:メールやConfluenceドキュメントに生のIOCを貼り付けると、自動URLスキャナやフィッシングツールをトリガーする可能性があります。
- 有効期限ポリシーの欠如:TTLなしでIOCをブロックリストに蓄積すると、インフラストラクチャが正当なユーザーに再利用された際に誤検出が発生し続けます。
- 単一ソースへの過依存:VirusTotalはAVの意見を集約しますが、すべてが間違っていたり、新興マルウェアに遅れをとることがあります。高リスクな判断には3つ以上の独立したソースを使用してください。