Исследуем защиту и восстанавливаем аркады Namco System ES1

    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.
    После этого игра должна запуститься, и можно проделать все вышеописанные манипуляции, чтобы заполучить расшифрованные файлы и восстановить остальные аппараты.

    25.06.2018 UPD: По всей видимости, Nirin был первой игрой на System ES1, и Namco не знали, как корректно реализовывать защиту с использованием TPM. Игра не использует шифрование средствами TPM, а получает ключ путем хеширования состояния значений Trusted Boot PCR.
    Получить ключ шифрования можно без DMA-атаки, путем модификации файла filesystem.squashfs для сохранения состояния /sys/kernel/security/tpm0/binary_bios_measurements и /sys/class/tpm/tpm0/pcrs и реконструкции оригинальных значений TPM PCR.
    Скрипт для реконструкции значений PCR: github.com/ValdikSS/binary_bios_measurements_parser

    Заключение

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

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

    Скрытый текст
    Pedal
    Share post
    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More
    Ads

    Comments 55

      +15
      Прекрасно, снимаю шляпу.
      Когда найду немного времени — напишу подробнее про TPM и firmware TPM, а то там конь не валялся и легенды про ужасный DRM ходят.
        +7
        Отсюда правило: копируй диски под Linux.
          0
          «Сделано это было явно намеренно — все утилиты для управления разделами в Linux генерируют случайный Disk Signature, а не нули.»

          Или я неправильно понял или не прокатит.
          ...Clonezilla live тоже меняет Disk Signature?
            0
            Прокатит, ядро не трогает Disk Signature, образ можно снять через dd, и игра останется работоспособной. Про Clonezilla не знаю, не пользовался.
            +1
            Это да. Недавно ноут в ремонт отдавал и прикупил гибридный диск того же объёма, что в ноуте был. Чтобы система пошутрее проворачивалась. Попросил склонировать систему, в сервисе взялись. Потом говорят, мол не выходит. Тремя способами пробовали — не грузится после копирования. Дома вставил диски в usb читалку, смотрю, у них количество секторов точно совпадает. И длина сектора одинаковая. Думаю: Геометрия у современных дистов вещь давно виртуальная, почему бы и нет? Запустил тупо dd один диск на второй. Четыре часа ожидания и всё работает. До сих пор не понимаю, что у них там не работало…
            –3
            То есть утилита бинарного копирования опирается на разметку ОС? Не могу сказать, что мне понравилась такая утилита.
              +3
              О какой утилите вы говорите? В статье, вроде, ничего подобного нет.
              • UFO just landed and posted this here
                +1
                Очень круто.
                  +1
                  А сколько места занимает весь игровой хабар на диске? 160 гигабайт даже для современных навороченных игр слишком много пока.
                    0
                    ≈100 МБ ОС и 600-800 МБ игра в зажатом (squashfs, lzma) виде. Сейчас десктопных жестких дисков объемом менее 320 ГБ просто не производят, тогда же, вероятно, меньше 160 ГБ было проблемно найти.

                    Игры с большим количеством контента, тот же Pump It Up Prime, занимает с последним обновлением уже под 50 ГБ, но там музыка в PCM и видео в MPEG2.
                      +1
                      По идее разумнее было бы поставить CF или SSD вместо механического диска, если система предполагает довольно жесткую эксплуатацию. CF даже дешевле наверное.

                      Хотя в этой реальности даже на системы в тепловозе жесткие диски ставят. :)
                  • UFO just landed and posted this here
                      +4
                      зачем копировать диски в винде?
                      Зачем? Затем, что Windows стоит на подавляющем большинстве компьютеров, и справлялась с этим не хуже других ОС. До этого момента.
                      к чему именно в железе привязывается система шифрования, ключ?
                      В материнскую плату установлен TPM, в TPM зашит уникальный ключ RSA-2048. Файлы игры зашифрованы случайным ключом AES-256, который берется из /dev/random при первом включении игры (на заводе), и этот ключ зашифровывается ключом из TPM с привязкой к PCR.
                      • UFO just landed and posted this here
                      +2
                      До последнего был уверен, что в защите используется серийник диска…
                        +2

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


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

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

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


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

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

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


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

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

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

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

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

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

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

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

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

                                    Если говорить об атаках на более старые системы без BG и с внешним TPM — там все можно, конечно, но очень и очень непросто, ибо придется трассировать реально каждый вызов Extend, которые там начинаются с PeiAfterMem и до BDS их там получается порядка тысячи. Не заметил один — весь лог на смарку, откатывайся. Понятно, что это можно автоматизировать и обойти, но стоимость таких решений получается чуть ли не выше стоимости защищаемой ими информации, т.е. главная задача ИБ защитой таки решена.
                                      0
                                      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 []
                                        0
                                        Проверять этот лог можно и самой прошивкой, например, на событии EndOfDxe. Не сошлось с эталоном — дальше не грузимся. Понятно, что все это, без настоящего аппаратного корня доверия, будет рано или поздно отломано, поэтому HWVB внедрили практически все производители процессоров, которые хотят продать клиентам нормальную доверенную загрузку, а не суррогат.
                                        0
                                        Печально. Собственно, вы в целом подтвердили мои теории — все подвинулось к тому, чтобы не давать разделять «работающий процессор» и «TPM».
                              0
                              Странно, что жесткий диск не был дополнительно защищен с помощью ATA security, хотя я думаю это не сильно усложнило бы задачу
                                0
                                как вы узнали про нули в Disk Signature?
                                  +2
                                  Сделал дамп диска в Linux, подключил к компьютеру с Windows, сделал дамп еще раз и сравнил.
                                  0
                                  Блин. То есть я всё правильно понял? При подключении HDD к винде, она, не обнаружив уникальный Disk Signature, без спроса его заменяет? или это, всё таки, происходит уже при снятии образа не правильным софтом?
                                    +2
                                    Именно при подключении, и без вопросов.
                                    0
                                    или замораживанием и выниманием памяти с сохранением ее содержимого на другом компьютере все тем же дампером

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

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

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

                                        Это я к тому, что если еще для некоторых 565РУ5 содержимое могло сохраняться секундами после отключения — то для современной памяти это нереально. Уменьшились размеры ячеек при сохранении уровня тепловых помех и утечек.
                                      0
                                      Интересно было бы в процессе старта UEFI и TPM промониторить сеть, не исключено что будет попытка общения с сервером производителя что бы дополнительно целостность TPM/UEFI/cамой игры проконтролировать, ключи сменить, телеметрию слить.
                                        0
                                        Там чипсет Q35, для которого реализаций UEFI еще не было, поэтому особенно сильно можно не бояться того, что этот конкретный автомат «звонит домой».
                                          0
                                          У Namco одна крайность другой краше: есть автоматы, которые работают только между такими же автоматами, они не обновляются и и никак не взаимодействуют с интернетом, а есть игры, которые работают только с подключенным интернетом и привязаны к серверам Namco, и по истечению нескольких лет Namco отключает серверы, как результат — игра превращается в груду неработающего железа.
                                            0

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

                                              +2
                                              Мы уже этим занимаемся ;)
                                              Проблема в том, что такие игры не только на x86-based машинах, но и на System 357 (Playstation 3), и там не все так тривиально, но решаемо.
                                                0
                                                Я, видимо, пропустил, поэтому рискну спросить: вы — это какая-то компания, которая обслуживает игровые автоматы? Какой-то заработок это приносит или больше для души?
                                                  +6
                                                  Мы — небольшая группа ребят с трекера-со-свиньями, которые заставляют аркадные игры работать на обычных компьютерах с клавиатурами, мышками, гемпадами и без донглов, попутно, как правило, вырезав coin-режим, чтобы игра работала только во free play и ей не могли воспользоваться бутлегеры.
                                                  Вернее, «мы» — громко сказано, я там принимаю довольно слабое участие, но все же принимаю.
                                                    +1
                                                    Тогда это практически сцена :) Тогда респект :)
                                                      +2
                                                      В Dead Heat теперь играют на Youtube, наверное, это успех.
                                                        0
                                                        В комментах суровый адъ :)
                                                        Это каким-то образом кто-то спер и раздает теперь с внешних ресурсов?
                                                          0
                                                          Скорее всего, кто-то скачал с трекера, загрузил на mega, скинул кому-то второму ссылку вместе с комментариями, а этот второй пошел на 8ch и сделал видео на youtube.
                                          +2
                                          Огромное спасибо за aeskeyfind! Воскурил, подход к поиску ключей просто чудесный :)
                                            +1
                                            Сначала Вы описываете атаку Cold boot. И там пишете:
                                            Первый способ не сработает из-за соответствия материнской платой спецификации Trusted Computing Group, которая предписывает выполнять очистку памяти при загрузке, и дампер сохранит уже очищенную память, в которой, конечно же, уже не будет никаких ключей.
                                            А затем следом описываете DMA-атаку, выполняемую с помощью FireWire-платы, установленной в компьютер. Она, как я понял, позволила сграбить ещё не очищенную память — с AES-ключами в ней.

                                            Разрешите поинтересоваться: как Вам удалось это сделать? Вы каким-то образом остановили процесс загрузки — до момента очистки памяти и после этого дампили память или же использовали какой-то другой метод?
                                              0
                                              Вы имеете ввиду, как мне удалось через Firewire получить память? Я дампил ее прямо на запущенном автомате, в то время, пока игра работает.
                                              А чтобы запустить дампер, нужна перезагрузка, и при перезагрузке память бы обнулилась.
                                                0
                                                Получается, чтобы сдампить память методом Cold Boot нужно загрузиться в собственную ось с флешки и с неё же запускать дампер памяти. Так как загрузчик после загрузки оси память подтёр, то ключей в дампе уже не найти. А в случае с Вашим методом загружается родная ось автомата, которая грузит и расшифровывает файлы игрушки и не убирает мусор за собой — что и позволило, сграбив память, найти в этом мусоре ключи. Я правильно понял?
                                                  0
                                                  Да, именно так.
                                              +1
                                              Добавлена заметка про защиту Nirin.
                                                0
                                                Интересная тема, надо бы попробовать на диве последней. Правда nu не любит смены винчестеров и при изменении серийников превращается в тыкву — это тоже последствия TPM или кастомный биос? а то не хочется воткнуть FW-контроллер и в итоге угрохать железку начисто
                                                  0
                                                  Nu — от Sega, а не от Namco. Я не знаю, какая защита там применяется.
                                                    0
                                                    Начиная с Nu там наверчено столько всего, что попробуй отвертеться. Могу подробнее рассказать в личке, если интересно, а то один уже порассказывал наружу и дорассказывался. Писал вам в твиттере с этим вопросом, но сам нашёл статью раньше вашего ответа.

                                                Only users with full accounts can post comments. Log in, please.