Життя печеньки-параноїка

image
(насправді параноя — це весело)

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


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

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


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

Чого маємо:

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


Що треба:

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


З другого пункту випливає, що

  • Сервер повинен бути написаний як вірус, з шифрованиями, обфускациями і т.д., щоб уневозможнить аналіз його роботи і перехоплення даних у працюючому режимі.
  • Канал зв'язку повинен бути надійно зашифрований з використанням асиметричної криптографії(аля ssl/tls).
  • Доступ до інформації повинен предоставлятся за login password, зберігається вся інформація має бути додатково (крім як на стороні користувача) защифрована на сервері ще одним користувача ключем.
  • При перевищенні допустимої кількості спроб введення пар login password, ip-адреса запитувача йде в довгий бан.
  • При довгому відсутності даних 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. викладав всі несерйозним мовою, щоб розрядити обстановку, і змусити мізки засвоювати інформацію відпочиваючи.
PSS стаєте більш криптографічно-грамотними, це ж Ваша безпека і анонімність. До всіх крипто-апі прислів'я «Довіряй але перевіряй». Псевдо спеців по ІБ все більше.
P.S.S.S ніколи не плутайте хакера і крекеру,
Хакер (англ. hacker, від to hack — рубати, шматувати) — висококваліфікований ІТ-фахівець, людина, яка розуміє тонкощі роботи програм ЕОМ.
Спочатку хакерами називали програмістів, які виправляли помилки в програмному забезпеченні або яким-небудь швидким і далеко не завжди елегантним (в контексті використовуваних у програмі стилю програмування та її загальної структури, дизайну інтерфейсів) або професійним способом; слово hack прийшло з лексикону хіпі, в російській мові є ідентичне жаргонне слово «врубаться» або «рубати ...». См. hacker (programmer subculture) (англ.)рос. і en:hacker (hobbyist).
В даний час найбільш широко відоме значення «комп'ютерний зломщик» — крэкер (англ. cracker, від to crack — розколювати, розламувати)
Багато хакери можуть бути крекерами і навпаки, але це не рівнозначні поняття.

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.