Tank! Tank! Tank! Arcade

Введение

Эта история началась практически сразу после написания статьи об исследовании аркады небезызвестной корейской компании: в аркадном автомате Tank! Tank! Tank! от Namco вышел из строя жесткий диск (что неудивительно, т.к. производитель установил в автомат не отличающиеся надежностью Seagate 7200.12), диск взяли с рабочей аркады и скопировали его через WinHex, после чего игра перестала запускаться. Предположив, что целостность диска была нарушена неосторожным нажатием клавиши в окне редактирования данных на диске в WinHex, был взят другой диск с еще одного рабочего автомата, скопирован аналогичным образом, который также перестал запускаться. Тут-то и стало понятно, что в диск каким-то образом встроена защита от копирования.
Arcade Linux Error

Namco System ES1

Аркада Tank! Tank! Tank!, выпущенная в 2009 году, работает на платформе System ES1, которая представляет из себя обычный компьютер тех лет на чипсете Intel Q35:
  • Материнская плата: Supermicro C2SBM-Q (Intel Q35 + ICH9DO)
  • CPU: Intel Core2 Duo CPU E8400 @ 3.00GHz
  • RAM: 2x512 MB DDR2 800 MHz 1.8V
  • Видео: NVIDIA GeForce 9600 GT с 512 мегабайтами памяти типа GDDR3
  • HDD: Seagate Barracuda 7200.12 160 ГБ (ST3160318AS) или Hitachi Deskstar 7K1000.C 160 ГБ (HDS721016CLA382)
  • Операционная система: Arcade Linux (основана на Debian 4.0)

Все это укомплектовано к массивный корпус с прикрученным блоком питания на 110В.
Dead Heat Arcade PC
Фотография System ES1, который поставляется с игрой Dead Heat. Установлен горизонтально, в отличие от варианта ES1 в Tank! Tank! Tank!.

На платформе ES1 всего было выпущено 9 игр, 4 из которых рассчитаны исключительно на внутрияпонский рынок. Последняя игра была выпущена в 2014 году, так что можно полагать, что новых игр на данной платформе не появится. На территории России и Украины мне встречались всего 4 ES1-игры: Tank! Tank! Tank!, Dead Heat, Dead Heat Riders и Nirin.

Доверенная загрузка и TPM

Особенность данной платформы в том, что она использует так называемую доверенную загрузку (Trusted Boot) со статичным корнем доверия (Static Root of Trust) с помощью крипточипа Trusted Platform Module (TPM) версии 1.2, встроенного в материнскую плату. TPM — замечательная штука — что-то вроде смарт-карты, которая несет в себе RSA-ключ, зашитый производителем на этапе производства, с возможностью генерирования своих ключей, приватная часть которых никогда не покинет TPM, загрузки уже существующих ключей, с небольшим энергонезависимым хранилищем произвольных данных (NVRAM) на борту, генератором случайных чисел и еще кучей всего. Но самое интересное, что предоставляет TPM — конфигурационные регистры платформы (Platform Configuration Registers, PCR), которые можно расширить SHA-1-суммой каких-то произвольных данных. Очень важно отметить, что эти регистры нельзя ни сбросить, ни установить в нужное значение, а только дополнить новой SHA-1-суммой, от которой сам TPM возьмет новую SHA-1-сумму от конкатенации старого и нового значения. Проще говоря, TPM выполняет следующую команду, если вы отправляете в PCR NEW_HASH:
PCR[i] = SHA1(PCR[i] + NEW_HASH)
BIOS/UEFI материнской платы, если он поддерживает спецификации Trusted Computing Group (TCG), измеряет (т.е. отправляет в TPM хеши) всего, что участвует в загрузке с момента включения компьютера: BIOS/UEFI Boot Block, сам BIOS/UEFI, сервисы UEFI, SMBIOS, таблицы ACPI, Option ROM устройств (например, сетевых карт), MBR или загрузчик EFI, разделы диска, и еще кучу всего.

PCR Measurements
(из Evil Maid Just Got Angrier)

BIOS/UEFI не могут осуществлять измерения чего-либо, что делается после загрузки MBR или UEFI-загрузчика, поэтому, в случае Linux, загружаемое ядро и initrd остаются неучтенными в PCR. Чтобы производить измерения после MBR, существуют загрузчики, поддерживающие TPM и осуществляющие доверенную загрузку со статичным корнем доверия: TrustedGRUB, TrustedGRUB2, GRUB-IMA. Последний используется в System ES1. Эти загрузчики отправляют в TPM хеши самих себя (stage1 и stage2 в случае GRUB), свои настройки и загружаемые модули (ядро, командную строку ядра и initrd, в случае Linux).

TPM может зашифровать произвольные данные RSA-ключом с привязкой к значениям PCR, и расшифровать их можно будет только в том случае, если значения PCR совпадут. Если мы зашифруем таким образом данные, то, в случае модификации BIOS/UEFI, загрузчика, модулей GRUB, ядра, initrd или всего лишь командной строки ядра, данные не расшифруются из-за несовпадения регистров.

Из популярного софта TPM используется, насколько мне известно, только в Microsoft BitLocker. TPM можно использовать в качестве хранилища сертификатов для всяких банк-клиентов, VPN и SSH-доступа, и очень обидно, что его использует так мало людей, единицы, учитывая его стоимость (?$10, дешевле, чем типичные смарт-карты), возможности и тот факт, что он уже установлен во многие модели ноутбуков, а в последних процессорах от Intel вообще реализован на уровне ПО и доступен всем.

Защита ES1

В Namco System ES1 есть три степени защиты от копирования.
Первая — принцип доверенной загрузки: файлы и ресурсы игры зашифрованы с помощью ключа в TPM и привязаны к значениям PCR. Производитель, перед отправкой автомата покупателю, запускает процесс зашифровки данных на автомате, и после этого диск с игрой будет запускаться только на той аркаде, где ее запустили первоначально. Для шифрования используется AES-256 в CBC-режиме средствами крайне простого и ныне усопшего loop-AES — модуля ядра для шифрования произвольных данных на блочных устройствах. Также имеется шифрованный LUKS-раздел на диске, в котором хранится копия данных игры вместе с обновлениями, сохранениями и другими данными.
Arcade Linux boot

Вторая степень защиты — защита HDD.
Seagate HDD
Почему же игра не запускается после копирования диска? Быть может, производитель написал свою прошивку для контроллера диска, которая стирает данные при обращении к какому-то сектору, которое происходит при посекторном копировании диска, но никогда не происходит при обычном использовании диска игрой и ОС? Зная Namco, они могли пойти на такой шаг, ведь у них есть средства, специалисты и время на создание аппаратов, основанных на PlayStation 2 (System 246) и 3 (System 357).
Но нет, все просто и по-злому гениально: в MBR диска в поле Disk Signature указаны нули. Как только вы подключаете этот диск к компьютеру под управлением ОС Windows, она обнаруживает нули, ей это не нравится, ведь Windows использует Disk Signature в качестве уникального идентификатора диска, генерирует случайный и по-тихому записывает его на диск. Материнская плата аппарата, во время загрузки игры, считывает MBR и отправляет его хеш в TPM. Когда дело доходит до расшифровки данных, TPM PCR не совпадают, данные не могут расшифроваться и игра не запускается. Сделано это было явно намеренно — все утилиты для управления разделами в Linux генерируют случайный Disk Signature, а не нули.
$ cmp -l mbr_working mbr_broken | gawk '{printf "%08X %02X %02X\n", $1-1, strtonum(0$2), strtonum(0$3)}'
000001B8 00 4B
000001B9 00 4D
000001BA 00 17
000001BB 00 CC

Помимо TPM, который используется только для расшифровки данных средствами ОС, в самих играх используется USB-донгл HASP HL Max. Точнее сказать, не используется, а только проверяется его наличие, и эта проверка обходится буквально одним патчем, либо вообще отключается в конфигурационном файле. Глупо, расточительно и вообще непонятно, зачем он нужен.

Из примечательного: пароль на BIOS и GRUB, который можно получить перебором — 016ystn или arcade, в зависимости от игры.

Варианты атаки

Итак, у нас имеется:
  • Образ диска, который больше не запускается
  • 2 работоспособных автомата
  • 2 неработоспособных автомата

Наша задача — восстановить неработоспособные машины, диски которых вышли из строя. Для этого нам нужно заполучить зашифрованные данные игры в незашифрованном виде с работоспособных аппаратов, для чего необходимо каким-то образом сначала получить ключ шифрования.

  • Эксплоит через USB-устройство
Используемое в автомате ядро версии 2.6.25 содержит, как минимум, два уязвимых драйвера USB-устройств. В первом из них, драйвере VoIP PBX Auerswald, можно проэксплуатировать переполнение буфера в имени устройства. К сожалению, переполнение буфера не на стеке, и переполнить его мы можем всего на 27 байт, из-за чего, вероятнее всего, уязвимость нельзя применить без взаимодействия с userspace, что нам не подходит, т.к. у нас нет доступа к терминалу или какой-то иной возможности исполнять код. Зато все упало.
Второй вариант — драйвер звукового и MIDI-устройства Caiaq, который мне, к сожалению, также не получилось проэксплуатировать.

  • Атака Cold boot
Атака заключается в дампе памяти и поиске в нем ключей шифрования. Осуществляться она может двумя способами: запуском небольшой программы-дампера с USB-флешки (например, msramdmp) или HDD сразу после перезагрузки, или замораживанием и выниманием памяти с сохранением ее содержимого на другом компьютере все тем же дампером. Первый способ не сработает из-за соответствия материнской платой спецификации Trusted Computing Group, которая предписывает выполнять очистку памяти при загрузке, и дампер сохранит уже очищенную память, в которой, конечно же, уже не будет никаких ключей.

  • DMA-атака
Атака прямым доступом к памяти (Direct Memory Access) основывается на выполнении запросов к блоку управления памятью через шину, устройство или стандарт, которые позволяют такой доступ. Существуют коммерческие платы, специально предназначенные для выполнения DMA-атак, также есть платы с контроллером USB 3.0 USB3380 (SLOTSCREAMER), который, по чистой случайности, умеет генерировать и посылать PCI-пакеты на шину, с некоторыми ограничениями, но для DMA-запросов этого достаточно. Самый простой и доступный способ — стандарт Firewire (IEEE 1394), который, однако, требует поддержки со стороны ОС. К счастью, в нашем автомате разработчики не заблокировали драйвер Firewire SBP2, который и позволяет прямой доступ к памяти, а это значит, что достаточно вставить Firewire-плату в свободный слот PCI или PCI-e, соединить ее с картой в вашем компьютере и сохранить RAM используя, например, Inception. Им и воспользуемся!

Расшифровка данных

Получить данные памяти еще полдела, нужно найти в них ключ AES и расшифровать файл игры. Для первой задачи умные люди из Принстонского университета написали утилиту aeskeyfind, которая побайтно проходит по всему образу, принимая случайные данные в оперативной памяти за AES-ключ, и пробует найти недалеко от него временные ключи, получаемые из основного и используемые в AES-раундах (так называемое расписание ключей, key schedule). Если мы нашли что-то похожее в памяти — отлично, у нас появился кандидат на правильный ключ шифрования!
$ aeskeyfind memdump_0x0-0x100000000_20160524-172534.bin
f322ee68145f5f32dea7252b2de00ff30003bb2775b7164f7211ba56fbe2012a
7523dfd705d26ce4f34ee872ec88f7ede80ac8ea0f104d3aba4a5d38bfa5849f
103687fef032a17e830b6709c29bd805
Нашлось два 256-битных ключа и один 128-битный

Для расшифровки файлов, зашифрованных loop-AES, я написал простейший скрипт на Python, т.к. существующие утилиты не умеют работать с тем ключом, который мы нашли в оперативной памяти (мастер-ключ), а принимают на вход «пароль», из которого с помощью функции формирования ключа получается мастер-ключ. «Пароля» у нас нет, и оказалось проще написать свое, чем модифицировать чужое.
Скрытый текст
#!/usr/bin/env python3
import sys
import struct
from Crypto.Cipher import AES

if len(sys.argv) < 3:
    print("Namco encrypted game file (.apps, LOOP-AES) decryptor.")
    print(sys.argv[0], "USAGE: ENCRYPTED_FILE KEY_FILE OUTPUT_FILE")
    print("KEY_FILE should be in binary format.")
    print("Use echo KEY_HERE | xxd -r -p")
    sys.exit(1)

aesfile = open(sys.argv[1], 'rb')
key = open(sys.argv[2], 'rb').read()
output = open(sys.argv[3], 'wb')

iv = 0
while True:
    enc_data = aesfile.read(512)
    if not enc_data:
        break
    cipher = AES.new(key=key, mode=AES.MODE_CBC, IV=struct.pack('LL', iv, 0))
    output.write(cipher.decrypt(enc_data))
    iv += 1

$ echo f322ee68145f5f32dea7252b2de00ff30003bb2775b7164f7211ba56fbe2012a | xxd -r -p > key
$ ./decrypt.py v352us.apps key v352us.app
$ file v352us.app
v352us.app: Squashfs filesystem, little endian, version 3.1, 655177264 bytes, 6062 inodes, blocksize: 131072 bytes, created: Sat Nov 28 06:26:17 2009
Первый же ключ подошел, отлично!

У нас есть все, чтобы сделать диск таким, какой он был до первого включения аппарата на заводе, а это значит, что мы можем восстановить любой автомат Namco System ES1 так же, как это сделал бы производитель!
С первого раздела, из директории arcade, удаляем зашифрованный файл *.apps и ключ шифрования sealkey, копируем файл с расшифованными данными *.app и создаем пустой файл RECOVERY, чтобы скрипты перешифровали его при запуске. Должно получиться что-то подобное:
p1/arcade % ls -lah
total 626M
drwxr-xr-x 2 root root 4.0K Jun 27 19:02 .
drwxr-xr-x 7 root root 4.0K Nov 28  2009 ..
-rw-r--r-- 1 root root  396 Nov 28  2009 config
-rw-r--r-- 1 root root   75 Nov 28  2009 partab
-rw-r--r-- 1 root root    0 Jun 27 19:02 RECOVERY
-rw-r--r-- 1 root root 625M Nov 28  2009 v352us.app

Обратите внимание на второй раздел, это раздел с обновлениями игры. Если на нем есть файл *.pkg, то необходимо удалить файл INITIALIZED, чтобы игра обновила сама себя, иначе вы получите устаревшую версию.

Подключаем диск в System ES1, включаем автомат и наблюдаем, как игра сама себя зашифровывает и копирует файлы на LUKS-раздел! Ура!
Namco System ES1 initialization

Реальная история:
Была очень печальная история, году в 2010 примерно, когда Nirin высыпался, и с другого аппарата техник снял, чтобы сделать копию на Винде с помощью Акрониса. Копию делает, сообщает, что все ОК. Но диск, с которого пытались сделать копию, потом, при подключении назад, показывает синий экран смерти и табличку, что у вас проблемы с диском. Упрямый парень на этом не остановился и полез в третий аппарат. История повторилась. Но ничего не страшит нашего человека — он позвонил своему коллеге в другой город и попросил ему почтой отправить диск с Нирина. Уехали все 4 системника в Лондон (Европейское представительство Намко), и все за счет парня, который думал, что упрямство победит! Почти 8000 евро за все обошлось (ремонт и туда-обратно логистика).
Что делать, если вы настолько же упрямый, и у вас не осталось работоспособных аппаратов? Не беда! Достаточно вернуть нули в поле идентификатора диска в MBR, т.е. записать 4 байта нулей по смещению 0x1B8. В Linux это делается одной командой:
# sudo dd if=/dev/zero of=/dev/sdX bs=1 count=4 seek=440
А в Windows можете использовать, например, WinHex.
После этого игра должна запуститься, и можно проделать все вышеописанные манипуляции, чтобы заполучить расшифрованные файлы и восстановить остальные аппараты.

Заключение

Архитектура и качество скриптов и утилит Arcade Linux оставили очень положительное впечатление о программистах Namco, а трюк с Disk Signature в MBR так вообще высший пилотаж. Конечно, для большей защиты следовало включить IOMMU, чтобы DMA-атаки были (почти) невозможны, а ключи шифрования хранить в debug-регистрах процессора, а не в оперативной памяти, но, все же считаю защиту Namco System ES1, как минимум, интересной, ее было нескучно исследовать и взламывать.
Образы и расшифрованные файлы игры доступны для скачивания на трекере-со-свиньями.

Помогу чем смогу, если вам нужно восстановить ПО аркад, а если вы разработчик аркадных игр под Linux (но не ссаных азартных/гемблинг-автоматов!), буду рад сделать вам надежную защиту, которую смогут взломать только очень смышленые люди.

Скрытый текст
Pedal
Поделиться с друзьями
-->

Комментарии (48)


  1. CodeRush
    27.06.2016 21:12
    +15

    Прекрасно, снимаю шляпу.
    Когда найду немного времени — напишу подробнее про TPM и firmware TPM, а то там конь не валялся и легенды про ужасный DRM ходят.


  1. lolipop
    27.06.2016 21:18
    +7

    Отсюда правило: копируй диски под Linux.


    1. ARD8S
      28.06.2016 00:02

      «Сделано это было явно намеренно — все утилиты для управления разделами в Linux генерируют случайный Disk Signature, а не нули.»

      Или я неправильно понял или не прокатит.
      ...Clonezilla live тоже меняет Disk Signature?


      1. ValdikSS
        28.06.2016 00:03

        Прокатит, ядро не трогает Disk Signature, образ можно снять через dd, и игра останется работоспособной. Про Clonezilla не знаю, не пользовался.


    1. pda0
      28.06.2016 20:06
      +1

      Это да. Недавно ноут в ремонт отдавал и прикупил гибридный диск того же объёма, что в ноуте был. Чтобы система пошутрее проворачивалась. Попросил склонировать систему, в сервисе взялись. Потом говорят, мол не выходит. Тремя способами пробовали — не грузится после копирования. Дома вставил диски в usb читалку, смотрю, у них количество секторов точно совпадает. И длина сектора одинаковая. Думаю: Геометрия у современных дистов вещь давно виртуальная, почему бы и нет? Запустил тупо dd один диск на второй. Четыре часа ожидания и всё работает. До сих пор не понимаю, что у них там не работало…


  1. GarryC
    27.06.2016 21:36
    -3

    То есть утилита бинарного копирования опирается на разметку ОС? Не могу сказать, что мне понравилась такая утилита.


    1. ValdikSS
      27.06.2016 21:40
      +3

      О какой утилите вы говорите? В статье, вроде, ничего подобного нет.


    1. Ivan_83
      28.06.2016 01:35
      +2

      Написано же: венда пишет вместо нулей рандомный идент, сама, при подключении, без спроса.
      До WinHEX дело доходит уже потом, оно тут не причём.


  1. zhovner
    27.06.2016 22:02
    +1

    Очень круто.


  1. Radjah
    28.06.2016 00:22
    +1

    А сколько места занимает весь игровой хабар на диске? 160 гигабайт даже для современных навороченных игр слишком много пока.


    1. ValdikSS
      28.06.2016 00:26

      ?100 МБ ОС и 600-800 МБ игра в зажатом (squashfs, lzma) виде. Сейчас десктопных жестких дисков объемом менее 320 ГБ просто не производят, тогда же, вероятно, меньше 160 ГБ было проблемно найти.

      Игры с большим количеством контента, тот же Pump It Up Prime, занимает с последним обновлением уже под 50 ГБ, но там музыка в PCM и видео в MPEG2.


      1. Radjah
        28.06.2016 07:21
        +1

        По идее разумнее было бы поставить CF или SSD вместо механического диска, если система предполагает довольно жесткую эксплуатацию. CF даже дешевле наверное.

        Хотя в этой реальности даже на системы в тепловозе жесткие диски ставят. :)


  1. rockin
    28.06.2016 01:36
    +2

    Прочитал, возникли вопросы
    а) зачем копировать диски в винде?
    б) к чему именно в железе привязывается система шифрования, ключ?


    1. ValdikSS
      28.06.2016 01:46
      +4

      зачем копировать диски в винде?
      Зачем? Затем, что Windows стоит на подавляющем большинстве компьютеров, и справлялась с этим не хуже других ОС. До этого момента.
      к чему именно в железе привязывается система шифрования, ключ?
      В материнскую плату установлен TPM, в TPM зашит уникальный ключ RSA-2048. Файлы игры зашифрованы случайным ключом AES-256, который берется из /dev/random при первом включении игры (на заводе), и этот ключ зашифровывается ключом из TPM с привязкой к PCR.


      1. rockin
        28.06.2016 10:33
        +1

        Просто, будучи сисадмином, я много дисков клонировал, но использовал для этого исключительно загрузочные носители. С простой целью: меньше запущенных процессов -> меньше вероятность ошибки. Винда для клонирования — это как микроскоп для забивания гвоздей. В линуксе мы хотя бы можем загружать то, что действительно нужно для работы. Да и mbr при этом бы точно не слетел (но и не помогло для решения конечной цели также).

        Про железо понял. Мелькнула при прочтении мысль, что проще было хачить железо. Ан нет… всё верно.


  1. robert_ayrapetyan
    28.06.2016 01:39
    +2

    До последнего был уверен, что в защите используется серийник диска…


  1. GreyCat
    28.06.2016 09:13
    +2

    Intel'овский TPM дыряв хотя бы тем, что позволил изменить состав подключенных устройств (новая PCI-карта) и при этом продолжить загружаться...


    Я правильно понимаю, что на самом деле можно было и не искать ключ AES и вообще заморачиваться с расшифровкой, после работы inception implant мы уже получаем работающий шелл на машину, после чего оттуда можно все скопировать уже из живой и расшифрованной ОС?


    1. CodeRush
      28.06.2016 09:41
      +1

      TPM — устройство пассивное, и потому позволил тут вовсе не «Intel'овский TPM», драйвер PCI прошивки. Чаще всего, устройства PCI в measurement log не добавляют, т.к. их можно добавить позже при помощи Hotplug, плюс это создает кучу неудобств из серии «отключил сетевуху — отвалился BitLocker».


      1. GreyCat
        28.06.2016 10:20

        С точки зрения кода — я имею в виду, что есть конгломерат из чипа TPM, ответной части в UEFI и GRUB-IMA, которые по идее должны были не позволять загрузить модифицированную систему и с чем торжествено не справились.


        С другой стороны — насколько я понимаю, обойти это можно даже без hotplug — просто сделать устройство, которое ничего не отвечает по шине до этапа загрузки ядра (на этапе проверок).


    1. ValdikSS
      28.06.2016 20:49
      +2

      Я правильно понимаю, что на самом деле можно было и не искать ключ AES и вообще заморачиваться с расшифровкой, после работы inception implant мы уже получаем работающий шелл на машину, после чего оттуда можно все скопировать уже из живой и расшифрованной ОС?
      На самом деле, как я узнал уже после написания этой статьи, можно сделать все гораздо проще — ОС подвержена Shellshock, можно запустить sshd через DHCP-сервер, подключиться под пользователем user:live (стандартный для Debian), sudo -i и все. Но так неинтересно :)


      1. GreyCat
        28.06.2016 20:59

        Вообще, на самом деле интересная и, субъективно, не очень решаемая задачка, как можно использовать TPM-подобный модуль для того, чтобы делать такую вот "защиту от копирования" или "защиту от запуска на измененном железе". До тех пор, пока есть отдельно процессор, выполняющий код, отдельно лежащие для него программы в виде чипа BIOS/UEFI + загрузчика на жестком диске, и отдельного TPM — по-моему, всегда можно вытащить этот самый код (в какой-нибудь эмулятор) и оттрассировать вызовы TPM.


        Другой вопрос, что, IMHO аркадные игры последних лет 10 настолько унылы, что ради них заморачиваться даже как-то не хочется. Разве что всякие DDR/Parapara, но и то, там все уже давным давно раздраконено и вытащено.


        1. ValdikSS
          28.06.2016 21:04

          Я точно не уверен, но, как мне кажется, не все так просто. TPM вряд ли Plug-and-Play, и там он не выносной, а запаян на материнскую плату, сбросить его регистры нельзя, так что придется, как минимум, модифицировать BIOS/UEFI таким образом, чтобы он забыл о TPM, и дополнять регистры уже из ОС. Задача усложняется с Intel Boot Guard, придется его выпаивать и вставлять в компьютер без Boot Guard. Но так-то, да, TPM не подразумевает защиту от физического присутствия.

          Coderush, возможно, сможет больше рассказать.

          Другой вопрос, что, IMHO аркадные игры последних лет 10 настолько унылы, что ради них заморачиваться даже как-то не хочется. Разве что всякие DDR/Parapara, но и то, там все уже давным давно раздраконено и вытащено.
          А у нас в квартире памп, а у вас?


          1. GreyCat
            28.06.2016 21:24

            Вариант номер раз — инъектируем в BIOS runtime отладчика, в начало — jmp, перепрошиваем, запускаем — вуаля — можно трейсить. Я года 3-4 назад на каких-то конференциях видел ребят, которые показывали готовые по сути решения такого вида.

            Вариант номер два — да, выпаять TPM, на макетку и дергать его чем угодно, хоть Ардуиной. Те, что я когда-то смотрел, не имели абсолютно ничего сложного, нужны питание/земля/clock, а дальше обычный SMBus по сути.

            А у нас в квартире памп, а у вас?

            Ну так народ ставит обычно не оригинальный же автомат, а контроллер + какую-нибудь Stepmania. И живет с этим, надо сказать, сильно лучше, чем с оригинальным автоматом.


            1. CodeRush
              28.06.2016 22:22
              +1

              С BootGuard вы ничего никуда не инжектируете, ибо процессор сначала проверяет, что у подписи первой половины тома PEI хеш совпал с тем, что в чипсет прошит при производстве, а затем только ресет отпускает. Т.е. попробуете влезть в фазу SEC — и система просто откажется включаться, перешиваем, запускаем — не запускается.

              Выпаять TPM теперь тоже нельзя, т.к. он теперь в чипсет встроен, как у Intel начиная с BayTrail, так и у AMD начиная с Merlin Falcon.

              Если говорить об атаках на более старые системы без BG и с внешним TPM — там все можно, конечно, но очень и очень непросто, ибо придется трассировать реально каждый вызов Extend, которые там начинаются с PeiAfterMem и до BDS их там получается порядка тысячи. Не заметил один — весь лог на смарку, откатывайся. Понятно, что это можно автоматизировать и обойти, но стоимость таких решений получается чуть ли не выше стоимости защищаемой ими информации, т.е. главная задача ИБ защитой таки решена.


              1. ValdikSS
                28.06.2016 22:26

                TPM же предоставляет лог измерений, можно запустить свой Linux, снять все, что измерялось до загрузчика, а после загрузчика уже самостоятельно посчитать и дополнить. Или там не все?

                Скрытый текст
                sudo cat /sys/kernel/security/tpm0/ascii_bios_measurements
                 0 95c27b31402f74c26900e177b8baa8e838b6bb9f 08 [S-CRTM Version]
                 6 0ed34fd1bb4227e218191958f2ddf98c9c5d2eaf 05 [Wake Event 1]
                 0 da39a3ee5e6b4b0d3255bfef95601890afd80709 07 [S-CRTM Contents]
                 0 da39a3ee5e6b4b0d3255bfef95601890afd80709 01 [POST CODE]
                 0 da39a3ee5e6b4b0d3255bfef95601890afd80709 01 [POST CODE]
                 0 da39a3ee5e6b4b0d3255bfef95601890afd80709 01 [POST CODE]
                 0 da39a3ee5e6b4b0d3255bfef95601890afd80709 01 [POST CODE]
                 0 da39a3ee5e6b4b0d3255bfef95601890afd80709 01 [POST CODE]
                 0 da39a3ee5e6b4b0d3255bfef95601890afd80709 01 [POST CODE]
                 0 da39a3ee5e6b4b0d3255bfef95601890afd80709 01 [POST CODE]
                 0 da39a3ee5e6b4b0d3255bfef95601890afd80709 01 [POST CODE]
                 0 8f50f5875f64a2e15d90439359385e83b7be2976 01 [POST CODE]
                 2 4e7eb43cc80572c09e6acb1a197e0c4d1f30428e 80000004 []
                 2 c3dfd4718660c13747c2c6a30e6a2e830314e75e 06 [Option ROM]
                 4 a070bfbb64dc542d7b6b22de52d9b4d994b0d2f1 80000003 []
                 2 0f6f41bcebc1da8f14c509b9d1d76acf16a54870 06 [Option ROM]
                 0 b0f6f2eb690c6c3dcbe4262dd74f8b5239ac98a4 07 [S-CRTM Contents]
                 0 c276613dbbb4d4f769c98610688681dbd6e94360 07 [S-CRTM Contents]
                 0 aa6e353181fa02adb8dede19be120225d2100c1d 07 [S-CRTM Contents]
                 0 5054f7d55020f5e5b3029cf39bea650127e70a3f 07 [S-CRTM Contents]
                 0 eeddbd4889ec75fbdf514558f45f13c450e7bceb 07 [S-CRTM Contents]
                 0 751353e555a1f600047fe5a312e555c8d4bdb1f9 07 [S-CRTM Contents]
                 0 bfd8a4fbe0a91927cc5fc9c2e6e2906a20c13335 07 [S-CRTM Contents]
                 0 b9c6ac5801cb8fe889aa1c05c1d6d03bd7bac8c3 07 [S-CRTM Contents]
                 5 cd0fdb4531a6ec41be2753ba042637d6e5f7f256 80000007 []
                 0 9c3f25b59808cf216bc4fc664c9c2429934ee614 80000009 []
                 1 de8159c9e3583e43ec0260b4f2a67156d7959094 80000009 []
                 1 3c82fd29e8b967dcabb4c47a1537b36fdf35a7a5 0a [Platform Config Flags]
                 1 147ff456bbbb76277ca8f924f6d204a22b57f4cd 06 [POST BIOS b41bb26650ab75be6f8d20ea96ba49b25227e1d4]
                 1 55e12bafd402f9e4868047b71f1bdcabb588be4e 06 [NVRAM]
                 1 54e256fd70f15b3ea614987c1fb340ae247b2bb3 06 [CMOS]
                 1 43a116f45a3009192e3e56a9aa37683fb41e9874 06 [SMBIOS]
                 0 9069ca78e7450a285173431b3e52c5c25299e473 04 []
                 1 9069ca78e7450a285173431b3e52c5c25299e473 04 []
                 2 9069ca78e7450a285173431b3e52c5c25299e473 04 []
                 3 9069ca78e7450a285173431b3e52c5c25299e473 04 []
                 4 9069ca78e7450a285173431b3e52c5c25299e473 04 []
                 5 9069ca78e7450a285173431b3e52c5c25299e473 04 []
                 6 9069ca78e7450a285173431b3e52c5c25299e473 04 []
                 7 9069ca78e7450a285173431b3e52c5c25299e473 04 []
                 4 8fd61378e02097961b440a059854ce7e61eaea9b 80000007 []
                 5 96b6446d4eb71852986a5696212ab871dcc2571c 80000002 []
                 5 c281e05b9b1acf018015a59eff6f7b4e4db1bd92 80000002 []
                 5 cd2b58e3c1f085d6703ae9ace8e32ef121ada736 80000002 []
                 5 a407760bdca6dbdb4772a460597ffef714d98762 80000002 []
                 5 b93bb690dd70511aa09739ad525d2196ea190187 80000002 []
                 5 9d759aa51a395e55f4e8967a1d3aa2707dbb3c7f 80000002 []
                 5 ccc5ef69c30305bda71c499fc02a116bdf10e3a6 80000002 []
                 5 294f49339e53192671ad549147b29df5e2a48574 80000002 []
                 5 1a26d9f405f16a8b302f71b673f54d3f849df91c 80000002 []
                 5 6f583a5b1e7d10c7ddc3043857bfe8c18ec187c7 80000002 []
                 5 0fec1c70382c5f369bddc20bd3cbfc2740ffcfbf 80000002 []
                 5 b5d3c77c2ed7b43b13edc3c313c6a148834b64b2 80000002 []
                 5 2bc2170c4a506885f29a501595cda13ce7991a62 80000002 []
                 5 68d6bc2ff72575c0ace6ce1277628df0db2e252b 80000002 []
                 5 2f87ff2a7a96f6bc43c626ccdf21e98273d76467 80000002 []
                 5 e1793c9a3ce760efab13936363e006bde294cc4a 80000002 []
                 2 6869f5936b1ff804a8ccfde890c911cb9cb5fe82 80000004 []


                1. CodeRush
                  28.06.2016 22:31

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


              1. GreyCat
                28.06.2016 22:34

                Печально. Собственно, вы в целом подтвердили мои теории — все подвинулось к тому, чтобы не давать разделять «работающий процессор» и «TPM».


  1. madprogrammer
    28.06.2016 10:45

    Странно, что жесткий диск не был дополнительно защищен с помощью ATA security, хотя я думаю это не сильно усложнило бы задачу


  1. Iqorek
    28.06.2016 11:03

    как вы узнали про нули в Disk Signature?


    1. ValdikSS
      28.06.2016 11:03
      +2

      Сделал дамп диска в Linux, подключил к компьютеру с Windows, сделал дамп еще раз и сравнил.


  1. Itachi261092
    28.06.2016 11:30

    Блин. То есть я всё правильно понял? При подключении HDD к винде, она, не обнаружив уникальный Disk Signature, без спроса его заменяет? или это, всё таки, происходит уже при снятии образа не правильным софтом?


    1. CodeRush
      28.06.2016 13:31
      +2

      Именно при подключении, и без вопросов.


  1. sim3x
    28.06.2016 12:20

    или замораживанием и выниманием памяти с сохранением ее содержимого на другом компьютере все тем же дампером

    вроде были исследования, где без заморозки на ддр2 снимали дамп даже через несколько минут после выдирания плашки, при комнатной температуре
    С заморозкой записи в памяти не повреждается неограниченное время

    Видео-фоточек со вскрытия аппарата не осталось?


    1. ValdikSS
      28.06.2016 13:46

      Нет, без заморозки DDR2 деградирует уже через несколько секунд, а с заморозкой — минуты. Другое дело, что деградация не случайная, а с неким шаблоном, и aeskeyfind умеет искать ключи даже в немного битой памяти, но делает это гораздо дольше.

      Фотографии есть только внутренностей, не думаю, что они будут интересны.


      1. MichaelBorisov
        28.06.2016 22:29

        По-моему там счет идет даже на миллисекунды. Помню, расширяли память ZX Spectrum на базе 72-выводных SIMM. Сегодня это уже музейные экспонаты, конечно, но по сравнению с КР565РУ5 это был прорыв в емкости и стоимости памяти. Так вот, когда расширяли память — то выяснилось, что ее регенерация в стандартной схеме работает слишком медленно для SIMM-72 — и память начинает забывать свое содержимое.

        Это я к тому, что если еще для некоторых 565РУ5 содержимое могло сохраняться секундами после отключения — то для современной памяти это нереально. Уменьшились размеры ячеек при сохранении уровня тепловых помех и утечек.


  1. kisttan
    28.06.2016 19:43

    Интересно было бы в процессе старта UEFI и TPM промониторить сеть, не исключено что будет попытка общения с сервером производителя что бы дополнительно целостность TPM/UEFI/cамой игры проконтролировать, ключи сменить, телеметрию слить.


    1. CodeRush
      28.06.2016 19:53

      Там чипсет Q35, для которого реализаций UEFI еще не было, поэтому особенно сильно можно не бояться того, что этот конкретный автомат «звонит домой».


    1. ValdikSS
      28.06.2016 20:45

      У Namco одна крайность другой краше: есть автоматы, которые работают только между такими же автоматами, они не обновляются и и никак не взаимодействуют с интернетом, а есть игры, которые работают только с подключенным интернетом и привязаны к серверам Namco, и по истечению нескольких лет Namco отключает серверы, как результат — игра превращается в груду неработающего железа.


      1. GreyCat
        28.06.2016 21:00

        О, кстати, было бы, наверное, интересно написать для них какие-нибудь эмуляторы и тем самым реанимировать.


        1. ValdikSS
          28.06.2016 21:06
          +2

          Мы уже этим занимаемся ;)
          Проблема в том, что такие игры не только на x86-based машинах, но и на System 357 (Playstation 3), и там не все так тривиально, но решаемо.


          1. GreyCat
            28.06.2016 21:29

            Я, видимо, пропустил, поэтому рискну спросить: вы — это какая-то компания, которая обслуживает игровые автоматы? Какой-то заработок это приносит или больше для души?


            1. ValdikSS
              28.06.2016 21:32
              +6

              Мы — небольшая группа ребят с трекера-со-свиньями, которые заставляют аркадные игры работать на обычных компьютерах с клавиатурами, мышками, гемпадами и без донглов, попутно, как правило, вырезав coin-режим, чтобы игра работала только во free play и ей не могли воспользоваться бутлегеры.
              Вернее, «мы» — громко сказано, я там принимаю довольно слабое участие, но все же принимаю.


              1. GreyCat
                28.06.2016 21:44
                +1

                Тогда это практически сцена :) Тогда респект :)


  1. datacompboy
    30.06.2016 12:00
    +2

    Огромное спасибо за aeskeyfind! Воскурил, подход к поиску ключей просто чудесный :)


  1. jok40
    01.07.2016 09:42
    +1

    Сначала Вы описываете атаку Cold boot. И там пишете:

    Первый способ не сработает из-за соответствия материнской платой спецификации Trusted Computing Group, которая предписывает выполнять очистку памяти при загрузке, и дампер сохранит уже очищенную память, в которой, конечно же, уже не будет никаких ключей.
    А затем следом описываете DMA-атаку, выполняемую с помощью FireWire-платы, установленной в компьютер. Она, как я понял, позволила сграбить ещё не очищенную память — с AES-ключами в ней.

    Разрешите поинтересоваться: как Вам удалось это сделать? Вы каким-то образом остановили процесс загрузки — до момента очистки памяти и после этого дампили память или же использовали какой-то другой метод?


    1. ValdikSS
      01.07.2016 11:11

      Вы имеете ввиду, как мне удалось через Firewire получить память? Я дампил ее прямо на запущенном автомате, в то время, пока игра работает.
      А чтобы запустить дампер, нужна перезагрузка, и при перезагрузке память бы обнулилась.


      1. jok40
        01.07.2016 15:03

        Получается, чтобы сдампить память методом Cold Boot нужно загрузиться в собственную ось с флешки и с неё же запускать дампер памяти. Так как загрузчик после загрузки оси память подтёр, то ключей в дампе уже не найти. А в случае с Вашим методом загружается родная ось автомата, которая грузит и расшифровывает файлы игрушки и не убирает мусор за собой — что и позволило, сграбив память, найти в этом мусоре ключи. Я правильно понял?


        1. ValdikSS
          01.07.2016 15:07

          Да, именно так.