Так там, судя по статье, не TeX-эксплойт, всего лишь используется то, что реализация MiKTeX позволяет писать куда угодно, в том числе в папку автозапуска; а собственно malicious часть должна быть не на TeX, а на JS (ну или VB). То есть все достаточно тривиально (и защититься установкой подходящих виндовых прав должно быть несложно).
То, что Turing-complete кодом можно задосить сервер, тоже понятно, и тоже вроде в статье не приведено чего-либо более нетривиального, чем \loop...\repeat.
Видели ли http://cseweb.ucsd.edu/~hovav/talks/blackhat08.html -- чуваки обнаружили, что внутри достаточно больших библиотек типа libc обычно есть Форт-система, которую можно использовать для исполнения direct-threaded code injected to the stack via buffer overflow, с игнорированием NX бита.
Типа, в современных ОС стек и прочие volatile memory areas помечаются NX (No Execute) битом, поэтому стандартный buffer overflow с переписыванием адреса возврата на записанный далее в стек код не работает.
Но есть замечательный приём, использовавшийся в большинстве реализаций Форта: представим программу как последовательность адресов написанных на ассемблере процедур плюс какой-то регистр, указывающий на текущую исполняемую Форт-инструкцию, каждая такая процедура в конце своего исполнения должна увеличить значение этого регистра и выполнить косвенный jump по указываемому им адресу. Причём разумеется процедуры могут использовать и изменять значение этого виртуального Instruction Pointer, например, есть процедура LIT которая читает следующий адрес как число, пушит его в особый стек и увеличивает указатель не на 1, а на 2. То есть "LIT 10 LIT 20 ADD PRINT" (где всё, кроме чисел, является указателями на соответствующие процедуры) печатает "30".
Ну и вот, 80x86 Stack Pointer является совершенно замечательным кандидатом на роль виртуального Instruction Pointer, потому что однобайтовая инструкция ret делает в точности то, что нам нужно: уменьшает SP (поэтому программа должна быть записана в обратном направлении) и прыгает на указываемый им адрес.
Вот эти чуваки в своей оригинальной статье обнаружили, что если воспринимать libc (например) как просто кусок случайных данных, то там есть достаточно интересных последовательностей инструкций заканчивающихся ret, чтобы построить из них Тьюринг-полный интерпретатор, да ещё и умеющий вызывать функции ОС. Причём, если мне не изменяет память, ни один из использованных ими ret не был оригинальной инструкцией, все были кусками каких-то других инструкций, которые случайно оказались имевшими нужное численное значение.
Вспомнил я про это потому, что я же правильно понимаю, что TeX является кривым вариантом Форта, без компиляции и IMMEDIATE слов, поэтому в нём например очень криво работают вложенные \if ? Впрочем, в статье всё как-то довольно просто и без изысков -- можно читать исполняющийся файл, можно писать что угодно куда угодно в файловую систему, ну и всё.
no subject
Date: 2010-04-16 04:34 pm (UTC)no subject
Date: 2010-04-17 09:37 am (UTC)То, что Turing-complete кодом можно задосить сервер, тоже понятно, и тоже вроде в статье не приведено чего-либо более нетривиального, чем \loop...\repeat.
no subject
Date: 2010-04-16 05:41 pm (UTC)no subject
Date: 2010-04-16 05:48 pm (UTC)no subject
Date: 2010-04-17 10:05 am (UTC)(И я не слышал о практической концепции вируса, использующей именно универсальную вычислимость, а не конкретные мисфичи; а было бы интересно).
no subject
Date: 2010-04-16 10:32 pm (UTC)Типа, в современных ОС стек и прочие volatile memory areas помечаются NX (No Execute) битом, поэтому стандартный buffer overflow с переписыванием адреса возврата на записанный далее в стек код не работает.
Но есть замечательный приём, использовавшийся в большинстве реализаций Форта: представим программу как последовательность адресов написанных на ассемблере процедур плюс какой-то регистр, указывающий на текущую исполняемую Форт-инструкцию, каждая такая процедура в конце своего исполнения должна увеличить значение этого регистра и выполнить косвенный jump по указываемому им адресу. Причём разумеется процедуры могут использовать и изменять значение этого виртуального Instruction Pointer, например, есть процедура LIT которая читает следующий адрес как число, пушит его в особый стек и увеличивает указатель не на 1, а на 2. То есть "LIT 10 LIT 20 ADD PRINT" (где всё, кроме чисел, является указателями на соответствующие процедуры) печатает "30".
Ну и вот, 80x86 Stack Pointer является совершенно замечательным кандидатом на роль виртуального Instruction Pointer, потому что однобайтовая инструкция ret делает в точности то, что нам нужно: уменьшает SP (поэтому программа должна быть записана в обратном направлении) и прыгает на указываемый им адрес.
Вот эти чуваки в своей оригинальной статье обнаружили, что если воспринимать libc (например) как просто кусок случайных данных, то там есть достаточно интересных последовательностей инструкций заканчивающихся ret, чтобы построить из них Тьюринг-полный интерпретатор, да ещё и умеющий вызывать функции ОС. Причём, если мне не изменяет память, ни один из использованных ими ret не был оригинальной инструкцией, все были кусками каких-то других инструкций, которые случайно оказались имевшими нужное численное значение.
Вспомнил я про это потому, что я же правильно понимаю, что TeX является кривым вариантом Форта, без компиляции и IMMEDIATE слов, поэтому в нём например очень криво работают вложенные \if ? Впрочем, в статье всё как-то довольно просто и без изысков -- можно читать исполняющийся файл, можно писать что угодно куда угодно в файловую систему, ну и всё.
no subject
Date: 2010-04-17 10:09 am (UTC)