July 29

Создание фальшивого сообщения WhatsApp с помощью SQLite

База данных SQLite. Такая манипуляция позволяет сообщению выглядеть так, будто оно было отправлено другой стороной, хотя на самом деле оно никогда не передавалось. Автор уязвимости разберет структуру хранилища сообщений WhatsApp и объяснит, как изменение определенных полей может обмануть приложение, заставив его отображать сфабрикованное сообщение как легитимное.

Хранение сообщений WhatsApp: Основы

WhatsApp хранит все сообщения пользователя в локальной базе данных SQLite под названием msgstore.db .

Эта база данных содержит несколько таблиц, но наиболее важной для нашей цели является таблица message .

Каждая строка в message таблице представляет одно сообщение, столбцы которого определяют его метаданные, включая отправителя, временные метки, статус и содержимое.

Ключевые столбцы в таблице сообщений

Вот некоторые из наиболее важных столбцов, участвующих в манипулировании сообщениями:

ColumnDescription

_id

Первичный ключ сообщения, автоматически увеличивается для каждого нового сообщения

chat_row_id

Указывает на беседу, к которой относится данное сообщение

from_me

Указывает направление сообщения:
1

если сообщение отправлено с устройства,
0

если получено

key_id

Уникальный идентификатор сообщения, обычно хэш

timestamp

Время отправки сообщения (время Unix в миллисекундах)

received_timestamp

Время, когда сообщение было получено

text_data

Фактическое содержимое сообщения

status

Указывает статус доставки/прочтения (например, 13 для "замечено")
sort_id

Определяет порядок отображения сообщения

Зачем увеличивать ID?

При ручной вставке новой строки в таблицу message поле _id должно быть уникальным. Поскольку оно обычно увеличивается автоматически, необходимо убедиться, что вставленное значение _id больше текущего максимального значения в таблице.

Например, если в последнем сообщении есть _id = 532, вы должны вставить своё сфабрикованное сообщение с _id = 533. Это сохранит целостность базы данных и гарантирует, что сообщение будет считаться самой новой записью.

Кроме того, sort_id должно совпадать с _id, если вы хотите, чтобы сообщение отображалось в правильном месте чата. В противном случае WhatsApp может неправильно отобразить его или проигнорировать.

Процесс Манипулирования

  1. Выберите существующее сообщение из таблицы message. Обратите внимание на chat_row_id, timestamp, и received_timestamp.
  2. Подготовьте запрос INSERT с помощью:
    • Новое значение _id (увеличенное на единицу)
    • Те же chat_row_id для того, чтобы сообщение появилось в том же чате
    • from_me = 0 чтобы создать впечатление, будто сообщение пришло от другого человека
    • Реалистичная key_id строка
    • Скопированные или изменённые временные метки соответствуют порядку сообщений
    • Ваш пользовательский text_data (например, 'this is a test message')
  3. Выполните запрос с помощью sqlite3 или другого редактора баз данных, пока приложение закрыто.
  4. Перезапустите WhatsApp, и сообщение появится в истории переписки.

Как это работает?

Основная причина, по которой эта манипуляция работает, заключается в том, что WhatsApp не проверяет целостность сообщений с помощью внешних средств при чтении из msgstore.db. Приложение просто загружает сообщения из базы данных и отображает их на основе метаданных.

В локальной базе данных нет цифровой подписи, контрольной суммы или криптографической проверки на уровне обычного текстового сообщения. Это позволяет вставлять поддельные сообщения, которые кажутся пользователю абсолютно легитимными.

Итог

Понимание структуры локального хранилища сообщений WhatsApp позволяет проводить целенаправленные манипуляции, такие как внедрение поддельных сообщений. Правильно изменяя такие поля, как _id, from_me, и timestamp, можно создавать правдоподобные поддельные сообщения, которые органично вписываются в историю чата.

Download | Github

Автор уязвимости: 0x6rss | Перевод: THREAD