Натхненні словами Альберта Ейнштейна, ми представляємо простий (але не надто простий) конвеєр використання атак лише на даних під назвою Einstein, який неймовірно легко створювати атаки. Це використовує незалежні від програми методи для створення атак лише на дані та доводить, що такі атаки цілком доступні для зловмисників, які не докладають зусиль. Незалежне застосування. Замість того, щоб […]
Натхненні словами Альберта Ейнштейна, ми представляємо простий (але не надто простий) конвеєр використання атак лише на даних під назвою Einstein, який неймовірно легко створювати атаки. Це використовує незалежні від програми методи для створення атак лише на дані та доводить, що такі атаки цілком доступні для зловмисників, які не докладають зусиль.
Незалежне застосування. Замість того, щоб намагатися зрозуміти специфічну семантику програми (наприклад, особливі випадки протоколу HTTP), Ейнштейн зосереджується на універсальному інтерфейсі, який використовує будь-яка програма для зв’язку з ядром операційної системи: системні виклики. Зокрема, він відстежує дані, що містяться в аргументах системного виклику, і визначає, чи може зловмисник пошкодити їх для виконання довільного коду, наприклад: виконувати Або змінювати файли у файловій системі. писати.
простий. Крім того, Einstein усуває непотрібну складність і натомість націлює на експлойти, які не тільки найпростіше ідентифікувати, але й найбільш перспективні для зловмисників. Зокрема, Ейнштейн автоматично генерує експлойти для чутливих до безпеки системних викликів уздовж шляху виконання програми (вже дійсного), аргументи якого (просто) дослівно копіюються з даних, які можуть контролювати зловмисники. Як ми обговоримо більш детально пізніше, цей простий підхід дозволяє нам автоматично генерувати напрочуд велику кількість корисних експлойтів лише для даних для поширених реальних програм.
Як Ейнштейн будує зразки атак
Щоб пояснити, як працює Ейнштейн, ми ознайомимо вас із кожним кроком створення прикладу атаки та створення аргументів для чутливих до безпеки системних викликів. Зловмисник припускає, що він може запустити сервер локально для аналізу, оскільки він має доступ до програм, які можна порівняти з тими, які розгорнула потенційна жертва. Ейнштейн приймає програму жертви як вхідні дані та працює у два етапи. перший, Експлуатувати кандидатів;Потім ми перевіряємо, чи кожен експлойт-кандидат є справді ціллю атаки. Експлойт, який працює. Для обговорення деталей дизайну, що виходять за рамки цього прикладу (наприклад, як Ейнштейн відстежує необмежену кількість даних, як об’єднати кілька системних викликів тощо), дивіться нашу статтю. [5].
Створення кандидатів на експлойт. Щоб створити експлойт-кандидатів, Einstein відстежує всі дані, які можуть бути пошкоджені зловмисником під час виконання, і визначає дані, які можуть вплинути на аргументи чутливих до безпеки системних викликів. Щоб полегшити це, ми спочатку запускаємо сервер, використовуючи інструменти бінарного рівня Ейнштейна (рис. 3a, ➊). Цей інструментарій додає підтримку динамічного аналізу забруднення, що дозволяє відстежувати «зіпсовані» дані програми під час виконання. [8]. Сервер запускається та ініціалізується. cgi_bin_pathпочинає очікування запиту. Ейнштейн моделює зловмисника, який використовує помилки безпеки пам’яті, унікально отруюючи потенційно пошкоджені дані (наприклад, рядок «»)./usr/local/server/cgi-binКрім того, він записує забруднені дані у знімок пам’яті (➋).
Потім Ейнштейн продовжує запускати програму та відстежує, як зіпсовані дані поширюються під час виконання програми, коли сервер обробляє робоче навантаження, що складається з доброякісних запитів (➌). Наприклад, надіслати “.Скрипт POST/сортування2b. Пізніше, під час обробки запиту, сервер приймає зіпсований рядок як аргумент. виконувати системний виклик. Ейнштейн визначає, коли контрольовані зловмисником дані надходять у чутливі до безпеки системні виклики, і записує інформацію про це, наприклад аргументи та ступінь їх пошкодження (➍).
І Ейнштейн робить таке судження: виконувати‘s ім’я шляху і аргумент Параметри забруднені не лише ідентифікаторами, що відповідають . cgi_bin_pathале насправді вони однакові cgi_bin_path. Цей вид (дуже) простого потоку даних є Потік ідентифікаційних даних. Ейнштейн створює експлойт-кандидатів для потоків даних ідентичності, генеруючи: (адреса, вартість) Пара, яка вказує, що помилка запису в пам’ять може бути використана виконувати Шляхом перезапису cgi_bin_path від “/usr/local/server/cgi-bin“до”/bin” (➎).