В этой главе я расскажу об отслеживании заражений на базе Chromium. Я модифицирую V8 и bink, чтобы обеспечить способ отслеживания передачи информации от переменной x к переменной y в заданном процессе, а именно отслеживание испорченных данных.

1. Особенность

  • Отслеживайте данные от рождения до смерти и всех операций, в которых она участвовала.
  • Отслеживайте API JS и API DOM, вызывающую сторону, аргументы и возврат.
  • Отслеживайте поток управления, какие данные связаны с потоком управления и как данные влияют на направление потока управления.
  • Отслеживайте поток данных, какие данные связаны с потоком данных и как данные влияют на направление потока данных.
  • Отслеживайте API, которые могут повлиять на направление потока управления.
  • Отслеживайте API, которые могут повлиять на направление потока данных.
  • Отслеживайте взаимодействие между JavaScript и деревом DOM.

2. Крючок V8

Основополагающим принципом является технология информационных потоков. Информационный поток в информационно-теоретическом контексте - это передача информации от переменной x к переменной y в заданном процессе. Поэтому я внедряю технологию в хром. Потому что это среда выполнения веб-приложений, независимо от поведения, которое вы можете увидеть, если вам интересно!

2.1 Отслеживание поведения в байт-коде

V8 реализован на языке C++ и объектно-ориентированным методом. HeapObject — это базовый класс объектов, управляемых кучей, в V8. Мы добавляем член-указатель внутри HeapObject для хранения поведения объекта. При создании объекта мы записываем производителя этого объекта. Когда объект участвует в вычислениях, мы обновляем его поведение. Например, когда объект передается в функцию (в V8 функция также является объектом HeapObject), мы обновляем поведение функции, чтобы записать, что эта функция является потребителем объекта. Мы также обновим поведение этого объекта, чтобы записать его переход.

2.2. Отслеживание поведения в машинном коде

Интерпретатор и JIT — это два разных исполнительных модуля в V8. Интерпретатор разработан с использованием ООП, поэтому мы можем напрямую управлять членами-указателями HeapObjcet для отслеживания, обновления и распространения поведения. Но в режиме JIT V8 использует методы спекулятивной оптимизации и удаляет бесполезную информацию, и наше поведение также удаляется. Чтобы обеспечить доступность поведения, мы переписали почти 2000 встроенных функций (это термин V8, внутренний метод) JIT.

2.3. Сохранение поведения в GC

Изначально я не сохранял поведение в HeapObject, а хранил его отдельно. Таким образом, нам нужно поддерживать жизненный цикл поведения в соответствии с объектом-владельцем, и когда V8 GC собирает владельца, мы также должны освобождать его поведение. Есть такая трудность: когда два или более объектов-владельцев ссылаются на одно и то же поведение и после того, как один объект собран V8, мы не можем освободить поведение сразу, потому что другой объект все еще ссылается на поведение, мы должны пройти по куче V8, и сделать убедиться, что нет никаких ссылок, прежде чем поведение будет освобождено.

Поэтому я создаю новую переменную-член в классе HeapObject для хранения поведения, чтобы поведение было таким же, как у других внутренних объектов V8, управляемых сборщиком мусора V8, и не требовало дополнительного внимания.

3. Крючок Блинк

Я делаю в Blink почти те же модификации, что и в V8. Ниже приведены важные функции, которые мы добавили в Blink.

3.1 Отзыв

Обратная связь — это поведение, генерируемое во время работы веб-приложения в Blink. Поведение собирается в Blink, а затем передается обратно в механизм трассировки V8, поэтому это называется обратной связью. Проще говоря: поведение, собранное в V8, называется трассировкой, а поведение, собранное в Blink, называется обратной связью.

3.2 Анализатор токенов

Когда HeapObject V8 входит в Blink, он, вероятно, изменяет DOM, поэтому Blink повторно визуализирует дерево DOM. Token Parser удалит или проигнорирует поведение HeapObject, поэтому мы переписываем большую часть Token Parser, чтобы гарантировать, что трассировка V8 и обратная связь Blink могут правильно взаимодействовать друг с другом.

3.3 Поведение при передаче между V8 и Blink

И Blink, и V8 используют механизмы слабой/сильной ссылки, поэтому мы также должны убедиться, что эталонная связь между обратной связью и трассировкой такая же, как у их владельца. Blink использует класс-оболочку для управления ссылками между собой и V8, поэтому мы переписываем класс-оболочку, чтобы убедиться, что оболочка может управлять жизненным циклом обратной связи и трассировки во время взаимодействия Blink с V8.

4. Достижение

4.1 Создание эксплойта для DOM-XSS

Как правило, эксплойт зависит от контекста. Это означает, что когда злоумышленник хочет выполнить DOM-XSS, ему нужно знать, что такое ввод и как ввод проходит в приемнике. Наконец, ему нужно сломать синтаксис вокруг раковины. Поведение, которое получил мой инструмент, содержит всю необходимую информацию для описания распространения данных от входа к приемнику. Итак, мы используем абстрактное синтаксическое дерево FSM для создания эксплойта, который может правильно запускать XSS. Я отправил несколько ошибок в SRC с помощью этого инструмента.

4.2 Анализ поведения веб-приложений

Мы знаем, что приложения со встроенным Chrome очень распространены, и мой инструмент может помочь владельцам приложений отслеживать их поведение. Благодаря этому поведению вы можете узнать, где отнимает много времени, например, почему ваша память часто остается на высоком критическом уровне. Таким образом, вы можете оптимизировать свое приложение для лучшего взаимодействия с пользователем, а также можете найти логические проблемы в своем приложении.

Хорошо, на этом мы закончили. Увидимся в следующий раз, берегите себя!

Пожалуйста, свяжитесь со мной, если у вас есть какие-либо проблемы. WeChat: qq9123013 Электронная почта: [email protected]

Дополнительные материалы на PlainEnglish.io. Подпишитесь на нашу бесплатную еженедельную рассылку новостей. Подпишитесь на нас в Twitter, LinkedIn, YouTube и Discord . Заинтересованы в хакинге роста? Ознакомьтесь с разделом Схема.