Comments 32
не знаю уже, смеяться или плакать.
Теперь на джаваскрипте еще и взломали PS4.

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

А здесь какая-то скукота намечается — браузер, яваскрипт, узявимость ядра. Хоть бы софт обновляли, емае. Хотя с нынешними темпами обновлений прошивки, еще и обновление ядра — совсем умрет все. У xbox one наверняка поинтереснее будет с его HyperV, виртуальными машинами и жестко ограниченными по правам приложениями на WinRT, но ничего что-то не слышно про него.
Просто раньше пытались защититься от взлома, потому что в играх сингл имел если не решающую, то точно одну из главных ролей, и т.к. многие покупали игры в первую очередь из-за сингла, был смысл защищать консоли именно от запуска записанных на внешний носитель рипов.

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

А взлом консоли только добавляет ей популярности. Это уже проходили с PS, PS2, PS3, Xbox360, PSP, так что для производителей отчасти даже выгодно, когда взламывают консоль — это позволяет значительно повысить ее продажи на исходе жизненного цикла, треть которого для PS4 уже прошла.
Ну если с этой позиции судить, то расцвет мульта это прошлое поколение. Сейчас это так, наследство. Большая игр таки продолжают быть с синглом во главе, а у кого-то мультиплеера и вовсе нет как у ордера недавнего.

Так что стимул пиратства он остался — большая часть крупных проектов все еще сингловые. А запуск не подписанного кода — это чисто спортивный интерес для любой новой платформы. Homebrew сцена всегда оживает с приходом новой консоли.
>> А взлом консоли только добавляет ей популярности
Да вот только с продаж консольного железа не зарабатывают денег, а поначалу и вообще теряют.
На исходе жизненного цикла, когда остатки консолей на складах становятся проблемой — идет борьба уже за продажу по сути любой ценой. А первые пару лет это невыгодно, конечно.
Что лучше, продать с убытком в 40$ или оставить лежать на складах, не заработав ничего?
Иногда производители даже выпускают консоли, чтобы их хачили, например psp E1000, который даже не имеет UMD привода, а доступ в PSN закрыт для него давно.

Они пытаются соблюсти некоторые приличия — именно тем, что не выпускают их сразу разлоченными, но тем не менее все заинтересованные понимают к чему дело идет.
Скажите, а как обстоят дела с PS Vita? Ее защиту не взломали еще?
По слухам, с ней дела гораздо серьезнее. Начиная с того, что если тут ядро частично фактически открыто, то в случае PS Vita ничего подобного нет.

Полноценный нативный хак Rejuvenate для PS Vita с прошивкой от 3.00 до 3.51 вышел совсем недавно, в июне, и он пока что кроме «Hello, world!» ничего запускать не умеет. Давно и успешно взломана часть, которая является эмулятором для запуска игр с PSP — для установки этих хаков требуется успевать скачивать специальные игры с эксплойтом из PSN.

Все известные мне новости по теме выкладываютсяздесь.
А ей кто-то пользуется? Вроде бы она какая-то не вот чтобы очень живая консоль…
Чувак, я нихрена не понял из того, что ты написал, но ты достучался до моего сердца!
Какой JavaScript API используется для системных вызовов и где почитать его спецификацию?
Как запустить выполнение нужного скрипта — разместить его на своем сайте и открыть его в браузере PS4 или еще как-то?
1. Насколько я понял по коду, специального API нет — только запись по адресам при помощи хаков, только хардкор. Адреса становятся известны после эксплуатации уязвимости Uint32Array. Алгоритм подробно расписан в exploit.js, системные вызовы делаются функциями из just-rop.js при помощи установки значений в адреса памяти. Во многом код автора поста — это расширенная версия эксплойта от nas, в частности он точь-в-точь перенес этот кусок из старого кода.
2. Да, в принципе можно просто перейти в браузере по ссылке cturt.github.io/PS4-playground. Правда, проверить не удалось — на прошивке 2.51 эксплойт уже не работает; видимо, поменялись адреса или закрыли уязвимость.
Вот это — chain.read_rdi_FromVariable(...), chain.syscall(...) — что за функции, что за объект chain, как их получили? Информация об этих функциях получена анализом какого-то кода, используемого внутри системы ps4?
Первое упоминание о chain идет после фразы:
Сделав так, что rcx указывает на инструкцию ret, цепочка выполнится обычным образом

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

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

Давайте рассмотрим пример с системным вызовом getpid из описания репозитория фреймворка JuSt-ROP (настоятельно рекомендую прочитать, поскольку там даны некоторые объяснения):

var chain = new rop();

try {
    chain.syscall("getpid", 20);

    // rax is the return value
    chain.write_rax_ToVariable(0);

    chain.execute(function() {
        console.log("PID: " + chain.getVariable(0).toString());
    });
}
catch(e) {
    logAdd("Incorrect gadget address " + e.toString(16));
}

chain — это объект класса rop(), который определен в файле just-rop.js и содержит в себе функции syscall (для осуществления системного вызова, который реализуется несколькими вызовами функций add()), add (для записи инструкции по адресу) и набор функций-хелперов write_<имя_регистра>_ToVariable / read_<имя_регистра>_FromVariable для чтения/записи регистра из/в переменную.

В файле gadgets.js описаны гаджеты в следующем формате:

gadget(instructions, module, address)

Спустимся по коду вглубь. В syscall() мы вызываем функцию add(), передавая в нее имя одного из гаджетов (для получения его адреса) и значение:

this.add("pop rax", systemCallNumber);
if(typeof(arg1) !== "undefined") this.add("pop rdi", arg1);

Функция add производит следующее: берет адрес гаджета, записывает его по адресу длины цепочки chainAddress + chainLength, затем прибавляет к длине цепочки еще 8 (по всей видимости, бит, для следующего адреса) и записывает по следующему адресу переданное в add значение.

Функция add для записи значения вызывает функцию setU64into(). Это функция, объявленная глобально в файле exploit.jswindow.setU64into(). Функции из этого файла выглядят как реализация уязвимости WebKit CVE-2012-3748, насколько я понял там все завязано на переполнении переменных типа u32/u64 в V8, но чтобы разобраться в деталях ее работы, надо уметь писать экплойты для WebKit. В принципе, можете попробовать разобраться по презентации.

После того, как chain.write_rax_ToVariable(0); запишет возвращенное вызовом значение регистра rax в переменную, его можно будет получить при помощи chain.getVariable(0).
Все описанные здесь методы очень сложны. Т.е. да, если делать хак один раз, то они возможно сработают. Но Sony не сидит не месте, и там где можно было пролезть один раз в следующий раз уже не пролезешь — дыру залатают и профиксят.

Мне странно, что Sony до сих пор не начала вычислять хакеров проактивно — например, если странный вызов происходит — связаться с Sony серверами и сообщить о данной попытке взлома.

Я бы предпочёл не reverse engineeriть вообще ничего, если возможно.

Есть ли возможность сделать игру для PS4, и запихать туда некий development kit / scripting kit, или же использовать существующие игры и их поддержку scriptинга / компиляции.

Я пробовал googlить, но скажем «ps4 python» не дружат между собой вообще.

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

Чем проще хак и чем обширнее даннная игра разпространена, тем лучше.
Есть ли возможность сделать игру для PS4, и запихать туда некий development kit / scripting kit, или же использовать существующие игры и их поддержку scriptинга / компиляции.
На дев-ките можно развлекаться сколько угодно, но релизные игры подписывает Sony, и она сразу отзовёт подпись кода с бекдором, как только информация о таковом появится в публичном доступе.
а как вообще с dev rights — можно ли получить доступ разработчика на любую консоль или это платно / холерно? не знаете?
За деньги вы получаете SDK и dev-kit, то есть «разблокированную» консоль, выполняющую неподписанный код. Тот же самый код не будет запускаться на обычных потребительских консолях. Никаких «dev rights» вы не получаете. Разблокировку «на любую консоль» купить нельзя.
Все описанные здесь методы очень сложны

Все описанные методы это стандартный инструментарий современного кулхацкера. Это сложно конечно, но никуда не денешься. Все к этому привыкли.

Есть ли возможность сделать игру для PS4, и запихать туда некий development kit / scripting kit, или же использовать существующие игры и их поддержку scriptинга / компиляции.

Sony запретила моддинг на пс4, который тащит снаружи какие-то файлы. Никакие ассеты и скрипты, которых нет в игре, добавить нельзя. Вокруг этого был крупный скандал касательно fallout 4. На пс4 моды, по сути, невозможны. Единственный способ создания контента в играх это его сборка из того, что дает игра. Самый продвинутый вариант на пс4 в dreams — подобие визуального программирования, где из готовых блоков собирается логика. Очевидно, что никак системный вызов дернуть вам не дадут, так же как не дадут вообще ничего, что взаимодействует с системой. Для эсплоитов это бесполезно.

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

И что это даст? Даже если невероятным образом вам дадут питоновский интепретатор, дальше то что? Игры однозначно в точно такой же песочнице исполняются, а то и более жесткой, чем браузер. Без эксплоитов ядра все равно никуда не залезть. После взлома ядра начинаются аппаратные защиты, которые у пс4 наверняка есть как были и в прошлом поколении. Ядро не является самым привилегированным режимом исполнения. У бокса вон их дофига, все кругом пошифровано изолировано на аппаратном уровне, да еще приправлено гипервизором и виртуальными машинами, что вполне можно считать причиной, почему это поколение консолей полностью миновало пиратство.
И что это даст?
Если получится запускать любой код в usermode через какую-нибудь дыру в условном «тетрисе», то запускаем этот тетрис, затем эксплойт, и шелл-код скачивает и запускает условный «uncharted 4» в этом же процессе. Ядро проламывать не надо, из песочницы убегать тоже не надо.
Если бы игры было так просто скачать и запустить, то проблем с пиратством было бы куда меньше. Потом еще надо умудриться запустить это нечто, если даже оно скачалось. Так просто что-то запустить наверняка не дадут атрибуты памяти. Если песочница правильно настроена, то будут заблокированы все варианты запуска чего-либо стороннего (mmap, mprotect, fork, вот это вот все, что игре совсем не нужно, будет нафиг выключено). Сами игры зашифрованы и расшифровкой занимается специальный процессор, к которому никакого доступа естественно нет.
Я поэтому и спрашивал. Консоли современные это кучи слоев защит от программных до аппаратных. Даже проникновение в ядро это далеко не все, что требуется.
Сам купил недавно новый PS4, но для детей — самому не охота «гадить» и/или убивать свой PS4, хотя сам с интересом поковырял бы защиту PS4. Думаю пока железо мое лезть в неё глубже пока не буду. Максимум попробовал бы PS4 SDK, и может какую нибуть игру написать пока её не хотят забанить. Боюсь, что PS4 SDK платный.

Если кто что захочет профинансировать, сообщите лично.
mmap, mprotect, fork, вот это вот все, что игре совсем не нужно, будет нафиг выключено
Убрать все эти функции из userspace — слишком большая цена безопасности, при этом она оправдана только если мы запускаем недоверенный код. При этом нужно будет перенести всё системное в ядро. Снизится стабильность. Кучу опенсорсных библиотек/движков придётся переписать. Но мы же запускаем только доверенный код, тут не нужна такая модель безопасности.
Сами игры зашифрованы и расшифровкой занимается специальный процессор, к которому никакого доступа естественно нет
В RAM игры не зашифрованы. Нужно расшифровывать при чтении из сети / с HDD. И даже в этом случае в защищённом криптопроцессоре можно хранить лишь закрытые ключи, а сеансовый (одноразовый) ключ отдавать программе для расшифровки на основном CPU. Просто потому что невыгодно прокачивать большие объёмы через спец. процессор, это надо его делать сравнимым по пропускной способности с CPU.
Кстати, один из вариантов — это онлайн игры. Они по идее сами тянут контент из сети. Изменить DNS оффициального сервера на свой собственный локальный сервер, я подавать эксплойт контент напрямую с сервера.

Онлайн игр много, Terraria, Growtopia,…
Думаю что игры проще эксплойтить, чем саму приставку.

Начиная с того, что поддержка скриптинга и modинга может быть в самой игре (как фича). Заблокировать сложнее — представьте отозвать и/или забаннить все версии данной игры, да и думаю в Sony более помешанные на security программисты, чем все те поставщики игр, что под них работают.

Изменить DNS оффициального сервера на свой собственный локальный сервер
Так сейчас всё SSL, а установка своего сертификата в приставку не поддерживается.
Это если игра использует https, но не факт, скорее всего customизированный бинарный протокол, который больше подходит для обновления мира.
Заблокировать сложнее — представьте отозвать и/или забаннить все версии данной игры
Это же элементарно.

Эксплойт в системе, так приставка, как только видит интернет, заявляет: хочу обновить ось, и без этого действия ну вообще почти ничего не работает (сегодня у меня PS4 так и написала, пришлось качать мегабайт 300-400).

Если ошибка в игре — принудительно обновить версию игры. У игрока нет выбора, кроме как не включать интернет )))
Only those users with full accounts are able to leave comments. Log in, please.