Information Security
System Programming
Reverse engineering
Comments 19
+30
не знаю уже, смеяться или плакать.
Теперь на джаваскрипте еще и взломали PS4.

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

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

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

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

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

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

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

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

Никакой предыстории, что это и откуда взялось, я не увидел.
+2
Спасибо 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).
Only those users with full accounts are able to leave comments., please.