Я считал, что 'Нормальные' инструкции ARM являются фиксированной длиной - 32 бита. И что никакая инструкция ARM не может вскочить в середину другой инструкции - что-то, что легко сделать с x86 инструкциями.
(Для x86 NaCl Google пытается 'зафиксировать' это путем выравнивания инструкций относительно 32-байтовых границ.)
Это делает программы ARM более безопасными или более стойкими к определенным нападениям?
Если так, это расширяется на инструкции по Java и Ползунок?
Место, где может быть безопаснее, - это сканирование кода операции в процесс песочницы. Если вы хотите запретить или перехватить какую-либо инструкцию, это проще сделать с набором инструкций фиксированной длины. В архитектуре x86 набор инструкций зависит от контекста, а инструкция имеет переменную длину, поэтому инструкция, которая кажется безобидной, может фактически встроить другую инструкцию, если вы проанализируете ее с правильным смещением. Вы можете эффективно «перейти в середину инструкции», оставаясь при этом действующей инструкцией.
ARM легче анализировать, и режим большого пальца не меняет этого. Таким образом, набор инструкций ARM не особенно безопасен сам по себе, но его гораздо проще анализировать, и правильный синтаксический анализ необходим для NaCl, подобного песочнице
. Это краткий и, вероятно, неточный ответ. Более точный ответ можно найти в сообщении в блоге в отличном блоге matasano
Вы думаете об этой атаке, состоящей в том, чтобы сбить адрес возврата стека или что-то подобное, чтобы она перешла в полезную нагрузку? Выравнивание слов, я полагаю, здесь не очень помогает или помешает - вам просто нужно выровнять полезную нагрузку 4 байта. Да, и x64 требует 16-байтового выравнивания инструкций.
Вы это имели в виду? Спасибо!