<?xml version="1.0" encoding="utf-8" ?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:tt="http://teletype.in/" xmlns:opensearch="http://a9.com/-/spec/opensearch/1.1/"><title>@anonim2272367846</title><author><name>@anonim2272367846</name></author><id>https://teletype.in/atom/anonim2272367846</id><link rel="self" type="application/atom+xml" href="https://teletype.in/atom/anonim2272367846?offset=0"></link><link rel="alternate" type="text/html" href="https://teletype.in/@anonim2272367846?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=anonim2272367846"></link><link rel="next" type="application/rss+xml" href="https://teletype.in/atom/anonim2272367846?offset=10"></link><link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></link><updated>2026-05-13T20:49:26.659Z</updated><entry><id>anonim2272367846:AKo0kuN1Vyf</id><link rel="alternate" type="text/html" href="https://teletype.in/@anonim2272367846/AKo0kuN1Vyf?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=anonim2272367846"></link><title>Пробив по getcontact не сливая свой номер телефона.</title><published>2022-05-07T08:13:48.354Z</published><updated>2022-05-07T08:13:48.354Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img4.teletype.in/files/bf/0b/bf0b113f-6f1b-4820-ab0d-7e9a6c2226a6.png"></media:thumbnail><summary type="html">&lt;img src=&quot;https://img1.teletype.in/files/0a/48/0a48b018-e1bb-4d16-ac95-adcf7160a611.webp&quot;&gt;Сегодня я вам расскажу как пробить инфу о человеке зная его номер телефона и с помощью GetContact.</summary><content type="html">
  &lt;figure id=&quot;G3fF&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/0a/48/0a48b018-e1bb-4d16-ac95-adcf7160a611.webp&quot; width=&quot;1082&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;qJfx&quot;&gt;Сегодня я вам расскажу как пробить инфу о человеке зная его номер телефона и с помощью GetContact.&lt;/p&gt;
  &lt;p id=&quot;BLs4&quot;&gt;&lt;strong&gt;GetContact — приложение, которое копирует себе все контакты, записанные в телефоне, а также позволяет узнать, как тот или иной номер записан у пользователей приложения. При первом запуске GetContact просит доступ к телефонной книге. Полученные данные отправляются на серверы разработчика.&lt;/strong&gt;&lt;/p&gt;
  &lt;h2 id=&quot;4WHi&quot;&gt;&lt;strong&gt;                      УСТАНОВКА на termux&lt;/strong&gt;&lt;/h2&gt;
  &lt;p id=&quot;HU9n&quot;&gt;&lt;/p&gt;
  &lt;pre id=&quot;55aO&quot;&gt;$ apt update
$ apt upgrade
$ pkg install git -y
$ pkg install python
$ git clone https://github.com/kovinevmv/getcontact
$ cd getcontact
$ pip3 install -r requirements.txt
$ cd src
$ python main.py -p номер для поиска
пример: (python main.py -p 79998895763)&lt;/pre&gt;
  &lt;p id=&quot;i2it&quot;&gt;&lt;strong&gt;дополнительную информацию моно найти на  &lt;a href=&quot;https://github.com/kovinevmv/getcontact&quot; target=&quot;_blank&quot;&gt;GitHub.&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
  &lt;p id=&quot;PHVz&quot;&gt;&lt;strong&gt;Наш проект - &lt;a href=&quot;https://t.me/+IEXpIFkco2BjODYy&quot; target=&quot;_blank&quot;&gt;канал .&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
  &lt;p id=&quot;UA4S&quot;&gt;&lt;strong&gt;Удачи, мамкины хацкеры.&lt;/strong&gt;&lt;/p&gt;

</content></entry><entry><id>anonim2272367846:54627fgyudsy782387</id><link rel="alternate" type="text/html" href="https://teletype.in/@anonim2272367846/54627fgyudsy782387?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=anonim2272367846"></link><title>Пробив по getcontact не сливая свой номер телефона.</title><published>2022-05-07T08:07:13.606Z</published><updated>2022-05-07T08:14:55.737Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img4.teletype.in/files/bf/0b/bf0b113f-6f1b-4820-ab0d-7e9a6c2226a6.png"></media:thumbnail><summary type="html">&lt;img src=&quot;https://img1.teletype.in/files/0a/48/0a48b018-e1bb-4d16-ac95-adcf7160a611.webp&quot;&gt;Сегодня я вам расскажу как пробить инфу о человеке зная его номер телефона и с помощью GetContact.</summary><content type="html">
  &lt;figure id=&quot;Z49E&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/0a/48/0a48b018-e1bb-4d16-ac95-adcf7160a611.webp&quot; width=&quot;1082&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;mWyg&quot;&gt;Сегодня я вам расскажу как пробить инфу о человеке зная его номер телефона и с помощью GetContact.&lt;/p&gt;
  &lt;p id=&quot;GH1Z&quot;&gt;&lt;strong&gt;GetContact — приложение, которое копирует себе все контакты, записанные в телефоне, а также позволяет узнать, как тот или иной номер записан у пользователей приложения. При первом запуске GetContact просит доступ к телефонной книге. Полученные данные отправляются на серверы разработчика.&lt;/strong&gt;&lt;/p&gt;
  &lt;p id=&quot;7mEU&quot;&gt;УСТАНОВКА на termux&lt;/p&gt;
  &lt;pre id=&quot;SM2M&quot;&gt;$ apt update
$ apt upgrade
$ pkg install git -y
$ pkg install python
$ git clone https://github.com/kovinevmv/getcontact
$ cd getcontact
$ pip3 install -r requirements.txt
$ cd src
$ python main.py -p номер для поиска
пример: (python main.py -p 79998895763)&lt;/pre&gt;
  &lt;p id=&quot;uYb5&quot;&gt;&lt;strong&gt;дополнительную информацию моно найти на  &lt;a href=&quot;https://github.com/kovinevmv/getcontact&quot; target=&quot;_blank&quot;&gt;GitHub.&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
  &lt;p id=&quot;RukM&quot;&gt;&lt;strong&gt;Наш проект - &lt;a href=&quot;https://t.me/+IEXpIFkco2BjODYy&quot; target=&quot;_blank&quot;&gt;канал .&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
  &lt;p id=&quot;yWdl&quot;&gt;&lt;strong&gt;Удачи, мамкины хацкеры.&lt;/strong&gt;&lt;/p&gt;

</content></entry><entry><id>anonim2272367846:GWxo_8XzpVD9423</id><link rel="alternate" type="text/html" href="https://teletype.in/@anonim2272367846/GWxo_8XzpVD9423?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=anonim2272367846"></link><title>Виды хакерство и как с ними бороться.</title><published>2022-04-30T13:01:49.551Z</published><updated>2022-04-30T13:19:00.441Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img1.teletype.in/files/8a/d9/8ad92981-2a2a-4475-be76-0a1ac6c13a48.png"></media:thumbnail><summary type="html">Здравствуйте, дорогие подписчики канала softboom.Сегодня я расскажу вам о способов взлома вашего устройства.</summary><content type="html">
  &lt;nav&gt;
    &lt;ul&gt;
    &lt;/ul&gt;
  &lt;/nav&gt;
  &lt;p id=&quot;T0Yz&quot;&gt;Здравствуйте, дорогие подписчики канала &lt;strong&gt;&lt;em&gt;&lt;a href=&quot;https://t.me/+IEXpIFkco2BjODYy&quot; target=&quot;_blank&quot;&gt;softboom.&lt;/a&gt;&lt;/em&gt;&lt;/strong&gt;Сегодня я расскажу вам о способов взлома вашего устройства.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;p id=&quot;btTb&quot;&gt;                                                                                   статья от &lt;a href=&quot;https://t.me/nubik_nn&quot; target=&quot;_blank&quot;&gt;Nubika&lt;/a&gt;&lt;/p&gt;
  &lt;p id=&quot;h0qK&quot;&gt;1.Начнем мы пожалуй с простого Брутфорса (или &lt;strong&gt;метод «грубой силы»&lt;/strong&gt;, англ. brute force) — метод решения математических задач. Относится к классу методовпоиска решения исчерпыванием всевозможных вариантов[en]. Сложность полного перебора зависит от количества всех возможных решений задачи. Если пространство решений очень велико, то полный перебор может не дать результатов в течение нескольких лет или даже столетий.&lt;/p&gt;
  &lt;p id=&quot;kDPL&quot;&gt;Проще говоря вы запускаете программу, которая подбирает все возможные пароли к аккаунту вашей жертвы пока не найдет подходящий.Защититься можно создав длинный пароль от 20 символов, включая заглавные буквы (так же можно запустить программу со своими паролями).&lt;/p&gt;
  &lt;p id=&quot;11sT&quot;&gt;Чтобы проверить достаточно ли вы защищены, , достаточно зайти &lt;a href=&quot;https://password.kaspersky.com/ru/&quot; target=&quot;_blank&quot;&gt;на этот сайт&lt;/a&gt; и написать свой пароль, сайт покажет надежность вашего пароля.&lt;/p&gt;
  &lt;p id=&quot;Izrq&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;XLDp&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;9jMC&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;Rbc4&quot;&gt;2.&lt;strong&gt;Фи́шинг&lt;/strong&gt; (англ. phishing от fishing «рыбная ловля, выуживание»[1]) — вид интернет-мошенничества, целью которого является получение доступа к конфиденциальным данным пользователей — логинам и паролям. Это достигается путём проведения массовых рассылок электронных писем от имени популярных брендов, а также личных сообщений внутри различных сервисов, например, от имени банков или внутри социальных сетей. В письме часто содержится прямая ссылка на сайт, внешне неотличимый от настоящего, либо на сайт с редиректом. После того как пользователь попадает на поддельную страницу, мошенники пытаются различными психологическими приёмами побудить пользователя ввести на поддельной странице свои логин и пароль, которые он использует для доступа к определённому сайту, что позволяет мошенникам получить доступ к аккаунтам и банковским счетам.&lt;/p&gt;
  &lt;p id=&quot;jsEx&quot;&gt;Фишинг — одна из разновидностей социальной инженерии, основанная на незнании пользователями основ сетевой безопасности: в частности, многие не знают простого факта: сервисы не рассылают писем с просьбами сообщить свои учётные данные, пароль и прочее.&lt;/p&gt;
  &lt;p id=&quot;3y5Y&quot;&gt;Простыми словами вы создаете ложный сайт похожий на действительный, затем отправляете жертве, когда жертва ведет пароль и логин, вы получите их.Чтобы не стать жертвой надо не переходить по неизвсетным ссылкам &lt;/p&gt;
  &lt;p id=&quot;B4Ay&quot;&gt;Туториал как создать фишинг сайт у нас на &lt;a href=&quot;https://t.me/+IEXpIFkco2BjODYy&quot; target=&quot;_blank&quot;&gt;канале.&lt;/a&gt;&lt;/p&gt;
  &lt;p id=&quot;1NTJ&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;FK8x&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;S5xY&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;nNpp&quot;&gt;3. Перехват сообщений.&lt;/p&gt;
  &lt;p id=&quot;sowk&quot;&gt;Суть данного способ а заключается в том, что 3-лица могут получить доступ к смс вашего мобильного номера.Обычно звонят в сервис мобильной связи и предлгают оператору эту услугу за сумму от 15000 рублей, таким образом можно взломать и телеграмм аккаунт, если у вас не стоит &lt;strong&gt;2FA (Двухфакторная аутентификация).&lt;/strong&gt;&lt;/p&gt;
  &lt;p id=&quot;qBXR&quot;&gt;Чтобы защититься от подобного взлома надо поставить пароль на свою сим-карту , но будьте осторожны если забудете пароль от сим-карты (и сим-карта не оформлена на вас) вы рискуете потерять доступ к нему навсегда.&lt;/p&gt;
  &lt;p id=&quot;QBzm&quot;&gt;Поставить пароль на сим-карту на&lt;a href=&quot;https://support.apple.com/ru-ru/HT201529&quot; target=&quot;_blank&quot;&gt;айфоне&lt;/a&gt;и на &lt;a href=&quot;https://androidnik.ru/kak-ustanovit-pin-kod-na-sim-kartu-v-androide/&quot; target=&quot;_blank&quot;&gt;андоиде.&lt;/a&gt;&lt;/p&gt;
  &lt;p id=&quot;kFWf&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;Fy8v&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;LtNu&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;Ljxr&quot;&gt;4. &lt;strong&gt;Ботнет&lt;/strong&gt; (англ. botnet, МФА: [ˈbɒtnɛt]; произошло от слов &lt;em&gt;ro&lt;strong&gt;bot&lt;/strong&gt;&lt;/em&gt; и &lt;em&gt;&lt;strong&gt;net&lt;/strong&gt;work&lt;/em&gt;) — компьютерная сеть, состоящая из некоторого количества хостов с запущенными ботами — автономным программным обеспечением. Чаще всего бот в составе ботнета является программой, скрытно устанавливаемой на устройство жертвы и позволяющей злоумышленнику выполнять некие действия с использованием ресурсов заражённого компьютера. Обычно используются для нелегальной или неодобряемой деятельности — рассылки спама, перебора паролей на удалённой системе, атак на отказ в обслуживании (DoS- и DDoS-атаки).&lt;/p&gt;
  &lt;p id=&quot;bXxm&quot;&gt;Иными словами вы внедряете в устройства жертвы вирус( &lt;a href=&quot;https://ru.wikipedia.org/wiki/%D0%A2%D1%80%D0%BE%D1%8F%D0%BD%D1%81%D0%BA%D0%B0%D1%8F_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B0&quot; target=&quot;_blank&quot;&gt;троян &lt;/a&gt;) и получаете удаленный доступ. мануал как сделать троян в &lt;a href=&quot;https://t.me/+IEXpIFkco2BjODYy&quot; target=&quot;_blank&quot;&gt;нашем канале.&lt;/a&gt;&lt;/p&gt;
  &lt;p id=&quot;oIkg&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;yaeh&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;apgr&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;QeFi&quot;&gt;5. DOS и DDOS атаки.&lt;/p&gt;
  &lt;p id=&quot;ni4e&quot;&gt;DoS — хакерская атака на вычислительную систему с целью довести её до отказа, то есть создание таких условий, при которых добросовестные пользователи системы не смогут получить доступ к предоставляемым системным ресурсам, либо этот доступ будет затруднён.&lt;/p&gt;
  &lt;p id=&quot;iL0g&quot;&gt;В кратце это виртуальное «нападение» на сайт или веб-сервер с целью перегрузки его максимальных мощностей, что, как правило, приводит к временному прекращению доступа к атакуемому сайту или целой группе сайтов. &lt;/p&gt;
  &lt;p id=&quot;dvJi&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;XEdm&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;fHp7&quot;&gt;Не забудьте &lt;a href=&quot;https://t.me/+IEXpIFkco2BjODYy&quot; target=&quot;_blank&quot;&gt;подписаться на канал&lt;/a&gt;&lt;/p&gt;
  &lt;p id=&quot;CRrl&quot;&gt;удачи, Мамкины хацкеры.&lt;/p&gt;

</content></entry><entry><id>anonim2272367846:fblRiRthp533712</id><link rel="alternate" type="text/html" href="https://teletype.in/@anonim2272367846/fblRiRthp533712?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=anonim2272367846"></link><title>Как взломать Айфон обычной гифкой ?</title><published>2022-04-30T11:39:08.324Z</published><updated>2022-04-30T12:10:48.754Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img1.teletype.in/files/ca/b7/cab79e22-bb39-4ff2-a9af-d21d5161ebbf.png"></media:thumbnail><summary type="html">&lt;img src=&quot;https://img3.teletype.in/files/27/d9/27d97fd2-2b14-4717-9dfc-b7ef643ae507.png&quot;&gt;Подробнейшая лекция, в которой мы рассказываем, как работает эксплоит zero-click для iMessage</summary><content type="html">
  &lt;p id=&quot;G61I&quot;&gt;Подробнейшая лекция, в которой мы рассказываем, как работает эксплоит zero-click для iMessage&lt;/p&gt;
  &lt;figure id=&quot;ITJd&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/27/d9/27d97fd2-2b14-4717-9dfc-b7ef643ae507.png&quot; width=&quot;1920&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;uyrz&quot;&gt;Всем салют, дорогие друзья!&lt;br /&gt;В изра­иль­ской NSO Group соз­дали &lt;strong&gt;экс­пло­ит для iMessage&lt;/strong&gt;, на­делав­ший мно­го шума. С помощью именно это­го экс­пло­ита &lt;strong&gt;тро­ян Pegasus&lt;/strong&gt; был внед­рен в телефо­ны пуб­личных деяте­лей и полити­ков. Apple уже по­дала иск на NSO. &lt;strong&gt;Одна­ко оста­вим в сто­роне полити­ку — в этой статье мы сос­редото­чим­ся на самом экс­пло­ите, тем более что он прос­то взрыв­ной!&lt;/strong&gt; &lt;u&gt;Заража­ет девай­сы без учас­тия юзе­ра, укры­вает­ся внут­ри GIF и вклю­чает в себя кро­шеч­ный вир­туаль­ный компь­ютер.&lt;/u&gt;&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;NSO&quot;&gt;NSO&lt;/h2&gt;
  &lt;p id=&quot;Eru7&quot;&gt;На­чало тому, о чем мы будем говорить, было положе­но в августе 2016 года, ког­да изра­иль­ская ком­пания NSO Group, спе­циали­зиру­ющаяся на киберо­ружии, раз­работа­ла и выпус­тила шпи­онское ПО Pegasus, пред­назна­чен­ное для зараже­ния мобиль­ных устрой­ств под управле­нием Android и iOS. &lt;strong&gt;«Пегас» был спо­собен читать тек­сто­вые сооб­щения, отсле­живать звон­ки и мес­тополо­жение, собирать пароли, получать информа­цию с мик­рофона и камеры, а так­же дос­туп к лич­ной информа­ции поль­зовате­ля.&lt;/strong&gt;&lt;/p&gt;
  &lt;p id=&quot;Oc1J&quot;&gt;Тот ста­рый «Пегас» 2016 года исполь­зовал экс­пло­ит «одно­го нажатия» (one-click). То есть, ког­да поль­зователь‑жер­тва получал на свой смар­тфон «заряжен­ное» сооб­щение, что­бы акти­виро­вать под­ложен­ный сюр­приз, ему нуж­но было что‑то сде­лать, нап­ример клик­нуть по ссыл­ке. Зараже­ния было лег­ко избе­жать — дос­таточ­но было не нажимать на что попало.&lt;/p&gt;
  &lt;figure id=&quot;z3OG&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://st768.s3.eu-central-1.amazonaws.com/12b6f117cb0affa76a781a44d8e40023/24581/pic01.jpg&quot; width=&quot;870&quot; /&gt;
    &lt;figcaption&gt;При­меры фишин­говых СМС&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;AQoU&quot;&gt;В июле 2021 года уда­лось изу­чить экс­пло­ит «нулево­го нажатия» для iMessage, обна­ружен­ный на смар­тфо­не акти­вис­та из Саудов­ской Ара­вии. &lt;strong&gt;Экс­пло­ит работал вооб­ще без учас­тия поль­зовате­ля и сра­баты­вал сам — хакеру дос­таточ­но лишь отпра­вить полез­ную наг­рузку в мес­сен­дже­ре.&lt;/strong&gt;&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;ОПАСНЫЙ-ПРИЕМ&quot;&gt;ОПАСНЫЙ ПРИЕМ&lt;/h2&gt;
  &lt;p id=&quot;rj9O&quot;&gt;Вход­ная точ­ка «Пегаса» в iPhone — при­ложе­ние &lt;strong&gt;iMessage&lt;/strong&gt;. Это зна­чит, что ата­кующе­му дос­таточ­но знать телефон­ный номер или Apple ID жер­твы.&lt;/p&gt;
  &lt;p id=&quot;lZ6Z&quot;&gt;В iMessage есть натив­ная под­дер­жка GIF-ани­мации. Прис­ланная в чат гиф­ка вос­про­изво­дит­ся в цик­ле бес­конеч­но. Как толь­ко iMessage получа­ет сооб­щение, еще до его вывода на экран вызыва­ется метод в про­цес­се &lt;code&gt;IMTranscoderAgent&lt;/code&gt;. Он, в свою оче­редь, выпол­няет­ся за пре­дела­ми песоч­ницы &lt;strong&gt;BlastDoor&lt;/strong&gt;. При этом в парамет­ре метода переда­ется любое изоб­ражение с рас­ширени­ем gif. Вот таким обра­зом:&lt;/p&gt;
  &lt;p id=&quot;iTAk&quot;&gt;&lt;code&gt;[IMGIFUtils copyGifFromPath:toDestinationPath:error]&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;y1oK&quot;&gt;Это при­мер кода на язы­ке Objective-C. Пос­мотри на селек­тор. Здесь, веро­ятно, было намере­ние прос­то ско­пиро­вать файл GIF перед редак­тирова­нием поля счет­чика цик­лов, но семан­тика это­го метода иная. Внут­ри он исполь­зует API CoreGraphics, что­бы отоб­разить исходное изоб­ражение в новый GIF-файл по задан­ному пути. Одна­ко то, что файл име­ет рас­ширение gif, вов­се не озна­чает, что он на самом деле гиф­ка.&lt;/p&gt;
  &lt;p id=&quot;N4mb&quot;&gt;Биб­лиоте­ка ImageIO при­меня­ется, что­бы опоз­нать фор­мат фай­ла и про­ана­лизи­ровать его, но при этом пол­ностью игно­риру­ет его рас­ширение. При исполь­зовании это­го трю­ка с «под­дель­ными гиф­ками» более 20 гра­фичес­ких кодеков ста­новят­ся потен­циаль­ными жер­тва­ми для ата­ки нулево­го нажатия в iMessage. Некото­рые из них очень слож­ны и сос­тоят из сотен тысяч строк кода. Огромное прос­транс­тво для хакер­ской сме­кал­ки!&lt;/p&gt;
  &lt;blockquote id=&quot;D4DR&quot;&gt;С iOS 14.8.1 (26 октября 2021 года) Apple огра­ничи­ла фор­маты в ImageIO, дос­тупные из про­цес­са &lt;code&gt;IMTranscoderAgent&lt;/code&gt;. Так­же инже­неры ком­пании пол­ностью уда­лили код для дос­тупа к GIF из &lt;code&gt;IMTranscoderAgent&lt;/code&gt; с вер­сии iOS 15.0 (20 сен­тября 2021 года), вмес­те с тем пол­ностью перене­ся декоди­рова­ние GIF внутрь BlastDoor.&lt;/blockquote&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;PDF-ВНУТРИ-GIF&quot;&gt;PDF ВНУТРИ GIF&lt;/h2&gt;
  &lt;p id=&quot;5cjd&quot;&gt;В NSO исполь­зовали дыру «под­дель­ный GIF», что­бы через нее заюзать уяз­вимость в пар­сере CoreGraphics PDF.&lt;/p&gt;
  &lt;p id=&quot;yHgp&quot;&gt;Дол­гие годы фор­мат PDF был излюблен­ной целью для атак — он дос­тупен вез­де и обла­дает дос­таточ­ной слож­ностью. При­ятный бонус для хакеров — под­дер­жка JavaScript внут­ри PDF. CoreGraphics PDF не интер­пре­тиру­ет JavaScript, тем не менее NSO уда­лось най­ти в нед­рах пар­сера кое‑что не менее мощ­ное.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;ЭКСТРЕМАЛЬНОЕ-СЖАТИЕ&quot;&gt;ЭКСТРЕМАЛЬНОЕ СЖАТИЕ&lt;/h2&gt;
  &lt;p id=&quot;Gs3h&quot;&gt;В кон­це девянос­тых мало у кого был ста­биль­ный и быс­трый интернет, боль­шинс­тво юзе­ров доз­ванива­лись к про­вай­деру по dial-up и работа­ли на смеш­ных сей­час ско­рос­тях. Да и дис­ки не отли­чались боль­шими емкостя­ми, поэто­му сжа­тие дан­ных было важ­ной тех­нологи­ей. PNG, JPEG и GIF нам зна­комы и по сей день, но были и дру­гие.&lt;/p&gt;
  &lt;p id=&quot;1Gaq&quot;&gt;Фор­мат &lt;strong&gt;JBIG2&lt;/strong&gt; пред­назна­чал­ся для сжа­тия монох­ромных изоб­ражений (где пик­сели могут быть толь­ко чер­ными или белыми). Он при­менял­ся в офис­ных ска­нерах высокой ценовой катего­рии, таких как Xerox WorkCenter.&lt;/p&gt;
  &lt;figure id=&quot;V4Ps&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://st768.s3.eu-central-1.amazonaws.com/12b6f117cb0affa76a781a44d8e40023/24580/xerox.png&quot; width=&quot;700&quot; /&gt;
    &lt;figcaption&gt;Xerox WorkCenter&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;lYUJ&quot;&gt;Ес­ли лет десять‑двад­цать тому назад тебе доводи­лось исполь­зовать фун­кцию «ска­ниро­вания в PDF» на подоб­ном устрой­стве, в получав­шихся у тебя PDF, ско­рее все­го, был поток JBIG2.&lt;/p&gt;
  &lt;p id=&quot;hTMT&quot;&gt;При­меча­тель­но, что эти фай­лы даже при дос­той­ном раз­решении ска­ниро­вания занима­ли все­го нес­коль­ко килобай­тов. JBIG2 исполь­зует два метода для дос­тижения такого мощ­ного сжа­тия. Сей­час мы их обсу­дим. &lt;strong&gt;Толь­ко не думай, что мы тут отвлек­лись на какую‑то побоч­ную ерун­ду, — все это име­ет непос­редс­твен­ное отно­шение к экс­плу­ата­ции дыры в iMessage!&lt;/strong&gt;&lt;/p&gt;
  &lt;h3 id=&quot;Техника-1:-сегментация-и-замещение&quot;&gt;Техника 1: сегментация и замещение&lt;/h3&gt;
  &lt;p id=&quot;C5Gl&quot;&gt;Тек­сто­вый документ, осо­бен­но написан­ный на язы­ках с неболь­шими алфа­вита­ми (англий­ский или, к при­меру, рус­ский), сос­тоит из мно­жес­тва час­то встре­чающих­ся сим­волов. Вмес­те бук­вы, диак­ритику, зна­ки пре­пина­ния и про­чие загогу­лины называ­ют гли­фами.&lt;/p&gt;
  &lt;p id=&quot;ic93&quot;&gt;JBIG2 пыта­ется сег­менти­ровать каж­дую стра­ницу на гли­фы, а затем исполь­зует прос­тое сопос­тавле­ние с образцом, что­бы выделить гли­фы, которые выг­лядят оди­нако­во.&lt;/p&gt;
  &lt;figure id=&quot;l9Ih&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://st768.s3.eu-central-1.amazonaws.com/12b6f117cb0affa76a781a44d8e40023/24579/letter-e.png&quot; width=&quot;352&quot; /&gt;
    &lt;figcaption&gt;Со­пос­тавле­ние с образцом поз­воля­ет най­ти все фор­мы, в дан­ном слу­чае все бук­вы e&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;J6TO&quot;&gt;При этом JBIG2 ничего не зна­ет о самих гли­фах и не пыта­ется рас­позна­вать их и сопос­тавлять с алфа­витом (OCR). Кодиров­щик JBIG2 прос­то ищет свя­зан­ные области пик­селей и груп­пиру­ет похожие.&lt;/p&gt;
  &lt;p id=&quot;WfYY&quot;&gt;При этом алго­ритм сжа­тия заменя­ет все дос­таточ­но похожие на вид области копи­ей толь­ко одной из них.&lt;/p&gt;
  &lt;figure id=&quot;5tZJ&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://st768.s3.eu-central-1.amazonaws.com/12b6f117cb0affa76a781a44d8e40023/24578/replacing-e.png&quot; width=&quot;327&quot; /&gt;
    &lt;figcaption&gt;За­мена всех вхож­дений одной копи­ей гли­фа поз­воля­ет дос­тичь высоких коэф­фици­ентов сжа­тия&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;23C3&quot;&gt;В таком слу­чае текст по‑преж­нему прек­расно чита­ется, одна­ко объ­ем хра­нимой информа­ции ста­новит­ся мень­ше. Вмес­то того что­бы хра­нить дан­ные о пик­селях всей стра­ницы, для их отоб­ражения нуж­на толь­ко сжа­тая вер­сия «ссы­лоч­ного гли­фа» для каж­дого сим­вола и отно­ситель­ные коор­динаты мест, где дол­жны быть раз­мещены его копии. При рас­паков­ке алго­ритм рас­став­ляет гли­фы по мес­там, как бы рисуя ими на хол­сте.&lt;/p&gt;
  &lt;p id=&quot;uJNg&quot;&gt;Та­кой под­ход таит в себе сущес­твен­ный недос­таток: кри­вой кодиров­щик может слу­чай­но спу­тать похожие на вид сим­волы. А это при­водит к печаль­ным пос­ледс­тви­ям. Для нас в дан­ном слу­чае эти проб­лемы не важ­ны — раз­ве что ими мож­но объ­яснить поч­ти пол­ное вымира­ние JBIG2.&lt;/p&gt;
  &lt;h3 id=&quot;Техника-2:-уточняющее-кодирование&quot;&gt;Техника 2: уточняющее кодирование&lt;/h3&gt;
  &lt;p id=&quot;BJTl&quot;&gt;Итак, резуль­тат сжа­тия на осно­ве под­ста­нов­ки отоб­ража­ется с потеря­ми. То есть пос­ле сжа­тия и рас­паков­ки вывод на вид не будет в точ­ности соот­ветс­тво­вать вво­ду. Поэто­му JBIG2 под­держи­вает и сжа­тие без потерь, в которое вхо­дит про­межу­точ­ный этап «сжа­тия с мень­шими потеря­ми».&lt;/p&gt;
  &lt;p id=&quot;X6yd&quot;&gt;В этом слу­чае допол­нитель­но исполь­зует­ся информа­ция о раз­нице меж­ду замещен­ным гли­фом и исходным — тоже, конеч­но же, сжа­тая. Вот при­мер, показы­вающий раз­личия меж­ду замещен­ным сим­волом сле­ва и исходным сим­волом без потерь посере­дине.&lt;/p&gt;
  &lt;figure id=&quot;OuIl&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://st768.s3.eu-central-1.amazonaws.com/12b6f117cb0affa76a781a44d8e40023/24577/xor-e.png&quot; width=&quot;267&quot; /&gt;
    &lt;figcaption&gt;Ис­поль­зование опе­рато­ра XOR на рас­трах для вычис­ления мас­ки раз­ности изоб­ражения&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;sz6t&quot;&gt;В при­мере выше кодиров­щик сох­раня­ет мас­ку раз­ности, показан­ную спра­ва, затем во вре­мя рас­паков­ки она под­верга­ется опе­рации XOR с заменен­ным сим­волом, что­бы вос­ста­новить точ­ные пик­сели, сос­тавля­ющие исходный сим­вол.&lt;/p&gt;
  &lt;p id=&quot;aBnm&quot;&gt;Вмес­то того что­бы пол­ностью кодиро­вать всю раз­ность за один раз, это мож­но сде­лать поэтап­но, при этом на каж­дой ите­рации исполь­зует­ся логичес­кий опе­ратор (один из AND, OR, XOR или XNOR) для уста­нов­ки, сбро­са или перек­лючения битов.&lt;/p&gt;
  &lt;p id=&quot;EOn2&quot;&gt;Каж­дый пос­леду­ющий шаг уточ­нения приб­лижа­ет конеч­ный резуль­тат к ори­гина­лу, и это поз­воля­ет кон­тро­лиро­вать потери качес­тва при сжа­тии. Реали­зация этих шагов уточ­няюще­го кодиро­вания очень гиб­кая. А еще здесь есть воз­можность читать зна­чения, уже при­сутс­тву­ющие в рабочей области вывода. А это, как ты уже, воз­можно, догады­ваешь­ся, ведет нас к пол­ноте по Тьюрин­гу... Но сна­чала нуж­но погово­рить про важ­ную уяз­вимость.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h3 id=&quot;ПОТОК-JBIG2&quot;&gt;ПОТОК JBIG2&lt;/h3&gt;
  &lt;p id=&quot;70c5&quot;&gt;Боль­шая часть декоде­ра CoreGraphics PDF — это проп­риетар­ный код Apple, но реали­зация JBIG2 взя­та из про­екта &lt;a href=&quot;https://www.xpdfreader.com/download.html&quot; target=&quot;_blank&quot;&gt;Xpdf&lt;/a&gt;, исходный код которо­го находит­ся в сво­бод­ном дос­тупе.&lt;/p&gt;
  &lt;p id=&quot;4lPa&quot;&gt;Фор­мат JBIG2 пред­став­ляет собой набор сег­ментов, который мож­но рас­смат­ривать как серию команд рисова­ния — они выпол­няют­ся пос­ледова­тель­но за один про­ход. Ана­лиза­тор CoreGraphics JBIG2 под­держи­вает 19 раз­личных типов сег­ментов, которые вклю­чают такие опе­рации, как опре­деле­ние новой стра­ницы, декоди­рова­ние таб­лицы Хаф­фма­на и визу­али­зация рас­тро­вого изоб­ражения с задан­ными коор­дината­ми.&lt;/p&gt;
  &lt;p id=&quot;XMZL&quot;&gt;Сег­менты пред­став­лены клас­сом &lt;code&gt;JBIG2Segment&lt;/code&gt; и его под­клас­сами &lt;code&gt;JBIG2Bitmap&lt;/code&gt; и &lt;code&gt;JBIG2SymbolDict&lt;/code&gt;. &lt;code&gt;JBIG2Bitmap&lt;/code&gt; пред­став­ляет собой пря­моуголь­ный мас­сив пик­селей. Его поле дан­ных ука­зыва­ет на зад­ний буфер, содер­жащий повер­хность для рен­дерин­га. &lt;code&gt;JBIG2SymbolDict&lt;/code&gt; груп­пиру­ет бит­мапы. А целевая стра­ница пред­став­лена как &lt;code&gt;JBIG2Bitmap&lt;/code&gt; и сос­тоит из отдель­ных гли­фов. На сег­менты (&lt;code&gt;JBIG2Segment&lt;/code&gt;) мож­но ссы­лать­ся по номеру, а век­торный тип &lt;code&gt;GList&lt;/code&gt; хра­нит ука­зате­ли на все сег­менты. Что­бы най­ти сег­мент по его номеру, &lt;code&gt;GList&lt;/code&gt; ска­ниру­ется пос­ледова­тель­но.&lt;/p&gt;
  &lt;blockquote id=&quot;Jprg&quot;&gt;Кста­ти, если ты сей­час про­читал сло­во «джи‑лист» неп­равиль­но и раз­веселил­ся, как дет­садовец, то пос­тарай­ся скон­цен­три­ровать­ся, нас ждут куда более инте­рес­ные откры­тия.&lt;/blockquote&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;УЯЗВИМОСТЬ&quot;&gt;УЯЗВИМОСТЬ&lt;/h2&gt;
  &lt;p id=&quot;DuW7&quot;&gt;Уяз­вимость пред­став­ляет собой клас­сичес­кое целочис­ленное перепол­нение при сопос­тавле­нии ссы­лоч­ных сег­ментов. Вот два сег­мента кода, которые дела­ют его воз­можным.&lt;/p&gt;
  &lt;p id=&quot;LbkS&quot;&gt;&lt;code&gt;Guint numSyms; // (1)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;I2S9&quot;&gt;&lt;code&gt; numSyms = 0;&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;EghE&quot;&gt;&lt;code&gt; for (i = 0; i &amp;lt; nRefSegs; ++i) {&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;rz0R&quot;&gt;&lt;code&gt; if ((seg = findSegment(refSegs[i]))) {&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;hmqc&quot;&gt;&lt;code&gt; if (seg-&amp;gt;getType() == jbig2SegSymbolDict) {&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;H8V6&quot;&gt;&lt;code&gt; numSyms += ((JBIG2SymbolDict *)seg)-&amp;gt;getSize(); // (2)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;sDLS&quot;&gt;&lt;code&gt; } else if (seg-&amp;gt;getType() == jbig2SegCodeTable) {&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;ubtm&quot;&gt;&lt;code&gt; codeTables-&amp;gt;append(seg);&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;3yux&quot;&gt;&lt;code&gt; }&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;SWdR&quot;&gt;&lt;code&gt; } else {&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;70Cm&quot;&gt;&lt;code&gt; error(errSyntaxError, getPos(),&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;gV45&quot;&gt;&lt;code&gt; &amp;quot;Invalid segment reference in JBIG2 text region&amp;quot;);&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;SqJB&quot;&gt;&lt;code&gt; delete codeTables;&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;YZGr&quot;&gt;&lt;code&gt; return;&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;qyV3&quot;&gt;&lt;code&gt; }&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;jupw&quot;&gt;&lt;code&gt; }&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;HxYb&quot;&gt;&lt;code&gt; ...&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;jOzQ&quot;&gt;&lt;code&gt; // Get the symbol bitmaps&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;KQC0&quot;&gt;&lt;code&gt; syms = (JBIG2Bitmap **)gmallocn(numSyms, sizeof(JBIG2Bitmap *)); // (3)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;BGyx&quot;&gt;&lt;code&gt; kk = 0;&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;u9nX&quot;&gt;&lt;code&gt; for (i = 0; i &amp;lt; nRefSegs; ++i) {&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;inVA&quot;&gt;&lt;code&gt; if ((seg = findSegment(refSegs[i]))) {&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;X2Qv&quot;&gt;&lt;code&gt; if (seg-&amp;gt;getType() == jbig2SegSymbolDict) {&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;8pGd&quot;&gt;&lt;code&gt; symbolDict = (JBIG2SymbolDict *)seg;&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;6Y6h&quot;&gt;&lt;code&gt; for (k = 0; k &amp;lt; symbolDict-&amp;gt;getSize(); ++k) {&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;qZvF&quot;&gt;&lt;code&gt; syms[kk++] = symbolDict-&amp;gt;getBitmap(k); // (4)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;nDRT&quot;&gt;&lt;code&gt; }&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;4V3f&quot;&gt;&lt;code&gt; }&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;MArG&quot;&gt;&lt;code&gt; }&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;Efx8&quot;&gt;&lt;code&gt; }&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;U9fk&quot;&gt;Здесь перемен­ная &lt;code&gt;numSyms&lt;/code&gt; объ­явле­на как 32-бит­ное целое (смот­ри помет­ку 1). Если мы будем раз за разом добав­лять спе­циаль­но под­готов­ленные ссы­лоч­ные сег­менты (2), в кон­це кон­цов это при­ведет к перепол­нению &lt;code&gt;numSyms&lt;/code&gt; до кон­тро­лиру­емо­го неболь­шого зна­чения. Это зна­чение исполь­зует­ся для выделе­ния кучи (3), из чего сле­дует, что &lt;code&gt;syms&lt;/code&gt; будет ука­зывать на буфер недос­таточ­ного раз­мера. Во внут­реннем цик­ле (4) зна­чения ука­зате­ля &lt;code&gt;JBIG2Bitmap&lt;/code&gt; записы­вают­ся в буфер &lt;code&gt;syms&lt;/code&gt; мень­шего раз­мера.&lt;/p&gt;
  &lt;p id=&quot;LwyD&quot;&gt;Без допол­нитель­ных ухищ­рений этот цикл записал бы более 32 Гбайт дан­ных в неп­ригод­ный по раз­мерам буфер &lt;code&gt;syms&lt;/code&gt;, а это при­ведет к сбою. Что­бы такого не про­исхо­дило, куча обра­баты­вает­ся так, что­бы пер­вые нес­коль­ко записей из кон­ца буфера &lt;code&gt;syms&lt;/code&gt; пов­режда­ли зад­ний буфер &lt;code&gt;GList&lt;/code&gt;. Спи­сок &lt;code&gt;GList&lt;/code&gt; хра­нит все извес­тные сег­менты и исполь­зует­ся фун­кци­ей &lt;code&gt;findSegments&lt;/code&gt; для сопос­тавле­ния номеров сег­ментов, передан­ных в &lt;code&gt;refSegs&lt;/code&gt;, с ука­зате­лями &lt;code&gt;JBIG2Segment&lt;/code&gt;. Перепол­нение при­водит к переза­писи ука­зате­лей &lt;code&gt;JBIG2Segment&lt;/code&gt; в &lt;code&gt;GList&lt;/code&gt; ука­зате­лями &lt;code&gt;JBIG2Bitmap&lt;/code&gt; (4).&lt;/p&gt;
  &lt;p id=&quot;tzBz&quot;&gt;Так как &lt;code&gt;JBIG2Bitmap&lt;/code&gt; нас­леду­ется от &lt;code&gt;JBIG2Segment&lt;/code&gt;, вир­туаль­ный вызов &lt;code&gt;seg-&amp;gt;getType()&lt;/code&gt; выпол­няет­ся успешно даже на устрой­ствах, где вклю­чена про­вер­ка под­линнос­ти ука­зате­ля (она исполь­зует­ся для выпол­нения сла­бой про­вер­ки типа вир­туаль­ных вызовов). Но воз­вра­щаемый тип теперь не будет равен &lt;code&gt;jbig2SegSymbolDict&lt;/code&gt;, в резуль­тате чего даль­нейшая запись не про­исхо­дит (4) и сте­пень пов­режде­ния памяти огра­ничи­вает­ся.&lt;/p&gt;
  &lt;figure id=&quot;5NRg&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://st768.s3.eu-central-1.amazonaws.com/12b6f117cb0affa76a781a44d8e40023/24576/overflow.png&quot; width=&quot;506&quot; /&gt;
    &lt;figcaption&gt;Уп­рощен­ное пред­став­ление струк­туры памяти при перепол­нении кучи&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;БЕСПРЕДЕЛЬНЫЙ-И-НЕОГРАНИЧЕННЫЙ-ДОСТУП&quot;&gt;БЕСПРЕДЕЛЬНЫЙ И НЕОГРАНИЧЕННЫЙ ДОСТУП&lt;/h2&gt;
  &lt;p id=&quot;kYTO&quot;&gt;Пос­ле того как сег­менты в спис­ке &lt;code&gt;GList&lt;/code&gt; пов­режде­ны, хакер перехо­дит к пор­че объ­екта &lt;code&gt;JBIG2Bitmap&lt;/code&gt;, пред­став­ляюще­го собой текущую стра­ницу (мес­то, где коман­ды рисова­ния выпол­няют визу­али­зацию). Про­ще говоря, &lt;code&gt;JBIG2Bitmap&lt;/code&gt; — это обо­лоч­ки зад­него буфера, хра­нящие ширину и высоту буфера (в битах), а так­же зна­чение, которое опре­деля­ет, сколь­ко бай­тов хра­нит­ся для каж­дой стро­ки.&lt;/p&gt;
  &lt;figure id=&quot;jXRZ&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://st768.s3.eu-central-1.amazonaws.com/12b6f117cb0affa76a781a44d8e40023/24575/layout.png&quot; width=&quot;1070&quot; /&gt;
    &lt;figcaption&gt;Струк­тура памяти объ­екта JBIG2Bitmap, показы­вающая поля segnum, w, h и line, которые были пов­режде­ны во вре­мя перепол­нения буфера&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;2tD4&quot;&gt;Ес­ли тща­тель­но струк­туриро­вать &lt;code&gt;refSegs&lt;/code&gt;, они могут оста­новить перепол­нение пос­ле записи еще трех ука­зате­лей &lt;code&gt;JBIG2Bitmap&lt;/code&gt; пос­ле кон­ца буфера сег­ментов &lt;code&gt;GList&lt;/code&gt;. Такой под­ход поз­воля­ет переза­писать ука­затель на &lt;code&gt;vtable&lt;/code&gt; и пер­вые четыре поля &lt;code&gt;JBIG2Bitmap&lt;/code&gt;, пред­став­ляющих текущую стра­ницу.&lt;/p&gt;
  &lt;p id=&quot;rDsh&quot;&gt;Вви­ду устрой­ства адресно­го прос­транс­тва iOS эти ука­зате­ли, ско­рее все­го, будут находить­ся во вто­рых 4 Гбайт вир­туаль­ной памяти с адре­сами от 0x100000000 до 0x1ffffffff. На девай­сах, исполь­зующих iOS, при­меня­ется пря­мой порядок бай­тов (little-endian). Это озна­чает, что поля &lt;code&gt;w&lt;/code&gt; и &lt;code&gt;line&lt;/code&gt; будут переза­писа­ны на 0x1 — наибо­лее зна­чимую полови­ну ука­зате­ля &lt;code&gt;JBIG2Bitmap&lt;/code&gt;, а поля &lt;code&gt;segNum&lt;/code&gt; и &lt;code&gt;h&lt;/code&gt; заменят­ся наиме­нее зна­чимой полови­ной это­го же ука­зате­ля — слу­чай­ным зна­чени­ем, завися­щим от раз­мещения кучи и ASLR (ран­домиза­ция раз­мещения адресно­го прос­транс­тва), где‑то меж­ду 0x100000 и 0xffffffff.&lt;/p&gt;
  &lt;p id=&quot;56Kf&quot;&gt;В ито­ге выходит, что целевая стра­ница &lt;code&gt;JBIG2Bitmap&lt;/code&gt; получа­ет слиш­ком боль­шое зна­чение &lt;code&gt;h&lt;/code&gt;. Пос­коль­ку это зна­чение исполь­зует­ся для про­вер­ки гра­ниц и дол­жно отра­жать выделен­ный раз­мер буфера стра­ницы, получа­ется эффект раз­верты­вания рабочей области для вывода изоб­ражения. Это озна­чает, что пос­леду­ющие коман­ды сег­мента JBIG2 могут читать и записы­вать память за пре­дела­ми исходных гра­ниц буфера под­дер­жки стра­ницы.&lt;/p&gt;
  &lt;p id=&quot;sISY&quot;&gt;Об­работ­чик кучи так­же раз­меща­ет буфер под­дер­жки текущей стра­ницы чуть ниже непод­ходяще­го по раз­мерам буфера &lt;code&gt;syms&lt;/code&gt;, поэто­му, ког­да стра­ница &lt;code&gt;JBIG2Bitmap&lt;/code&gt; не огра­ниче­на, она может читать и записы­вать свои собс­твен­ные поля.&lt;/p&gt;
  &lt;figure id=&quot;rTIl&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://st768.s3.eu-central-1.amazonaws.com/12b6f117cb0affa76a781a44d8e40023/24574/buffer.png&quot; width=&quot;545&quot; /&gt;
    &lt;figcaption&gt;Схе­ма памяти, показы­вающая, как неог­раничен­ный зад­ний буфер рас­тро­вого изоб­ражения может ссы­лать­ся на объ­ект JBIG2Bitmap и изме­нять поля в нем, пос­коль­ку этот объ­ект рас­положен пос­ле буфера в памяти&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;E76Q&quot;&gt;Бла­года­ря отри­сов­ке четырех­бай­товых рас­тров с пра­виль­ными коор­дината­ми мож­но про­изво­дить запись во все поля стра­ницы &lt;code&gt;JBIG2Bitmap&lt;/code&gt;, а тща­тель­но выбирая новые зна­чения для &lt;code&gt;w&lt;/code&gt;, &lt;code&gt;h&lt;/code&gt; и &lt;code&gt;line&lt;/code&gt;, мож­но записы­вать про­изволь­ные сме­щения в зад­ний буфер стра­ницы.&lt;/p&gt;
  &lt;p id=&quot;I9LA&quot;&gt;На этом эта­пе уже мож­но было бы писать абсо­лют­ные адре­са памяти, если бы мы зна­ли их сме­щения в зад­нем буфере стра­ницы. Но как вычис­лить эти сме­щения? До сих пор этот экс­пло­ит дей­ство­вал очень похоже на обыч­ный экс­пло­ит тра­дици­онно­го язы­ка сце­нари­ев. В JavaScript это мог­ло бы закон­чить­ся неог­раничен­ным объ­ектом &lt;code&gt;ArrayBuffer&lt;/code&gt; с дос­тупом к памяти. В таком слу­чае зло­умыш­ленник имел бы воз­можность запус­кать про­изволь­ный код на JavaScript, который бы исполь­зовал­ся для вычис­ления сме­щений и выпол­нения про­изволь­ных дей­ствий. Как это сде­лать в однопро­ход­ном пар­сере изоб­ражений?&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;ДРУГОЙ-ФОРМАТ-СЖАТИЯ-—-ПОЛНЫЙ-ПО-ТЬЮРИНГУ!&quot;&gt;ДРУГОЙ ФОРМАТ СЖАТИЯ — ПОЛНЫЙ ПО ТЬЮРИНГУ!&lt;/h2&gt;
  &lt;p id=&quot;79Fe&quot;&gt;Как ты пом­нишь, пос­ледова­тель­ность шагов, реали­зующих уточ­нение в JBIG2, очень гиб­кая. Шаги уточ­нения могут ссы­лать­ся как на рас­тро­вое изоб­ражение вывода, так и на любые ранее соз­данные сег­менты, а так­же отоб­ражать вывод либо на текущей стра­нице, либо на сег­менте. Хит­роум­но работая с завися­щей от кон­тек­ста деком­прес­сией уточ­нения, мож­но соз­давать пос­ледова­тель­нос­ти сег­ментов, в которых эффект будут иметь толь­ко опе­рато­ры ком­бинации усо­вер­шенс­тво­ваний.&lt;/p&gt;
  &lt;p id=&quot;7QAh&quot;&gt;На прак­тике это зна­чит, что мож­но при­менять логичес­кие опе­рато­ры AND, OR, XOR и XNOR меж­ду областя­ми памяти с про­изволь­ными сме­щени­ями зад­него буфера &lt;code&gt;JBIG2Bitmap&lt;/code&gt; текущей стра­ницы. И пос­коль­ку огра­ниче­ний нет, мож­но выпол­нять эти логичес­кие опе­рации с памятью с про­изволь­ными сме­щени­ями за пре­дела­ми гра­ниц.&lt;/p&gt;
  &lt;figure id=&quot;WwnY&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://st768.s3.eu-central-1.amazonaws.com/12b6f117cb0affa76a781a44d8e40023/24573/memorypage.png&quot; width=&quot;551&quot; /&gt;
    &lt;figcaption&gt;Схе­ма памяти, показы­вающая, как логичес­кие опе­рато­ры могут при­менять­ся за пре­дела­ми гра­ниц&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;V8aB&quot;&gt;Это нем­ного усложнит задачу, но при желании мож­но вмес­то гли­фов работать с отдель­ными битами. В качес­тве вход­ных дан­ных мож­но подать набор команд сег­мента JBIG2, которые реали­зуют пос­ледова­тель­ность логичес­ких битовых опе­раций, при­меня­емых к стра­нице. А пос­коль­ку буфер стра­ницы не огра­ничен, эти битовые опе­рации могут работать с про­изволь­ной памятью.&lt;/p&gt;
  &lt;p id=&quot;paMX&quot;&gt;С помощью дос­тупных логичес­ких опе­рато­ров AND, OR, XOR и XNOR мож­но выпол­нить любую матема­тичес­кую фун­кцию.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h3 id=&quot;ВЫВОДЫ&quot;&gt;ВЫВОДЫ&lt;/h3&gt;
  &lt;p id=&quot;H0qk&quot;&gt;&lt;strong&gt;В JBIG2 нет воз­можнос­ти выпол­нять скрип­ты, но в сочета­нии с уяз­вимостью он может ими­тиро­вать схе­мы раз­ных логичес­ких вен­тилей, работа­ющих с про­изволь­ной памятью&lt;/strong&gt;.&lt;u&gt; Так почему бы не исполь­зовать это и не соз­дать собс­твен­ную компь­ютер­ную архи­тек­туру для выпол­нения сво­их сце­нари­ев?&lt;/u&gt;&lt;/p&gt;
  &lt;p id=&quot;0qet&quot;&gt;&lt;strong&gt;Это как раз то, что дела­ет экс­пло­ит NSO&lt;/strong&gt;. В нем на осно­ве 70 тысяч сег­мен­тных команд реали­зова­на архи­тек­тура неболь­шого компь­юте­ра. Здесь есть регис­тры, а так­же пол­ные 64-бит­ный сум­матор и ком­паратор, которые исполь­зуют­ся для поис­ка в памяти и выпол­нения ариф­метичес­ких опе­раций. Все это работа­ет не так быс­тро, как JavaScript, но мож­но добить­ся схо­жих резуль­татов.&lt;/p&gt;
  &lt;p id=&quot;wmjW&quot;&gt;Опе­рации началь­ной заг­рузки, бла­года­ря которым экс­пло­ит выходит из песоч­ницы, написа­ны целиком на этой при­чуд­ливой эму­лиру­емой эле­мен­тарной логике, соз­данной из одно­го про­хода деком­прес­сии потока JBIG2.&lt;/p&gt;
  &lt;p id=&quot;AUA7&quot;&gt;&lt;strong&gt;Хоть деятель­ность NSO и вызыва­ет воп­росы с точ­ки зре­ния эти­ки, но нель­зя не отдать дол­жное изоб­ретатель­нос­ти этой схе­мы!&lt;/strong&gt;&lt;/p&gt;
  &lt;p id=&quot;n5co&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;HWq0&quot;&gt;Не забудь подписаться на наш &lt;a href=&quot;https://t.me/+IEXpIFkco2BjODYy&quot; target=&quot;_blank&quot;&gt;канал&lt;/a&gt;&lt;/p&gt;

</content></entry></feed>