Ресурсы: техническое описание TLS, LaTeX - в картинки (img), криптографическая библиотека Arduino, шифр "Кузнечик" на ассемблере AMD64/AVX и ARM64
Массовый централизованный сервис для обмена сообщениями должен обеспечить собственную надёжность и иметь возможности по восстановлению. Уже эти моменты гарантируют, что с пользовательскими сообщениями, сохраняемыми внутри сервиса, ситуация будет не самой прямолинейной, поэтому рассуждать об удалении переписки по команде пользователя – несколько странно. Посмотрим подробнее на разные особенности “хранения сообщений”.
Так, сообщения сохраняются в какой-то, условно, “базе данных”, потому что речь про централизованный сервис. База может быть распределённой или нет, это тут не особенно важно, потому что “распределение” всё равно происходит внутри единого сервиса (по условию задачи). Работа с базой данных может быть реализована при помощи той или иной распространённой СУБД, либо каким-то собственным решением; да, от хорошо спроектированного сервиса – можно было бы ожидать собственного специализированного решения. Однако тип решения для управления базой данных тут тоже не важен, поскольку так или иначе должны быть и “холодные” резервные копии, и реплики, работающие онлайн, последние, как минимум, необходимы для балансировки между дата-центрами и для обработки локальных отказов. И резервная копия, и реплика – содержат сообщения пользователей в некоторых файлах, выгружаемых на “диски” (то есть, в систему хранения данных). Если эти файлы куда-то утекают, то, понятно, из них можно восстановить сообщения. Кто-то сделал дамп дисков системы хранения данных (или, условно говоря, просто вынул пару дисков и унёс, потому что “так можно было”)? У этого “кого-то” теперь есть все сообщения.
Удаление сообщений ещё и в резервных копиях, – тем более, в упомянутых “побочных” дампах, – представляет собой очень большую технологическую проблему, что бы там ни публиковалось в маркетинговых материалах. Зашифрование резервной копии – не делает сообщения и данные удалёнными (см., впрочем, про ключи и связанные аспекты ниже), а дампы баз данных нередко делают в открытом виде, хоть бы и просто в SQL.
Дело не только в упомянутых файлах, которые содержат копии сообщений. Для того, чтобы сделать резервную копию или синхронизировать реплику – данные, в подавляющем большинстве случаев, должны быть переданы по сети внутри сервиса (заметьте, что это не эквивалентно даже понятию “внутри одного физического сегмента LAN”). Таким образом, резервирование данных в больших сервисах – тоже порождает сетевой трафик, который может ходить и внутри одного дата-центра, и между дата-центрами (более того – в случае резервных копий, в хорошей системе, трафик просто обязательно ходит между разными дата-центрами, так как делать резервное хранилище в том же дата-центре, где и основное, это архитектурная ошибка). Если этот трафик записывается, то из него можно восстановить данные. Трафик может быть защищён (VPN и пр.) от прослушивания, но может и не быть, а ключи от VPN – бывает, “утекают из-под коврика”.
Другой, менее очевидный, вариант: разнообразные логи – общие системные, а также логи конкретных программных сервисов. В лог-файлы записывается самая разнообразная информация. Там могут быть и пароли пользователей, в том числе, в открытом виде (известная история из практики Facebook); могут быть ключи/пароли, защищающие резервные копии; могут быть реквизиты доступа к базам данных и много всего другого, вплоть до самих текстов сообщений, передаваемых мессенджером. Логи (лог-файлы) передаются через вычислительную сеть – это самое обычное дело: в “операционной практике” принято логи собирать на центральных лог-коллекторах, которые являются отдельными физическими серверами. Более того, типовая практика подразумевает использование логов в системах обнаружения вторжений (или “обнаружения утечек/угроз”, SIEM и т.д., и т.п., там море аббревиатур и терминов, так что называть можно по-разному, но часто наличие такой системы – ни много ни мало, а строгое требование политики ИБ). А чтобы логи так использовать, их нужно скопировать в соответствующую систему. Понятно, что делаются и резервные копии логов, а сами лог-записи, – возможно, превращённые в какие-то типовые “сообщения о событиях”, – записываются в ту или иную дополнительную БД (“от SIEM в SOC”). У этой БД есть реплика, резервные копии, ну и так далее.
Это далеко не всё. Сейчас повсеместно используется виртуализация вычислительных ресурсов. Наличие виртуальных машин автоматически подразумевает, что есть и гипервизор с системой управления им, а это, в свою очередь, означает, что имеется и популярнейший механизм под названием “снапшоты”. Полноценный снапшот записывает в файл полную копию состояния виртуальной машины, включая дамп оперативной памяти. То есть, в такой снапшот попадают и данные, которые программное обеспечение, работающее в виртуальной машине, не записывало на диск (например, те самые “сансовые ключи” от чего угодно, которые “под ковриком”).
Снапшоты снимаются администраторами и DevOps, специалистами ИБ и SecOps, и даже другим инженерным персоналом (с более экзотическими обязанностями). Снапшоты, без всяких сомнений, нужны. Они нужны: для резервирования; для обнаружения угроз; для исследования условий потребления ресурсов; для экспериментов; для изучения “всяких странностей” (постоянно используются, не шутка). Снапшоты могут содержать образы баз данных, файлы с ключами, файлы логов и много всего ещё. Снапшоты рутинно передаются через сетевые соединения. В снапшотах сохраняются сообщения пользователей сервиса. Отследить, чтобы сообщения удалялись из снапшотов, чтобы удалялись сами снапшоты, как и то, чтобы в снапшот не попала чувствительная информация, – задачи слишком сложные. Обратите внимание, что при это доступ на уровне гипервизора подразумевает, что нужны и резервные копии “данных гипервизора”.
А ещё есть контейнеризация (читай – разные воплощения Docker). Контейнеры – это программно-обособленные копии системного и прикладного окружения. Контейнеры, как и снапшоты виртуальных машин, могут попадать в резервные копии, передаваться между серверами, и так далее, и тому подобное. Естественно, внутри контейнера легко могут оказаться (и оказываются) самые критически важные данные и ключи доступа.
Общее “зашифрование бэкапов” (это сейчас уже звучит скорее как описание успешной разрушительной атаки на инфраструктуру), да ещё и с ключами, имеющими срок действия, после которого они уничтожаются, означает, что в нужный момент доступа к данным в резервных копиях не окажется, потому что необходимые ключи будут “максимально безопасно” сохранены в самих зашифрованных бэкапах.
Вернёмся к обсуждению сервисов, реализующих “мессенджеры”. Архитектурной особенностью центрального (централизованного) сервиса обмена сообщениями является то, что все точки “копирования сообщений” будут сосредоточены в небольшом количестве “сетевых локаций”. Для действительно распределённой P2P-системы это было бы не так. В теории, даже в центрально сервисе, если пользовательские сообщения, передаваемые сервисом, зашифрованы на стороне клиента без доступа сервера к ключу, то во всех упомянутых выше случаях внутри копий на стороне сервиса окажутся только зашифрованные “блобы”. Проблема в том, что такой идеальный подход на практике реализован далеко не всегда, даже если заявлен и предусмотрен. Это происходит из-за наличия ошибок и административных “особенностей” (как минимум, тут всегда остаются открытыми метаданные, а ключи – могут и утечь). Если же ключи как-то на сторону сервиса передаются, то эти ключи там могут быть сохранены, в том числе, в результате “побочных процессов”, например, в момент миграции конкретного экземпляра ПО сервиса на другую аппаратуру.
Комментировать »
Занятно читать массовые рекомендации про “срочно удалите все сообщения из переписок в мессенджере” в свете новостей о популярном мессенджере Telegram.
Дело в том, что даже если удалённые на устройстве-клиенте сообщения действительно удалятся и на серверной стороне (если они там были, да), в том числе, из всех “бэкапов” разных уровней, то это вовсе не означает, что удалится и соответствующий трафик из сетевых дампов.
Telegram – центральный мессенджер, это означает, что нетрудно определить узлы, через которые проходят все сообщения. Даже если сервер сообщения удалил (не факт, но ладно), то соответствующий трафик, при необходимости, без проблем, в пассивном режиме, сохраняется на стороне подключения каждого дата-центра, ну, это как минимум. Каких-то уведомлений “арендатора” для того, чтобы поставить “сплиттер” в нужном месте, не требуется. Все сообщения восстанавливаются из трафика, если имеются нужные ключи.
(Дополнение: да, естественно, в удалении сообщений с устройства может быть польза, понятно; речь о другом; о том, что нужно использовать правильную “модель угроз”; удаление сообщений в приложении на устройстве – это удаление сообщений в приложении на устройстве, не более того: сообщения-то и с устройства при этом могут не удалиться, что уж говорить про прочие хранилища.)
Комментарии (2) »
NIST выпустил первые стандарты по криптосистемам с постквантовой стойкостью. Как и ожидалось:
- FIPS 203: обмен ключами (KEM) – Kyber, который в стандарте называется ML-KEM, где ML – это Module-Lattice (модули с решётками, а не “машинное обучение”);
- FIPS 204, FIPS 205: подписи – CRYSTALS-Dilithium (ML-DSA, основной, 204) и Sphincs+ (SLH-DSA, дополнительный/резервный, 205).
(via)
P.S. Универсальных квантовых компьютеров пока нет и не видно, даже если присмотреться, но NIST в новости намекает, что, “как предсказывают некоторые эксперты”, квантовые компьютеры, способные взламывать современные криптографические алгоритмы, всё же могут появиться в течение десяти лет.
Комментировать »
Метаинформация о TLS-соединении. TLS-клиенты часто могут быть классифицированы (с точностью до типа и, реже, версии) по начальному сообщению TLS-сессии. Это позволяет при пассивном прослушивании узнавать трафик конкретных программ-клиентов (и не только, но сейчас речь только про клиентов и начало соединения).
Дело в том, что начальное сообщение, отправляемое клиентом, – ClientHello, – содержит много параметров и, соответственно, имеет структуру, которой хватает для эффективного построения отпечатков. Например, весьма подробное представление о том, как такой классификатор действует, можно составить, если внимательно посмотреть на выдачу моего тестового сервера TLS 1.3. Посмотреть можно непосредственно веб-браузером. При успешном соединении сервер вернёт страницу, где в подробностях показано то самое CLientHello, которое сервер получил от клиента. Вы можете подключиться браузером, обновить страницу несколько раз и увидеть, какие блоки данных не изменяются и, поэтому, служат основой для построения сигнатур.
Посмотрим на ситуацию чуть подробнее (рассматриваем случай TLS поверх TCP). Основу для построения сигнатур (отпечатков) может составлять последовательность байтов, которые представляют структуру TLS-сообщений. То есть, сообщения строятся из некоторого набора полей, а этим полям обязательно соответствуют конкретные заголовки.
Прежде всего, структура базового уровня: для TLS это будут TLS-записи, которые имеют свой простой заголовок фиксированного формата. Этот заголовок содержит обозначение типа и обозначение версии, а также – запись длины. С первыми параметрами (тип, версия) – всё очевидно, однако они, сами по себе, не дают нужной избирательности. Но уже сопоставление длины с соответствующей частью потока – даёт неплохой дополнительный признак: можно проверить, что заданное количество байтов укладывается в общий состав разбираемого потока.
Эта же идея важна и для разбора самого сообщения ClientHello, где она позволяет анализировать структуру следующего уровня, так как ClientHello вложено в TLS-запись. А состоит идея в том, что значения байтов, кодирующих предполагаемую длину, интерпретируются как смещение; полученное значение прибавляется к текущему адресу (в предварительно собранном потоке байтов) и значения байтов по вычисленному адресу сравниваются с ожидаемыми значениями, которые там оказались бы, если это действительно анализируется ClientHello. И если TLS-записи тут не добавляют много нового (они просто следуют одна за одной), то в ClientHello появляются вложенные поля данных (расширения) и более богатая структура, которая, тем не менее, устроена точно так же: значения байтов, интерпретируемые как целое число, задающее длину, должны строго сходиться, когда рассматриваются в виде цепочки. Заметьте, что до разбора самих значений полей данных дело ещё даже не дошло. Это важная особенность TLS: данный протокол не обладает скрытностью. Скрытный протокол выглядел бы случайным набором байтов со случайными же значениями. TLS, – особенно, на начальном этапе соединения, – выглядит как связанная строгими параметрами длины и типов байтовая структура (так, впрочем, и должно быть).
Для машины, разбирающей трафик, все эти записи “структур в байты” представляют собой наборы битов. Так что грамотно построенная ASIC-система может сопоставлять шаблоны с имеющимся потоком чрезвычайно быстро (ASIC – это аппаратная, интегральная схема, построенная под конкретную задачу; например, ASIC-и давно используются в производительных маршрутизаторах, потому что никакой универсальный процессор за ASIC-системой не угонится).
Итак, вернёмся к ClientHello. Помимо верхнеуровневой структуры из вложенных блоков, есть и содержание этих блоков. Например, сообщение ClientHello, в самом начале, после указания версии, полей Random и SessionID, содержит перечень шифронаборов, которые поддерживает клиент. (Это всё хорошо видно в выдаче тестового сервера.) Сокращённый пример: 0x1301, 0x1303, 0x1302, 0xC02B, 0xC02F… На уровне потока данных это всё просто последовательные значения байтов, по два байта на каждый идентификатор шифронабора (понятно, что данному блоку предшествуют байты с записью длины, что добавляет “узнаваемости”).
Так, для конкретной версии браузера перечень шифронаборов – узнаваем. В принципе, ничто не мешает клиенту менять состав и порядок пар байтов, обозначающих шифронаборы, но, например, Firefox передаёт фиксированный набор. Понятно, что строгая последовательность из 36 байтов – это уже достаточный идентифицирующий признак. (36 байтов получается так: 17 идентификаторов шифронаборов от Firefox, по два байта каждый, плюс два байта на запись длины.) Чуть более подробный пример, начальная часть ClientHello TLS 1.3:
Type (тип сообщения, 0x01, один байт - подходит для сигнатуры); Len (длина сообщения, три байта - подходит для сигнатуры: должно соответствовать общей структуре); Version (версия, 0x0303, два байта - подходит для сигнатуры); Random ([...], 32 "случайных" байта - не подходит для сигнатуры); SessionID_Len (длина данных Session_ID, один байт, для TLS 1.3 - подходит для сигнатуры); SessionID (обычно, для TLS 1.3 от браузера тут будет 32 байта - не подходит для сигнатуры). CS_Len (длина данных списка шифронаборов, два байта - подходит для сигнатуры); CS (список двухбайтовых идентификаторов шифронаборов - подходит для сигнатуры). [...]
При этом, скажем, браузер Chromium/Chrome добавляет к списку шифронаборов так называемые значения GREASE (для тестирования реализаций TLS), которые меняются от сеанса к сеансу. Но значения GRASE имеют строго определённый формат, так что их несложно распознать автоматом. Если взять такой клиент, как cURL, то состав ClientHello будет другим, в частности, другим будет список шифронаборов. Более того, по составу ClientHello нередко можно определить даже используемую библиотеку, реализующую TLS.
Естественно, не только шифронаборы подходят для построения сигнатуры. В ClientHello современных браузеров присутствует разнообразный набор расширений – это дописываемые в сообщение поля со своей структурой: они содержат заголовок с записью длины, дополнительные блоки внутри. Для TLS 1.3 расширения имеют определяющее значение. Внутри расширений передаются различные необходимые параметры, в частности, открытая часть протокола Диффи-Хеллмана и открытый ключ постквантовой криптосистемы X25519Kyber768. По составу и количеству расширений можно построить дополнительную сигнатуру. Так, уже наличие X25519Kyber768 едва ли не однозначно выдаёт современный веб-браузер. А ведь современный браузер ещё и укажет расширение ECH (Encrypted ClientHello). Firefox использует зафиксированный порядок расширений ClientHello, а браузер Chromium/Chrome – порядок следования расширений изменяет между сессиями. Однако даже в случае, когда порядок расширений разный, всё равно можно использовать перечень имеющихся расширений для построения сигнатуры.
Комментировать »
Предположим, имеется TLS-сертификат на веб-сайте, – то есть, выпущенный для доменного имени, – и соответствующий секретный ключ. Можно ли использовать этот секретный ключ для подписывания каких-то произвольных файлов, например, текстовых сообщений?
Да, это возможно. Технически, ключ вовсе не зафиксирован в роли “только для сайта”, так что ничего тут не мешает: достаточно взять какую-нибудь подходящую утилиту, которая может прочитать секретный ключ из файла (OpenSSL или другие варианты), и можно начать подписывать произвольные электронные документы. В процессе подписывания – открытый ключ и сертификат вообще не требуются. Естественно, каждое использование ключа (буквально – каждая операция) несёт с собой дополнительный риск утечки этого ключа. Однако, при штатной работе TLS, ключ “от сертификата” уже постоянно задействован именно для получения электронной подписи, так что тут нет места для каких-нибудь опасений относительно того, что ключ будет “использован не по назначению”. Однако для хитрых ошибок – место, всё же, появляется.
Так, если для подписи файлов применяется новая утилита, отличная от библиотеки, используемой TLS-реализацией веб-сервера, то возникает дополнительная вероятность утечки: либо непосредственно через эту утилиту, либо в процессе её вызова. Если этот дополнительный, относительно веб-сервера, процесс вдруг так устроен, что позволяет третьей стороне непосредственно подписывать произвольные данные, то даже без утечки ключа это ведёт к компрометации TLS-сервера: третья сторона может подменить сессию, перехватив соединение и подписав нужные параметры, которые подаст в виде файла на вход подписывающей утилиты. Так что осторожность – не помешает, а утечки ключей от одного TLS-сервера через другой, сконфигурированный с уязвимостью, – уже случались.
Проверка подписи для рассматриваемого способа использования проводится при помощи открытого ключа, опубликованного в TLS-сертификате. Тут возникает административный момент, связанный с политикой управления доверием, используемой приложением на проверяющей стороне. Это приложение может “верить в сертификат”, а может – “верить в сам ключ”.
В первом случае – допустимый контекст использования ключа задаёт сертификат и, так сказать, семантика применения этого сертификата. Например, приложение может в принципе принимать TLS-сертификаты (и ключи из них) только в контексте подписывания TLS-параметров при HTTPS-доступе к веб-серверу, и всё. Естественно, в сертификате предусмотрены дополнительные флаги и параметры, определяющие допустимые способы использования ключа. Их приложение тоже может учитывать каким-то своим способом (но, заметьте, использование ключа для подписи – в сертификате “от сайта” должно быть разрешено и так; см. выше).
Во втором случае, когда приложение “верит в сам ключ”, сертификат служит лишь контейнером для доставки этого ключа. “Верить в сам ключ” – означает, что доверие распространяется прежде всего на конкретное значение ключа, но при этом сам сертификат из рассмотрения может и не исключаться. Например, это обычная практика для корневых ключей в TLS для веб-сайтов и браузеров.
Впрочем, “побочное” использование ключей “от сайтов” для подписывания может подразумевать и то, что открытый ключ тоже используется вообще без учёта сертификата. Технически, опять же, ничего этому не мешает.
Комментировать »
Исследователи, сравнивая в автоматизированном режиме (fuzzing) поведение различных микропроцессоров семейства RISC-V, обнаружили дефекты команд в линейке распространённых ЦПУ T-Head C910. Дефекты относятся к конкретной реализации и расширениям RISC-V, которые могут использовать разработчики совместимой аппаратуры.
Особенно интересно выглядит команда, позволяющая реализовать прямую запись данных в физическую память (ОЗУ) по произвольному адресу, минуя не только внутренний кеш, но и вообще все аппаратные ограничения на уровне процессора. Такой “гаджет”, конечно, позволяет добиться уверенной эскалации привилегий (и не только), в том числе, из любых контейнеров и прочих систем виртуализации. В качестве примера в исходной работе приводятся линуксы и модификация системного вызова getuid() таким образом, чтобы он всегда возвращал значение 0 (это, соответственно, root в линуксах). Очевидно, от типа ОС такой результат не зависит, так как речь про произвольный и прямой доступ в память.
(Новость OpenNet.)
Комментировать »
Официальная новость ТЦИ про добавление определения X25519Kyber768 на audit.statdom.ru (САБИУ). Цитата:
На серверной стороне поддержка реализована, например, на узлах Google и веб-фронтендах Cloudflare, одного из крупнейших мировых провайдеров веб-доступа. То есть существенная часть веб-трафика в Интернете уже защищена с помощью данной криптосистемы.
Вообще, этот момент почему-то сейчас упускают из виду: может, оно и прошло незаметно, но сейчас, если вы используете Google или Youtube через более или менее современный браузер из распространённых, TLS-трафик уже защищён при помощи ключей, полученных с использованием Kyber768 – то есть, постквантовой криптосистемы. А если сюда добавить, что очень многие мало-мальски популярные сайты используют Cloudflare, – в том числе, в Рунете этот сервис очень распространён, – то окажется, что немалая часть обычного TLS-трафика в Вебе, – точно больше трети, – уже перешла, так сказать, на “постквантовые ключи”. А момент довольно интересный, но почему-то про него не особо-то пишут даже технические СМИ.
(Кстати, по наличию поддержки на стороне сервера можно, – примерно, – судить, у кого насколько “свой” TLS-бэкенд. Тоже занимательно.)
Комментировать »
С “червём” CrowdStrike, конечно, странная история, но не менее странно и то, что уж в корпоративной-то Windows-среде есть все штатные способы настроить тестовую зону для раскатки обновлений. То есть, обновления должны сперва локально раздаваться только на некоторые машины, где отдельная служба может проверить, что оно не сломало всё, куда дотянулось, а только потом, когда некоторая уверенность появилась, обновления можно попробовать применять дальше. Наверное, с CrowdStrike ситуация другая. Наверное, можно так устроить программу-агента с центральным управлением, что она сломается только после того, как расползётся по достаточному количеству компьютеров.
Да, понятно, что описанный способ администрирования, с контролируемым изменением системного ПО, как и многие смежные технологии, это сейчас скорее из области теории, поскольку на практике, когда у вас есть внешний “непогрешимый ИИ”, управляющий “безопасностью ИТ-решений”, то этот ИИ может сам центрально раздать любой код на любые машины, где работают его “пробники”, поскольку windows-операторы свою часть уже сделали в самом начале: “прокликали Next->Next->Next до Finish”.
(Касается, кстати, и мониторинговых решений с агентами для линукс-систем. Тут, конечно, ситуация получше, но, вообще-то, в корпоративных средах предпочитают расставить на все машины, до которых удалось дотянуться, предположим, Zabbix-агент, и не задумываться о том, что это за программа и каковы её возможности.)
Комментировать »
Наземная сеть радиоприёмников, – например, базовых станций мобильной связи, – может быть использована для определения координат (геолокации) передатчиков. Типовой пример передатчика – мобильный терминал. Для такой геолокации не требуется связь со спутниками GNSS (GPS, в частности), как не требуется и прямое участие самого терминала: главное, чтобы этот терминал излучал сигнал с известной модуляцией. То есть, терминал может работать с какой-то “внешней” системой, – даже со спутниковой, – но определять его местоположение может совсем другая сеть.
Задача, в общем случае, формулируется следующим образом: пусть есть набор узлов (обычно, пассивных приёмников), координаты которых в заданной системе известны с достаточной точностью; эти узлы далее называются “опорными”; кроме опорных – есть узлы, называемые “определяемыми”, для которых и требуется вычислять координаты и определять местоположение (то есть, это те самые терминалы). По условию задачи, опорные узлы принимают сигналы, излучаемые определяемыми узлами.
В этой задаче могут двигаться любые узлы, а не только определяемые, как можно подумать. Конечно, обычно опорные узлы будут неподвижны (в заданной системе координат), но, вообще-то, это не так важно: главное, чтобы траектории опорных узлов были известны с достаточной точностью. Идеальный вариант, если траектория известна ещё и с опережением по времени, но это уже детали, хоть данный аспект и позволяет использовать те же методы на базе спутниковых приёмников.
Заметьте, что в некоторых частных, но интересных, случаях данной задачи, как только координаты определяемого узла вычислены, этот узел, вне зависимости от степени участия в сети, может стать дополнительным “подсвечивающим” узлом и, тем самым, начнёт помогать в работе опорным узлам сети (этот момент отдельно рассмотрен ниже).
Узкая практическая интерпретация задачи: определение координат пользовательских терминалов, работающих с той или иной мобильной сетью. Естественно, в качестве источника сигнала может выступать не только типовой радиомодуль смартфона 4G/5G – годится и какой-нибудь WiFi-сигнал или Bluetooth. Данный технологический “сеттинг” легко переносится и на сценарии с прочими передатчиками. При этом, например, в самых современных стандартах мобильной связи, обычно называемых 5G, для непрерывной, точной геолокации терминалов, что называется, и методы определены, и специальные сигналы выделены: определение местоположения терминала имеет решающее значение для сети. Конечно, геолокация, без привязки к GNSS, доступна и в более ранних системах сотовой связи (LTE).
Методов определения координат для решения только что описанной задачи неожиданно много, а если определяемое устройство в той или иной мере “кооперативное”, то есть, помогает измерять свои координаты, то и методов становится больше. Но и для “не кооперативного” случая методов не мало.
Необходимо уточнить важный момент: предполагается, что приёмники имеют возможность точной атрибуции сигналов. То есть, принимаемый сигнал заведомо соответствует одному, – так сказать, точечному, – передатчику (антенне). Это обеспечивается разными способами, которые зависят от используемой модуляции и других характеристик сигналов (вплоть до “дрейфа фазы” и прочих нетривиальных методов “фингерпринтинга”). Но если речь идёт о системах типа современной сотовой связи, то достаточно принять во внимание один архитектурный момент: сеть, обеспечивающая передачу данных, просто должна иметь возможность точно различать передатчики – иначе возникнут трудности с диспетчеризацией и управлением доступной полосой (“бюджетом” радиоканала, как часто говорят). Поэтому протоколы в этой области и проектируются так, что можно различить передатчики на уровне радиоканала (то есть, не на уровне самого ЭМ-сигнала). Дополнительную базу для успешной селекции сигналов конкретных передатчиков может предоставлять обмен информацией между приёмниками – базовыми узлами.
Теперь можно кратко рассмотреть основные методы геолокации, среди которых есть и редко упоминаемые.
Измерение времени распространения сигнала
Самый очевидный и самый мощный метод. Если точно известно время, затрачиваемое сигналом на преодоление расстояния между передатчиком и приёмником, то, зная скорость распространения сигнала, нетрудно вычислить расстояние. Взяв расстояния до нескольких приёмников – определяем координаты передатчика. Геометрическая основа – точки пересечения окружностей (сфер, в общем случае). Для идеального двумерного случая на плоскости – достаточно трёх приёмников. Необходимое количество может быть меньше, если применяются гибридные способы геолокации (см. ниже).
Это рабочий метод. Он лежит в основе GPS. Основная проблема тут в том, что нужно иметь общую с передатчиком схему отсчёта времени, поскольку необходимо знать, когда принятый сигнал был отправлен. То есть, необходима такая схема, метки времени из которой можно однозначно перевести в общее время сети опорных узлов-приёмников. Если передатчик не “кооперативный”, то ситуация сложнее: общие часы уже так просто не получить. Однако подходящие метки времени иногда можно вычислить из свойств самого принимаемого сигнала: например, устройство работает с какой-то своей сетью, синхронизирует с ней время, а время в этой сети – это время GPS.
(Сюда же, вообще говоря, относится и метод измерения фазы принятого сигнала (в одной точке), особенно, если речь идёт о гармонике: определив изменение фазы – можно определить расстояние, но требуется учитывать параметры генерации сигнала и то, что в дистанцию может уложиться более одного периода сигнала. Естественно, подходит и заранее известная зависимость модуляции от общего времени.)
Разработка алгоритмов коррекции ошибок по времени, которые возникают на этих направлениях, приводит к следующему методу геолокации передатчиков.
Измерение разности времени поступления сигнала
Логика метода сходна с предыдущим, но не требуется синхронизация времени передатчиком. Опорные узлы, работающие в общем, синхронном времени, могут вычислять разность времени получения одного и того же сигнала разными узлами. То есть, определение координат передатчика тут строится на вычислении множества точек, для которых постоянной является разность расстояний, а геометрической основой – гипербола.
Запрос с подтверждением
Этот метод не пассивный. Он основан на отправке опорного сигнала в сторону определяемого узла с получением ответа от этого узла. Ответ отправляется через строго заданный промежуток времени после получения запроса. Здесь сигнал ходит в обе стороны, а опорный узел может измерить дальность по суммарному времени: предполагается, что расстояния в одну и в другую сторону – одинаковые. Далее метод работает аналогично первому (или второму, в зависимости от деталей). Заданный интервал ожидания позволяет компенсировать рассогласование локальных часов.
С одной стороны, этот метод, используемый напрямую, как бы противоречит идее: он не является пассивным – измеряющая сеть должна отправить сигнал, а определяемый узел – ответить (кстати, подобрать такой сигнал, на который ответит типовой терминал, не так сложно, поскольку не требуется “содержательный” ответ, а достаточно любого). С другой стороны, можно этот метод модифицировать так, что он будет использовать штатные сигналы другой сети, с которой взаимодействует исследуемый передатчик – эти сигналы тоже может принимать опорная сеть.
Угол (направления) на приёмнике
Ещё более геометрический метод, который обычно и называют пеленгацией: определение каждым опорным узлом направления на передатчик. Это направление, в двумерном случае, принято задавать в виде угла, взятого относительно условного “севера”, который является общим для всей измеряющей сети. Построив лучи из нескольких точек, соответствующих опорным узлам, можно вычислить координаты определяемого узла по пересечению лучей.
Опорный узел может определить угол направления на передатчик, сравнивая сигнал, принимаемый на разные антенны. Либо можно использовать одну антенную решётку, так же измеряя разность фаз сигнала.
Затухание сигнала
Мощность передатчика часто известна. Не только потому, что она, предположим, определена спецификацией оборудования. Значение рабочей мощности может передаваться и в составе сигналов, обеспечивающих работу радиоканала. Зная мощность на антенне передатчика и мощность на принимающей антенне, можно вычислить расстояние по степени затухания. Так как, по условию задачи, опорных приёмников несколько, то измерение затухания позволяет определить координаты передатчика по расстояниям от нескольких опорных узлов.
Этот метод можно улучшить, если измерять не просто затухание, а “разность” затухания на нескольких опорных узлах – логика совпадает с измерением разности времени получения сигнала (см. выше).
Гибридные методы
Описанные методы не являются взаимоисключающими, так что использование данных, полученных одним методом, для “просеивания” результатов, полученных другим методом, существенно улучшает точность. Самый простой пример: измерение угла направления позволяет убрать неоднозначности координат, полученных измерением времени распространения сигнала.
***
Все описанные методы используются на практике. И все они подвержены влиянию отражений и затенения. Понятно, что в реальных условиях, – предположим, в городской застройке, – путь сигнала от передатчика до приёмника может быть замысловатым, а отражённые сигналы – накладываться. При этом опорные узлы могут использовать сигналы тех определяемых узлов, координаты которых уже известны, для уточнения координат других определяемых узлов (конечно, за вычетом возможных дефектов первичных измерений). Пусть для какого-то передатчика координаты уже известны точно (как и характеристики сигнала), но при этом некоторые опорные узлы, действуя локально, определяют для этого же передатчика другие координаты, отличающиеся от известных: соответствующая поправка позволяет определить особенности деформации сигнала в направлении этих опорных узлов, что, в свою очередь, позволяет скорректировать измерения для других определяемых передатчиков.
Естественно, если снова отказаться от полностью пассивной роли сети, то в качестве источников сигналов, по которым измеряется деформация, могут служить сами опорные узлы, координаты которых известны по определению. Собственно, в LTE, в 5G, для таких измерений даже предусмотрены отдельные сигналы. А само поле деформации, если его заранее измерить, может служить основой для навигации и определения координат.
Комментировать »
Практический пример того, как автоматизация процессов работы с исходным кодом и репозиториями (читать нужно: CI/CD) может легко и неожиданно “выйти боком”: токен с правами полного доступа к репозиториям Python и PyPI на GitHub долгое время находился в открытом доступе.
Разбор инцидента из первых рук позволяет понять, как так вышло: наружу отправился локальный файл .pyc, случайно оставшийся в локальной (общей для процесса сборки) директории, которая требовалась для работы приложения в Docker-контейнере; ну и не менее случайно – в этом .pyc-файле сохранился токен доступа.
Комментировать »
Кстати, очередная типовая академическая атака на процессоры: в этот раз – процессоры Intel и Indirect Branch Predictor (IBP) поверх Branch Target Buffer (BTB) – то есть, косвенное извлечение данных, относящихся к соседнему процессу на том же CPU, через подстановку фиктивных ветвлений и измерение состояний аппаратуры, пытающейся оптимизировать исполнение кода.
Такие дефекты, при современной архитектуре процессоров, в принципе неустранимы, поэтому статьи по теме, переоткрытой Spectre/Meltdown (о самом направлении именно в процессорах известно с 80-х годов прошлого века, если не раньше), сейчас идут одна за одной стройным потоком. Обратите внимание, что атаки этого типа требуют исполнения специального кода, в несколько тепличных условиях, на том же процессоре, где исполняется и процесс с “секретными данными” и известным внутренним устройством.
(Статья на Bleeping Computer.)
Комментировать »
Новый