Встраиваемые системы. Проектирование приложений на микроконтроллерах семейства 68HC12/HCS12 с применением языка С — страница 55 из 70

7.6.1. Описание проекта

В этом разделе описана основанная на нечеткой логике система защиты от вторжения, которая может защитить ваш компьютер от несанкционированного внешнего доступа. В частности, рассматриваемая система может с помощью встроенных в МК 68HC12/HCS12 функций поддержки нечеткой логики обнаруживать внедрение постороннего гипертекста (HTTP) при туннелировании информации по сетевой шине компьютера. Туннелирование применяется для легальной установки сеансов связи между ведущим компьютером внутри компьютерной сети и компьютером, внешним по отношению к этой сети. «Злоумышленник» использует такой внешний компьютер, чтобы установить тайный сеанс связи, формируя несанкционированные сообщения внутри пакетов обычного протокола HTTP. Чтобы предотвратить такие действия, общество защиты компьютерной информации разработало в прошедшем десятилетии ряд информационных систем. Цель описываемой микроконтроллерной системы защиты состоит не в том, чтобы заменить существующие коммерческие системы, а в том, чтобы помогать таким системам, оценивая присутствие в данных сетевого трафика внедренных посторонних HTTP сообщений.

Цель данного проекта состоит в создании переносной микроконтроллерной системы для анализа туннелирования HTTP. Эта система должна обнаруживать следующие злонамеренные и несанкционированные действия при туннелирования HTTP:

• атаки на интерактивные сеансы туннелирования;

• атаки с помощью внедрения скриптов в сеансах туннелирования; 

• внедрение несанкционированных видео и звуковых сигналов в передаваемых потоках информации.

Система защиты должна удовлетворять следующим системным требованиям:

1. Использовать МК семейства;

2. Иметь светодиодное табло для отображения состояния трафика;

3. Обнаруживать интерактивные сеансы туннелирования;

4. Проводить поиск внедренных скриптов при туннелировании;

5. Обнаруживать несанкционированное видео и звуковые сеансы передачи;

6. Использовать алгоритмы нечеткой логики для определения состояния сетевого трафика.

7.6.2. Использование системы HCS12

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

7.6.3. Основы теории

На рис. 7.27 показан полный процесс, который должна реализовать микроконтроллерная система защиты, чтобы идентифицировать нежелательный сетевой трафик. Система обрабатывает набор из шести входных сигналов, создаваемых ПК, используя алгоритмы нечеткой логики. (Обзор команд 68HC12 для реализации законов управления с нечеткой логикой см. в [11]). Входными сигналами для системы являются оценки уровня членства; нулевая оценка означает отсутствие членства, в то время как максимальная оценка представляет совершенное членство. Первые три входных сигнала отражают оценки членства для профилей поведения. Профиль поведения составлен из таких атрибутов сеанса, как размер пакета, число пакетов сеанса, продолжительность сеанса, соотношение между большими и малыми пакетами, направления передачи данных, средний размер пакета, изменение стандартного размера пакета и общих размеров полученных пакетов.

Рис. 7.27. Определение оценок членства для трех наборов и двух множеств (шесть входов)

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


При сравнении каждого файла на атакующее поведение (у нас три таких файла, описывающих три типа несанкционированной активности при туннелировании HTTP: атаки на интерактивные сеансы туннелирования, атаки с помощью скриптов и внедрение видео и аудио потоков) с профилем данных обычного трафика шины ПК система обнаружения вторжения формирует оценку членства во множестве действий туннелирования HTTP (tunneling activity detection — TAD). Другие три входа системы формируют оценки членства в множестве ключевых слов, характерных для каждого из видов атаки.

Пакеты данных в сеансе туннелирования HTTP, содержат одно или несколько ключевых слов, по которым можно идентифицировать присутствие туннелирования. Испытуемый ПК сравнивает 40 ключевых слов со словами, которые появляются в данных сеанса. Оценка соответствия передается переносной системе в качестве второй входной величины.

На рис. 7.27 показана вся система с необходимыми входными сигналами. На рис. 7.28 приведено размещение переносной системы для обнаружения вторжения в сетевую среду. В беспроводной сети переносная система может быть связана с персональным компьютером. Библиотечные подпрограммы Libpcap используются, чтобы выбрать пакеты сеанса из необработанных данных Internet, программа Psplice проводит синтаксический анализ отдельных пакетов, а модуль предварительной обработки сравнивает данные пакета по трем профилям поведения и по оценке членства во множестве ключевых слов. Более подробно о библиотечных подпрограммах, программе Psplice и модуле предварительной обработки, см. в [11].

Рис. 7.28. Структура связей переносной системы обнаружения вторжения с общей сетью

7.6.4. Структура программы и блок-схема алгоритма

На рис. 7.29 приведена структура аппаратных средств системы HTTP. Структура программы для системы защиты относительно проста. Она состоит из трех машин с нечеткой логикой, каждая из которых работает как программный модуль, показанный на на рис. 7.27. Чтобы увеличить быстродействие, можно использовать три платы HCS12 для обнаружения на шине трех действий вторжения. На рис. 7.30 показана блок-схема алгоритма для системы защиты.

Рис. 7.29. Структура аппаратных средств системы защиты


Рис. 7.30. Блок-схема алгоритма UML для системы защиты

7.6.5. Описание системы

На рис. 7.31a, показан внешний вид переносной системы при работе. ЖК дисплей показывает следующее начальное сообщение:

Portable HTTP

TAD System

Version 1.0

На рис. 7.31б, показан следующий типовой экран после того, как сеанс оценен:

IA: 60 Med Alert

SA: 40 Low Alert

S : 40 Low Alert

a) Компоненты, которые составляют систему контроллера. В левой нижней части показана плата 68HC12, используемая для интерфейса ПК с целевой платой, показанной в правом нижнем углу фотографии. Целевая плата использует микроконтроллер 68HC129S12DP256B, входящий в семейство контроллеров HCS12

б) Жидкокристаллический дисплей отображает типовое сообщение

Рис. 7.31. Микроконтроллерная система оценки атак на HTTP туннелирование (TAD)


Сообщение показывает ряд оценок текущего сеанса для трех типов атак на туннелирование HTTP и соответствующих им сообщения.

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

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

Как только переносная система безопасности TAD получает набор шести оценок, он пересылается на три подсистемы с нечеткой логикой — подсистемы фаззификации. Каждая из подсистем TAD вычисляет оценку для каждого из видов атаки на туннелирование. Опишем теперь системы фаззификации.

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

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

Рис. 7.32. Входные функции членства для вторжения в интерактивное туннелирование подсистемы TAD


В дополнение к профилю поведения, подсистема получает также соответствующую оценку членства ключевых слов, выраженную натуральным числом пределах от 0 до 255. Функцию на рис. 7.32 можно применить и для оценки членства ключевых слов. Как показано на рисунке, использовано идентичное описаниие входной функции членства. Снова ось у представляет уровень членства от 0 до 255, и значение оси x определяет оценку членства для полученных ключевых слов.

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

В конце процесса фаззификации, мы имеем одну или несколько входных функций членства с соответствующими значениями. Следующий шаг в процессе должен отобразить нечеткие входные функции в нечеткие выходные функции, используя определенный набор правил. Прежде, чем мы обсудим процесс отображения в логической машине с нечеткой логикой, необходимо определить нечеткие выходные функции членства. Пять из них показаны на рис. 7.33: (1) нет опасности, (2) низкая опасность, (3) средняя опасность, (4) опасность и (5) высокая опасность.

Рис. 7.33. Выходные функции членства для интерактивного вмешательства


Вывод лингвистических переменных функции членства на рис. 7.33 может выглядеть необычно для экспертов по система с нечеткой логикой. Как мы покажем далее, проектировщики МК HCS12 фирмы Motorola упростили процесс дефаззификации, сопоставив каждой выходной функции с нечеткой логикой одно значение. Для текущей подсистемы, мы применяем девять правил, показанных в табл. 7.1, чтобы преобразовать входные переменные в выходные.

Значения для профиля поведенияЗначения для ключевых словВыходные величины
НизкоеНизкоеНет опасности
НизкоеСреднееНизкая опасность
НизкоеВысокоеОпасность
СреднееНизкоеНизкая опасность
СреднееСреднееСредняя опасность
СреднееВысокоеОпасность
ВысокоеНизкоеСредняя опасность
ВысокоеСреднееОпасность
ВысокоеВысокоеВысокая опасность

Таблица 7.1. Правила фаззификации, позволяющие преобразовать входные переменные в выходные


Мы использовали общий метод минимакса, показанный на рис. 7.34, чтобы получить значения членства для выходных переменных. То есть наибольшее из значений членства входных функций отображается в соответствующей выходной функции. Если после применения всех правил, и выходная функция имеет более одного значения, то для выходной функции выбирается наименьшее значение. Для дефаззификации выходного значения, все выходные функции и соответствующие значения членства используются, чтобы вычислить центральное выходное значение. Полученные значения выходных функций функций (показанные на оси X рис. 7.33), умножаются на значения членства, вычисленные по девяти правилам, результаты складываются и сумма делится на число членов. Конечное числовое значение и соответствующее сообщение распечатано на экране ЖК дисплее, чтобы сообщить пользователю состояние сеанса. Таким образом, для каждого сеанса, ЖК дисплей высвечивает три числа, характеризующих три типа активности вторжения: атаки на интерактивные сеансы туннелирования, атаки с помощью скриптов и внедрение видео и аудио потоков.

Рис. 7.34. Процедуры передачи членства оценивают, используя метод Минимакса

7.6.6. Обсуждение проекта

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

Микроконтроллерная система может взять на себя часть функций системы обнаружения вторжения, связанных с атаками на туннелирование HTTP. Система использует свойства сессии, чтобы проверить данные трафика Internet, которые составляют сессию Internet — программные связи между двумя компьютерами для передачи данных. Хорошим примером сессии является набор адреса сети в браузере. Ваш компьютер запрашивает сессию у ведущего компьютера, который содержит страницу сети, которая вам необходима. Как только вы закрываете веб-сайт и переходите к другому сайту, вы закрываете одну сессию и запускаете другую.

7.6.7. Программный код

//********************************************************************

// Файл: micro.с

// Функция программы: Устанавливает шесть IDS оценок членства и создает

// оценку опасности вторжения

// Авторы: Даниэль Пак, Барри Муллинз, Стив Барретт

// Дата создания: 17 июня 2004

// Установки: Program=0x1000, Data=0x3000, Stack=0x4000

//********************************************************************

#include 

#include "hcs12dp256.h"


//********************************************************************

//функции поддержки

//====================================================================

// _HC12Setup: выключить сторожевой таймер COP

//====================================================================

void _HC12Setup(void) {

 COPCTL = 0x00; // выключить сторожевой таймер COP

}


//********************************************************************

//delay: подпрограмма задержки

//********************************************************************

void delay(void) { //подпрограмма задержки

 volatile unsigned n, m;

 m = 10;

 do {

  n = 0;

  do {

   n--;

  } while(n);

  m--;

 } while(m);

}


//********************************************************************

// status_wait: время ожидания подпрограмма установки связи с ЖКД

//********************************************************************

void status_wait(void) { //время ожидания подпрограмма установки связи с ЖК дисплеем

 char temp = 0x00;

 DDRA = 0x00;

 PORTB = 0xF9;

 while ((temp & 0x03) != 0x03) {

  PORTB = 0xFF;

  temp = PORTA;

  PORTB = 0xF9;

 }

 PORTB = 0xFF;

 DDRA = 0xFF;

}


//********************************************************************

// command: пересылка команд на ЖК дисплей

//********************************************************************

void command(unsigned char n) { // пересылка команд на ЖК дисплей

 status_wait();

 PORTA = n;

 PORTB = 0xFF;

 PORTB = PORTB & 0xFA;

 PORTB = 0xFF;

}

//********************************************************************


//********************************************************************

//data: пересылка данных на ЖК дисплей

//********************************************************************

void data(unsigned char n) { // пересылка данных на ЖК дисплей

 status_wait();

 PORTA = n;

 PORTB = PORTB & 0xF2;

 PORTB = 0xFF;

}


//********************************************************************

// LCD_char: функция пересылки символа на ЖК дисплей

//********************************************************************

void LCD_char(unsigned char n) {

 // функция пересылки символа на ЖК дисплей

 data(n - 0x20);

 command(0xC0);

}


//********************************************************************

// newline: пересылка новой строки на ЖК дисплей

//********************************************************************

void newline(void) {

 // пересылка новой строки на ЖК дисплей

 int i;

 for (i=0; i<16; i++) LCD_char(' ');

}


//********************************************************************

// LCD_output: пересылка последовательности символов на ЖК дисплей

//********************************************************************

void LCD_output(char s[]) {

 // пересылка последовательности символов на ЖК дисплей

 int n = 0;

 while (s[n] != '\0') {

  LCD_char(s[n]);

  ++n;

 }

}


//********************************************************************

// Reset_cursor: возврат курсора

//********************************************************************

void Reset_cursor(void) { // возврат курсора

 data(0x00);

 data(0x10);

 command(0x24);

}


//********************************************************************

//Clearscreen: очистка экрана ЖКД

//********************************************************************

void Clearscreen(void) { // очистка экрана ЖКД

 int i,j;

 Reset_cursor();

 for (i=0; i<16; i++) for(j=0; j<16; j++) LCD_char(' ');

 Reset_cursor();

}


//********************************************************************

// Initlcd: инициализация ЖКД

//********************************************************************

void Initlcd(void) { // инициализация ЖКД

 PORTB = 0xEF; //принудительный сброс

 delay();

 PORTB = 0xFF; //все линии команд на высоком уровне

 status_wait();

 command(0x80); // установить режим текста

 data(0x00); // установить младший байт адреса текста (L)

 data(0x10); // установить младший байт адреса текста (H)

 command(0x40); //установить адрес команды текста

 data(0x10); //установить область текста

 data(0x00);

 command(0x41);

 command(0x94); //включить текстовый дисплей

 command(0xA7); //курсор 8×8 позиций

 Clearscreen();

 Reset_cursor();

}


//********************************************************************

// InitMes: начальное сообщение

//********************************************************************

void InitMes(void) { // начальное сообщение

 unsigned char k;

 for(k=0; k<3; k++) newline();

 LCD_output(" Portable HTTP");

 newline();

 LCD_output(" TAD System.");

 newline();

 LCD_output(" version 1.0");

}


//********************************************************************

// numdisplay: отображение чисел на ЖК дисплее

//********************************************************************

void numdisplay(char s) { //отображение чисел на ЖК дисплее

 char k;

 newline();

 k = s;

 s = s>>4;

 if (s > 0x08) data(s + 0x17);

 else data(s + 0x10);

 command(0xC0);

 k = k & 0x0F;

 if (k > 0x08) data(k + 0x17);

 else data(k + 0x10);

 command(0xC0);

}


//********************************************************************

// Секция данных - инициализация табличных данных

//********************************************************************

#pragma abs_address 0x3000

char BeP[12] = {0x00, 0x70, 0x00, 0x10,

 0x40, 0xC0, 0x10, 0x10,

 0x90, 0xFF, 0x10, 0x00};


char KeM[12] = {0x00, 0x70, 0x00, 0x10,

 0x40, 0xC0, 0x10, 0x10,

 0x90, 0xFF, 0x10, 0x00};


char OT[5] = {0x40, 0x60, 0x80, 0xA0, 0xC0};


char IMV[6] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00};


char OMV[5] = {0x00, 0x00, 0x00, 0x00, 0x00};


// правило

char rules[45] = {0x00,0x03,0xFE,0x06, 0xFE,

 0x00, 0x04, 0xFE, 0x07, 0xFE,

 0x00, 0x05, 0xFE, 0x08, 0xFE,

 0x01, 0x03, 0xFE, 0x07, 0xFE,

 0x01, 0x04, 0xFE, 0x08, 0xFE,

 0x01, 0x05, 0xFE, 0x09, 0xFE,

 0x02, 0x03, 0xFE, 0x08, 0xFE,

 0x02, 0x04, 0xFE, 0x09, 0xFE,

 0x02, 0x05, 0xFE, 0x0A, 0xFF};


char result[3] = (0x00, 0x00, 0x00};

#pragma end_abs_address


//********************************************************************

//Основная программа

//********************************************************************

void main(void) {

 int index;

 char temp = 0x00;

 /* определение интерактивного туннелирования */

 asm("LDX #$3000");

 asm("LDY #$301D");

 asm("LDAA $4000"); //оценка профиля поведения

 asm("MEM");

 asm("MEM");

 asm("MEM"); //фаззификация

 asm("LDAA $4001"); //оценка членства ключевых слов

 asm("MEM");

 asm("MEM");

 asm("MEM"); //фаззификация

 asm("LDY #$301D");

 asm("LDX #$3028");

 asm("LDAA #$FF"); //инициализация минимума и бита V

 asm("REV"); //применение правил фаззификации

 asm("LDX #$3018"); //дефаззификация

 asm("LDY #$3023");

 asm("LDAB #$05");

 asm("WAV");

 asm("EDIV");

 asm("TFR Y,D");

 asm("STAB $3055"); //сохранение результата

 PORTB = 0xff;

 DDRB = 0xff;

 delay2();

 PORTB = 0x7F; //проверка платы с использованием ЖКД

 delay2();

 PORTB = 0xFF;

 /*Определение туннелирования скриптов*/

 asm("LDX #$3000");

 asm("LDY #$301D");

 asm("LDAA $4002"); //оценка профиля поведения

 asm("MEM");

 asm("MEM");

 asm("MEM"); //фаззификация

 asm("LDAA #$PF"); //оценка членства ключевых слов

 asm("MEM");

 asm("MEM");

 asm("MEM"); //фаззификация

 asm("LDY #$301D");

 asm("$3028");

 asm("$4003"); //инициализация минимума и бита V

 asm("REV"); //применение правил фаззификации

 asm("LDX #$3018"); //дефаззификация

 asm("LDY #$3023");

 asm("LDAB #$05");

 asm("WAV");

 asm("EDIV");

 asm("TFR Y,D");

 asm("STAB $3056"); //сохранение результата

 PORTB = 0xff;

 DDRB = 0xff;

 delay2();

 PORTB = 0x7F; //проверка платы с использованием ЖКД

 delay2();

 PORTB = 0xFF;

 /*Проверка внедрения потоков*/

 asm("LDX #$3000");

 asm("LDY #$301D");

 asm("LDAA $4004"); //оценка профиля поведения

 asm("MEM");

 asm("MEM");

 asm("MEM"); //фаззификация

 asm("LDAA $4005"); //оценка членства для ключевых слов

 asm("MEM");

 asm("MEM");

 asm("MEM"); //фаззификация

 asm("LDY #$301D");

 asm("LDX #$3028");

 asm("LDAA $4003"); //инициализация минимума и бита V

 asm("REV"); //применение правил фаззификации

 asm("LDX #$3018"); //дефаззификация

 asm("LDY #$3023");

 asm("LDAB #$05");

 asm("WAV");

 asm("EDIV");

 asm("TFR Y,D");

 asm("STAB $3057"); //сохранение результата

 PORTB = 0xff;

 DDRB = 0xff;

 delay2();

 PORTB = 0x7F; //проверка платы с использованием ЖКД

 delay2();

 PORTB = 0xFF;

 //Конфигурация ЖКД

 DDRA = 0xFF;

 PORTB = 0xFF,

 Initlcd(); //Инициализация ЖКД

 InitMes(); //Инициализация сообщений

 delay2();

 Clearscreen(); //Очистить экран ЖКД

 Reset_cursor; //Возврат курсора ЖКД

 newline(); //Создать новую строку на ЖКД

 newline();

 LCD_Output("IA: ");

 numdisplay(result[0]);

 if (result[0] > 0xA0) //Вывести на дисплей предупреждение

  LCD_output(" High Alert");

 else if (result[0] > 0x60) LCD_output(" Med Alert");

 else LCD_output(" Low Alert");

 newline();

 LCD_output("SA: ");

 numdisplay(result[1]);

 if (result[0] > 0xA0) LCD_output(" High Alert");

 else if (result[1] > 0x60) LCD_output(" Med Alert");

 else LCD_output(" Low Alert");

 newline();

 LCD_output{"S: ");

 numdisplay(result[2]);

 if (result[2] > 0xA0) LCD_output(" High Alert");

 else if (result[0] > 0x60) LCD_output(" Med Alert");

 else LCD_output(" Low Alert");

}

//====================================================================

7.6.8. Некоторые комментарии

Вы можете задать вопрос о необходимости иметь отдельную микроконтроллерную систему HTTP TAD. Почему бы просто не включить функцию системы HTTP TAD в состав стандартной системы обнаружения «злоумышленника»? Цель упражнения состоит в том, чтобы показать большие возможности МК HCS12 и использование их в ряде проектов. Конечно, система, описанная в этом разделе, может быть включена в состав большой системы обнаружения «злоумышленника». Одно из преимуществ создания отдельной системы — мобильность. Это обеспечивает администраторов защиты гибким инструментом, чтобы изменять одиночную переносную систему и проверять несколько модулей внутри сети. Материалы для более подробного изучения систем информационной защиты мы вынесли в раздел «Что еще прочесть» в конце главы.

7.7. Электронная версия игры в «15»