Бэкдор

Материал из Википедии — свободной энциклопедии
Перейти к: навигация, поиск

Бэкдор, backdoor (от англ. back door — задняя дверь, в русском языке кроме подходящего по смыслу слова «люк» есть словосочетание «чёрный ход», полностью аналогичное по первичному смыслу англоязычному backdoor) — дефект алгоритма, который намеренно встраивается в него разработчиком и позволяет получить тайный доступ к данным или удалённому управлению компьютером[1].

Предназначение[править | править вики-текст]

Основное назначение бэкдора — скрытное и быстрое получение доступа к данным, чаще всего зашифрованным. Например, бэкдор может быть встроен в алгоритм шифрования для последующей прослушки защищённого канала злоумышленником[1][2].

Основные свойства бэкдора[править | править вики-текст]

Идеальный бэкдор:[править | править вики-текст]

  • Сложно обнаружить
  • Можно использовать многократно
  • Легко отрицать — Выглядит как ошибка, и в случае обнаружения разработчик может сослаться на то что допустил эту ошибку случайно и злого умысла не имел.
  • Эксплуатируем только при знании секрета — Только тот кто знает как активируется бэкдор может им воспользоваться.
  • Защищён от компрометации предыдущими использованиями — Даже если бэкдор был обнаружен, то невозможно установить кем он до этого эксплуатировался и какой информацией завладел злоумышленник.
  • Сложно повторить — Даже если бэкдор был кем-то найден, то его невозможно будет использовать в другом коде или в другом устройстве.

Распространённые принципы создания бэкдоров в алгоритмах:[править | править вики-текст]

  • Слабая устойчивость алгоритма криптоанализу
  • Специально подобранные константы — Алгоритм может стать неустойчивым к криптоанализу при выборе определённых значений констант используемых в его работе.
  • Сложность в безопасной реализации — Это означает, что безопасная реализация алгоритма работает слишком медленно, и все будут использовать небезопасный вариант, что и выгодно злоумышленнику.

Гипотетические примеры бэкдоров в современных алгоритмах[править | править вики-текст]

Уязвимость генератора псевдослучайной последовательности DUAL_EC_DRBG[править | править вики-текст]

Данный генератор был разработан в АНБ и стандартизован в качестве криптографически стойкого генератора псевдослучайных чисел национальным институтом стандартов и технологий США NIST в 2006 году. Однако уже в 2007 году независимыми исследователями было высказано предположение, что в этот алгоритм мог быть встроен бэкдор.[3][4][5]

Иллюстрация работы алгоритма согласно спецификации АНБ[6]:

DUAL EC DRBG.jpg

Данный алгоритм использует эллиптические кривые.  P  — генератор группы точек на эллиптической кривой,  Q  — точка на эллиптической кривой — константа, определённая стандартом, как она была выбрана неизвестно. Параметры самой кривой кривой также заданы стандартом.

Принцип работы:

Уравнение кривой  y = x^3+ax+b~mod~p можно переписать в виде  x = \varphi(x, y)~mod~p и записать следующие выражения для работы алгоритма:

 r_i = \varphi(s_i*P) ,  t_i = \varphi(r_i*Q) ,  s_{i+1} = \varphi(r_i*P)
 s_i — внутреннее состояние генератора на текущем шаге
 s_{i+1} — внутреннее состояние генератора на следующем шаге
 t_i  — выход генератора на текущем шаге
Предполагаемый бэкдор:

Так как  p  — простое число, то существуют такое число  e , что  e*Q=P. Нахождение  e  — вычислительно сложная задача дискретного логарифмирования на эллиптической кривой, для решения которой на сегодняшний день не существует эффективных алгоритмов. Но если предположить, что злоумышленник знает  e , то получается следующая атака: Если  x=t_i  — очередной выход генератора, и если существует такое  y , что  y^2 \equiv x^3+ax+b~mod~p, то точка  A =(x,y), лежит на кривой и для неё выполняется следующее равенство:  A=r_i*Q . Зная число  e можно вычислить:  s_{i+1}=\varphi(e*A)=\varphi(e*r_i*Q)=\varphi(r_i*P) . Таким образом, злоумышленник, знающий число  e , может не только вычислить следующий выход генератора, но и быстро перебрать все возможные внутренние состояния генератора и восстановить его начальное внутреннее состояние. Сосгласно независимым исследованиям[7][2], при знании  e достаточно всего 30 байт выходной последовательности генератора, чтобы простым перебором  2^{15} значений восстановить его начальное внутреннее состояние. По мнению исследователей, такая уязвимость может быть расценена как бэкдор.

Ошибка в реализации протокола проверки сертификатов TLS от компании Apple[править | править вики-текст]

Исследователями компании Яндекс была обнаружена уязвимость в реализации протокола TLS в одном из программных продуктов Apple[2]. По их мнению, данная ошибка вполне может оказаться бэкдором, намеренно встроенным в алгоритм кем-то из разработчиков.

Участок кода с ошибкой:
static DSStatus SSLVerifySignedServerKeyExchnge(....)
{
     DSStatus err;
     ....
     if ((err = SSLHashSHA1.update(&hashCtx, &signedParams)) != 0)
          goto fail;
          goto fail;
     if ((SSHashSHA1.final(&hashCtx, &hashOut)) != 0)
          goto fail;
     ....
     fail:
          ....
          return err;
}

Как можно видеть, после второго оператора if стоят две строчки goto fail, и вторая строчка выполняется всегда, независимо от результата if. Таким образом процедура проверки сертификата проходит не полностью. Злоумышленник, знающий об этой уязвимости, может подделать сертификат и пройти проверку подлинности. Это позволит ему организовать атаку типа «Человек посередине», тем самым вмешаться в защищённое соединение между клиентом и сервером. Исследователи, обнаружившие данную ошибку в реализации, не могут точно сказать, намеренно она была сделана или случайно. Вполне возможно, что это бэкдор, встроенный в алгоритм кем-то из разработчиков.

Примеры методов создания бэкдоров[править | править вики-текст]

Специально подобранные константы[править | править вики-текст]

Очень многие современные криптографические алгоритмы используют при своей работе определённый набор внутренних констант. Как правило, эти константы задаются стандартом и выбираются из соображений криптографической стойкости к известным на данный момент видам криптоанализа. Но выбор констант при стандартизации алгоритма теоретически может быть использован разработчиками и со злым умыслом: например, для создания определённых уязвимостей и бэкдоров в алгоритме.

В качестве такого примера использования констант можно привести недавние исследовательские работы на тему так называемого «вредоносного хэширования»[8][9], где авторам удалось построить коллизии для криптографической хэш-функции SHA1 путём модификации её раундовых констант. Отметим, что предложенная авторами исследования атака не является атакой на саму хэш-функцию SHA1, она позволяет лишь находить коллизии при условии возможности изменения раундовых констант и только для определённых типов файлов.

Краткое описание SHA1:

SHA1 — современная раундовая хэш-функция. Алгоритм хэширования следующий:

  • Инициализируются 32-битные значения  a = h_0 , b = h_1 , c = h_2 , d = h_3 , e = h_4
  • Входное сообщение разбивается на блоки длиной 512 бит
  • Каждый блок сообщения обрабатывается и дополняется специальным образом, по алгоритму, определённому в стандарте
  • Полученный блок сообщения хэшируется в 4 этапа по 20 раундов в каждом, причём для каждого этапа используется своя константа K_1, K_2, K_3 или K_4
  • Выходом функции для каждого блока будут новые значения a, b, c, d, e , которые добавляются к результату:  h_0 = h_0 + a, h_1 = h_1 + b, h_2 = h_2 + c, h_3 = h_3 + d, h_4 = h_4 + e
  • Итоговым результатом хэширования будет 160-битное значение полученное конкатенацией пяти 32-битных значений  h_0, h_1, h_2, h_3, h_4 после обработки последнего блока сообщения.
Построение коллизий:

Целью рассматриваемой атаки является нахождение таких констант  K_1, K_2, K_3, K_4 и таких сообщений M_1 и M_2 , что Hash(M_1) = Hash(M_2). Данная атака модифицирует только первые 512 бит (1-ый блок) сообщений для которых требуется построить коллизию. Алгоритм базируется на уже известной разностной атаке на SHA1, предложенной в 2005 году[10][11] и имеющей сложность порядка  2^{69} операций, что делает её трудноосуществимой на практике. Поэтому до настоящего времени ни одной реальной коллизии для SHA1 найдено не было.

Но в случае создания вредоносного варианта SHA1 злоумышленник может варьировать не только блоки сообщений M_1 и M_2, но и раундовые константы  K_1, K_2, K_3, K_4 . Согласно исследованиям[9], это сильно снижает сложность атаки до порядка  2^{48} операций и делает построение таких коллизий реальной задачей которую можно выполнить на нескольких компьютерах. Таким образом, авторам исследования удалось построить одноблоковые коллизии для многих известных типов файлов.

Одноблоковая коллизия:

Mal sha1.jpg

M_1 и M_2 — первые блоки сообщений(512 бит), которые отличаются между собой, но дают одинаковую хэш-сумму
 Content  — остальное содержимое, которое одинаково для обоих файлов

Пример использования вредоносного хэширования для создания бэкдоров[править | править вики-текст]

С помощью описанной атаки были созданы два sh-скрипта, которые при выборе  K_1=5a827999~,~K_2=88e8ea68~,~K_3=578059de~,~K_4=54324a39 дают одинаковую хэш-сумму SHA1, но работают по-разному.

Malicious sh.jpg

Как можно видеть, различие между этими двумя скриптами заключается только в первых блоках по 512 бит, которые представляют из себя закоментированный мусор. Но содержимое этих блоков затем используется в условии if , следовательно скрипты при запуске работают по-разному. Подобные файлы могут быть использованы создателем со злым умыслом.

Конкурс бэкдоров Underhanded C Contest[править | править вики-текст]

Суть данного конкурса состоит в том, что участники должны прислать код, реализующий какой-нибудь криптографический алгоритм. Этот код должен выглядеть безопасно, но при этом содержать в себе бэкдор, который трудно обнаружить, но можно использовать в реальной системе.[12] В качестве примера такого кода приведём победителя Underhanded C Contest 2007:

#define TOBYTE(x) (x) & 255
#define SWAP(x,y) do { x^=y; y^=x; x^=y; } while (0)

static unsigned char A[256];
static int i=0, j=0;

void init(char *passphrase) {
    int passlen = strlen(passphrase);
    for (i=0; i<256; i++)
        A[i] = i;
    for (i=0; i<256; i++) {
        j = TOBYTE(j + A[TOBYTE(i)] + passphrase[j % passlen]);
        SWAP(A[TOBYTE(i)], A[j]);
    }
    i = 0; j = 0;
}

unsigned char encrypt_one_byte(unsigned char c) {
    int k;
    i = TOBYTE(i+1);
    j = TOBYTE(j + A[i]);
    SWAP(A[i], A[j]);
    k = TOBYTE(A[i] + A[j]);
    return c ^ A[k];
}

Данный код реализует алгоритм шифрования RC4 для встраиваемых устройств. Разработчиками была применена якобы дополнительная оптимизация для реализации макроса #define SWAP(x, y) do { x^=y; y^=x; x^=y; } while (0), который меняет местами значения двух переменных без использования третьей переменной. Но этот макрос работает правильно только если  x \neq y , если же  x = y то значения обоих переменных становятся равными нулю. Таким образом, внутреннее состояние генератора RC4 постепенно зануляется и через некоторое число итераций на выход алгоритма шифрования будет поступать просто открытый текст. Этот бэкдор будет выглядеть как просто трудно выявляемая ошибка, потому что swap(x, y) кажется очень простой операцией, и маловероятно, что кто-то будет искать в её реализации ошибку, а уж тем более тестировать на двух одинаковых значениях переменных. По мнению авторов этого кода, подобные ошибки, которые сделаны из-за попытки оптимизировать какой-нибудь простой и известный алгоритм, часто делаются ненамеренно и встречаются в реальных алгоритмах.[13]

Аппаратные бэкдоры[править | править вики-текст]

Бэкдоры могут встраиваться не только в программное обеспечение, но и в аппаратуру. Подобные бэкдоры могут использоваться производителями аппаратной начинки для встраивания в неё вредоносных функций на этапе производства.

Аппаратные бэкдоры имеют ряд преимуществ над программными:

  • Не могут быть обнаружены антивирусами, сканерами кода и другим защитным ПО.
  • Не могут быть устранены обновлением или заменой программного обеспечения.

Примером аппаратного бэкдора может быть вредоносная прошивка BIOS. Согласно исследованиям[14], такая прошивка может быть построена на основе свободных прошивок Coreboot[15] и SeaBIOS. Coreboot не является полноценным BIOS: он отвечает только за обнаружение имеющегося на машине оборудования и передачу управления самой «начинке BIOS», в качестве которой может быть использован модифицированный злоумышленником под свои нужды SeaBIOS.

Принцип действия вредоносной прошивки кратко можно описать так: сразу после включения заражённого компьютера, ещё до загрузки операционной системы, она производит попытку установить соединение с сервером злоумышленника через интернет. Если такая попытка удалась, то производится удалённая загрузка какого-нибудь буткита, который уже в свою очередь предоставляет злоумышленнику возможность производить с заражённым компьютером вредоносные действия: кражу данных или удалённое управление. Если же попытка соединения с интернетом не удалась, то происходит нормальная загрузка операционной системы. Несомненным плюсом для злоумышленника является то, что сама по себе модифицированная прошивка не содержит в себе никакого вредоносного кода, а буткиты трудно обнаруживаются.

Примечания[править | править вики-текст]

  1. 1 2 J.P. Aumasson Cryptographic bacdooring
  2. 1 2 3 Евгений Сидоров, Криптографические баги и бэкдоры, Yandex security meet up, 24.07.2015
  3. Dan Shumow, Niels Ferguson, On the Possibility of a Back Door in the NIST SP800-90 Dual Ec Prng, CRYPTO 2007, august 2007
  4. Брюс Шнайер. Did NSA Put a Secret Backdoor in New Encryption Standard?, Wired News (15 ноября 2007). Архивировано из первоисточника 19 сентября 2012.
  5. Киви Берд, Неслучайные случайности // Компьютерра, 07 декабря 2007
  6. John Bryson, Patrick Gallagher, Recommendation for Random Number Generation Using Deterministic Random Bit Generators, p. 60, 2012
  7. Dan Shumow, Niels Ferguson, On the Possibility of a Back Door in the NIST SP800-90 Dual Ec Prng, pages 6-7, CRYPTO 2007, august 2007
  8. Ange Albertini, Jean-Philippe Aumasson, Maria Eichlseder, Florian Mendel, Martin Schlaeffer, Malicious SHA-1, 14.08.2014
  9. 1 2 Ange Albertini, Jean-Philippe Aumasson, Maria Eichlseder, Florian Mendel, Martin Schlaffer, Malicious Hashing: Eve’s Variant of SHA-1, 2014 year
  10. Wang, X., Yao, A.C., Yao, Cryptanalysis on SHA-1. NIST — First Cryptographic Hash Work-shop, 31 October 2005
  11. Wang, X., Yin, Y.L., Yu, H. , Finding collisions in the full SHA1, CRYPTO 2005
  12. About Underhanded C Contest
  13. David Wagner, Philipe Biondi, Underhaneded C Cntest 2007, Malicious RC4 implementation, 2007 year
  14. Jonathan Brossard, Аппаратные бэкдоры — это практично, 12 марта 2012
  15. Обзор проекта свободного BIOS — Coreboot, 9 октября 2014

Ссылки[править | править вики-текст]

См. также[править | править вики-текст]