Искусственный интеллект в кибербезопасности

Привет! Меня зовут Александр Адамов. Последние 15 лет я занимаюсь детектированием и анализом вредоносных программ. В один прекрасный момент, когда поток этих программ увеличился настолько, что у меня и моих коллег стало не хватать времени на их анализ, мы задумались над автоматизацией своей работы. Как сделать машину, которая бы и днем и ночью автономно детектировала и анализировала вредоносные файлы и фишинговые ссылки, писала и публиковала отчеты? В итоге мы создали робота (программного), с помощью которого смогли автоматизировать большинство процессов в антивирусной лаборатории при помощи Его Величества Искусственного Интеллекта (ИИ).

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

Немного теории

Многоликий искусственный интеллект. Экскурс в историю

Термин «искусственный интеллект» (ИИ) впервые был использован John McCarthy (Dartmouth College), Marvin Minsky (Harvard University), Nathaniel Rochester (IBM) и Claude Shannon (Bell Telephone Laboratories) в 1956 году. С тех пор определение ИИ неоднократно менялось в зависимости от уровня развития информационных технологий. Поэтому обычно его толкуют в зависимости от контекста и уровня развития технологий. Такие определения получили название парадигм ИИ, а процесс их изменения — сдвига парадигмы ИИ. К примеру, David Auerbach выделяет пять парадигм ИИ:

  • Speculative (до 1940).
  • Cybernetic (1940–1955).
  • Symbolic AI (1955–1985), AI winter (1974–80).
  • Subsymbolic AI (1985–2010), 2nd AI winter (1987–1993).
  • Deep Learning (2010—...).

Чтобы убедиться в этом, достаточно загуглить термины Artificial Intelligence (ИИ), Machine Learning (машинное обучение, МО) и Data Mining (интеллектуальный анализ данных, ИАД), и вы получите множество диаграмм Эйлера, показывающих отношения между этими научными направлениями, причем все разные :)

Разнообразие существующих отношений ИИ (Artificial Intelligence), МО (Machine Learning) и ИАД (Data Mining), показанное на диаграммах Эйлера Image Sources: 1, 2, 3

Ron Schmelzer (Managing Partner & Principal Analyst at AI Focused Research and Advisory firm Cognilytica) в своей статье в журнале Forbes утверждает, что существует два полярных мнения.

Согласно одному, только Artificial General Intelligence (AGI — общий, полный или сильный искусственный интеллект), который имеет такие же познавательные способности, как и человек, может называться настоящим ИИ; и только те ML-алгоритмы, которые служат цели AGI, могут почетно именоваться ИИ. Такая позиция характерна для парадигм середины прошлого века.

В 1950 году Алан Тьюринг (Alan Turing) в своей знаменитой работе Computing Machinery and Intelligence предложил тест для ответа на вопрос «может ли машина думать?». Суть теста, который в статье назывался «Игра в имитацию», сводилась к поочередному задаванию вопросов человеку и машине и попытке определить с помощью их ответов, с кем в данный момент происходит общение. Его конвенция ИИ звучит так: «Если машина действует так же разумно, как человек, то она так же разумна, как и человек».

Стив Возняк впоследствии предложил свой вариант теста под названием Coffee, суть которого состояла в том, что машина (робот), зайдя в незнакомый американский дом, сможет найти все необходимые ингредиенты и приборы и приготовить кофе :)

Семь лет спустя, в 1957-м, Фрэнк Розенблатт (Frank Rosenblatt) создал первый Персептрон (простейшая искусственная нейронная сеть), дав американским военным надежду на создание машины, которая сможет ходить, говорить, видеть, писать, воспроизводить себя и осознавать свое существование.

На сегодняшний день описанные концепции, скорее, похожи на сценарии к сериалу «Черное зеркало» и все так же далеки от реальности.

Другую, более практичную позицию заняли ученые, занимающиеся прикладными исследованиями в области ИИ (Applied AI). В рамках этой парадигмы МО является подмножеством ИИ. Искусственный интеллект можно определить как алгоритм, который находит паттерн во входных данных или делает их оценку. В дальнейшем полученные результаты алгоритм использует для принятия решений, как если бы это был человек. В рамках такой модели ИИ мы и будем рассматривать проблему выявления и блокирования кибератак.

Диаграммы Эйлера, иллюстрирующие разницу в парадигмах «общего» (AGI, слева) и прикладного (справа) ИИ

Кибератаки известные и не очень

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

Второй подход в основном используется для блокировки неизвестных угроз или угроз нулевого дня при таргетированных атаках, когда мы заранее не знаем индикаторов компрометации. Как следует из названия, данный подход позволяет выявлять новые кибератаки с некоторой вероятностью, оставляя последнее слово за пользователем системы либо специалистом по кибербезопасности. Как раз вероятностный подход и открывает широкое поле для использования ИИ с МО.

Триада машинного обучения

Как известно, в рамках МО существует три основных подхода:

  1. Обучение с учителем (Supervised Learning). Основные области применения:
    • классификация и распознавание;
    • выявление паттернов и аномалий;
    • прогнозирование.
  2. Обучение без учителя (Unsupervised Learning). Основные области применения:
    • Кластеризация;
    • выявление паттернов и аномалий.
  3. Обучение с подкреплением (Reinforcement Learning). Основные области применения:
    • управление роботами;
    • теория игр, алгоритмы для го (AlphaGo), шахматы (AlphaZero), шашки, нарды. ИИ изначально знает только правила игры, а алгоритмы и стратегии создает в процессе игры с самим собой;
    • выявление аномалий.

Есть еще два подхода:

  1. Гибридный подход (Semi-Supervised Learning) — обучение с частичным привлечением учителя, когда входные данные могут быть как маркированными, так и не содержащими метку класса.
  2. Самостоятельное обучение (Self-Supervised Learning). Его особенностью является то, что метки классов уже находятся во входных данных. Например, для имеющейся выборки произвольных изображений мы генерируем новые изображения путем поворота на 90, 180 или 270 градусов. Задача модели — научиться разворачивать изображения в исходное положение. Другой пример — собирание пазла после разрезания изображения на части. В обеих задачах мы знаем искомый результат и учим модель находить его.

Детектирование кибератак с учителем

Самой популярной задачей в области кибербезопасности является бинарная классификация, т. е. деление объектов на вредоносные и доброкачественные с целью выявления и блокирования кибератак. При этом подразумевается, что, кроме самих классов, мы уже знаем критерии, по которым проводим атрибуцию объектов. Чтобы выработать данные критерии, мы должны обладать знаниями об угрозе. Другими словами, методы классификации позволяют выявлять известные типы угроз и векторы атак, но не дают возможности выявлять новую кибератаку, которая не использует традиционные техники и не содержит известные нам индикаторы.

Кроме этого, создание бинарного классификатора сопряжено с рядом проблем, таких как отсутствие размеченных данных и извлечение признаков.

Проблема отсутствия размеченных данных

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

Например, для того, чтобы натренировать нейронную сеть отличать котов от собак, необходимо сначала предоставить размеченные изображения. Такая маркировка обычно осуществляется вручную и на больших количествах данных будет затруднительна. Если говорить о кошках и собаках, то, к счастью, уже существуют готовые наборы данных от Kaggle, содержащие 25 000 классифицированных изображений. Также можно использовать CAPTCHA, для того чтобы пользователи классифицировали изображения при прохождении теста, выявляющего интернет-роботов (Internet crawlers).

Получение размеченных данных для обучения с учителем с помощью CAPTCHA

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

Поэтому более перспективным является подход «обучение без учителя» (когда не требуется предварительно размечать данные для обучения) или «обучение с подкреплением» (когда есть возможность получить обратную связь от эксперта).

Детектирование фишинга с учителем

Тем не менее не стоит сбрасывать со счетов обучение с учителем. Удачным его применением, например, может быть детектирование фишинговых ссылок.

Во-первых, существует база валидированных фишинговых ссылок на Phishtank.org, куда загружают новые образцы ссылок как антивирусные компании, так и индивидуальные исследователи. Белые ссылки получить тоже несложно. Для этого можно воспользоваться сервисом Alexa.com, где есть адреса популярных веб-сайтов.

Во-вторых, разнообразие техник запуска фишинговых веб-сайтов ограничено возможностями хостинга и регистратора доменного имени, и за последние 15–20 лет мало что изменилось, разве что начали больше использоваться сертификаты. Злоумышленники до сих пор регистрируют созвучные атакуемому сервису доменные имена на минимально возможный срок. Хостинг для фишинговой страницы также выбирается локальный, либо используется взломанный сервер. В большинстве атак обычно применяется протокол HTTP без шифрования и сертификатов. Таким образом, в качестве атрибутов достаточно взять доменное имя, WhoIs-информацию, геолокацию сервера, тип сетевого протокола (HTTP или HTTPS) и наличие сертификата и его параметров.

Задачу детектирования фишинговых ссылок можно решить с помощью бинарного классификатора. Причем необязательно использовать сложный аппарат глубоких нейронных сетей (DNN), который требует большого количества данных для качественного обучения. Достаточно воспользоваться традиционными инструментами классификации (дискриминантный анализ, метод опорных векторов, деревья принятия решения, случайный лес, регрессионный анализ [предсказания]) или созданием репутационной модели (scoring system) на основе статистического распределения атрибутов между двумя классами ссылок и экспертной оценки.

Рассмотрим задачу детектирования фишинговых ссылок на основе следующих атрибутов: регистратор домена, период регистрации домена, геолокация хостинг-сервера и наличие защищенного соединения с валидным сертификатом. Данную задачу я предлагаю решить на лабораторной работе своим студентам, используя ресурс Phishtank.com как источник классифицированных фишинговых ссылок.

Пример выборки ссылок с атрибутами и меткой класса

#URLIP addressRegistrarLifetimeCountryClass
1[http://]admin.palmariguani.com/...192.186.205.8godaddy2USphishing
2[http://]www.whoes.info/docs/fox/dropbox/107.180.26.63godaddy1Murricaphishing
3[http://]www.apple-id.ldn-app.mobi/apple208.109.255.48godaddy1USphishing
4[http://]v01-apple.co.uk45.79.129.214godaddy1UKphishing
5[https://]www.bth.se/194.47.131.132SE Direkt14SEbenign
6[https://]wikipedia.com208.80.154.238MARKMONITOR INC.16USbenign
7..................

Диаграммы, показывающие частоту встречаемости значений трех атрибутов: а) название регистратора (Registrar), б) период регистрации домена (Lifetime), в) геолокация хостинг-сервера (Countries) для фишинговых и доброкачественных ссылок

После частотного анализа двух выборок с фишинговыми (Phishing) и доброкачественными (Benign) ссылками мы видим, что атрибуты регистратора и геолокации будет сложно использовать для бинарной классификации, так как среди наиболее часто встречающихся значений имеется много совпадений. Различия по этим двум атрибутам носят более тонкий характер и могут быть выявлены на выборках большего размера. Однако атрибут Lifetime, соответствующий сроку, на который регистрируется домен, показывает, что среди фишинговых ссылок существует тенденция регистрировать домены на более короткий срок. Например, 37% фишинговых доменов было зарегистрировано на 1 год, в отличие от доброкачественных доменов, которые обычно регистрируются на более длительный срок — 10 лет и дольше.

Что же касается защищенного соединения, то преобладающее большинство фишинговых ссылок (96%) не используют HTTPS-протокол, т. е. это один из существенных критериев, который можно применять для детектирования фишинга. Для HTTPS-ссылок можно дополнительно проводить анализ сертификата на основе его атрибутов: например, кем и кому выдан, адрес регистрации компании, которой был выдан сертификат. Хакеры могут регистрировать сертификаты на несуществующие компании, как это было в случае с компанией шифровальщика LockerGoga, файлы которого были подписаны цифровыми сертификатами, выпущенными Sectigo RSA Code Signing CA для фейковых компаний Alina Ltd, Kitty’s Ltd., Mikl Limited и AB Simba Limited. Рекомендую к прочтению исследование Chronicle по этому поводу.

При подготовке выборки для обучения нам необходимо все строковые значения перевести в категориальные и закодировать их числовыми значениями; для категории можно использовать порядковый номер. В таком случае значения атрибута можно будет представить в числовом пространстве. Например, для категориального атрибута Country создадим новый числовой атрибут Country_code с порядковым номером страны, встречающейся в выборке (1 — Australia, 2 — Bangladesh, 3 — Canada, ... , 28 — USA).

Распределение фишинговых (оранжевые точки) и доброкачественных (голубые точки) ссылок в зависимости от периода регистрации (lifetime), геолокации (Country_code) и типа протокола (Protocol_code: {0 — http, 1 — https})

На рисунке видно несколько тенденций в распределении данных:

  • большое количество (47% фишинговых и 53% доброкачественных) IP-адресов находится в США (Country_code = 28);
  • преобладающее большинство фишинговых ссылок (96%) используют HTTP-, тогда как все доброкачественные ссылки используют HTTPS-протокол;
  • период регистрации доменов фишинговых ссылок в целом существенно меньше, чем у доброкачественных ссылок. На большей выборке эта тенденция будет лучше выражена и будет стремиться к 1 году.

А теперь воспользуемся методом k — ближайших соседей (англ. k-nearest neighbors algorithm, k-NN) для классификации ссылок. При классификации метод присваивает объекту класс, который является наиболее распространенным среди k-соседей данного объекта, классы которых уже известны.

Сперва обучим нашу модель, после чего построим карту классификатора, чтобы увидеть границу принятия решения. Если новая ссылка попадет в голубую зону, то она будет классифицирована как доброкачественная, если в оранжевую — как фишинговая. Точность классификатора будет тем выше, чем больше маркированных ссылок будет содержать тренинговая выборка. Кроме того, можно экспериментировать с параметрами модели, такими как количество ближайших соседей, весовая функция, алгоритм нахождения ближайших соседей и другими.

Бинарный классификатор на основе метода k — ближайших соседей. Параметры: количество соседей k = 5; весовые функции: слева — uniform (все точки в каждой окрестности имеют одинаковый вес) и справа — distance (более близкие соседи точки запроса будут иметь большее влияние, чем соседи, которые находятся дальше)

Далее обученный классификатор мы можем использовать для детектирования фишинговых ссылок. Например, hxxps://www.ebay.com.items-checkout.us/item=2328358263481rt=nctrksid=p2328358263481/ (источник: Phishtank)— ссылка, ведущая на поддельную страницу Ebay со следующими атрибутами: домен зарегистрирован на 1 год (27.01.2019 — 27.01.2020), сервер находится в США, протокол HTTPS, регистратор NameCheap, Inc. будет задетектирован нашим классификатором как фишинг. А вот если бы домен был зарегистрирован не на 1 год, а на 3, то наш классификатор определил бы, что сайт доброкачественный.

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

  • True positive (TP) — количество фишинговых ссылок, определенных как фишинговые;
  • True negative (TN) — количество доброкачественных ссылок, определенных как доброкачественные;
  • False positive (FP) — количество доброкачественных ссылок, определенных как фишинговые;
  • False negative (FN) — количество фишинговых ссылок, определенных как доброкачественные.

И производные от них:

  • True positive rate (TPR) или Recall = TP / (TP+FN);
  • True negative rate (TNR) = TN / (TN+FP);
  • False positive rate (FPR) = FP / (FP+TN);
  • False negative rate (FNR) = FN / (FN+TP);
  • Precision или Positive predictive value (PPV) = (TP+TN) / (TP+TN+FP+FN);
  • Negative predictive value (NPV) = TN / (TN+FN);
  • F-measure — гармоническое среднее между Recall (TPR) и Precision (PPV) = 2*Precision*Recall / (Precision + Recall).

В контексте задачи выявления кибератак наиболее важной является метрика FN/FNR, которая дает количественную оценку пропущенным атакам.

Визуализация и уменьшение мерности

Так как количество признаков (атрибутов) в модели зачастую больше, чем 2 или 3 (в реальных моделях — 1000 и более), то возникает вопрос: как представить объекты или наблюдения в двух- или трехмерном пространстве, чтобы увидеть закономерности их распределения для оценки возможности дальнейшей классификации или кластеризации. Для этих целей можно воспользоваться методами уменьшения размерности. Далее мы рассмотрим две техники — линейного (PCA) и нелинейного (t-SNE) уменьшения размерности.

Метод главных компонент (англ. Principal component analysis, PCA) осуществляет линейное отображение данных в пространство меньшей размерности таким образом, что дисперсия данных в малоразмерном представлении максимизируется.

В нашем случае уменьшения размерности до двух компонент имеем следующие значения:

  • компонента 1: −0.998 x Registrar_code + 0.065 x Lifetime + −0.022 x Country_code + 0.006 x Protocol_code
  • компонента 2: 0.020 x Registrar_code + −0.035 x Lifetime + −0.999 x Country_code + −0.005 x Protocol_code

Мы видим, что основной вклад в компоненту 1 вносит регистратор домена, а в компоненту 2 — страна, где находится сервер. Это можно объяснить тем, что обе эти величины являются категориальными и после кодирования с использованием порядкового номера значения атрибута имеют большую дисперсию; разброс значений в интервалах значений атрибутов (Registrar_code: [1,92], Country_code: [1, 28], Lifetime: [1,34], Protocol_code: [0,1]). В данном случае стоит поэкспериментировать с алгоритмами кодирования категориальных данных, например использовать one-hot-кодирование.

Визуализация интернет-ссылок в двумерном пространстве после применения техники PCA (фишинговые ссылки — оранжевые точки, доброкачественные ссылки — голубые точки)

На рисунке сложно выделить отдельные группы доброкачественных и фишинговых ссылок. Данная техника для нашего случая неэффективна.

Другим алгоритмом является стохастическое вложение соседей с t-распределением (англ. T-distributed Stochastic Neighbor Embedding, t-SNE), представляющее нелинейную технику уменьшения размерности данных.

Визуализация интернет-ссылок в двумерном пространстве после применения техники t-SNE (фишинговые ссылки — оранжевые точки, доброкачественные ссылки — голубые точки)

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

Обучение без учителя. Кластерный анализ

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

Для этого воспользуемся популярным методом кластеризации k-средних (англ. K-means). К-means стремится минимизировать суммарное квадратичное отклонение точек кластеров от центров этих кластеров. В нашем случае количество кластеров равно двум. Используя технику t-SNE для проекции данных на двумерную плоскость, получаем следующие визуализированные результаты.

Визуализация интернет-ссылок в двумерном пространстве после кластерного анализа с помощи метода K-means

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

Обучающая выборка с обозначенными метками классов (слева) и после кластеризации (справа)

Более точную оценку эффективности кластеризации можно получить, используя описанные выше метрики: TPR, TNR, FPR, FNR, PPV, NPV, F-measure.

TP = 110, TN = 41, FP = 7, FN = 44;
TPR (Recall) = 71%;
TNR = 85%;
FPR = 15%;
FNR = 29%;
PPV (Precision) = 0.75;
NPV = 0.48;
F-measure = 0.73.

Очевидно, что такой точности классификатора недостаточно для самостоятельного использования в продакшен-системах. Однако, учитывая тот факт, что у нас не было меток классов и мы не обучали нашу модель, это хороший результат. Данный классификатор может быть востребован как дополнительный механизм в рамках эвристического подхода для выявления подозрительных ссылок, на которые следует обратить внимание и, возможно, подвергнуть более глубокому анализу или сканированию другими сервисами, например Phishtank или Virustotal. Также возможно прибегнуть к кластеризации для помощи в маркировании объектов, которые в дальнейшем, после проверки экспертом, будут использоваться для обучения модели классификатора (обучение с учителем) либо для детерминистических методов — поиска однозначного соответствия с обнаруженной фишинговой ссылкой.

Выводы

В рамках этой статьи мы рассмотрели основные парадигмы ИИ, взаимные отношения МО и ИИ, а также на примере задачи детектирования фишинговых ссылок исследовали возможности обучения с учителем и без него, попутно затронув техники уменьшения размерности и визуализации данных.

Обучение без учителя, несмотря на невысокую точность, сейчас является наиболее перспективным направлением научных исследований. Такие модели не требуют размеченных данных и поэтому имеют большой потенциал для применения, в том числе в области кибербезопасности.

Одним из таких перспективных направлений является детектирование аномалий без учителя. Сегодня этот подход активно внедряется в системы мониторинга и управления событиями информационной безопасности (англ. Security Information and Event Management, SIEM) и позволяет выявлять аномальную активность пользователей и систем, которая может сигнализировать о целевой кибератаке на организацию.

Интересным, на мой взгляд, также является исследование возможностей применения генетических алгоритмов (англ. Genetic Algorithms) и обучения с подкреплением (англ. Reinforcement Learning) в дополнение к популярным Fuzzing и Symbolic Execution для тестирования безопасности программных продуктов (англ. Security Testing) и выявления уязвимостей в них (англ. Vulnerability Testing).

Для детектирования и анализа вредоносных программ (англ. malware) может оказаться полезным Smart Pattern Matching.

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

Что почитать и поучить

  • Saxe J., Sanders H. Malware Data Science. Attack Detection and Attribution, 2018.
    Плюсы: книга содержит детально описанные решения реальных задач в области детектирования и автоматизации анализа вредоносных программ.
    Минусы: узкая направленность.
  • Chio C., Freeman D. Machine Learning and Security, 2018.
    Плюсы: книга содержит большое количество примеров с кодом на языке Python.
    Минусы: использование синтетических входных данных, отсутствие задач из реального мира и их решений.
  • Dua S., Du X. Data Mining and Machine Learning in Cybersecurity, 2011.
    Плюсы: исчерпывающий обзор методов машинного обучения.
    Минусы: отсутствие примеров решения практических задач.
  • Tsukerman E. Machine Learning for Cybersecurity Cookbook, 2019.
    Плюсы: решения актуальных задач с примерами кода на языке Python.
    Минусы: фокус на реализации учебных задач, отсутствие глубокого анализа решаемых проблем и аргументации для применяемых методов.
  • Chebbi C. Mastering Machine Learning for Penetration Testing, 2018.
    Плюсы: рассматривается большое количество актуальных задач с примерами кода на языке Python.
    Минусы: отсутствие глубокого анализа решаемых проблем и аргументации для применяемых методов. Автор отвечает на практический вопрос «Как решить задачу?», но не дает ответов на вопросы «Почему именно таким способом?», «Какие варианты решения проблемы еще существуют?», «В чем их сильные и слабые стороны?», «Как можно улучшить рассматриваемую модель?».
  • Andrew Ng. Machine Learning Yearning. Technical Strategy for AI Engineers in the Era of Deep Learning, 2018.

Статьи об истории, парадигмах и текущих исследованиях в области ИИ:

Онлайн-курсы:

Похожие статьи:
Тиск на бізнес через постійні перевірки ІТ-компаній знищує інвестиційну привабливість держави та змушує інноваційні галузі шукати...
В последнее время все озадачились утилизацией отходов. Очень большое количество не разлагаемого мусора представлено различными...
Советы сеньоров — новая рубрика, в рамках которой опытные специалисты делятся практическими советами с джуниорами — общие...
Олександр Різник — доктор технічних наук, завідувач відділу нейротехнологій Інституту проблем математичних машин і систем...
Александра Ковалева — Head of Softengi Training Center, Senior Testing Consultant и мама двоих детей получила награду Ukrainian IT Awards 2017 в номинации Best...
Яндекс.Метрика