geektimes

Жизнь печеньки-параноика

  • четверг, 30 октября 2014 г. в 02:11:02
http://habrahabr.ru/post/241854/

image
(на самом деле паранойя — это весело)

Каждый программист в своей жизни хоть раз, но писал/хотел написать(нужное подчеркнуть) свой собственный сервер с блекджеком и шлюхами, ой т.е. преферансом и балеринами. Как же жить, если ты нереальный кул-хацкер и просто обязан иметь место для бекапов файлов, сообщений и прочих штук.


Конечно же нужен будет защищенный от NSA/ФСБ удаленный сервак, где нибудь в Малазии/Японии или Египте. Тру кул-хацкер конечно же будет писать его на С, а не на какой нибудь джабе, используя туеву кучу фреймворков/велосипедов, чтобы образовать кросс-ведро, но далее не об этом. Далее о том, как бы в теории дожна выглядеть система параноика-шизофреника, первая личность которго – крекер (да, печенька), а вторая – это агент NSA/ФСБ. Шизофрения у нас будет спецефическая, т.е. крекер об агенте ничего не знает и наоборт (пароли и ключи конечно-же у каждого разные).

Если долго-долго рефлексировать специалист по ИБ(дядя служивший/преподававший где-нибудь в военном универе) родит мало-мальскую схему такого сервера, еще и скажет вам, что так надо делать всегда, в любой системе. И в основе этой системы будет лежать чудо-механизм защиты от НСД, включающий кучу ненужной для печеньки фигни. (НСД – это сокращенно, от не санкционнированный доступ, все крутые парни из 50-х используют эту аббревиатуру) И покажет вам красивую схемку
image
Это общая картинка того, как все это работает в NSA/ФСБ(да, да привет ФСБ).
Некоторые сокращения автор расшифроввывает так:
  • АРМ СБ – автоматизированное рабочее место службы безопасности (что, правда автоматизированное? Привет из 50х, и таки еще раз привет всем гос-органам)
  • КП – ключи пользователей
  • ПК – персональный компьюте (серьезно? Также на схеме выше под ПК можно подразумевать терминал)
  • УНДП – уникальный идентификатор пользователя (в простонародье используется буквенное сочетание именуемое логином)


Но, эта схема далека от жизни кул-хацкера. Физического доступа к серверу у него нету. Настоящий крекер не доверяет даже железу, которое специльно для него могло поставить в Малазии NSA/ФСБ. Давайте на минутку побудем все-таки профессионалами, и подумаем, что имеем, и что нам надо.

Чего имеем:


  • сервер удаленный 1 шт. (и мы ему не доверяем), конфигурация стандартная 1-2 Гб оперативы, N терабайт хранилища. На базе какого-нибудь процессора c парой ядер. Сетевая карта и подключение к интернету обязательно.


Что надо:


  • крутая сверх-защищенная система, которая должна обеспечивать
  • — анонимность
  • — полная защищенность информации от НСД (процессор тоже враждебный, жесткий диск враждебен еще больше, а канал между вами и сервером по-полной снимается спец-службами)


Из второго пункта следует что

  • Cервер должен быть написан как вирус, с шифрованиями, обфускациями и т.д., дабы уневозможнить анализ его работы и перехват данных в работающем режиме.
  • Канал связи должен быть надежно зашифрован с применением ассиметричной криптографии(аля ssl/tls).
  • Доступ к информации должен предоставлятся по login-password, вся хранящаяся информация должна быть дополнительно (кроме как и на пользовательской стороне) защифрована на сервере еще одним пользовательским ключем.
  • При превышении допустимого количества попыток ввода пар login-password, ip-aдресс запросчика уходит в долгий бан.
  • При долгом отсутсвии данных auto-logout.
  • Kill-switch для данных, на каждого пользователя (т.е. при успешном входе есть возможность одной командой надежно выпилить все свои данные, т.е. хранящиеся данные, и login-password). Про надежное выпиливание данных можно почитать тут
  • Т.к. недоверие к среде исполнения полное, то все криптограффические алгоритмы забандлены (полностью реализованы в коде сервера). Потому что, может возникнуть ситуация, когда мы вызывает какой-нибудт libcrypto-api в unix, а там вместо AES подставлен, беспокоящимися о нас спец-слежбами, какой нибудь в лучшем случае xor, а вхудшем пустой прогон данных.
  • Желательно еще временная перестройка по tcp/udp портам. Т.е. скажем мы сидим 10 минуток на 6000, а потом прыгаем на порт по криптографически-стойкому ГПСП(генератор псевдо-случайной последовательности). Что такое криптографическая стойкость ГПСП прочитайте либо тут, либо в вики.


Вроде как все, если что забыл, добавлю, как вспомню.

Step 1 – Аутентификация



Аутентифика́ция (англ. Authentication) — процедура проверки подлинности, например: проверка подлинности пользователя путём сравнения введённого им пароля с паролем в базе данных пользователей; 

Как говорит википедия сравнивать мы будем пароли на соотвествие с базой данных. Первые люди поняли что это крутая идея, и придумали РАР (от англ.  Password Authentication Protocol) Этот протокол отправлял введенный пользователем пароль на сервер, где тот на него смотрит, и говорил есть ли истина, или нет ее на земле.

Пакет протокола:
image

расшифровка
  • peer-id-length – длинна идентификатора пользователя (пира в одноранговых сетях)
  • peer-id — сам идентификатор
  • (по факту это всем извесная pascal-строка, длинной до 255 символов, потому что поле 1 байт)
  • password-length – длинна пароля
  • password – сам пароль


А вообще, тем кто не учил в школе английский не место в кул-хацкерах, по этому далее я не буду переводить английский уровня 4 класса.

image

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

Хеширование (иногда «хэширование», англ. hashing) — преобразование по определённому алгоритму входного массива данных произвольной длины в выходную битовую строку фиксированной длины. Такие преобразования также называются хеш-функциями или функциями свёртки, а их результаты называют хешем, хеш-кодом или сводкой сообщения (англ. message digest).

Криптографическая хеш-функция — всякая хеш-функция, являющаяся криптостойкой.

Для того, чтобы хеш-функция H считалась криптографически стойкой, она должна удовлетворять трём основным требованиям, на которых основано большинство применений хеш-функций в криптографии:
  • Необратимость или стойкость к восстановлению прообраза: для заданного значения хеш-функции m должно быть вычислительно невозможно найти блок данных X, для которого H(X)=m.
  • Стойкость к коллизиям первого рода или восстановлению вторых прообразов: для заданного сообщения M должно быть вычислительно невозможно подобрать другое сообщение N, для которого H(N)=H(M).
  • Стойкость к коллизиям второго рода: должно быть вычислительно невозможно подобрать пару сообщений  (M,M′), имеющих одинаковый хеш.

Данные требования не являются независимыми:
  • Обратимая функция нестойка к коллизиям первого и второго рода.
  • Функция, нестойкая к коллизиям первого рода, нестойка к коллизиям второго рода; обратное неверно.


Вот и решили, что пароли нужно хешировать, а в базе на сервере, хранить хеш, и сверять их. Это был next step, и протокол назвали CHAP.
CHAP (англ. Challenge Handshake Authentication Protocol) — широко распространённый алгоритм проверки подлинности, предусматривающий передачу не самого пароля пользователя, а косвенных сведений о нём. 

Структура пакета:
image

Схема работы:
image

CHAP по стандарту использует MD5. А я говорю, что можно использовать что-угодно другое, хоть свой крипто-велосипед. Но, умный крекер никогда не будет писать свой крипто-велосипед, потому что знает, что можно натктунся на тучу дырок в реализации, начиная от атаки по времени, заканчивая неправильными выдаваемыми значениями.

В криптографии атака по времени (англ. Timing attack) — это атака, в которой атакующий пытается скомпрометировать криптосистему с помощью анализа времени, затрачиваемого на исполнение криптографических алгоритмов. Каждая логическая операция требует времени на исполнение на компьютере и это время может различаться в зависимости от входных данных. Располагая точными измерениями времени для разных операций, атакующий может восстановить входные данные.

Так говорит вики, и не нужно боятся слова скомпрометировать, в простонародье называют взломать, но все же будьте грамотны. Поясняю на пальцах:
x – сообщение
H(x) – хеш функция
t(H(x)) – функция времени хеширования сообщения


Вспоминая 6-е классы школы функция — это правило, по которому каждому элементу одного множества (называемого областью определения) ставится в соответствие некоторый элемент другого множества (называемого областью значений). Т.е. даже если t(H(x)) отвечают несколько x, то мы можем подобрать нужный нам, путем проверки. Допустим есть сообщение “Мишган” мы его хешируем, получается H(“Мишган”) = абракадабра, а t(абракадабра = 0.01 с, но вот незадача, что
t(H(“Иван”)) = t(H(“Марфа”)) = t(H(“Мишган”)) = 0.01с
и не важно чему равны хеши, т.к. известно сколько времени нужно на хеширование некоторого сообщения, и просто подставляя в сообщение поочередно “Иван”, “Марфа” и “Мишган”, мы получаем, что пароль “Мишган” срабатывает, и заходим с N-той попытки в нужный аккаунт.

Поэтому всю криптограффию мы берем с OpenBSD сорцов (исходников), попутно сверяя ее с открытыми реализациями других либ/проектов и бандлим ее в наш проект. Сам CHAP очень прост, и реализовать его не составит труда, даже для начинающего программиста.

Таким образом step 1 можно считать пройденым. До новых встреч!

P.S. излагал все несерьезным языком, чтобы разрядить обстановку, и заставить мозги усваивать информацию отдыхая.
P.S.S становитесь более криптографически-грамотными, это Ваша же безопасность и анонимность. Ко всем крипто-апи пословица “Доверяй но проверяй”. Псевдо спецов по ИБ все больше.
P.S.S.S никогда не путайте хакера и крекера,
Ха́кер (англ. hacker, от to hack — рубить, кромсать) — высококвалифицированный ИТ-специалист, человек, который понимает тонкости работы программ ЭВМ.
Изначально хакерами называли программистов, которые исправляли ошибки в программном обеспечении каким-либо быстрым и далеко не всегда элегантным (в контексте используемых в программе стиля программирования и её общей структуры, дизайна интерфейсов) или профессиональным способом; слово hack пришло из лексикона хиппи, в русском языке есть идентичное жаргонное слово «врубаться» или «рубить в ...». См. hacker (programmer subculture) (англ.)русск. и en:hacker (hobbyist).
В настоящее время наиболее широко известно значение «компьютерный взломщик» — крэкер (англ. cracker, от to crack — раскалывать, разламывать)
Многие хакеры могут быть крекерами и наоборот, но это не равнозначные понятия.