SSH 鍵を盗まれても横に広がらせない(HashKnownHosts と短命の SSH 証明書、Panchan ワーム事例)
暗号資産採掘ワーム Panchan は、盗んだ SSH 秘密鍵と known_hosts の接続先一覧を使って次のサーバーへ広がる。known_hosts をハッシュ化して行き先を読めなくし、鍵そのものを短命の証明書に置き換えると、この横展開の材料を減らせる。
背景
- SANS ISC の DShield ハニーポットで Panchan の検体が捕獲された。2022 年に見つかった Go 製の P2P 型ボットネットで、SSH 鍵の窃取などで拡散し、ルートキットで居座り、Discord の Webhook を指令・監視用の通信先に使っていた。
- ワームは動いているユーザーの
~/.ssh/known_hostsに載っているホストへ、盗んだ秘密鍵で接続を試みる。パッチ未適用で対策の甘いシステムが多いため、今も広がっていると報告者は説明している。
やること
known_hostsをハッシュ化する:~/.ssh/configに次を書くと、新しく記録するホスト名とアドレスがハッシュ化され、ファイルが漏れても接続先が一見してわからない。Host * HashKnownHosts yes既存の記録はハッシュ化されないので、
ssh-keygen -Hで別途変換する(元ファイルはknown_hosts.oldとして残るので、確認後に消す)。- 長期の秘密鍵を短命の証明書に置き換える: HashiCorp Vault などで署名した有効期限の短い SSH 証明書を使えば、盗まれた鍵の再利用は極めて難しくなる。
- インターネットに出す SSH を絞る: パスワード認証と root ログインを無効にして公開鍵認証だけにし、接続元を特定 IP や踏み台サーバーに限る。認証失敗を繰り返す IP は Fail2Ban で遮断し、可能なら多要素認証を足す。
感染の兆候(点検項目)
- SSH 認証失敗の急増
- CPU などリソースの異常な消費、強制終了できないプロセス
/tmpなどの一時ディレクトリや、該当ユーザーのホームに作られたランダムな名前の隠しディレクトリ- Discord など外部サービスへの定期的な通信(外向き通信の監視は サプライチェーン侵害の「いつもと違う外向き通信」を DNS+VPC フローで拾う を参照)
注意点
HashKnownHostsは接続先を隠すだけで、鍵が盗まれること自体は防がない。ハッシュ化後はssh-keygen -F <ホスト名>で個別に検索できるが、一覧として目で見ることはできなくなる。- 解析側の小技として、報告者は検体に
stringsとgrepをかけるだけでminer.go・spreader.goなどのソースファイル名や Discord API の URL が見つかったとしている。