「レガシーな現場」が標的になる理由 —— Modbus TCPの脆弱性が招く産業制御の悪夢
現場のエンジニア諸君、今日もパケットの海を泳いでいるか。
Web系やクラウドネイティブな世界で「TLS 1.3がどう」とか「OAuth 2.0の認可フロー」だなんて話をしていると、つい忘れがちになる場所がある。それが工場や重要インフラを支える「ICS(産業用制御システム)/SCADA」の世界だ。
彼らの通信プロトコル、特に Modbus TCP を一度でもパケットキャプチャしたことはあるだろうか? 驚くほど「無防備」だ。認証なし、暗号化なし。TCPポート 502 を叩けば、誰でもPLC(プログラマブル・ロジック・コントローラ)に直接「命令」を下せる。これがどれほど恐ろしいことか、今日は技術的な側面から紐解いていこう。
Modbus TCP:性善説に基づいた「オープンな通信」の落とし穴
Modbus TCP は1979年に生まれたプロトコルを、そのままTCP/IPの上に乗せたものだ。現代のWeb APIのようにヘッダーに Authorization トークンなど存在しない。
通信フローは至ってシンプルだ。クライアント(SCADAサーバー等)がPLCに対して Read Holding Registers(レジスタ読み取り)や Write Single Register(レジスタ書き込み)といったリクエストを投げると、PLCは即座にそれを実行する。
もし、ネットワーク境界が突破され、攻撃者がこの 502 番ポートに到達できたとしたらどうなるか? 攻撃者はPLCのレジスタ値を書き換え、バルブを勝手に開閉したり、モーターを異常回転させたりすることが可能になる。ランサムウェアの連中がこれを悪用し、PLCの設定値を書き換えて物理的な「人質」を取る事例も、もはや都市伝説ではない。
Pythonで見る「あまりに素直な」コマンドインジェクション
百聞は一見にしかず。pymodbus ライブラリを使って、実際にPLCに値を書き込む様子を見てみよう。
from pymodbus.client import ModbusTcpClient
# ターゲットのPLCのIPアドレスとポート(502)を指定
# 本来であれば、ここに到達すること自体が異常なはずだ
client = ModbusTcpClient('192.168.10.50', port=502)
if client.connect():
# 攻撃者はレジスタアドレス 0x0001 に異常な値(例: 9999)を書き込む
# PLCはこれを「正常な命令」として受け取り、物理的な動作を変更してしまう
result = client.write_register(1, 9999, unit=1)
if not result.isError():
print("書き込み成功: PLCの制御ロジックが変更されました")
else:
print("エラーが発生しました")
client.close()
見ての通り、認証の壁はゼロだ。攻撃者は curl のようなツールで、直接バイナリを流し込むことさえできる。
現場で守りを固めるための「泥臭い」防御策
「じゃあ、PLCを全部入れ替えるのか?」と聞かれれば、答えは「NO」だ。工場のラインを止めることは容易ではない。だからこそ、我々ネットワークエンジニアの出番がある。
1. 境界防御の徹底(マイクロセグメンテーション)
オフィスネットワークと工場ネットワークを L3 スイッチや Next-Generation Firewall (NGFW) で厳格に分断すること。特に、502 ポートへのアクセスは、特定のSCADAサーバーのIPアドレスからの通信のみを許可するホワイトリスト運用を徹底せよ。
2. DPI(ディープパケットインスペクション)の導入
IDS/IPSを用いて、Modbus TCP のパケットペイロードの中身を検査しよう。例えば、Write コマンドが頻発していないか、異常な値が書き込まれていないかを監視するのだ。
3. VPNによるトンネリング
やむを得ずリモートから保守を行う場合は、必ず IPsec や WireGuard などのトンネルを通すこと。生で 502 ポートをインターネットに公開するなんてもってのほかだ。
最後に:エンジニアとしての心構え
WebエンジニアがAPIの設計で JWT の検証を厳格に行うように、ICS環境でも「境界の内側は安全」という神話を捨てる必要がある。
Modbus TCP は歴史的な遺産だが、現代のサイバー脅威の前ではあまりに無防備だ。パケットの挙動を理解し、どこで誰が「書き込み」を行っているかを常に監視する目を持つこと。それが、物理世界をデジタルから守る我々インフラエンジニアの責務だ。
もし君の現場のネットワークで、正体不明の 502 ポートへのアクセスを見つけたら、即座に隔離せよ。そのパケットは、明日の工場の停止命令かもしれないのだから。
コメント