DGAとDNSフォレンジック:ノイズに埋もれた「沈黙のC2」を暴く技術
インシデントレスポンスの現場において、IDS/IPSのアラートが鳴り止まない環境は、ある種「健全」です。本当の悪夢は、ネットワークの片隅で、静かに、そして執拗に繰り返される「名前解決の失敗」から始まります。
DNSはインターネットの背骨ですが、同時に攻撃者にとっては最も隠密性の高い隠れ蓑です。今回は、DGA(Domain Generation Algorithm)を用いたC2通信を、メモリフォレンジックと統計的解析の交差点から解剖します。
—
1. DGAの本質と「NXDOMAIN」の死角
多くのセキュリティエンジニアは、SIEMで NXDOMAIN(ドメイン名が存在しない)の急増を監視しています。しかし、巧妙な攻撃者は閾値を下回るトラフィックを維持したり、TTLを極端に短くしてレコードのキャッシュを回避したりします。
DGAの真の脅威は、それが「アルゴリズム」である点です。攻撃者は、日時、シード値、ハードコードされた辞書を組み合わせ、数千のドメインを生成します。防御側が追うべきは、単なるエラー数ではなく、「クエリの構造的ランダム性」です。
2. エントロピー解析による通信プロファイル
DGAが生成するドメインは、人間が読める文字列ではなく、シャノンエントロピーが高い傾向にあります。これを利用し、DNSクエリログから疑わしいドメインをフィルタリングするロジックを実装しましょう。
以下のPythonコードは、クエリ文字列のランダム性を評価し、DGAの可能性をスコアリングするアプローチの概念実証です。
import math
from collections import Counter
def shannon_entropy(domain):
"""
ドメイン名の文字列エントロピーを算出する。
値が高いほどランダム性が高く、DGAの可能性を示唆する。
"""
domain = domain.split('.')[0] # サブドメイン部分を抽出
prob = [float(count) / len(domain) for count in Counter(domain).values()]
return -sum(p * math.log(p, 2) for p in prob)
# 使用例: 典型的なランダムドメインと正規ドメインの比較
domains = ["google.com", "asdfg12345qwer.xyz", "xkzqpwlmnbv.ru"]
for d in domains:
print(f"Domain: {d}, Entropy: {shannon_entropy(d):.2f}")
# 実際の実務では、閾値(例: 3.5以上)を設け、異常検知のトリガーとする
3. メモリフォレンジック:プロセスの背後を暴く
ネットワークログで「怪しい」と特定できても、それは氷山の一角です。真のDFIR担当者は、そのDNSクエリを発行しているプロセスをメモリ上で特定します。
Windows環境であれば、Volatility 3 を用いて、不審なネットワーク接続を持つプロセスを特定し、そのメモリダンプからDGAアルゴリズムの痕跡を抽出します。
- 確認すべきポイント:
netscanプラグインで、外部へのUDP 53ポート通信を行っているPIDを特定。malfindを使用し、当該プロセスのメモリ空間に注入されたコード(PAGE_EXECUTE_READWRITEフラグが立っている領域)を調査。stringsコマンドでダンプを解析し、ドメイン生成の「シード値」や「ハードコードされた定数」がメモリ上に存在するかを確認。
もし、メモリ上に難読化された文字列や、奇妙な演算ロジックが見つかれば、それが攻撃者のDGAロジックそのものです。
4. アーキテクチャの未来:耐量子とガードレイル
今後、我々が対峙するのは、生成AIによって最適化されたDGAです。これに対抗するためには、単なるブラックリスト運用は過去の遺物となります。
- DNS over HTTPS (DoH) の強制と可視化:
プロキシ層でDoHを終端させ、復号した上でコンテンツベースのフィルタリングを行うアーキテクチャが必須です。
- ガードレイルの実装:
AIがコード生成を支援する時代、プロンプトインジェクションと同様に、エンドポイントのセキュリティエージェント自体に「DNSクエリの許可リスト・推論エンジン」を搭載し、異常なクエリパターンをAIがリアルタイムで遮断するゼロトラスト・アーキテクチャへの移行が必要です。
結論:泥臭い解析が最強の武器になる
高度なツールは重要ですが、最終的に攻撃者を追い詰めるのは「なぜこのクエリがこのタイミングで発生したのか?」という執拗な仮説検証です。
DNSは、マルウェアの「心臓の鼓動」です。その鼓動が速まっているのか、あるいは不規則なのか。ログの海の中に潜むわずかなノイズを読み解く力こそが、次世代のセキュリティアーキテクトに求められる真のスキルセットです。
皆さんの環境で、今日、一度も名前解決に成功していないドメインへのクエリが、どれだけ放置されているか。一度、SIEMのダッシュボードではなく、生ログの深淵を覗いてみてください。答えは必ずそこにあります。
コメント