Досліджуємо захист і відновлюємо аркади 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.00 GHz
  • RAM: 2x512 MB DDR2 800 MHz 1.8 V
  • Відео: 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 взагалі реалізований на рівні і доступний усім.

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

Друга ступінь захисту — захист HDD.
HDD Seagate
Чому ж гра не запускається після копіювання диска? Бути може, виробник написав свою прошивку для контролера диска, яка стирає дані при зверненні до якогось сектору, яке відбувається при посекторном копіювання диска, але ніколи не відбувається при звичайному використанні диска грою і ОС? Знаючи 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.0 K Jun 27 19:02 .
drwxr-xr-x 7 root root 4.0 K 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
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.