Віруси для MacOS телефону iPhone

Для того щоб зрозуміти причини уразливості iPhone , Спочатку розглянемо деякі типові прийоми, якими користуються розробники шкідливих додатків. Проведемо аналіз однієї з найбільш поширених атак шляхом переповнення буфера. Саме цей підхід застосовують розробники вірусів для iPhone найчастіше.

Будь-який користувач-чоловік повинен мати уявлення про основні принципи роботи електронних пристроїв. ось тут, ви знайдете тест справжній ви чоловік. Втім, незалежно від результатів будь-яких тестів, розбиратися в роботі свого телефону не завадить.

Пам'ять пристрою - це набір осередків, в які може бути записана інформація розміром, наприклад, 1 байт. Осередки мають послідовні номери. Вся пам'ять ділиться на розділи, кожен з яких має власну структуру і порядок звернення до осередків. Нас в цьому зв'язку цікавлять три структури: власне пам'ять, де зберігаються дані, буфер і стек.

Буфер - це розділ пам'яті, куди містяться дані, що вводяться користувачем в процесі взаємодії з додатком, перед тим як бути використаними відповідно до логіки програми.

Стек - це така структура пам'яті, куди дані містяться послідовно один за одним. При цьому додаток може отримати швидкий доступ до останнього вміщеної в стек значення. Щоб витягти передостаннє значення, необхідно перш за витягти останнє значення, записане в стек. Для приміщення значення в стек зазвичай використовується інструкція PUSH, а для вилучення інструкція POP.

У пам'яті даних зберігається код самої програми. У першому наближенні програма - це набір функцій, кожна з яких виконує ті чи інші дії з даними. При виконанні програми функції можуть виконуватися послідовно, але програміст також може викликати будь-яку функцію. Для подібного виклику використовується адреса функції.

Адреса функції - це покажчик на місце в пам'яті, де розташований код функції.

Часто виникає ситуація, коли під час виконання однієї функції повинна бути викликана інша функція для того, щоб зробити будь-які дії з даними. Після того, як викликана функція закінчила своє виконання, управління передається назад в першу функцію. Подібні виклики зручно робити, використовуючи структуру стек. При виклику внутрішньої функції в стек поміщається адреса зовнішньої функції. Таким чином, програма запам'ятовує, в яке місце необхідно повернутися після виконання внутрішньої функції. Виглядає це так, як показано на малюнку нижче.

До виконання внутрішньої функції стек порожній [1]. Під час виклику внутрішньої функції в стек зберігається адреса повернення в зовнішню функцію [2]. У нашому випадку - 0x00638. Після виконання внутрішньої функції з стека витягується адреса зовнішньої функції і здійснюється перехід до виконання команд за адресою 0x00638. Стек виявляється порожнім [3]. До виконання внутрішньої функції стек порожній [1]

Але іноді в стек поміщають тимчасові дані. Так, наприклад, туди може бути вміщено вміст буфера. Операції зі стеком швидше, ніж операції з іншими розділами пам'яті, так як адресація в разі зі стеком набагато простіше.

Цим і користуються програмісти. В такому випадку структура стека виглядає наступним чином. Цим і користуються програмісти

Як видно з малюнка, під час виконання функції програміст використовує стек для тимчасового зберігання даних. У нашому випадку це введене користувачем ім'я. Дані тимчасово поміщаються в стек під час виконання внутрішньої функції і витягуються після [3].

Але буфери, де б вони в пам'яті не розташовувалися, можуть бути переповнені дуже великою кількістю даних, якщо немає необхідних перевірок на розмір введеної інформації інформації. При відсутності перевірок дані, які не вмістилися в буфер, записуються в наступні комірки пам'яті, фактично переписуючи все, що зберігалося там до цього.

Наслідки такого роду переповнення можуть бути різними. У кращому випадку програма аварійно завершить виконання, коли не зможе повернутися за перезаписати адресою повернення на колишнє місце. У гіршому випадку зловмисник може цим скористатися, щоб змінити хід виконання програми і передати управління від шкідливого коду.

Пояснимо, як переходить зміна ходу виконання програми. Припустимо, користувач завантажив з Інтернету офіційний додаток Apple. Причому цензори компанії не побачили те, що в додатку немає перевірки на довжину вводяться користувачем даних. Тобто, програма має потенційну вразливість переповнення буфера. Як ми пам'ятаємо, всі запущені програми на iPhone виконуються з правами адміністратора.

Далі зловмисник вводить в вікно деякі дані. Причому вони мають велику довжину і мають приблизно такий вигляд.

AAAAAAAAAAAAAA0x619300610efa2380aacdl089aabcdl028abd458eefl

Спочатку йде інформація, яка переповнює буфер (АААААААААААААААА), потім адреса деякої комірки пам'яті (0x6193 006), а далі команди вірусу в бінарному вигляді (10efa2 3 80aacd 1089а abcdl028abd458eefl). Такі команди, якщо на них передати управління, приведуть до виконання вірусного коду. А так як перевірки на довжину даних, що вводяться немає, то подібних команд може бути багато, а значить і вірус може бути вельми серйозним. Зазвичай такий вірус відправляє по Wi-Fi з'єднання всі дані користувача зловмисникові. Хоча хакер з вигодою для себе може знайти і інші можливості скористатися описаної вразливістю.

Можна здогадатися, що адреса комірки пам'яті, наступний за переповнюють буфер інформацією - це адреса вірусного коду. Ця електронна адреса була не складно визначити. Зловмисник, який написав програму, схвалену Apple, знає адресу функції в пам'яті, яка відповідає за введення даних від користувача.

Він також знає адресу стека і адресу тієї комірки пам'яті стека, куди поміщається вміст буфера. Він також знає адресу стека і адресу тієї комірки пам'яті стека, куди поміщається вміст буфера

На малюнку вище показано, що відбувається з пам'яттю програми при переповненні буфера.

На малюнку приведена типова ситуація переповнення буфера, коли обсяг даних виявився настільки великий, що фактично переповнив буфер, виділений під локальні змінні. В даному випадку це послідовність букв «А». Більш того, надлишкові дані затерли адресаповернення і замінили його на адресу наступної комірки стека. Таким чином, при спробі виходу з функції програма з правами адміністратора передасть управління вірусу. Тобто вірус отримає права адміністратора.