【実務・中級編】 BACnetプロトコル(ポート47808/UDP)を標的としたビル管理システムへのマルウェア感染拡大 – サイバーセキュリティとプライバシー保護実践ガイド

ビル管理の「パンドラの箱」:BACnet/IPを標的としたOTネットワーク侵入のリアル

現場でネットワーク設計をしていると、時折「なぜこんな設計にしたんだ……」と頭を抱えたくなるようなシステムに出会う。その筆頭が、ビルオートメーション(BMS)の基幹プロトコルである BACnet だ。

特にITとOT(制御技術)の境界が曖昧になっている昨今、BACnet/IP(ポート 47808/UDP)は、セキュリティの観点からは「広大な平原に突如現れた無防備な要塞」に見える。今日は、このプロトコルがなぜマルウェアの格好の標的となり、どうやって侵入されるのか、そして我々エンジニアが現場で何をすべきかを、泥臭い知見を交えて解説する。

—

BACnet/IPの脆弱性は「信頼」に根ざしている

BACnet(Building Automation and Control networks)は、もともと「閉じたネットワーク」で動くことを前提に設計されている。そのため、設計思想の根底にあるのは「同じネットワークにいる奴は味方」という、今のゼロトラスト時代には到底信じられない性善説だ。

なぜ攻撃者は UDP 47808 を狙うのか

BACnet/IPは、ブロードキャスト(Who-Is / I-Am)通信を多用してデバイスを発見する。攻撃者がネットワーク内に侵入できれば、47808/UDP に向けてスキャンパケットを投げるだけで、空調、照明、防犯カメラ、そして重要インフラである受変電設備まで、全貌が手に取るように分かってしまう。

さらに深刻なのは、多くのBACnetデバイスが「認証なし」でデータ書き換えを許可している点だ。これは、設定用の WriteProperty サービスを叩けば、ビル全体の温度設定を強制変更したり、火災報知器をオフにしたりすることが可能であることを意味する。

—

攻撃ベクトル:ITからOTへの「横移動(Lateral Movement)」

攻撃者は通常、脆弱な Web API やメールの添付ファイルからITネットワークのクライアントPCを奪取する。そこからが彼らの腕の見せ所だ。

1. 偵察: 奪取したPCから ARP スキャンを行い、OT側ゲートウェイ(BACnet/IPルーター)を探す。
2. プローブ: Who-Is リクエストを送り、応答するデバイスのリストを抽出する。
3. コマンド注入: デバイスに対し、悪意のある設定値を書き込む。

実践:PythonによるBACnetデバイスの探索(検証用コード)

攻撃者がどのような通信を行っているかを知ることは、防御の第一歩だ。以下は、ネットワーク上のBACnetデバイスを探索するイメージコードである。

# BACnetデバイスを探索するための簡易的な探索リクエストの構成例
# 実際には BACpypes などのライブラリを使用するが、ここではパケットの構造を示す
import socket

# BACnet/IPのデフォルトポート
PORT = 47808
# ブロードキャストアドレス(ネットワーク環境に合わせて変更)
BROADCAST_ADDR = "192.168.1.255"

def send_who_is_request():
    # BVLCヘッダー(Type=0x81, Function=0x0a: Original-Broadcast-NPDU)
    # 実際にはNPDU、APDUを連結して送信する
    packet = b'\x81\x0a\x00\x0c\x01\x20\xff\xff\x00\xff\x10\x08'
    
    with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as s:
        s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
        s.sendto(packet, (BROADCAST_ADDR, PORT))
        print(f"BACnet探索パケットを {BROADCAST_ADDR}:{PORT} に送信しました。")

# 注意:このコードは検証環境のみで使用してください。

—

現場で打つべき防衛策:現実的な「境界」の引き方

「BACnetを今すぐHTTPS化しろ」と言っても、古いコントローラーは対応していないのが現実だ。では、どう守るか。

1. ネットワークセグメンテーション(VLANの隔離)

最も基本だが、最も重要だ。OTネットワークをITネットワークとは完全に切り離し、Firewall や L3スイッチ で UDP/47808 の通信を厳密に制御する。業務に必要な管理端末以外からのアクセスは、ACL(アクセスリスト)で全遮断が鉄則だ。

2. IPSによるプロトコル異常検知

Snort や Suricata などのIPSを導入しているなら、BACnet 固有の通信パターンを検知するルールを適用しよう。

# Suricataのルール例:不審なWritePropertyコマンドを監視
alert udp any any -> any 47808 (msg:"BACnet WriteProperty Command Detected"; content:"|3f|"; offset:10; sid:1000001; rev:1;)

※ 0x3f は WriteProperty サービスのコードを示す。このような特定の関数コードをフィルタリングすることで、不正な書き換えを即座に検知・遮断できる。

3. 不要なサービスの無効化

コントローラー側に Webサーバ 機能がついている場合、ファームウェアの設定で必ず無効化すること。また、デフォルトのパスワードが「admin / admin」のまま放置されていないか、今すぐ確認してほしい。

—

最後に:ネットワークは「生き物」である

現場でトラブルシューティングをしていると、ネットワークは単なる配線の束ではなく、意思を持った生き物のように感じる。特にOT領域は、一度の誤設定が物理的な被害(空調停止やエレベーター故障)に直結する。

「動いているから触らない」という現場の慣習を打破し、リスクを可視化するのが我々エンジニアの役割だ。まずは今日、あなたのネットワーク内で 47808 がどこを通っているか、誰が通信を許可されているのかを確認することから始めてみてほしい。

セキュリティは、ツールを導入して終わりではない。日々の泥臭いパケットの観察と、プロトコルへの深い理解の積み重ねだけが、ビルを守る唯一の盾となるのだ。

コメント

タイトルとURLをコピーしました